From 59d8f8f515088da01b7ffb3269512a7449b84063 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 24 Feb 2023 23:29:34 +0300 Subject: [PATCH] fixed bugs in multistepper: eeprom in flash + adc, tested on TMC2130, but don't work on TMC2230 --- F0:F030,F042,F072/3steppersLB/flash.c | 4 +- F3:F303/Multistepper/adc.c | 7 +- F3:F303/Multistepper/commonproto.c | 18 +++-- F3:F303/Multistepper/flash.c | 93 +++++++++++++---------- F3:F303/Multistepper/flash.h | 2 +- F3:F303/Multistepper/hardware.c | 27 ++++--- F3:F303/Multistepper/hardware.h | 13 ++-- F3:F303/Multistepper/hashgen/hdr.c | 5 ++ F3:F303/Multistepper/hashgen/hdr.h | 1 + F3:F303/Multistepper/hashgen/helpcmds.in | 3 +- F3:F303/Multistepper/hashgen/testdic | 1 + F3:F303/Multistepper/main.c | 7 +- F3:F303/Multistepper/multistepper.bin | Bin 26096 -> 28340 bytes F3:F303/Multistepper/proto.c | 34 +++++++-- F3:F303/Multistepper/steppers.c | 75 +++++++----------- F3:F303/Multistepper/steppers.h | 6 +- F3:F303/Multistepper/usb.h | 2 +- F3:F303/Multistepper/version.inc | 4 +- 18 files changed, 172 insertions(+), 130 deletions(-) diff --git a/F0:F030,F042,F072/3steppersLB/flash.c b/F0:F030,F042,F072/3steppersLB/flash.c index 43a1d20..bef6a36 100644 --- a/F0:F030,F042,F072/3steppersLB/flash.c +++ b/F0:F030,F042,F072/3steppersLB/flash.c @@ -175,10 +175,10 @@ static int erase_flash(const void *start, const void *end){ FLASH->AR = (uint32_t)Flash_Data + i * blocksize; FLASH->CR |= FLASH_CR_STRT; while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; - FLASH->SR |= FLASH_SR_EOP; + FLASH->SR = FLASH_SR_EOP; if(FLASH->SR & FLASH_SR_WRPRTERR){ ret = 1; - FLASH->SR |= FLASH_SR_WRPRTERR; + FLASH->SR = FLASH_SR_WRPRTERR; break; } } diff --git a/F3:F303/Multistepper/adc.c b/F3:F303/Multistepper/adc.c index d9e8293..8817bc3 100644 --- a/F3:F303/Multistepper/adc.c +++ b/F3:F303/Multistepper/adc.c @@ -77,7 +77,7 @@ void adc_setup(){ // ADC1: channels 1,2,3,4,16,18; ADC2: channels 1,10 ADC1->SMPR1 = ADC_SMPR1_SMP1 | ADC_SMPR1_SMP2 | ADC_SMPR1_SMP3 | ADC_SMPR1_SMP4; ADC1->SMPR2 = ADC_SMPR2_SMP16 | ADC_SMPR2_SMP18; - // 4 conversions in group: 1->2->3->4->16->18 + // 6 conversions in group: 1->2->3->4->16->18 ADC1->SQR1 = (1<<6) | (2<<12) | (3<<18) | (4<<24) | (NUMBER_OF_ADC1_CHANNELS-1); ADC1->SQR2 = (16<<0) | (18<<6); ADC2->SMPR1 = ADC_SMPR1_SMP1; @@ -134,8 +134,7 @@ uint16_t getADCval(int nch){ // get voltage @input nch (V) float getADCvoltage(int nch){ - float v = getADCval(nch); - v *= getVdd(); + float v = getADCval(nch) * 3.3; v /= 4096.f; // 12bit ADC #ifdef EBUG DBG("v="); printf(v); newline(); @@ -157,7 +156,7 @@ float getMCUtemp(){ return(temperature); } -// return Vdd (V) +// return ADC Vref (V) float getVdd(){ float vdd = ((float) *VREFINT_CAL_ADDR) * 3.3f; // 3.3V vdd /= getADCval(ADC_VREF); diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 68deeb6..c306fb9 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -55,17 +55,18 @@ errcodes cu_accel(uint8_t _U_ par, int32_t _U_ *val){ if(ISSETTER(par)){ if(*val/the_conf.microsteps[n] > ACCELMAXSTEPS || *val < 1) return ERR_BADVAL; the_conf.accel[n] = *val; + update_stepper(n); } *val = the_conf.accel[n]; return ERR_OK; } static const uint8_t extADCchnl[NUMBER_OF_EXT_ADC_CHANNELS] = {ADC_AIN0, ADC_AIN1, ADC_AIN2, ADC_AIN3}; -// V*10 +// V*100 errcodes cu_adc(uint8_t par, int32_t *val){ uint8_t n = PARBASE(par); if(n > NUMBER_OF_EXT_ADC_CHANNELS - 1) return ERR_BADPAR; - float v = getADCvoltage(extADCchnl[n])*10.f; + float v = getADCvoltage(extADCchnl[n])*100.f; *val = (int32_t)v; return ERR_OK; } @@ -93,7 +94,9 @@ errcodes cu_emstop(uint8_t _U_ par, int32_t _U_ *val){ errcodes cu_eraseflash(uint8_t _U_ par, int32_t _U_ *val){ NOPARCHK(par); - if(erase_storage()) return ERR_CANTRUN; + if(ISSETTER(par)){ + if(erase_storage(*val)) return ERR_BADVAL; + }else if(erase_storage(-1)) return ERR_CANTRUN; return ERR_OK; } @@ -109,6 +112,7 @@ errcodes cu_eswreact(uint8_t _U_ par, int32_t _U_ *val){ if(ISSETTER(par)){ if(*val < 0 || *val > ESW_AMOUNT-1) return ERR_BADVAL; the_conf.ESW_reaction[n] = *val; + update_stepper(n); } *val = geteswreact(n); return ERR_OK; @@ -188,6 +192,7 @@ errcodes cu_maxspeed(uint8_t _U_ par, int32_t _U_ *val){ if(ISSETTER(par)){ if(*val <= the_conf.minspd[n]) return ERR_BADVAL; the_conf.maxspd[n] = getSPD(n, *val); + update_stepper(n); } *val = the_conf.maxspd[n]; return ERR_OK; @@ -229,6 +234,7 @@ errcodes cu_microsteps(uint8_t _U_ par, int32_t _U_ *val){ if(m != 1< PCLK/(MOTORTIM_PSC+1)/(MOTORTIM_ARRMIN+1)) return ERR_BADVAL; the_conf.microsteps[n] = m; + update_stepper(n); } *val = the_conf.microsteps[n]; return ERR_OK; @@ -239,6 +245,7 @@ errcodes cu_minspeed(uint8_t _U_ par, int32_t _U_ *val){ if(ISSETTER(par)){ if(*val >= the_conf.maxspd[n]) return ERR_BADVAL; the_conf.minspd[n] = getSPD(n, *val); + update_stepper(n); } *val = the_conf.minspd[n]; return ERR_OK; @@ -248,6 +255,7 @@ errcodes cu_motflags(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); if(ISSETTER(par)){ the_conf.motflags[n] = *((motflags_t*)val); + update_stepper(n); } *(motflags_t*)val = the_conf.motflags[n]; return ERR_OK; @@ -334,14 +342,14 @@ errcodes cu_usartstatus(uint8_t _U_ par, int32_t _U_ *val){ // V*10 errcodes cu_vdrive(uint8_t par, int32_t _U_ *val){ NOPARCHK(par); - float v = getADCvoltage(ADC_VDRIVE)*100.f; + float v = getADCvoltage(ADC_VDRIVE)*1000.f; *val = (int32_t)v; return ERR_OK; } errcodes cu_vfive(uint8_t par, int32_t *val){ NOPARCHK(par); - float v = getADCvoltage(ADC_VFIVE)*20.f; + float v = getADCvoltage(ADC_VFIVE)*200.f; *val = (int32_t)v; return ERR_OK; } diff --git a/F3:F303/Multistepper/flash.c b/F3:F303/Multistepper/flash.c index c0dd0b4..d963443 100644 --- a/F3:F303/Multistepper/flash.c +++ b/F3:F303/Multistepper/flash.c @@ -46,7 +46,7 @@ static uint32_t maxCnum = 1024 / sizeof(user_conf); // can't use blocksize here ,.motflags = {DEFMF,DEFMF,DEFMF,DEFMF,DEFMF,DEFMF,DEFMF,DEFMF} \ ,.ESW_reaction = {ESW_IGNORE,ESW_IGNORE,ESW_IGNORE,ESW_IGNORE,ESW_IGNORE,ESW_IGNORE,ESW_IGNORE,ESW_IGNORE} \ } -static int erase_flash(const void*, const void*); + static int write2flash(const void*, const void*, uint32_t); // don't write `static` here, or get error: // 'memcpy' forming offset 8 is out of the bounds [0, 4] of object '__varsstart' with type 'uint32_t' @@ -89,7 +89,7 @@ static int binarySearch(int r, const uint8_t *start, int stor_size){ */ void flashstorage_init(){ if(FLASH_SIZE > 0 && FLASH_SIZE < 20000){ - uint32_t flsz = FLASH_SIZE * FLASH_blocksize; // size in bytes + uint32_t flsz = FLASH_SIZE * 1024; // size in bytes flsz -= (uint32_t)(&__varsstart) - FLASH_BASE; maxCnum = flsz / sizeof(user_conf); } @@ -107,7 +107,7 @@ int store_userconf(){ // for binarySearch() checking that there's nothing more after it! if(currentconfidx > (int)maxCnum - 3){ // there's no more place currentconfidx = 0; - if(erase_flash(Flash_Data, NULL)) return 1; + if(erase_storage(-1)) return 1; }else ++currentconfidx; // take next data position (0 - within first run after firmware flashing) return write2flash((const void*)&Flash_Data[currentconfidx], &the_conf, sizeof(the_conf)); } @@ -118,65 +118,81 @@ static int write2flash(const void *start, const void *wrdata, uint32_t stor_size FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } - while(FLASH->SR & FLASH_SR_BSY); - if(FLASH->SR & FLASH_SR_WRPERR){ - return 1; // write protection - } + while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; // clear all flags FLASH->CR |= FLASH_CR_PG; const uint16_t *data = (const uint16_t*) wrdata; volatile uint16_t *address = (volatile uint16_t*) start; + USB_sendstr("Start address="); printuhex((uint32_t)start); newline(); uint32_t i, count = (stor_size + 1) / 2; for(i = 0; i < count; ++i){ IWDG->KR = IWDG_REFRESH; *(volatile uint16_t*)(address + i) = data[i]; - while (FLASH->SR & FLASH_SR_BSY); + while (FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; + if(*(volatile uint16_t*)(address + i) != data[i]){ + USB_sendstr("DON'T MATCH!\n"); + ret = 1; + break; + } +#ifdef EBUG + else{ USB_sendstr("Written "); printuhex(data[i]); newline();} +#endif if(FLASH->SR & FLASH_SR_PGERR){ + USB_sendstr("Prog err\n"); ret = 1; // program error - meet not 0xffff break; } FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; } - FLASH->CR |= FLASH_CR_LOCK; // lock it back FLASH->CR &= ~(FLASH_CR_PG); return ret; } -/** - * @brief erase_flash - erase N pages of flash memory - * @param start - first address - * @param end - last address (or NULL if need to erase all flash remaining) - * @return 0 if succeed - */ -static int erase_flash(const void *start, const void *end){ +// erase Nth page of flash storage (flash should be prepared!) +static int erase_pageN(int N){ int ret = 0; - uint32_t nblocks = 1, flsz = 0; - if(!end){ // erase all remaining - if(FLASH_SIZE > 0 && FLASH_SIZE < 20000){ - flsz = FLASH_SIZE * FLASH_blocksize; // size in bytes - flsz -= (uint32_t)start - FLASH_BASE; - } - }else{ // erase a part - flsz = (uint32_t)end - (uint32_t)start; +#ifdef EBUG + USB_sendstr("Erase block #"); printu(N); newline(); +#endif + FLASH->AR = (uint32_t)Flash_Data + N*FLASH_blocksize; + FLASH->CR |= FLASH_CR_STRT; + while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; + FLASH->SR = FLASH_SR_EOP; + if(FLASH->SR & FLASH_SR_WRPERR){ /* Check Write protection error */ + ret = 1; + FLASH->SR = FLASH_SR_WRPERR; /* Clear the flag by software by writing it at 1*/ + } + return ret; +} + +// erase full storage (npage < 0) or its nth page; @return 0 if all OK +int erase_storage(int npage){ + int ret = 0; + uint32_t end = 1, start = 0, flsz = 0; + if(FLASH_SIZE > 0 && FLASH_SIZE < 20000){ + flsz = FLASH_SIZE * 1024; // size in bytes + flsz -= (uint32_t)Flash_Data - FLASH_BASE; + } + end = flsz / FLASH_blocksize; + if(end == 0 || end >= FLASH_SIZE) return 1; + if(npage > -1){ // erase only one page + if((uint32_t)npage >= end) return 1; + start = npage; + end = start + 1; } if((FLASH->CR & FLASH_CR_LOCK) != 0){ FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } - nblocks = flsz / FLASH_blocksize; - if(nblocks == 0 || nblocks >= FLASH_SIZE) return 1; - for(uint32_t i = 0; i < nblocks; ++i){ - IWDG->KR = IWDG_REFRESH; - while(FLASH->SR & FLASH_SR_BSY); - FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; - FLASH->CR |= FLASH_CR_PER; - FLASH->AR = (uint32_t)Flash_Data + i*FLASH_blocksize; - FLASH->CR |= FLASH_CR_STRT; - while(FLASH->SR & FLASH_SR_BSY); - FLASH->SR = FLASH_SR_EOP; - if(FLASH->SR & FLASH_SR_WRPERR){ /* Check Write protection error */ + /*USB_sendstr("size/block size/nblocks/FLASH_SIZE: "); printu(flsz); + USB_putbyte('/'); printu(FLASH_blocksize); USB_putbyte('/'); + printu(nblocks); USB_putbyte('/'); printu(FLASH_SIZE); newline(); USB_sendall();*/ + while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; + FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; + FLASH->CR |= FLASH_CR_PER; + for(uint32_t i = start; i < end; ++i){ + if(erase_pageN(i)){ ret = 1; - FLASH->SR |= FLASH_SR_WRPERR; /* Clear the flag by software by writing it at 1*/ break; } } @@ -184,9 +200,6 @@ static int erase_flash(const void *start, const void *end){ return ret; } -int erase_storage(){ - return erase_flash(Flash_Data, NULL); -} int fn_dumpconf(uint32_t _U_ hash, char _U_ *args){ // "dumpconf" (3271513185) #ifdef EBUG diff --git a/F3:F303/Multistepper/flash.h b/F3:F303/Multistepper/flash.h index e9523b5..21fcf75 100644 --- a/F3:F303/Multistepper/flash.h +++ b/F3:F303/Multistepper/flash.h @@ -72,5 +72,5 @@ extern user_conf the_conf; // global user config (read from FLASH to RAM) void flashstorage_init(); int store_userconf(); -int erase_storage(); +int erase_storage(int npage); diff --git a/F3:F303/Multistepper/hardware.c b/F3:F303/Multistepper/hardware.c index 3523aa5..832826b 100644 --- a/F3:F303/Multistepper/hardware.c +++ b/F3:F303/Multistepper/hardware.c @@ -18,6 +18,7 @@ #include "flash.h" #include "hardware.h" +#include "steppers.h" // Buttons: PA9, PA10, PF6, PD3, PD4, PD5, pullup (active - 0) volatile GPIO_TypeDef* const BTNports[BTNSNO] = {GPIOA, GPIOA, GPIOF, GPIOD, GPIOD, GPIOD}; @@ -76,11 +77,11 @@ static IRQn_Type motirqs[MOTORSNO] = { uint8_t ESW_state(uint8_t MOTno){ uint8_t val = 0; if(the_conf.isSPI){ // only ESW0 used - val = ((ESWports[MOTno][0]->IDR & ESWpins[MOTno][0]) ? 0 : 1); + val = ((ESWports[MOTno][0]->IDR & ESWpins[MOTno][0]) ? 1 : 0); if(the_conf.motflags[MOTno].eswinv) val ^= 1; return val; }else for(int i = 0; i < 2; ++i){ - val |= ((ESWports[MOTno][i]->IDR & ESWpins[MOTno][i]) ? 0 : 1) << i; + val |= ((ESWports[MOTno][i]->IDR & ESWpins[MOTno][i]) ? 1 : 0) << i; } if(the_conf.motflags[MOTno].eswinv) val ^= 3; return val; @@ -221,9 +222,13 @@ static void setup_mpwm(int i){ } +void mottimers_setup(){ + for(int i = 0; i < MOTORSNO; ++i) setup_mpwm(i); +} + void hw_setup(){ gpio_setup(); - for(int i = 0; i < MOTORSNO; ++i) setup_mpwm(i); + mottimers_setup(); #ifndef EBUG iwdg_setup(); #endif @@ -232,34 +237,34 @@ void hw_setup(){ // timers for motors: 0:t15c1, 1:t16c1, 2:t17c1, 3:t2ch1, 4:t8ch1, 5:t4c1, 6:t1c1, 7:t3c3 void tim1_cc_isr(){ - // addmicrostep(6); + addmicrostep(6); TIM1->SR = 0; } void tim2_isr(){ - // addmicrostep(3); + addmicrostep(3); TIM2->SR = 0; } void tim3_isr(){ - // addmicrostep(7); + addmicrostep(7); TIM3->SR = 0; } void tim4_isr(){ - // addmicrostep(5); + addmicrostep(5); TIM4->SR = 0; } void tim8_cc_isr(){ - // addmicrostep(4); + addmicrostep(4); TIM8->SR = 0; } void tim1_brk_tim15_isr(){ - // addmicrostep(0); + addmicrostep(0); TIM15->SR = 0; } void tim1_up_tim16_isr(){ - // addmicrostep(1); + addmicrostep(1); TIM16->SR = 0; } void tim1_trg_com_tim17_isr(){ - // addmicrostep(2); + addmicrostep(2); TIM17->SR = 0; } diff --git a/F3:F303/Multistepper/hardware.h b/F3:F303/Multistepper/hardware.h index ab7f766..41fb937 100644 --- a/F3:F303/Multistepper/hardware.h +++ b/F3:F303/Multistepper/hardware.h @@ -20,9 +20,10 @@ #include -// PCLK frequency +// "PCLK" frequency +// really APB1=36M -> TIM2/3/4/6/7 f=72M, APB2=72M -> TIM1/8/15/16/17/20 f=72M #ifndef PCLK -#define PCLK (48000000) +#define PCLK (72000000) #endif // motors' timer PSC = PCLK/Tfreq - 1, Tfreq=16MHz @@ -33,8 +34,10 @@ // USB pullup: PA8 #define USBPU_port GPIOA #define USBPU_pin (1<<8) -#define USBPU_ON() pin_clear(USBPU_port, USBPU_pin) -#define USBPU_OFF() pin_set(USBPU_port, USBPU_pin) +//#define USBPU_ON() pin_clear(USBPU_port, USBPU_pin) +//#define USBPU_OFF() pin_set(USBPU_port, USBPU_pin) +#define USBPU_ON() pin_set(USBPU_port, USBPU_pin) +#define USBPU_OFF() pin_clear(USBPU_port, USBPU_pin) // temporary LED: PD9 #define LED_blink() pin_toggle(GPIOD, 1<<9) @@ -86,4 +89,4 @@ extern volatile uint32_t Tms; uint8_t ESW_state(uint8_t MOTno); uint8_t MSB(uint16_t val); void hw_setup(); - +void mottimers_setup(); diff --git a/F3:F303/Multistepper/hashgen/hdr.c b/F3:F303/Multistepper/hashgen/hdr.c index 4896a8b..5cd0e95 100644 --- a/F3:F303/Multistepper/hashgen/hdr.c +++ b/F3:F303/Multistepper/hashgen/hdr.c @@ -54,6 +54,8 @@ int fn_dumperr(_U_ uint32_t hash, _U_ char *args) WAL; // "dumperr" (1223989764 int fn_dumpmotflags(_U_ uint32_t hash, _U_ char *args) WAL; // "dumpmotflags" (36159640) +int fn_dumpstates(_U_ uint32_t hash, _U_ char *args) WAL; // "dumpstates" (4235564367) + int fn_emstop(_U_ uint32_t hash, _U_ char *args) WAL; // "emstop" (2965919005) int fn_eraseflash(_U_ uint32_t hash, _U_ char *args) WAL; // "eraseflash" (3177247267) @@ -205,6 +207,9 @@ int parsecmd(const char *str){ case CMD_DUMPMOTFLAGS: return fn_dumpmotflags(h, args); break; + case CMD_DUMPSTATES: + return fn_dumpstates(h, args); + break; case CMD_EMSTOP: return fn_emstop(h, args); break; diff --git a/F3:F303/Multistepper/hashgen/hdr.h b/F3:F303/Multistepper/hashgen/hdr.h index e3e41c7..23349d8 100644 --- a/F3:F303/Multistepper/hashgen/hdr.h +++ b/F3:F303/Multistepper/hashgen/hdr.h @@ -35,6 +35,7 @@ int parsecmd(const char *cmdwargs); #define CMD_DUMPCONF (3271513185) #define CMD_DUMPERR (1223989764) #define CMD_DUMPMOTFLAGS (36159640) +#define CMD_DUMPSTATES (4235564367) #define CMD_EMSTOP (2965919005) #define CMD_ERASEFLASH (3177247267) #define CMD_ESW (2963094612) diff --git a/F3:F303/Multistepper/hashgen/helpcmds.in b/F3:F303/Multistepper/hashgen/helpcmds.in index 6b0f843..6d45092 100644 --- a/F3:F303/Multistepper/hashgen/helpcmds.in +++ b/F3:F303/Multistepper/hashgen/helpcmds.in @@ -20,8 +20,9 @@ "dumpcmd - dump command codes\n" "dumpconf - dump current configuration\n" "dumpmotflags - dump motor flags' bits\n" + "dumpstates - dump motors' state codes\n" "emstop[N] - emergency stop motor N or all\n" - "eraseflash - erase flash data storage\n" + "eraseflash [=N] - erase flash data storage (full or only N'th page of it)\n" "esw[N] - G end-switches state\n" "eswreactN - GS end-switches reaction (0 - ignore, 1 - stop@any, 2 - stop@zero)\n" "gotoN - GS move motor to given absolute position\n" diff --git a/F3:F303/Multistepper/hashgen/testdic b/F3:F303/Multistepper/hashgen/testdic index eace749..7407ab0 100644 --- a/F3:F303/Multistepper/hashgen/testdic +++ b/F3:F303/Multistepper/hashgen/testdic @@ -20,6 +20,7 @@ dumperr dumpcmd dumpconf dumpmotflags +dumpstates emstop eraseflash esw diff --git a/F3:F303/Multistepper/main.c b/F3:F303/Multistepper/main.c index 1dcaab7..9570776 100644 --- a/F3:F303/Multistepper/main.c +++ b/F3:F303/Multistepper/main.c @@ -22,6 +22,7 @@ #include "flash.h" #include "hardware.h" #include "proto.h" +#include "steppers.h" #include "usb.h" #define MAXSTRLEN RBINSZ @@ -40,9 +41,10 @@ int main(void){ StartHSI(); SysTick_Config((uint32_t)48000); // 1ms } - //flashstorage_init(); - hw_setup(); // GPIO, ADC, timers, watchdog etc. USBPU_OFF(); // make a reconnection + flashstorage_init(); + hw_setup(); // GPIO, ADC, timers, watchdog etc. + init_steppers(); USB_setup(); CAN_setup(the_conf.CANspeed); adc_setup(); @@ -57,6 +59,7 @@ int main(void){ } CAN_proc(); USB_proc(); + process_steppers(); if(CAN_get_status() == CAN_FIFO_OVERRUN){ USB_sendstr("CAN bus fifo overrun occured!\n"); } diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index e9e644e8919cdbf750a0474163f46f9f4baa0c47..3864bcf21539c52ae904875b56a6d41c8742a99e 100755 GIT binary patch delta 14724 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 VkBRr+e{BK3r42Oa1eH{i{|4PV%yIw# delta 12268 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 W(eq=FG|@$h{RfATGs2GLasLIzPDua& diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index dd35300..092ca56 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -448,6 +448,24 @@ int fn_dumperr(uint32_t _U_ hash, char _U_ *args){ // "dumperr" (1223989764) return RET_GOOD; } +static const char* motstates[STP_STATE_AMOUNT] = { + [STP_RELAX] = "relax", + [STP_ACCEL] = "acceleration", + [STP_MOVE] = "moving", + [STP_MVSLOW] = "moving at lowest speed", + [STP_DECEL] = "deceleration", + [STP_STALL] = "stalled (not used here!)", + [STP_ERR] = "error" +}; +int fn_dumpstates(uint32_t _U_ hash, char _U_ *args){ // "dumpstates" (4235564367) + USND("Motor's state codes:"); + for(int i = 0; i < STP_STATE_AMOUNT; ++i){ + printu(i); USB_sendstr(" - "); + USB_sendstr(motstates[i]); newline(); + } + return RET_GOOD; +} + int fn_canid(uint32_t _U_ hash, char *args){ // "canid" (2040257924) if(args && *args){ int good = FALSE; @@ -481,13 +499,13 @@ static int canusb_function(uint32_t hash, char *args){ return RET_GOOD; } par = (uint8_t) N; - n = strchr(n, '='); - if(n){ - const char *nxt = getnum(n+1, &N); - if(nxt != n){ // give flag issetter - val = (int32_t) N; - par |= SETTERFLAG; - } + } + n = strchr(n, '='); + if(n){ + ++n; + const char *nxt = getint(n, &val); + if(nxt != n){ // set setter flag + par |= SETTERFLAG; } } } @@ -521,7 +539,7 @@ static int canusb_function(uint32_t hash, char *args){ USB_putbyte('='); USB_sendstr(u2str(getADCval(par))); f = getADCvoltage(par); USB_sendstr("\nADCv");USB_putbyte('0'+par); - USB_putbyte('='); USB_sendstr(float2str(f, 1)); + USB_putbyte('='); USB_sendstr(float2str(f, 2)); newline(); return RET_GOOD; break; diff --git a/F3:F303/Multistepper/steppers.c b/F3:F303/Multistepper/steppers.c index 634bacf..53a9487 100644 --- a/F3:F303/Multistepper/steppers.c +++ b/F3:F303/Multistepper/steppers.c @@ -30,22 +30,12 @@ typedef enum{ M0SLOW // slowest move from ESW } mvto0state; -typedef enum{ - STALL_NO, // moving OK - STALL_ONCE, // Nstalled < limit - STALL_STOP // Nstalled >= limit -} t_stalled; - #ifdef EBUG static uint8_t stp[MOTORSNO] = {0}; #endif -static t_stalled stallflags[MOTORSNO]; - // motors' direction: 1 for positive, -1 for negative (we need it as could be reverse) static int8_t motdir[MOTORSNO]; -// direction of moving when stalled (forbid moving in that direction before go out of position) -static int8_t stalleddir[MOTORSNO] = {0}; // current position (in steps) by STP counter static volatile int32_t stppos[MOTORSNO] = {0}; // previous position when check (set to current in start of moving) @@ -67,8 +57,6 @@ static stp_state state[MOTORSNO]; // move to zero state static mvto0state mvzerostate[MOTORSNO]; -static int8_t Nstalled[MOTORSNO] = {0}; // counter of STALL - // lowest ARR value (highest speed), highest (lowest speed) //static uint16_t stphighARR[MOTORSNO]; // microsteps=1<> ustepsshift[i]); // recalculate speed due to new val } +// update stepper's settings +void update_stepper(uint8_t i){ + if(i >= MOTORSNO) return; + accdecsteps[i] = (the_conf.maxspd[i] * the_conf.maxspd[i]) / the_conf.accel[i] / 2; + ustepsshift[i] = MSB(the_conf.microsteps[i]); + ESW_reaction[i] = the_conf.ESW_reaction[i]; +} + // run this function after each steppers parameters changing void init_steppers(){ + mottimers_setup(); // reinit timers // init variables for(int i = 0; i < MOTORSNO; ++i){ - stalleddir[i] = 0; // clear old stall direction stopflag[i] = 0; motdir[i] = 0; curspeed[i] = 0; - accdecsteps[i] = (the_conf.maxspd[i] * the_conf.maxspd[i]) / the_conf.accel[i] / 2; state[i] = STP_RELAX; - ustepsshift[i] = MSB(the_conf.microsteps[i]); if(!the_conf.motflags[i].donthold) MOTOR_EN(i); else MOTOR_DIS(i); - ESW_reaction[i] = the_conf.ESW_reaction[i]; + update_stepper(i); } } @@ -176,7 +170,7 @@ static int esw_block(uint8_t i){ break; case ESW_STOPMINUS: // stop only @ given direction if(motdir[i] == -1 && (s & 1)) ret = TRUE; // stop @ESW0 - if(motdir[i] == 1 && (s & 3)) ret = TRUE; // stop @ESW1 + if(motdir[i] == 1 && (s & 2)) ret = TRUE; // stop @ESW1 break; default: // ESW_IGNORE break; @@ -194,11 +188,6 @@ errcodes motor_absmove(uint8_t i, int32_t newpos){ case STP_RELAX: break; case STP_STALL: - DBG("Move from STALL"); - if(dir == stalleddir[i]){ - DBG("Move to stalled direction!"); - return ERR_CANTRUN; // can't run into stalled direction - } break; default: // moving state DBG("Is moving"); @@ -213,7 +202,6 @@ errcodes motor_absmove(uint8_t i, int32_t newpos){ DBG("Block by ESW"); return ERR_CANTRUN; // on end-switch } - Nstalled[i] = (state[i] == STP_STALL) ? -(NSTALLEDMAX*4) : 0; // give some more chances to go out of stall state stopflag[i] = 0; targstppos[i] = newpos; prevstppos[i] = stppos[i]; @@ -221,10 +209,10 @@ errcodes motor_absmove(uint8_t i, int32_t newpos){ state[i] = STP_ACCEL; calcacceleration(i); #ifdef EBUG - USND("MOTOR"); USB_putbyte('0'+i); - USND(" targstppos="); printi(targstppos[i]); - USND(", decelstart="); printi(decelstartpos[i]); - USND(", accdecsteps="); printu(accdecsteps[i]); newline(); + USB_sendstr("MOTOR"); USB_putbyte('0'+i); + USB_sendstr(" targstppos="); printi(targstppos[i]); + USB_sendstr(", decelstart="); printi(decelstartpos[i]); + USB_sendstr(", accdecsteps="); printu(accdecsteps[i]); newline(); #endif MOTOR_EN(i); mottimers[i]->CR1 |= TIM_CR1_CEN; // start timer @@ -288,12 +276,7 @@ void addmicrostep(uint8_t i){ stopflag[i] = 0; if(the_conf.motflags[i].donthold) MOTOR_DIS(i); // turn off power - if(stallflags[i] == STALL_STOP){ - stallflags[i] = STALL_NO; - state[i] = STP_STALL; - }else{ - state[i] = STP_RELAX; - } + state[i] = STP_RELAX; #ifdef EBUG stp[i] = 1; #endif @@ -305,8 +288,8 @@ void addmicrostep(uint8_t i){ #define TODECEL() do{state[i] = STP_DECEL; \ startspeed[i] = curspeed[i]; \ Taccel[i] = Tms; \ - USND("MOTOR"); USB_putbyte('0'+i); \ - USND(" -> DECEL@"); printi(stppos[i]); USND(", V="); printu(curspeed[i]); newline(); \ + USB_sendstr("MOTOR"); USB_putbyte('0'+i); \ + USB_sendstr(" -> DECEL@"); printi(stppos[i]); USB_sendstr(", V="); printu(curspeed[i]); newline(); \ }while(0) #else #define TODECEL() do{state[i] = STP_DECEL; \ @@ -322,22 +305,22 @@ static void chkstepper(int i){ #ifdef EBUG if(stp[i]){ stp[i] = 0; - // motor state could be changed outside of interrupt, so return it to relax or leave in STALL + // motor state could be changed outside of interrupt, so return it to relax state[i] = STP_RELAX; - USND("MOTOR"); USB_putbyte('0'+i); USND(" stop @"); printi(stppos[i]); - USND(", curstate="); printu(state[i]); newline(); + USB_sendstr("MOTOR"); USB_putbyte('0'+i); USB_sendstr(" stop @"); printi(stppos[i]); + USB_sendstr(", V="); printu(curspeed[i]); + USB_sendstr(", curstate="); printu(state[i]); newline(); } #endif switch(state[i]){ case STP_ACCEL: // acceleration to max speed - //newspeed = curspeed[i] + dV[i]; i32 = the_conf.minspd[i] + (the_conf.accel[i] * (Tms - Taccel[i])) / 1000; if(i32 >= the_conf.maxspd[i]){ // max speed reached -> move with it curspeed[i] = the_conf.maxspd[i]; state[i] = STP_MOVE; #ifdef EBUG - USND("MOTOR"); USB_putbyte('0'+i); - USND(" -> MOVE@"); printi(stppos[i]); USND(", V="); printu(curspeed[i]); newline(); + USB_sendstr("MOTOR"); USB_putbyte('0'+i); + USB_sendstr(" -> MOVE@"); printi(stppos[i]); USB_sendstr(", V="); printu(curspeed[i]); newline(); #endif }else{ // increase speed curspeed[i] = i32; @@ -375,8 +358,8 @@ static void chkstepper(int i){ curspeed[i] = the_conf.minspd[i]; state[i] = STP_MVSLOW; #ifdef EBUG - USND("MOTOR"); USB_putbyte('0'+i); - USND(" -> MVSLOW@"); printi(stppos[i]); newline(); + USB_sendstr("MOTOR"); USB_putbyte('0'+i); + USB_sendstr(" -> MVSLOW@"); printi(stppos[i]); newline(); #endif } recalcARR(i); @@ -388,11 +371,11 @@ static void chkstepper(int i){ case M0FAST: if(state[i] == STP_RELAX || state[i] == STP_STALL){ // stopped -> move to + #ifdef EBUG - USB_putbyte('M'); USB_putbyte('0'+i); USND("FAST: motor stopped\n"); + USB_putbyte('M'); USB_putbyte('0'+i); USB_sendstr("FAST: motor stopped\n"); #endif if(ERR_OK != motor_relslow(i, 1000)){ #ifdef EBUG - USND("Can't move\n"); + USND("Can't move"); #endif DBG("->ERR"); state[i] = STP_ERR; @@ -410,7 +393,7 @@ static void chkstepper(int i){ } if((state[i] == STP_RELAX || state[i] == STP_STALL) && ++stopctr[i] > 5){ // wait at least 50ms #ifdef EBUG - USB_putbyte('M'); USB_putbyte('0'+i); USND("SLOW: motor stopped\n"); + USB_putbyte('M'); USB_putbyte('0'+i); USND("SLOW: motor stopped"); #endif ESW_reaction[i] = the_conf.ESW_reaction[i]; prevstppos[i] = targstppos[i] = stppos[i] = 0; diff --git a/F3:F303/Multistepper/steppers.h b/F3:F303/Multistepper/steppers.h index 044906d..0ae3e81 100644 --- a/F3:F303/Multistepper/steppers.h +++ b/F3:F303/Multistepper/steppers.h @@ -36,7 +36,8 @@ typedef enum{ STP_MVSLOW, // 3 - moving with slowest constant speed (end of moving) STP_DECEL, // 4 - moving with deceleration STP_STALL, // 5 - stalled (UNUSED) - STP_ERR // 6 - wrong/error state + STP_ERR , // 6 - wrong/error state + STP_STATE_AMOUNT } stp_state; // end-switches reaction @@ -52,8 +53,9 @@ enum{ void addmicrostep(uint8_t i); void init_steppers(); -errcodes setmotpos(uint8_t i, int32_t position); +void update_stepper(uint8_t i); +errcodes setmotpos(uint8_t i, int32_t position); errcodes getpos(uint8_t i, int32_t *position); errcodes getremainsteps(uint8_t i, int32_t *position); errcodes motor_absmove(uint8_t i, int32_t abssteps); diff --git a/F3:F303/Multistepper/usb.h b/F3:F303/Multistepper/usb.h index 3a98d84..5b62cc5 100644 --- a/F3:F303/Multistepper/usb.h +++ b/F3:F303/Multistepper/usb.h @@ -31,7 +31,7 @@ #define STR(s) STR_HELPER(s) #ifdef EBUG -#define DBG(str) do{USB_sendstr(__FILE__ " (L" STR(__LINE__) "): " str);}while(0) +#define DBG(str) do{USB_sendstr(__FILE__ " (L" STR(__LINE__) "): " str); newline();}while(0) #else #define DBG(str) #endif diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 685da40..e4c2362 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "56" -#define BUILD_DATE "2023-02-21" +#define BUILD_NUMBER "80" +#define BUILD_DATE "2023-02-24"