2024-08-26 20:47:04 +03:00

29 KiB

Management of 8 independend steppers

Eighth stepper could be changed to 8 dependent multiplexed. Based on STM32F303VDT6.

Pinout

(all GPIO outs are push-pull if not mentioned another)

Sorted by pin number

Pin # Pin name function settings comment
1 PE2 DIAG in diag output of TMC
2 PE3 MUL0 slow out multiplexer address
3 PE4 MUL1 slow out for DIAG input
4 PE5 MUL2 slow out
5 PE6 MUL EN slow out enable mul.
6 (vbat) - -
7 PC13 M0 L1 slow in PU/out enable motor
8 PC14 M0 L0 slow in PU direction of motor
9 PC15 M0 DIR slow out limit-switch 0
10 PF9 M0 STEP AF clock of motor
11 PF10 M0 EN slow out l-s 0 or CS of SPI
12 (OSC IN)
13 (OSC OUT)
14 (nrst) reset
15 PC0 MOTMUL0 slow out external motors
16 PC1 MOTMUL1 slow out multiplexer
17 PC2 MOTMUL2 slow out
18 PC3 MOTMUL EN slow out
19 PF2 ADC2 in10 ADC 5V in / 2
20 (VSSA)
21 (VREF+)
22 (VDDA)
23 PA0 ADC1 in1 ADC External ADC inputs
24 PA1 ADC1 in2 ADC
25 PA2 ADC1 in3 ADC
26 PA3 ADC1 in4 ADC
27 (VSS)
28 (VDD)
29 PA4 ADC2 in1 ADC Vdrive / 10
30 PA5 SPI1 SCK AF In case of SPI TMC
31 PA6 SPI1 MISO AF
32 PA7 SPI1 MOSI AF
33 PC4 USART1 Tx AF External USART
34 PC5 USART1 Rx AF
35 PB0 M7 STEP AF
36 PB1 M7 EN slow out
37 PB2 M7 DIR slow out
38 PE7 M7 L0 slow in PU
39 PE8 M7 L1 slow in PU/out
40 PE9 M6 STEP AF
41 PE10 M6 L1 slow in PU/out
42 PE11 M6 L0 slow in PU
43 PE12 M6 DIR slow out
44 PE13 M6 EN slow out
45 PE14 OUT2 slow in PU/out external GPIO
46 PE15 OUT1 slow in PU/out
47 PB10 USART3 Tx AF USART for 4 of TMC
48 PB11 OUT0 slow in PU/out
49 (VSS)
50 (VDD)
51 PB12 SCRN DCRS slow out screen commands
52 PB13 SCRN SCK AF SPI for screen
53 PB14 SCRN MISO AF
54 PB15 SCRN MOSI AF
55 PD8 SCRN RST slow out reset screen
56 PD9 SCRN CS slow out activate screen
57 PD10 M5 L1 slow in PU/out
58 PD11 M5 L0 slow in PU
59 PD12 M5 STEP AF
60 PD13 M5 DIR slow out
61 PD14 M5 EN slow out
62 PD15 M4 L1 slow in PU/out
63 PC6 M4 STEP AF
64 PC7 M4 L0 slow in PU
65 PC8 M4 DIR slow out
66 PC9 M4 EN slow out
67 PA8 USBpu slow out PP USB DP pullup
68 PA9 BTN1 slow in PU buttons to operate
69 PA10 BTN2 (SDA) slow in PU/AF with screen
70 PA11 USB DM AF USB
71 PA12 USB DP AF
72 PA13 SWDIO dflt dbg/flash
73 PF6 BTN3 (SCL) slow in PU/AF (possible I2C2)
74 (VSS)
75 (VDD)
76 PA14 SWCLK dflt debug/sew
77 PA15 M3 STEP AF
78 PC10 M3 L0 slow in PU
79 PC11 M3 L1 slow in PU/out
80 PC12 M3 DIR slow out
81 PD0 CAN Rx AF CAN bus
82 PD1 CAN Tx AF
83 PD2 M3 EN slow out
84 PD3 BTN4 slow in PU
85 PD4 BTN5 slow in PU
86 PD5 BTN6 slow in PU
87 PD6 M2 L1 slow in PU
88 PD7 M2 L0 slow in PU/out
89 PB3 USART2 Tx AF USART for 4 of TMC
90 PB4 M2 DIR slow out
91 PB5 M2 STEP AF
92 PB6 M2 EN slow out
93 PB7 M1 L1 slow in PU/out
94 (BOOT0) boot mode
95 PB8 M1 STEP AF
96 PB9 M1 L0 slow in PU
97 PE0 M1 DIR slow out
98 PE1 M1 EN slow out
99 (VSS)
100 (VDD)

Some comments.

DIAG input used to detect problems with TMC drivers (multiplexed by MUL outputs).

Each motor have next control signals: EN - enable driver, DIR - rotation direction, STEP - microstepping clock signal, L0 - zero end-switch, L1 - max end-switch (or Cable Select for SPI-based TMC).

MOTMUL - external multiplexer or other GPIO signals (e.g. to manage of 64 stepper motors).

ADC1 in - four external ADC signals (0..3.3V).

SPI1 used to manage TMC drivers in case of SPI-based.

USART1 - to connect external something (master or slave).

OUT - external GPIO.

USART2 Tx used to manage USART-based TMC (numbers 0-3).

USART3 Tx used to manage USART-based TMC (numbers 4-7).

SCRN - control signals for SPI TFT screen.

BTN - external button, keypad, joystick etc. Two of them could be connected to I2C devices.

USB and CAN used as main device control buses.

SW used as debugging/flashing.

Sorted by ports (with AF numbers).

Pin # Pin name function settings comment
23 PA0 ADC1 in1 ADC External ADC inputs
24 PA1 ADC1 in2 ADC
25 PA2 ADC1 in3 ADC
26 PA3 ADC1 in4 ADC
29 PA4 ADC2 in1 ADC Vdrive / 10
30 PA5 SPI1 SCK AF5 In case of SPI TMC
31 PA6 SPI1 MISO AF5
32 PA7 SPI1 MOSI AF5
67 PA8 BTN0 slow in PU Buttons/joystick
68 PA9 BTN1 slow in PU to operate with
69 PA10 BTN2 (SDA) slow in PU/AF4 screen
70 PA11 USB DM USB USB
71 PA12 USB DP USB
72 PA13 SWDIO/USBpu dflt/slow out USB pullup or dbg
76 PA14 SWCLK dflt debug/sew
77 PA15 M3 STEP AF1 (T2ch1)
35 PB0 M7 STEP AF2 (T3ch3)
36 PB1 M7 EN slow out
37 PB2 M7 DIR slow out
89 PB3 USART2 Tx AF7 USART for 4 of TMC
90 PB4 M2 DIR slow out
91 PB5 M2 STEP AF10 (T17ch1)
92 PB6 M2 EN slow out
93 PB7 M1 L1 slow in PU/out
95 PB8 M1 STEP AF1 (T16ch1)
96 PB9 M1 L0 slow in PU
47 PB10 USART3 Tx AF7 USART for 4 of TMC
48 PB11 OUT0 slow in PU/out
51 PB12 SCRN DCRS slow out screen commands
52 PB13 SCRN SCK AF5 SPI for screen
53 PB14 SCRN MISO AF5
54 PB15 SCRN MOSI AF5
15 PC0 MOTMUL0 slow out external motors
16 PC1 MOTMUL1 slow out multiplexer
17 PC2 MOTMUL2 slow out
18 PC3 MOTMUL EN slow out
33 PC4 USART1 Tx AF7 External USART
34 PC5 USART1 Rx AF7
63 PC6 M4 STEP AF4 (T8ch1)
64 PC7 M4 L0 slow in PU
65 PC8 M4 DIR slow out
66 PC9 M4 EN slow out
78 PC10 M3 L0 slow in PU
79 PC11 M3 L1 slow in PU/out
80 PC12 M3 DIR slow out
7 PC13 M0 L1 slow in PU/out enable motor
8 PC14 M0 L0 slow in PU direction of motor
9 PC15 M0 DIR slow out limit-switch 0
81 PD0 CAN Rx AF7 CAN bus
82 PD1 CAN Tx AF7
83 PD2 M3 EN slow out
84 PD3 BTN4 slow in PU
85 PD4 BTN5 slow in PU
86 PD5 BTN6 slow in PU
87 PD6 M2 L1 slow in PU
88 PD7 M2 L0 slow in PU/out
55 PD8 SCRN RST slow out reset screen
56 PD9 SCRN CS slow out activate screen
57 PD10 M5 L1 slow in PU/out
58 PD11 M5 L0 slow in PU
59 PD12 M5 STEP AF2 (T4ch1)
60 PD13 M5 DIR slow out
61 PD14 M5 EN slow out
62 PD15 M4 L1 slow in PU/out
97 PE0 M1 DIR slow out
98 PE1 M1 EN slow out
1 PE2 DIAG slow in PU diag output of TMC
2 PE3 MUL0 slow out multiplexer address
3 PE4 MUL1 slow out for DIAG input
4 PE5 MUL2 slow out
5 PE6 MUL EN slow out enable mul.
38 PE7 M7 L0 slow in PU
39 PE8 M7 L1 slow in PU/out
40 PE9 M6 STEP AF2 (T1ch1)
41 PE10 M6 L1 slow in PU/out
42 PE11 M6 L0 slow in PU
43 PE12 M6 DIR slow out
44 PE13 M6 EN slow out
45 PE14 OUT2 slow in PU/out external GPIO
46 PE15 OUT1 slow in PU/out
19 PF2 ADC2 in10 ADC 5V in / 2
73 PF6 BTN3 (SCL) slow in PU/AF4 (possible I2C2)
10 PF9 M0 STEP AF3 (T15ch1) clock of motor
11 PF10 M0 EN slow out l-s 0 or CS of SPI

DMA usage

  • ADC1 - DMA1_ch1
  • ADC2 - DMA2_ch1

Stepper drivers connection

After changing stepper type by soldering/desoldering appropriate jumpers, don't forget to change their types in settings (and save settings in MSU flash memory after checking it with dumpconf).

Connection diagram for soldering jumpers shown on reverse side of PCB.

Jumpers A, B and C allow to short the contacts of driver's pins 6 (CLK / DCO / ~SLEEP), 5 (PDN_UART / SDO / ~RESET) and 4 (SPREAD / CS / M2), respectively.

Jumper D1 connects MCU UART output with jumper E1, D2 connects MCU MISO with same contact of E1. Jumpers E1 and E2 allows to pullup pin 5 of driver to be connected with 3.3V or UART/MISO.

Jumper F1 allows to connect pin 4 to CS line. F2 connects pin 4 to 3.3V.

Jumper G1 connects pin 3 (MS2 / SCK / M1) to SCK line. G2 connects this pin to 3.3V.

Jumper H1 connects pin pin 2 (MS1 / SDI / M0) to MOSI line H2 connects it to 3.3V.

So, depending on driver type and its mode you can solder these jumpers so, than driver can work over PDN-UART, SPI or configuration pins can select microstepping directly.

DRV8825 and other simplest drivers

Solder jumpers E2, B and A to connect ~RST and ~SLP to 3.3V.

Microstepping selection produced by soldering H2 (bit0), G2 (bit1) and/or C (bit2).

TMC2209 and other PDN-UART based

Solder jumpers D1 and E1 to connect MCU UART2/UART3 to PDN-UART pin of driver. Solder jumpers G2/H2 according address table (X - soldered, O - not soldered):

Address G2 H2
0 O O
1 O X
2 X O
3 X X
4 O O
5 O X
6 X O
7 X X

TMC2130 and other SPI based

(not negotiated yet)

Solder jumpers D2 and E1 to connect MISO, F1 to connect CS, G1 for SCK and H1 for MOSI.

Protocol

Errors

Error codes are in brackets:

  • OK (0) - all OK;
  • BADPAR (1) - bad parameter (N) value (e.g. greater than max available or absent);
  • BADVAL (2) - bad setter value (absent, text or over range);
  • WRONGLEN (3) - (only for CAN bus, you can't meet in text protocol) wrong CAN message length;
  • BADCMD (4) - unknown command, in case of USB proto user will see full command list instead of this error;
  • CANTRUN (5) - can't run required function.

USB

Used simple text protocol each string should contain one command and ends with '\n'. Uppercase N at the end of command means parameter number (No of motor, button, ADC channel etc). Getters and action commands have simplest format command[N]: some commands have no parameter, other have two variants - with and without parameter; wariant without parameter will act on all parameters (e.g. getter for all buttons) - in this case N enclosed in square brackets. Setters have format command[N] = value. The value is integer number, so in case floating values you need to multiply it by 1000 and write result. So, voltage and temperature are measured in millivolts and thousandths of degC respectively.

Some commands (especially that have no CAN analogue) have non-standard format described later. They are not intended to be used in automatic control systems, only in manual mode.

Answer for every (excluding special) setter and getter in case of success is command[N]=value showing current value for getter or new value for setter. In case of error you will see one of error mesages (message OK with errcode=0 usually not shown). Also you can get such answers:

  • BADCMD - wrong command (not in dictionary);
  • BADARGS - bad arguments format (e.g. for command cansend etc);
  • FAIL - if something wrong and parser got impermissible error code.

In following list letter G means "getter", S - "setter", no of them - custom USB-only command. The number in brackets is CAN command code. The asterisk following command means that it isn't implemented yet (and maybe will be never implemented).

absposN (35) GS

Absolute stepper position in steps, setter just changes current value. E.g. you want to set current position as zero (be carefull: gotoz will zero position again on a zero-point limit switch). Maximum absolute value is maxstepsN.

accelN (17) GS

Stepper acceleration/deceleration on ramp (steps/s^2), only positive. Maximum value is ACCELMAXSTEPS from flash.h.

adcN (4) G

ADC value (N=0..3).

buttonN (5) G

Given (N=0..6) buttons' state. If number is right, returns two strings: buttonN=state (where state is none, press, hold or release) and buttontmN=time (where time is time from start of last event).

!!!NOTE: Button numbering starts from 0, not 1 as shown on PCB!!!

canerrcodes

Print last CAN errcodes. Print "No errors" or last error code.

canfilter DATA

CAN bus hardware filters, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]] . By default have two filters allowing to listen any CAN ID:

Filter 0, FIFO0 in MASK mode: ID=0x01, MASK=0x01
Filter 1, FIFO1 in MASK mode: ID=0x00, MASK=0x01

canflood ID DATA

Send or clear (if empty) flood message: ID byte0 ... byteN. On empy message return NO ID given, send nothing! (and stops flooding), or Message parsed OK.

canfloodT N

Flood period, N in milliseconds (N >= 0ms).

canid [ID]

Get or set CAN ID of device. Default CAN ID is "1".

canignore [ID]

Software ignore list (max 10 IDs), negative to delete all, non-negative to add next.

canincrflood ID

Send incremental flood message with given ID. Message have uint32_t little endian type and increments for each packet starting from 0. Empty command stops flooding (canflood too).

canpause

Pause filtered IN packets displaying. Returns Pause CAN messages.

canreinit

Reinit CAN with last settings. Returns OK.

canresume

Resume filtered IN packets displaying, returns RESUME CAN messages.

cansend ID [data]

Send data over CAN with given ID. If data is omitted, send empty message. In case of absence of ACK you can get message CAN bus is off, try to restart it.

canspeed N

CAN bus speed (in kbps, 50 <= N <= 1500) In case of setter, store new speed value in global parameters (and if you call saveconf later, it will be saved in flash memory).

canstat

Get CAN bus status: values of registers CAN->MSR, CAN->TSR, CAN->RF0R and CAN->RF1F.

diagn[N] (37) G *

DIAG state of motor N (or all)\n"

drvtypeN (45) GS

Nth driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved). This parameter is taken from .drvtype bits of motflags settings parameter.

dumperr

Dump error codes. Returns:

Error codes:
0 - OK
1 - BADPAR
2 - BADVAL
3 - WRONGLEN
4 - BADCMD
5 - CANTRUN

dumpcmd

Dump command codes. Returns all list of CAN bus command codes.

dumpconf

Dump current configuration. Returns a lot of information both common (like CAN bus speed, ID and so on) and for each motor driver. You can call independeng getters for each of this parameter.

dumpmotN

Dump configuration of Nth motor only.

dumpmotflags

Dump motor flags' bits (for motflagsN) and reaction to limit switches (eswreact) values:

Motor flags:
bit0 - 0: reverse - invert motor's rotation
bit1 - 1: [reserved]
bit2 - 2: [reserved]
bit3 - 3: donthold - clear motor's power after stop
bit4 - 4: eswinv - inverse end-switches (1->0 instead of 0->1)
bit5 - 5: [reserved]
bit6 - 6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved)
End-switches reaction:
0 - ignore end-switches
1 - stop @ esw in any moving direction
2 - stop only when moving in given direction (e.g. to minus @ESW0)

dumpstates

Dump motors' state codes (for getter stateN):

Motor's state codes:
0 - relax
1 - acceleration
2 - moving
3 - moving at lowest speed
4 - deceleration
5 - stalled (not used here!)
6 - error

emstop[N] (29 with N and 31 without)

Emergency stop Nth motor or all (if N absent). Returns OK or error text.

eraseflash [=N] (38)

Erase flash data storage (full or only N'th page of it). Use this option only if you have problems when try to save current configuration.

eswN (6) G

Get end-switches state. Return two bits (for limit switches 0 and 1): 1 means "active", 0 - "passive". If you use SPI-based driver, only one switch available, so return will be 1-bit.

eswreactN (24) GS

End-switches reaction: 0 - ignore, 1 - stop on any limit switch (both 0 and 1; moving will be available only backwards), 2 - stop only on switch 0. You can modify this values on-the-fly (but only when steppers aren't moving). This can be usefull, for example, to rotate filter turret into given position using switch 1 to both as limit switch and position stopper. But even in state 0 (ignore) active state of both switches estimates as error and you won't be able to move motor.

gotoN (26) GS

Move motor to given absolute position.

gotozN (32)

Find zero position & refresh counters. The motor would rotate in reverse direction until limit switch 0 acts or amount of steps (parameter maxsteps of configuration) is exhausted.

gpioconfN* GS

GPIO configuration (0 - PUin, 1 - PPout, 2 - ODout), N=0..2.

gpio[N]* (12) GS

GPIO values, N=0..2. Without N run for all GPIOs (each byte is state: 0/1). By default GPIOs are pulled up inputs.

help

Show this help.

maxspeedN (18) GS

Maximal motor speed (steps per sec). Depends on current microstep configuration. As speed depends on Nth motor's timer settings, you can't give any value you want. Speed recalculated through ARR value:

ARR = 26MHz / microsteps / (speed - 1).

Minimal value of ARR is 99 (260kHz), maximal is 0xffff (600Hz). And after that actual speed value calculated:

speed = 26MHz / microsteps / (ARR + 1).

And it can't be greater than 0xffff. So if your motor really can make, let's say, 32000 steps per second, you can run it only for microstepping not more than 2.

maxstepsN (21) GS

Maximal steps amount (from zero ESW) for given motor. This is limiting positive position and amount of steps to make when searching of zero limit switch.

mcut (7) G

Temperature of MCU in thousandths of degC.

mcuvdd (8) G

MCU Vdd value.

microstepsN (16) GS

Microsteps settings (2^0..2^9). Read maxspeed about relationship of maximal speed and microsteppings.

minspeedN (19) GS

Minimal motor speed (steps per sec), this is the starting speed of motor's ramp and default speed for relslow command, so don't try to make it too large.

motcurrentN (46) GS

Maximal motor current (1..32 for 1/32..32/32 of max current) for TMC drivers. In case of simplest drivers like DRV8825 you should set current using varistor on driver's board.

motflagsN (23) GS

Nth motor flags. To understand bit fields of these flags use dumpmotflags.

motmul * (36) GS

external multiplexer status (<0 - disable, 0..7 - enable and set address).

motno (44) GS

Motor number for next pdn commands (if you want to run custom commands by hands or in a batch).

motreinit (25)

Re-init motors after configuration changed. Some changes will run this automatically.

pdnN (43) GS

Read/write TMC2209 (and other UART-based drivers) registers over uart @ motor number motno. For pdnN=X N is register number, X is data to write into it. Due to protocol's particulars you can't work with registers with address more than 126 (0x7e).

ping (1)

Echo given command back. For CAN bus return original packet, for USB - given argumemt and parameter (but checking parameter).

relposN (27) GS

Relative (with ramp) move for given amount of steps (get remaining steps for getter).

relslowN (28) GS

Like relpos but with constant slowest speed (you can change it with minspeed).

reset (9)

Software reset.

saveconf (13)

Save current configuration into MCU flash memory.

screen* GS

Enable (1) or disable (0) screen.

speedlimit (20) G

Get limiting speed for current microsteps setting.

stateN (33) G

Get Nth motor state (dumpstates: 0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err).

stopN (30)

Stop Nth motor with deceleration (moving by ramp).

time (10) G

Get time from start (ms).

tmcbus * GS

TMC control bus (0 - USART, 1 - SPI), unuseful command; use motflags instead.

udata* (39) GS

Data by usart in slave mode (text strings, '\n'-terminated).

usartstatus* (40)

GS status of USART1 (0 - off, 1 - master, 2 - slave).

vdrive (41) G

Approximate voltage on Vdrive input, millivolts.

vfive (42) G

Approximate voltage on 5V bus, millivolts.

CAN bus

Default CAN ID is 1. Protocol use variable length incoming messages: from 2 bytes for simplest commands to all 8 bytes for common. Bytes (in time order):

  • 0, 1 - little-endian command code.
  • 2 - parameter number (0..126), 127 means "no parameter", elder bit (0x80) is a setter flag (without it all rest part of message ignored).
  • 3 - (only in packets from controller) error code.
  • 4...8 - little-endian data.

Command codes described in USB answer for dumpcmd:

1 - ping
4 - adc
5 - button
6 - esw
7 - mcut
8 - mcuvdd
9 - reset
10 - time
12 - gpio
13 - saveconf
16 - microsteps
17 - accel
18 - maxspeed
19 - minspeed
20 - speedlimit
21 - maxsteps
23 - motflags
24 - eswreact
25 - motreinit
26 - goto
27 - relpos
28 - relslow
29 - emstop N
30 - stop
31 - emstop all
32 - gotoz
33 - state
35 - abspos
36 - motmul
37 - diagn
38 - eraseflash
39 - udata
40 - usartstatus
41 - vdrive
42 - vfive
43 - pdn
44 - motno
45 - drvtype

Error codes (dumperr):

0 - OK
1 - BADPAR
2 - BADVAL
3 - WRONGLEN
4 - BADCMD
5 - CANTRUN