|
|
(2 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
− | {{TOC right}}
| + | #REDIRECT [[Kart]] |
− | | + | |
− | The [[Kart|kart's]] stepper motor controller module generates 4 coil driving signals and receives a ''stepper end'' input.
| + | |
− | | + | |
− | [[File:Kart_stepper_module.jpg|center|1400px|stepper motor module]]
| + | |
− | | + | |
− | == Stepper motor ==
| + | |
− | | + | |
− | === Hardware ===
| + | |
− | | + | |
− | The '''stepper motor''' is a [[Media:SP3575M0906-A.pdf|Nanotec SP3575M0906-A]].
| + | |
− | | + | |
− | It has a step angle of 7.5°, and as such 48 steps per turn.
| + | |
− | It is attached to a 100:1 reductor, which leads to an output axis with 4800 steps per turn.
| + | |
− | | + | |
− | The [[Media:Kart_dc_stepper_schematic.pdf|DC/stepper control board]] hosts a dual full H-bridge to control the 4 coils of the stepper motor.
| + | |
− | | + | |
− | The '''end switch''' is connected between one of the FPGAs I/O with an internal pull-up enabled and the GND. The logic is internally reverted (i.e. a '1' is read when the switch is closed).
| + | |
− | | + | |
− | === Connector ===
| + | |
− | | + | |
− | The cables are connected as follows:
| + | |
− | :{| cellpadding="4" cellspacing="0" border="1"
| + | |
− | ! Signal
| + | |
− | ! Color
| + | |
− | |-
| + | |
− | | phase 1
| + | |
− | | white
| + | |
− | |-
| + | |
− | | phase 2
| + | |
− | | blue
| + | |
− | |-
| + | |
− | | phase 3
| + | |
− | | red
| + | |
− | |-
| + | |
− | | phase 4
| + | |
− | | yellow
| + | |
− | |-
| + | |
− | | GND
| + | |
− | | brown, black
| + | |
− | |}
| + | |
− | | + | |
− | == FPGA design ==
| + | |
− | [[File:Kart_stepper_block.jpg|right|500px|stepper motor module]]
| + | |
− | The [https://en.wikipedia.org/wiki/Stepper_motor stepper motor] controller has to generate the [https://en.wikipedia.org/wiki/Stepper_motor#Phase_current_waveforms 4 phases] to turn the kart's steering wheels to the desired angle.
| + | |
− | The <code>target angle</code> is set in the [[Kart/serial_link#SmartPhone_to_Kart|desired steering angle register]].
| + | |
− | | + | |
− | To begin with, the [[Kart#FPGA_Design|design environment]] has to be downloaded.
| + | |
− | It comprises the <code>stepperMotorController</code> block which contains the registers and events manager and an empty <code>angleControl</code> block which is to be completed.
| + | |
− | | + | |
− | === Functionality ===
| + | |
− | | + | |
− | The block receives a <code>targetAngle</code> unsigned number and has to step the coils at each occurrence of the <code>stepEn</code> signal until the desired angle is reached.
| + | |
− | | + | |
− | The coils are controlled through the 4 outputs <code>coil1</code> to <code>coil4</code>. When a '1' is applied, the corresponding coil is magnetized.
| + | |
− | {{WarningBox|content=
| + | |
− | To control the stepper, one coil at a time should be magnetized, known as [https://en.wikipedia.org/wiki/Stepper_motor#Wave_drive_(one_phase_on) '''wave drive'''].
| + | |
− | | + | |
− | The switching frequency should also be chosen carefully. A frequency of 285 Hz is near the slip limit of the motor.
| + | |
− | The frequency is given by the formula : f = 100k / prescaler.
| + | |
− | A prescaler ('''clockDivider''') of '''400''' (i.e. a frequency of 250 Hz) is a great first approach.
| + | |
− | }}
| + | |
− | The steering angle, <code>actual</code>, is estimated with the help of a counter which increments or decrements each time the coils change.
| + | |
− | | + | |
− | It is joined with a logic signal, <code>reached</code>, telling if the desired angle has been reached.
| + | |
− | This information is sent back to the [[Kart#Android_App|controlling smartphone]].
| + | |
− | | + | |
− | === Zero position ===
| + | |
− | | + | |
− | A switch contact, providing the signal <code>stepperEnd</code>, has to be mechanically fitted on the kart in order set one end of the wheels' direction movement.
| + | |
− | As soon as <code>stepperEnd</code> is '1', the stepper motor is stopped and the <code>actual</code> angle is reset.
| + | |
− | | + | |
− | With this, the steering motor will not try to turn further than what the kart's mechanical structure allows it to do in one of the directions.
| + | |
− | In the other direction, it is the programmer's task not to request a too large <code>target</code> angle.
| + | |
− | This also means that the angles are always considered as positive numbers, the zero position being given by the <code>stepperEnd</code> switch.
| + | |
− | | + | |
− | {{WarningBox|content=
| + | |
− | * In order to limit the current consumption, turn off the current in all the coils when the stepper motor is not turning any more.
| + | |
− | * Make sure that both the first and the last pulse of the coil control signals have the same duration as all the others.
| + | |
− | }}
| + | |
− | {{TaskBox|content=
| + | |
− | Draw the schematics of the <code>angleControl</code> block.
| + | |
− | }}
| + | |
− | | + | |
− | === Hardware orientation ===
| + | |
− | [[File:Kart stepper hw orientation.svg|right|350px|stepper hardware orientation controls]]
| + | |
− | The mechanical design allows for the following variations:
| + | |
− | * the <code>stepperEnd</code> switch can be placed such as to detect the maximal steering angle either on the left or on the right side
| + | |
− | * switching the coil controls in the sequence <code>1 - 2 - 3 - 4 - 1 - 2 - …</code> can result in the kart to turn either to the left or to the right
| + | |
− | | + | |
− | In order to cope with all possibilities, 2 setup signals are provided to the block:
| + | |
− | * <code>sensorLeft</code> being '1' means that the <code>stepperEnd</code> switch has been placed such as to react when the wheels are oriented to the maximal steering angle on the left side
| + | |
− | * <code>clockwise</code> being '1' means that the sequence <code>1 - 2 - 3 - 4 - 1 - 2 - …</code> lets the steering turn to the right
| + | |
− | | + | |
− | The corresponding setup bits are configured in the [[Kart/serial_link#Hardware_control_register|hardware control register]].
| + | |
− | | + | |
− | {{TaskBox|content=
| + | |
− | Update the schematics of the <code>angleControl</code> block in order to cope for the different mechanical design possibilities.
| + | |
− | }}
| + | |
− | | + | |
− | === Initial position ===
| + | |
− | | + | |
− | The [[Kart/serial_link#Hardware_control_register|hardware control register]] also contains the bit <code>restart</code> indicating that the stepper motor has to turn all the way back until presswing the <code>stepperEnd</code>.
| + | |
− | | + | |
− | This has to be sent by the [[Kart#Android_App|remote control smartphone]] after a successful Bluetooth pairing, together with the appropriate <code>sensorLeft</code> and <code>clockwise</code> setup bits, in order for the FPGA hardware to discover the zero angle position.
| + | |
− | Obviously, this should only be done after the [[Kart/serial_link#SmartPhone_to_Kart|Stepper motor period register]] has been set to a proper value.
| + | |
− | | + | |
− | Restarting to the zero position can also be a help if too much current has been drawn from the batteries and the FPGAs' power has sunk in a way that they have performed a reset.
| + | |
− | | + | |
− | The <code>restart</code> signal stays high until the stepperEnd is pressed or is reset by the smartphone.
| + | |
− | Thus, when detecting the signal, one must enter a restart state and move until the <code>stepperEnd</code> is pressed.
| + | |
− | If the switch is already on, it will stay high during only one clock period.
| + | |
− | | + | |
− | {{TaskBox|content=
| + | |
− | Update the schematics of the <code>angleControl</code> block in order to turn all the way to the <code>stepperEnd</code> position once the input <code>restart</code> has been set.
| + | |
− | | + | |
− | The stepper motor should wait for the <code>restart</code> signal to be released before acting normally.
| + | |
− | | + | |
− | It should not turn while a first <code>restart</code> has not been performed.
| + | |
− | }}
| + | |
− | | + | |
− | == Tests ==
| + | |
− | The Stepper motor functionality can be tested through the '''StepperMotor_test -> stepperMotorController_tb''' block.
| + | |
− | | + | |
− | [[File:Kart_stepper_tester.jpg|center|600px|Stepper motor tester]]
| + | |
− | | + | |
− | The corresponding simulation layout file for Modelsim is available under '''$SIMULATION_DIR/Stepper/stepperMotorController.do'''.
| + | |
− | It will automatically run the simulation if it has not been modified.
| + | |
− | | + | |
− | [[File:Kart_stepper_tester_sim.jpg|right|900px|Stepper motor tester]]
| + | |
− | | + | |
− | * The '''blue''' header shows which test is performed
| + | |
− | * The '''yellow''' signals are those generated by the tester
| + | |
− | * The '''purple''' signals are the one generated by your implementation
| + | |
− | * The '''green''' signals are internal ones
| + | |
− | * ''You can add and remove signals at will, they will not interfere with the tests''
| + | |
− | | + | |
− | === Testing ===
| + | |
− | The following tests are performed :
| + | |
− | * The '''prescaler''' is set, outputting pulses on '''stepEn'''
| + | |
− | * A '''target''' of 250 is set, expecting the '''coils''' to stay at '0'
| + | |
− | * The '''restart''' signal pulses (both '''one pulse''' or '''constant '1'''' are valid), expecting the '''coils''' to turn as '''4-3-2-1-4...'''
| + | |
− | * The '''endSwitch''' pulses, which should reset '''actual''' to 0 and begin moving '''coils''' to target 250 in order '''1-2-3-4-1...'''
| + | |
− | * The '''reached''' signal should be '1' when 250 pulses have been made
| + | |
− | * A '''target''' of 500 is set, expecting same behavior as before
| + | |
− | * A '''target''' of 1000 is set, expecting same behavior as before
| + | |
− | * A '''target''' of 0 is set, expecting same behavior as before but the '''coils''' sequencing as '''4-3-2-1-4...'''
| + | |
− | * The '''endSwitch''' creates a pulse a bit after the '''actual''' signal reaches 0, ensuring coils stop moving when target 0 is reached
| + | |
− | * A '''target''' of 500 is set, expecting same behavior as before
| + | |
− | * The '''restart''' signal pulses while the '''sensorLeft''' is inverted, expecting the '''coils''' to turn as '''1-2-3-4-1...'''
| + | |
− | * '''stepperEnd''' pulses, '''coils''' should stop and '''reached''' should rise
| + | |
− | | + | |
− | The '''transcript''' window gives you details on if tests passed or not:
| + | |
− | * For the '''Coil1...4''' signals, you get <code>Coil direction OK</code> or <code>Coil direction error</code>.
| + | |
− | * For the '''reached''' signal, you get <code>Reached flag OK</code> or <code>Reached flag error</code>.
| + | |
− | * For the '''actual''' signal, you get <code>Position readback OK</code> or <code>Position readback error</code>.
| + | |
| | | |
| [[Category:Kart]] | | [[Category:Kart]] |