From f488f0ce44d506593c223e2a19544cb4d2305a72 Mon Sep 17 00:00:00 2001 From: eddyem Date: Wed, 10 Oct 2018 10:34:38 +0300 Subject: [PATCH] Final fix, all works pretty --- STM8/2stepper4reductor/Readme | 70 +++++ STM8/2stepper4reductor/motors.c | 62 ++--- STM8/2stepper4reductor/motors.h | 16 +- STM8/2stepper4reductor/proto.c | 3 +- STM8/2stepper4reductor/twosteppers.bin | Bin 6191 -> 6122 bytes STM8/2stepper4reductor/twosteppers.c.tags | 70 +++++ STM8/2stepper4reductor/twosteppers.ihx | 312 +++++++++++----------- 7 files changed, 336 insertions(+), 197 deletions(-) diff --git a/STM8/2stepper4reductor/Readme b/STM8/2stepper4reductor/Readme index e69de29..5b33cfb 100644 --- a/STM8/2stepper4reductor/Readme +++ b/STM8/2stepper4reductor/Readme @@ -0,0 +1,70 @@ +Rotation direction as seems from back side of motor! + +Command protocol: [ addr command data ] + broadcast addr: b +commands: +0/1 - command for given motor: + E - get end-switches + L - move CCW + M - get motor state (RELAX, INFMV+/-, STOP, MVSTP+/-, OFFSW+/-, UNDEF) + N - go for N st./get rest + O - pull off the switch + P - get current position + R - move CW + S - get/set speed + X - stop motor + Z - stop and zero position +r - reset MCU +G - get board address +L 0/1 - LED on/off +P ch val - PWM on channel ch +T - time counter value + +examples: +[00E] -> [ 0 0 E 0 ] (no esw) +[01E] -> [ 0 1 E 3 ] (both - bad situation) +[00L] -> [ 0 0 L ] (all OK) +[01L] -> [ 0 1 L E 1 ] (on left endswitch) +[00R] -> [ 0 0 R E 2 ] (on right endswitch) +[01R][01M] -> [ 0 1 M INFMV+ ] +[01N400] -> [ 0 1 N 400 ] (start moving) +[01N] -> [ 0 1 N 46 ] (steps left) +[00N-300] -> [ 0 0 N err ] (on endswitch) +[00O-100] -> [ 0 0 O err ] (on left endswitch) +[00O100] -> [ 0 0 O 100 ] (on rigth endswitch or out of them) +[01P] -> [ 0 1 P 1903 ] (current position in full steps) +[00S] -> [ 0 0 S 2500 ] (get speed value) +[01S1500] -> [ 0 1 S 1500 ] (set speed value) +[01X] -> [ 0 1 X ] +[01Z] -> [ 0 1 Z ] + +[0r] -> + +Hello! My address is 0 + + +Command protocol: [ addr command data ] + broadcast addr: b +commands: +0/1 - command for given motor: + E - get end-switches + L - move CCW + M - get motor state + N - go for N st./get rest + O - pull off the switch + P - get current position + R - move CW + S - get/set speed + X - stop motor + Z - stop and zero position +r - reset MCU +G - get board address +L 0/1 - LED on/off +P ch val - PWM on channel ch +T - time counter value + + +[0G] -> [ 0 G 0 ] +[0L] -> [ 0 L 0 ], [0L1] -> [ 0 L 1 ], [0L] -> [ 0 L 1 ] +[0P] -> [ 0 P 0 0 ], [0P0100] -> [ 0 P 0 100 ], [0P0] -> [ 0 P 0 100 ], [0P510] -> [ 0 P -1 ], [0P0500] -> [ 0 P 0 -1 ] +[0T] -> [ 0 T 191593 ] diff --git a/STM8/2stepper4reductor/motors.c b/STM8/2stepper4reductor/motors.c index 5114662..91df543 100644 --- a/STM8/2stepper4reductor/motors.c +++ b/STM8/2stepper4reductor/motors.c @@ -122,7 +122,6 @@ static void stop_motor(U8 motorNum){ default: return; } Steps_left[motorNum] = 0; - Ustep[motorNum] = 0; Dir[motorNum] = DIR_STOP; } @@ -161,13 +160,21 @@ static void get_motor_state(U8 nmotor, char **buff){ // turn on motor's timer starting from the lowest speed static void turnontimer(U8 motorNum){ + U8 tmp; switch(motorNum){ case 0: + // turn on power + tmp = PORT(STP0_PORT, ODR) & ~STP_PINS; + PORT(STP0_PORT, ODR) = tmp | usteps[Ustep[0]]; + // start from the slowest speed TIM2_ARRH = MAX_USTEP_PERIOD >> 8; TIM2_ARRL = MAX_USTEP_PERIOD & 0xff; + // run timer TIM2_CR1 |= TIM_CR1_CEN; break; case 1: + tmp = PORT(STP1_PORT, ODR) & ~STP_PINS; + PORT(STP1_PORT, ODR) = tmp | usteps[Ustep[1]]; TIM3_ARRH = MAX_USTEP_PERIOD >> 8; TIM3_ARRL = MAX_USTEP_PERIOD & 0xff; TIM3_CR1 |= TIM_CR1_CEN; @@ -189,7 +196,6 @@ static int moveNsteps(U8 motorNum, long nsteps){ if(sw) return 0; // on zero end-switch: no moving backward, on positive - no moving at all! Dir[motorNum] = DIR_CCW; nsteps = -nsteps; - Ustep[motorNum] = 7; state[motorNum] = MOTOR_MOVENSTEPS; }else{ if(sw & 2) return 0; // for positive direction no moving to any side when on end-switch 2! @@ -216,7 +222,6 @@ static int pullofftheswitch(U8 motorNum, long nsteps){ if(sw & 1) return 0; // on zero end-switch: no moving backward Dir[motorNum] = DIR_CCW; nsteps = -nsteps; - Ustep[motorNum] = 7; }else{ Dir[motorNum] = DIR_CW; } @@ -236,26 +241,27 @@ void motor_command(const char *cmd, char **buff){ *((*buff)++) = '0' + motorNum; *((*buff)++) = ' '; c = *cmd++; - *((*buff)++) = c; *((*buff)++) = ' '; + *((*buff)++) = c; switch(c){ case 'E': // check endswitches state + *((*buff)++) = ' '; *((*buff)++) = '0' + check_endsw(motorNum); break; case 'L': // infinite move left - if(1 == check_endsw(motorNum)){ - *((*buff)++) = 'E'; *((*buff)++) = ' '; - *((*buff)++) = '1'; + if(check_endsw(motorNum) & 1){ + strtobuf(" E 1", buff); }else{ state[motorNum] = MOTOR_INFMOVE; Dir[motorNum] = DIR_CCW; - Ustep[motorNum] = 7; turnontimer(motorNum); } break; case 'M': // get motor state + *((*buff)++) = ' '; get_motor_state(motorNum, buff); break; case 'N': // go for N steps or get steps left + *((*buff)++) = ' '; if(!readLong(cmd, &l)){ // get long2buf(Steps_left[motorNum], buff); }else{ @@ -264,6 +270,7 @@ void motor_command(const char *cmd, char **buff){ } break; case 'O': // pull off the switch (if no steps given, go for PULLOFFTHESW_STEPS) + *((*buff)++) = ' '; if(!readLong(cmd, &l)){ // get l = PULLOFFTHESW_STEPS; } @@ -271,12 +278,12 @@ void motor_command(const char *cmd, char **buff){ else long2buf(l, buff); break; case 'P': // get current position + *((*buff)++) = ' '; long2buf(Current_pos[motorNum], buff); break; case 'R': // infinite move right - if(2 == check_endsw(motorNum)){ - *((*buff)++) = 'E'; *((*buff)++) = ' '; - *((*buff)++) = '2'; + if(check_endsw(motorNum) & 2){ + strtobuf(" E 2", buff); }else{ state[motorNum] = MOTOR_INFMOVE; Dir[motorNum] = DIR_CW; @@ -284,6 +291,7 @@ void motor_command(const char *cmd, char **buff){ } break; case 'S': // change speed + *((*buff)++) = ' '; if(!readLong(cmd, &l) || l < MIN_USTEP_PERIOD || l > MAX_USTEP_PERIOD){ // get speed if(motorNum == 0) spd = TIM2_ARRH << 8 | TIM2_ARRL; else spd = TIM3_ARRH << 8 | TIM3_ARRL; @@ -358,27 +366,21 @@ void stepper_interrupt(U8 motor_num){ break; default: return; } - if(Dir[motor_num] == DIR_CCW){ // counter-clockwise - if(Ustep[motor_num] == 0){ - --Steps_left[motor_num]; - --Current_pos[motor_num]; - if(state[motor_num] == MOTOR_STOP || state[motor_num] == MOTOR_ZEROSTOP){ - stop_motor(motor_num); - return; - } - Ustep[motor_num] = 7; - }else --Ustep[motor_num]; - }else{ // clockwise - if(++Ustep[motor_num] > 7){ - --Steps_left[motor_num]; - ++Current_pos[motor_num]; - if(state[motor_num] == MOTOR_STOP || state[motor_num] == MOTOR_ZEROSTOP){ - stop_motor(motor_num); - return; - } - Ustep[motor_num] = 0; + if(Ustep[motor_num] % 2 == 0){ // full amount of half-steps - increment step counters & check for stop + --Steps_left[motor_num]; + if(Dir[motor_num] == DIR_CCW) --Current_pos[motor_num]; + else ++Current_pos[motor_num]; + if(state[motor_num] == MOTOR_STOP || state[motor_num] == MOTOR_ZEROSTOP){ + stop_motor(motor_num); + return; } } + if(Dir[motor_num] == DIR_CCW){ // counter-clockwise + if(Ustep[motor_num] == 0) Ustep[motor_num] = 7; + else --Ustep[motor_num]; + }else{ // clockwise + if(++Ustep[motor_num] > 7) Ustep[motor_num] = 0; + } } /** diff --git a/STM8/2stepper4reductor/motors.h b/STM8/2stepper4reductor/motors.h index dd15ff1..a737a0b 100644 --- a/STM8/2stepper4reductor/motors.h +++ b/STM8/2stepper4reductor/motors.h @@ -24,17 +24,17 @@ #ifndef __MOTORS_H__ #define __MOTORS_H__ -// default speed @ start - 50 steps per second +// default speed @ start - 200 steps per second #define DEFAULT_USTEP_PERIOD (2500) -// max speed == 1/(625us*8) = 200 steps per second -#define MIN_USTEP_PERIOD (625) -// min speed as 16-bit timer can - 65535 - near 1.9 steps per second -// default min speed - 10 steps per second -#define MAX_USTEP_PERIOD (12500) +// max speed == 1/(800us*2) = 625 steps per second +#define MIN_USTEP_PERIOD (800) +// min speed as 16-bit timer can - 65535 - near 7.6 steps per second +// default min speed - 25 steps per second +#define MAX_USTEP_PERIOD (20000) // amount of steps to pull off the switch #define PULLOFFTHESW_STEPS (100) -// amount of microsteps for acceleration calculation -#define ACCEL_USTEPS (200) +// amount of microsteps for acceleration calculation (50 full steps) +#define ACCEL_USTEPS (100) //extern unsigned char irq_flag; diff --git a/STM8/2stepper4reductor/proto.c b/STM8/2stepper4reductor/proto.c index 367cb2c..1e42c81 100644 --- a/STM8/2stepper4reductor/proto.c +++ b/STM8/2stepper4reductor/proto.c @@ -43,8 +43,7 @@ void show_help(){ uart_write("G - get board address\n"); uart_write("L 0/1 - LED on/off\n"); uart_write("P ch val - PWM on channel ch\n"); - uart_write("T - time counter value\n"); - uart_write("\n\n"); + uart_write("T - time counter value\n\n"); } static void set_PWM(char *cmd, char **buff){ diff --git a/STM8/2stepper4reductor/twosteppers.bin b/STM8/2stepper4reductor/twosteppers.bin index f72a53843427730012e02a61fe1d1edabe259f52..869a663021edce4bf0b07d13c3618108bee59244 100644 GIT binary patch delta 3120 zcma)8eQevt73Yx@CDEp-NDd{-${p>vQevn6YHX*T-JphpeYlQOc|e^>snDSL*n}dD z@>jtEid(f2m!_f0C<0o{o}9*5R)G5>0|vB1hyF8QfHm~54GXp*!!WPduq{|Iaf4fF z?j}^(#_1f$AQoQ=IRrV%6EamrRF$H_9p?`Ef!DZB!&8&}@72guNZ$9vK&wikJTN;)5cmRt!JX%|^ zR=kw*s23$)|07@T1FLh6YcF-Zj%-CVPAmldm4%?M92SYsJmo)@zhAHzl;W3@NAXNO zO=iA3oJAU{qW#>)HKfdj$MJZB9KlD@WD1WfQ%w!MH;j+icq&bvfQcuXcxqj>Teiwn z?heD^@g{!4t{zJqtv;1FTb++{8{ht*dYlgTstYh&{c`mL9d1;U@jQ&R>LRdjv{jer z@cZgF=Jp+smdul_0}P(Qp558Yk5Q>Wrw-dU!O1^PVH zf@C5%(ux-OLNp(IK7`M};d$sy?{d8TFK1C4Z8?jAGmFtk%*{0)gJg#w*}+z_!@H7o zYkHeaKvDns{}eS(ZFVX;jE7rshyQyKi5TW@ajKT*))L+93g%o$Snlf!8r-V zyR1d2Zj=|~9&53qF84)yD#l8*udH@kivy0}ptX3YF2|z>vjZTBXZvx#k_ zV(zZ40;fDn4m-;yllX8xw>8;>(+a}{l!vf;j1{>ZLfZ=v)>yUG(=ZW$kaXe@op^fJ z2gTaz%r2I*)yMGcCd!g}7Ax3DhkKRYrh?bc7`D<2?5Hx@RC?EQl%;2-na88+IXiW9 zIXS6KJJ2)@(3IP_J_t#XAw1L|V|Xkv;}+wvQ;f%>hiNe$FXtYNkqKB)gYbAF#P|6X zK0JYkU@6*!EYM|WN6HH;U}SGYosZ%dKvE0p{P}v+N3l-5U@_Oo2p(w=2}?9ytHwd6 z#$C}Mjn@V7B!VpFg$5xQg$TqWVT4C$JS0C#tE90`yh9Mr!Ap+DYjg3ktsdnlUaAaa zu-ZMH&3CTcVX`3{s?YXu8*hFF2MP9Y+Nc;y#!`51Zfh?I(Q-pz7xzcvkcbhV(4?nDz&9|Lz`UJeVSDaDg!r_!U^wg5#Gq2d{#(rRns1FMfWKB~sK@~a zSoxN-OQa9?QD?ol7ku@AFSS81R%t2(Qo&#JWJngU0@t3h zeeJRPLpY+FKMKnE7nDfYi@gn6tTYtKs|1?P{q_ zRaO@1_33ba;QYX`4krUAugu5ek{A~yf4oDI<3aVJl{{O|3hFnldizIeG<~FQ!;%S!$)v&69h7 zJ0ddWf2gNKCZ#T^4E8JDey&!54o=@q*KR^nuW^pZJg2;bzo_s&Rfx2#?>3YX^ly$^ BSJVIi delta 3219 zcmaJ^eQevt73Yx@B`cPA(ZXxD1EK8Mv*ui1?FT5*{ze@%D~_s{ zLN^x?VtY@it|xSd+mTw<*1X2mcVbrDoyx}5%HW>Sj}uIy4}pvS{S<)t5h3dF2IjF|c7`woZ7=CuP=X zU|vU-k~9~4Hu{xmbFpv3r0xP1n(hL1-)SxmZ1iWSgA2Qw4le2-nv2m52es|oEU!CD zOvD9m6zNc=Mq_j0=&d=A)-lH@9Pq;%)LOcO+?AbH z;isJXyJ!HDIkUcSz?@B^y|Ha$(@N1i=ReKD06dYWi*nwpa$qeb^Z0PSn$4>G zba=pIo+H7O?pU6m*VcloT$-%1XGq-DF-*1oTWUB53izhZ!N9BIwu3|a(hEo%1;@V+zw`++}DuX%NjN9{nx;K zWzAA2&&?jw6Ht-b;Ef_$rl%I{h8|1#j>%ji z1d}@H#l4ZEEsh6lj-$Z=nlB3ZdI^-cZ`8>MX8j|OZzRBCLi4fGBa|hbOAksr^uhEH zjMRr9twhrzns(S^3_I;`Er_7QQZkJFp(X4}2Zvo^a(jCGocDtB8N#RZ1hB%>qAS_!+C*03!frhQ_2xnrRt9#w(*miF zKZeJsvJUhy3iK#GT03Tyoc%BS7nE%+l#=d(?4G;FS=qA=vjx$fPFEIo2fD%J^e%`Q z%-&`Hf%L6Vm7qkeL;4&-*g7^sg~LZP>ajvhie`HCUZ{s$#kc|rOO@4>J^)3DIH7@q zh6NTBp7x|baR9#yJ81C=;DEN~Bwe@*YK8zc!%-(3c3fvzorh1ByT(LiN|~R=)7Jc? z4Y!q9%O3qA*^0N)(V1;{8w~fsaBrPR*sI-hkdWTtAJCylmu;++~MH*}i-U6`{hy|Op2NMbf1C$;ZD%#96$FY`3XS%RMM1^F>^T>Jg z!;T)5fup&YgrbSoZ!yJGOF7$8zTZ;bYAV&2?wG~*T8+PJDRNgV3kRCh!oH*|!F9-I zA5})J2tk;zP)2F5!b)DSkZp-zi8O(2dBF0lOozjwH|!S0ut)TSeTrtzK3&VCk@BoL zd#VQVq&fR6mB*L1GaN0I_MsK=irf$o+3-6OK0e{&qJZc@$jT$SkVX##mmxU4VtF7o zl>)>DsUvAi3TBYc>7E>|#bH%Y{pV&oOlAS@2=46+PefS^AbNF`{gj4Un#1nGg1>vG zH($-at@4#Czrmu;Sy+U110Fyo2`}>jgry|$V-e63q41$!>G@#v%QLq}nVG+iqM5(Z zkV^fR%+tUmZ^=Tz-x+rB0T*cdI{Oo^!v!>q`3&5kn)hPnWSj@}-zxX3rLksP87W&6 zij2{HuT5QQ$GKVH=^$~-?f_r-QRmQ@3s4CXr*rQzr$U|BRfFp%+(88k?x{p*=ai4N z6mtsxpP^X`KT%n@1yvVE3jVIY#F(XV<%FA2m3f81ZL)Kat1kZ*mSwYEU4q{YI%jtk V`sC;F=N%f