From 3e865562062e27fc3b790e8d7366755beb815301 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 20 Aug 2024 17:25:26 +0300 Subject: [PATCH] Readme.md finished for current protocol --- F3:F303/Multistepper/Readme.md | 187 ++++++++++++++---- F3:F303/Multistepper/hardware.c | 2 +- F3:F303/Multistepper/multistepper.bin | Bin 30164 -> 44308 bytes .../Multistepper/multistepper.creator.user | 34 ++-- F3:F303/Multistepper/proto.c | 2 +- 5 files changed, 171 insertions(+), 54 deletions(-) diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index d65409c..82939a6 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -420,42 +420,157 @@ Dump motors' state codes (for getter `stateN`): ### 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: - "eraseflash [=N] (38) erase flash data storage (full or only N'th page of it)\n" - "esw[N] (6) G end-switches state\n" - "eswreactN (24) GS end-switches reaction (0 - ignore, 1 - stop@any, 2 - stop@zero)\n" - "gotoN (26) GS move motor to given absolute position\n" - "gotozN (32) find zero position & refresh counters\n" - "gpioconfN* - GS GPIO configuration (0 - PUin, 1 - PPout, 2 - ODout), N=0..2\n" - "gpioN* (12) GS GPIO values, N=0..2\n" -help - "maxspeedN (18) GS max speed (steps per sec)\n" - "maxstepsN (21) GS max steps (from zero ESW)\n" - "mcut (7) G MCU T\n" - "mcuvdd (8) G MCU Vdd\n" - "microstepsN (16) GS microsteps settings (2^0..2^9)\n" - "minspeedN (19) min speed (steps per sec)\n" - "motcurrentN (46) GS motor current (1..32 for 1/32..32/32 of max current)\n" - "motflagsN (23) motorN flags\n" - "motmul* (36) GS external multiplexer status (<0 - disable, 0..7 - enable and set address)\n" - "motno (44) GS motor number for next `pdn` commands\n" - "motreinit (25) re-init motors after configuration changed\n" - "pdnN (43) GS read/write TMC2209 registers over uart @ motor0\n" - "ping (1)- echo given command back\n" - "relposN (27) GS relative move (get remaining)\n" - "relslowN (28) GS like 'relpos' but with slowest speed\n" - "reset (9) software reset\n" - "saveconf (13) save current configuration\n" - "screen* - GS screen enable (1) or disable (0)\n" - "speedlimit (20) G limiting speed for current microsteps setting\n" - "stateN (33) G motor state (0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err)\n" - "stopN (30) stop motor with deceleration\n" - "time (10) G time from start (ms)\n" - "tmcbus* - GS TMC control bus (0 - USART, 1 - SPI)\n" - "udata* (39) GS data by usart in slave mode (text strings, '\\n'-terminated)\n" - "usartstatus* (40) GS status of USART1 (0 - off, 1 - master, 2 - slave)\n" - "vdrive (41) G approx voltage on Vdrive\n" - "vfive (42) G approx voltage on 5V bus\n" + 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. \ No newline at end of file +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 + diff --git a/F3:F303/Multistepper/hardware.c b/F3:F303/Multistepper/hardware.c index 3fe8aee..7244b1c 100644 --- a/F3:F303/Multistepper/hardware.c +++ b/F3:F303/Multistepper/hardware.c @@ -194,7 +194,7 @@ TRUE_INLINE void iwdg_setup(){ static void setup_mpwm(int i){ volatile TIM_TypeDef *TIM = mottimers[i]; TIM->CR1 = TIM_CR1_ARPE; // buffered ARR - TIM->PSC = MOTORTIM_PSC; // 16MHz + TIM->PSC = MOTORTIM_PSC; // 26MHz // PWM mode 1 (active -> inactive) uint8_t n = mottchannels[i]; switch(n){ diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 97ee936a5428b664c8e02e09bd5a58809a119e0d..77b79235c79e0521a3681211144bba078ab2efcf 100755 GIT binary patch literal 44308 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 WbNLYB+&}#0uHRo#)Ne{T?EV7}3cz>( diff --git a/F3:F303/Multistepper/multistepper.creator.user b/F3:F303/Multistepper/multistepper.creator.user index c02f8ee..de3975f 100644 --- a/F3:F303/Multistepper/multistepper.creator.user +++ b/F3:F303/Multistepper/multistepper.creator.user @@ -1,10 +1,10 @@ - + EnvironmentId - {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} + {7bd84e39-ca37-46d3-be9d-99ebea85bc0d} ProjectExplorer.Project.ActiveTarget @@ -39,9 +39,9 @@ 1 0 false - false + true false - 1 + 0 true true 0 @@ -50,10 +50,10 @@ false 1 true - true + false true *.md, *.MD, Makefile - true + false true true @@ -69,14 +69,16 @@ true true + false + 0 true true true Builtin.DefaultTidyAndClazy - 4 + 8 true @@ -91,12 +93,12 @@ Desktop Desktop Desktop - {91347f2c-5221-46a7-80b1-0a054ca02f79} + {65a14f9e-e008-4c1b-89df-4eaa4774b6e3} 0 0 0 - /home/eddy/Docs/SAO/ELECTRONICS/STM32/F3-srcs/Multistepper + /Big/Data/00__Electronics/STM32/F303-nolib/Multistepper @@ -106,8 +108,8 @@ GenericProjectManager.GenericMakeStep 1 - Сборка - Сборка + Build + Build ProjectExplorer.BuildSteps.Build @@ -119,8 +121,8 @@ GenericProjectManager.GenericMakeStep 1 - Очистка - Очистка + Clean + Clean ProjectExplorer.BuildSteps.Clean 2 @@ -128,15 +130,15 @@ false - По умолчанию + Default GenericProjectManager.GenericBuildConfiguration 1 0 - Развёртывание - Развёртывание + Deploy + Deploy ProjectExplorer.BuildSteps.Deploy 1 diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index 27ef830..38f38c9 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -488,7 +488,7 @@ static int canusb_function(uint32_t hash, char *args){ const char *n = getnum(args, &N); if(n != args){ // get parameter if(N >= CANMESG_NOPAR){ - USND("Wrong parameter value"); + USB_sendstr(errtxt[ERR_BADPAR]); newline(); return RET_GOOD; } par = (uint8_t) N;