mmpp/STM32/steppers/Readme.md
2018-01-24 12:48:36 +03:00

166 lines
5.0 KiB
Markdown

Management of two stepper motors
================================
Based on STM32F030F4P6
## Pinout
|Pin | Type | Role |
|:---|:----:|:------------------------|
|PA0 | AIN | Steppers current |
|PA1 | AIN | Input voltage 12V |
|PA2 | AIN | EndSwitch1 of motor0 |
|PA3 | AIN | EndSwitch0 of motor0 |
|PA4 | PUPD | Tim14Ch1 - motor0 steps |
|PA5 | PUPD | Motor1 enable |
|PA6 | PUPD | Tim3Ch1 - motor1 steps |
|PA7 | PUPD | Motor1 direction |
|PA9 | OD | USART1 Tx |
|PA10| FIN | USART1 Rx |
|PA13| FINPU| EndSwitch0 of motor1 |
|PA14| FINPU| EndSwitch1 of motor1 |
|PB1 | PUPD | Turn off current sensor |
|PF0 | PUPD | Motor0 enable |
|PF1 | PUPD | Motor0 direction |
## Protocol
Any command have format "# CMD", where # is device ID (the_conf.devID) or "-1" if there's
only one device at the bus. After it can be any number of spaces and command symbols.
If the command recognized and it's right, `ALL OK` would be returnded. If the command is bad, answer
`BADCMD`. Error in command sintax: `ERR`. If the answer would take more than one line it would
be ends by `DATAEND`.
### First symbol of commands
* (nothing except spaces) - *ping* command, device with given ID answers: `ALIVE`
* **G** - one of the *Getters* (depending on next text)
* **M** - motors' manipulation
* **R** - make *MCU software reboot* (next `status` getter will return `SOFTRESET=1`)
* **S** - one of the *Setters*
* **W** - *write flash* command, use it to save new configuration data
All wrong commands will return `BADCMD`, commands with bad format or wrong number return `ERR`.
Commands with lot of output ends with `DATAEND`. Some commands (like flash write) will return
just `ALL OK` if succeed.
### Getters
Getters returning more than one field ends with `DATAEND` meaning that's all data.
* **A** - get *ADC value*
* **D** - Vdd value (*100 Volts), e.g. `VDD=330`
* **I** - total motors' current (*100 Amperes), e.g. `IMOT=123`
* **M** - motor's voltage (*100 Volts), e.g. `VMOT=1193`
* **C** - get *current configuration*, e.g.
```
CONFSZ=36
DEVID=0
V12NUM=1
V12DEN=10
I12NUM=1
I12DEN=1
V33NUM=1
V33DEN=1
ESWTHR=150
MOT0SPD=60
MOT1SPD=60
USARTSPD=115200
REVERSE0=0
REVERSE1=0
MAXSTEPS0=0
MAXSTEPS1=0
DATAEND
```
All variables here are fields of `user_conf` struct.
* **R** - get *raw ADC* values:
* 0 - Steppers current
* 1 - Input voltage 12V
* 2 - EndSwitch2 of motor1
* 3 - EndSwitch1 of motor1
* 4 - inner temperature
* 5 - vref
E.g.:
```
ADC[0]=4095
ADC[1]=2340
ADC[2]=4095
ADC[3]=4087
ADC[4]=1665
ADC[5]=1532
DATAEND
```
* **S** - get *motors' status*, e.g.
```
SOFTRESET=1
MOTOR0=STOP
POS0=-1
ESW00=ERR
ESW01=BTN
MOTOR1=STOP
POS1=-1
ESW10=HALL
ESW11=HALL
```
* **T** - get *MCU temperature*, e.g. `TEMP=365`
### Motors' manipulation
Next char should be '0' or '1' --- motor's number. If wrong, `Num>1` answer would be returned.
There's only two commands in this section:
* **Mnum** - move motor to *num* steps. Errors:
* **BadSteps** - *num* isn't a number
* **IsMoving** - motor is still moving, stop it before
* **OnEndSwitch** - the motor is on end-switch limiting moving in given direction
* **ZeroMove** - user wants to move for 0 steps
* **TooBigNumber** - amount of steps is greater than `MAXSTEPSx`
* **S** - stop motor
### Setters
Change of any setter takes place in MCU RAM immediately. To store them permanently run
*write flash* command.
* **C#num** - set current *speed* to *num* for motor #
* **D num** - set *denominator* to number *num*
* **E num** - set *numerator*
* **I num** - set *device ID*
* **M#num** - set maxsteps (*num* is 1..65535) for motor `#`
* **P num** - properties of internal pullup (0 - disabled, other or without `num` - enabled)
* **R#num** - set reverse for motor # (*num* == 0 turns reverse off, *num* == 1 turns it on)
* **S#num** - set *speed* (`motspd`) to *num* for motor #
* **T num** - set *end-switches threshold* (in ADU, near 0 for Hall switch, 2048 for user button
and 4096 for released state)
* **U num** - set *USART speed* to *num* bits per second
### Motor speed setters
To set motor speed to **N** steps per second, give command `C` or `S` with argument equal to
3000/N. E.g. to set current speed for DevID=0, motor0 to 50 steps per second give command `0SC050`.
### Denominator and numerator setters
Have naxt letter similar to ADC getter (**D** - Vdd, **I** - motors' I, or **M** - motors' U).
The value of numerator shouldn't be very large as uint32_t used in multiplications.
### Device ID setter
After this command device will immediately change it's ID, if you "lost" device after this
procedure you should reboot it or (if there's only one device on the bus) call it by "universal ID"
(-1).
### USART speed setter
The USART speed will be changed after next reset (e.g. by *MCU software reboot* command), so it
don't work without storing in the flash. Check it twice before writing as wrong numbers can make device
lost until next re-flashing.