mirror of
https://github.com/eddyem/stm32samples.git
synced 2025-12-06 10:45:11 +03:00
322 lines
8.7 KiB
Markdown
322 lines
8.7 KiB
Markdown
Loopback control of three stepper motors
|
|
========================================
|
|
|
|
|
|
# Pinout
|
|
|
|
- **PA0** Enc2a (motor2 encoder)
|
|
- **PA1** Enc2b
|
|
- **PA2** CLK1 (motor1 clock)
|
|
- **PA3** ADC1 (ADC1 in, 0-3.3V)
|
|
- **PA4** CLK2 (motor2 clock)
|
|
- **PA5** ADC2 (ADC2 in, 0-3.3V)
|
|
- **PA6** CLK3 (motor3 clock)
|
|
- **PA7** PWM (opendrain PWM, up to 12V)
|
|
- **PA8** Enc1a (motor1 encoder)
|
|
- **PA9** Enc1b
|
|
- **PA10** BTN1 (user button 1)
|
|
- **PA11** USBDM
|
|
- **PA12** USBDP
|
|
- **PA13** BTN2 (user button 2)
|
|
- **PA14** BTN3 (user button 3)
|
|
- **PA15** BTN4 (user button 4)
|
|
- **PB0** ~EN1 (motor1 not enable)
|
|
- **PB1** DIR1 (motor1 direction)
|
|
- **PB2** ~EN2 (motor2 not enable)
|
|
- **PB3** Buzzer (external buzzer or other non-inductive opendrain load up to 12V)
|
|
- **PB4** Enc3a (motor3 encoder)
|
|
- **PB5** Enc3b
|
|
- **PB6** I2C SCL (external I2C bus, have internal pullups of 4.7kOhm to +3.3V)
|
|
- **PB7** I2C SDA
|
|
- **PB8** CAN Rx (external CAN bus, with local galvanic isolation
|
|
- **PB9** CAN Tx
|
|
- **PB10** DIR2 (motor2 direction)
|
|
- **PB11** ~EN3 (motor3 not enable)
|
|
- **PB12** DIR3 (motor3 direction)
|
|
- **PB13** Ext0 (3 external outputs: 5V, up to 20mA)
|
|
- **PB14** Ext1
|
|
- **PB15** Ext2
|
|
- **PC13** ESW1 (motor1 zero limit switch)
|
|
- **PC14** ESW2 (motor2 zero limit switch)
|
|
- **PC15** ESW3 (motor3 zero limit switch)
|
|
- **PF0** Relay (10A 250VAC, 10A 30VDC)
|
|
|
|
# Connectors
|
|
|
|
## ADC inputs connector, J1
|
|
|
|
1. ADC1 (up to 3.3V)
|
|
2. ADC2 (up to 3.3V)
|
|
3. GND
|
|
|
|
## Encoders connectors, J2-J4
|
|
|
|
1. GND
|
|
2. Encoder B phase
|
|
3. Encoder A phase
|
|
4. +5V (through resistor 22Ohm)
|
|
|
|
## I2C connector, J5
|
|
|
|
1. +3.3V
|
|
2. SCL
|
|
3. SDA
|
|
4. GND
|
|
|
|
## PWM connector, J6
|
|
1. +3.3V
|
|
2. +5V
|
|
3. PWM GND (opendrain)
|
|
|
|
## CAN bus connector, J7
|
|
|
|
1. CANL (low signal)
|
|
2. CANGND (common - not need for short lines)
|
|
3. CANH (high signal)
|
|
|
|
## External buttons connector (WARNING! NO ESD PROTECTION!), J8
|
|
|
|
1. Button 1
|
|
2. Button 2
|
|
3. Button 3
|
|
4. Button 4
|
|
5. GND
|
|
|
|
## External Hall sensors connector (zero limit switches), J9
|
|
|
|
1. +3.3V (through resistor 47Ohm)
|
|
2. Motor1 limit switch
|
|
3. Motor2 limit switch
|
|
4. Motor3 limit switch
|
|
5. GND
|
|
|
|
## Relay connector, J10
|
|
|
|
1. Normally opened
|
|
2. Common
|
|
3. Normally closed
|
|
|
|
## 24V input power connector, J12
|
|
|
|
1. GND
|
|
2. +24V DC
|
|
|
|
## 24V motors power connector, J13
|
|
|
|
1. GND
|
|
2. +24V DC to motors' coils (reverse protected)
|
|
|
|
## Stepper motors control signals connectors, J14-J16
|
|
|
|
1. CLK (step signal)
|
|
2. DIR (rotation direction)
|
|
3. ~EN (not enable)
|
|
4. GND
|
|
|
|
## External 5V logic outputs connector (up to 20mA per each channel), J17
|
|
|
|
1. Ext0
|
|
2. Ext1
|
|
3. Ext2
|
|
4. GND
|
|
|
|
## External buzzer (or other load) connector (opendrain, up to 12V), J18
|
|
|
|
1. power (depending on JP1 jumper): 3.3V or 5.0V
|
|
2. GND (opendrain)
|
|
|
|
# Control points
|
|
|
|
- **TP1** 5V
|
|
- **TP2** 3.3V
|
|
- **TP3** NRST
|
|
- **TP4** GND
|
|
|
|
# Firmware download
|
|
|
|
Activate "Jump to DFU" menu entry through USB protocol. Flash MCU by `dfu-util`.
|
|
|
|
# USB protocol
|
|
https://github.com/eddyem/stm32samples/tree/master/F0-nolib/3steppersLB build#138 @ 2021-12-02
|
|
Common commands format is cmd[ N[ = val]]
|
|
where N is command argument (0..127), val is its value
|
|
Different commands:
|
|
adc - get ADC values
|
|
button - get buttons state (return time of last event & ERRCODE == buttonstate)
|
|
buzzer - change buzzer state (1/0)
|
|
esw - get end switches state (without number - all, by bytes)
|
|
ext - external outputs (without number - all, by bytes; value= 0-off, 1-on, other-toggle)
|
|
mcut - get MCU T
|
|
mcuvdd - get MCU Vdd
|
|
ping - echo given command back
|
|
pwm - pwm value
|
|
relay - change relay state (1/0)
|
|
reset - reset MCU
|
|
time - get time from start
|
|
Confuguration:
|
|
accel - set/get accel/decel (steps/s^2)
|
|
encrev - set/get max encoder's pulses per revolution
|
|
encstepmax - maximal encoder ticks per step
|
|
encstepmin - minimal encoder ticks per step
|
|
eswreact - end-switches reaction
|
|
maxspeed - set/get max speed (steps per sec)
|
|
maxsteps - set/get max steps (from zero)
|
|
microsteps - set/get microsteps settings
|
|
minspeed - set/get min speed (steps per sec)
|
|
motflags - set/get motorN flags
|
|
saveconf - save current configuration
|
|
speedlimit - get limiting speed for current microsteps
|
|
Motors' commands:
|
|
abspos - set/get position (in steps)
|
|
emerg - emergency stop all motors
|
|
emstop - emergency stop motor (right now)
|
|
encpos - set/get encoder's position
|
|
gotoz - find zero position & refresh counters
|
|
motreinit - re-init motors after configuration changed
|
|
relpos - set relative steps, get remaining
|
|
relslow - set relative steps @ lowest speed
|
|
setpos - set/get absolute position (in steps)
|
|
state - get motor state
|
|
stop - smooth motor stopping
|
|
USB-only commands:
|
|
canid - get/set CAN ID
|
|
canspeed - CAN bus speed
|
|
delignlist - delete ignore list
|
|
dfu - activate DFU mode
|
|
dumperr - dump error codes
|
|
dumpcmd - dump command codes
|
|
dumpconf - dump current configuration
|
|
eraseflash - erase flash data storage
|
|
filter - add/modify filter, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]]
|
|
getctr - get TIM1/2/3 counters
|
|
ignbuf - print ignore buffer
|
|
ignore - add ID to ignore list (max 10 IDs)
|
|
listfilters - list all active filters
|
|
pause - pause IN packets displaying
|
|
resume - resume IN packets displaying
|
|
send - send data over CAN: send ID byte0 .. byteN
|
|
wd - check watchdog
|
|
|
|
# CAN bus protocol
|
|
|
|
bytes descr
|
|
0 Lcmd - command code
|
|
1 Hcmd
|
|
2 par - command paremeter (steper, ADC channel number etc)
|
|
3 err - error code (only in answer)
|
|
4 Ldata - optional data in int32_t
|
|
5
|
|
6
|
|
7 Hdata
|
|
|
|
dumperr
|
|
Error codes:
|
|
0 - all OK
|
|
1 - wrong parameter's value
|
|
2 - wrong setter of parameter
|
|
3 - bad message length
|
|
4 - unknown command
|
|
5 - temporary can't run given command
|
|
|
|
|
|
dumpcmd
|
|
Commands list:
|
|
1 - echo given command back
|
|
2 - change relay state (1/0)
|
|
3 - change buzzer state (1/0)
|
|
4 - get ADC values
|
|
5 - get buttons state
|
|
6 - get end switches state
|
|
7 - get MCU T
|
|
8 - get MCU Vdd
|
|
9 - reset MCU
|
|
10 - get time from start
|
|
11 - pwm value
|
|
12 - external outputs
|
|
13 - save current configuration
|
|
14 - minimal encoder ticks per step
|
|
15 - maximal encoder ticks per step
|
|
16 - set/get microsteps settings
|
|
17 - set/get accel/decel (steps/s^2)
|
|
18 - set/get max speed (steps per sec)
|
|
19 - set/get min speed (steps per sec)
|
|
20 - get limiting speed for current microsteps
|
|
21 - set/get max steps (from zero)
|
|
22 - set/get max encoder's pulses per revolution
|
|
23 - set/get motorN flags
|
|
24 - end-switches reaction
|
|
25 - re-init motors after configuration changed
|
|
26 - move to/get absolute position (in steps)
|
|
27 - set relative steps, get remaining
|
|
28 - set relative steps @ lowest speed
|
|
29 - emergency stop motor (right now)
|
|
30 - smooth motor stopping
|
|
31 - emergency stop all motors
|
|
32 - find zero position & refresh counters
|
|
33 - get motor state
|
|
34 - set/get encoder's position
|
|
35 - set/get absolute position (in steps)
|
|
|
|
|
|
dumpconf
|
|
userconf_addr=0x08006000// address from which userconf started
|
|
userconf_idx=5 // "index of stored conf"
|
|
userconf_sz=68 // "magick number"
|
|
canspeed=100 // default CAN speed
|
|
canid=170 // identifier (0xaa)
|
|
microsteps0=32 // microsteps amount per step
|
|
accel0=1500 // acceleration/deceleration (steps/s^2)
|
|
maxspeed0=1501 // max motor speed (steps per second)
|
|
minspeed0=20 // min motor speed (steps per second)
|
|
maxsteps0=500000 // maximal amount of steps
|
|
encperrev0=4000 // encoders' counts per revolution
|
|
encperstepmin0=17 // min amount of encoder ticks per one step
|
|
encperstepmax0=23 // max amount of encoder ticks per one step
|
|
motflags0=0x2f // motor's flags
|
|
eswreaction0=0 // end-switches reaction (esw_react)
|
|
microsteps1=32
|
|
accel1=1500
|
|
maxspeed1=2000
|
|
minspeed1=20
|
|
maxsteps1=500000
|
|
encperrev1=4000
|
|
encperstepmin1=17
|
|
encperstepmax1=23
|
|
motflags1=0x2f
|
|
eswreaction1=0
|
|
microsteps2=32
|
|
accel2=1500
|
|
maxspeed2=2500
|
|
minspeed2=20
|
|
maxsteps2=500000
|
|
encperrev2=4000
|
|
encperstepmin2=17
|
|
encperstepmax2=23
|
|
motflags2=0x2f
|
|
eswreaction2=0
|
|
|
|
|
|
Motor flags:
|
|
bit0 - reversing motor rotation
|
|
bit1 - reversing encoder rotation
|
|
bit2 - have encoder
|
|
bit3 - clear power @ stop (don't hold motor when stopped)
|
|
bit4 - inverse end-switches (Work @ high level when this flag activated)
|
|
bit5 - keep current position (as servo motor)
|
|
|
|
Stepper states:
|
|
STP_RELAX, // 0 - no moving
|
|
STP_ACCEL, // 1 - start moving with acceleration
|
|
STP_MOVE, // 2 - moving with constant speed
|
|
STP_MVSLOW, // 3 - moving with slowest constant speed (end of moving)
|
|
STP_DECEL, // 4 - moving with deceleration
|
|
STP_STALL, // 5 - stalled
|
|
STP_ERR // 6 - wrong/error state
|
|
|
|
ESW reaction:
|
|
|
|
ESW_IGNORE, // 0 - don't stop @ end-switch
|
|
ESW_ANYSTOP, // 1 - stop @ esw in any moving direction
|
|
ESW_STOPMINUS, // 2 - stop only in negative moving
|
|
|