Michael Marzano / Mbed 2 deprecated Linear_Stepper_Motor_Nema17

Dependencies:   mbed

Committer:
mikermarza
Date:
Mon Apr 27 17:26:51 2020 +0000
Revision:
7:0d941d1140ad
Parent:
6:0c5418e05145
Child:
8:f1d869d9b8df
added software stops for maximum and minimum rotations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikermarza 0:54c5be5f26f4 1 // Code for the lin_step_mtr driver
mikermarza 0:54c5be5f26f4 2
mikermarza 0:54c5be5f26f4 3 #include "lin_step_mtr.h"
mikermarza 5:955bbc08ee78 4 #include "debug.h"
mikermarza 0:54c5be5f26f4 5
mikermarza 0:54c5be5f26f4 6 //Construtor
mikermarza 3:2138b69ee3bd 7 LinStepMtr::LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r, int m_rpm=MAX_RPM)
mikermarza 3:2138b69ee3bd 8 :mtr_ctrl(B_r, A_r, B_f,A_f), max_speed((m_rpm > MAX_RPM) ? floor((float)MAX_RPM * 10/3):floor((float)m_rpm * 10/3)),
mikermarza 3:2138b69ee3bd 9 max_rpm(m_rpm)
mikermarza 0:54c5be5f26f4 10 {
mikermarza 0:54c5be5f26f4 11 mtr_ctrl = 0x0;
mikermarza 3:2138b69ee3bd 12 speed = floor((float)DEFAULT_RPM * 10 / 3);
mikermarza 0:54c5be5f26f4 13 dir = CW;
mikermarza 1:757a52db1604 14 cur_step = ONE;
mikermarza 1:757a52db1604 15
mikermarza 7:0d941d1140ad 16 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 17 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 1:757a52db1604 18
mikermarza 7:0d941d1140ad 19 pc.printf("Init:\nmin: %f\nmax: %f\n",min_rev_cnt,max_rev_cnt);
mikermarza 1:757a52db1604 20 }
mikermarza 1:757a52db1604 21
mikermarza 1:757a52db1604 22 LinStepMtr::LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r)
mikermarza 3:2138b69ee3bd 23 :mtr_ctrl(B_r,A_r,B_f,A_f), max_speed(floor((float)MAX_RPM * 10/3)), max_rpm(MAX_RPM)
mikermarza 1:757a52db1604 24 {
mikermarza 1:757a52db1604 25 mtr_ctrl = 0x0;
mikermarza 3:2138b69ee3bd 26 speed = floor((double)DEFAULT_RPM * 10 / 3);
mikermarza 1:757a52db1604 27 dir = CW;
mikermarza 1:757a52db1604 28 cur_step = ONE;
mikermarza 0:54c5be5f26f4 29 }
mikermarza 0:54c5be5f26f4 30
mikermarza 1:757a52db1604 31 LinStepMtr::~LinStepMtr()
mikermarza 1:757a52db1604 32 {
mikermarza 1:757a52db1604 33 }
mikermarza 1:757a52db1604 34
mikermarza 0:54c5be5f26f4 35
mikermarza 0:54c5be5f26f4 36 float LinStepMtr::get_speed()
mikermarza 0:54c5be5f26f4 37 {
mikermarza 0:54c5be5f26f4 38 return (float) speed * 3 / 10;
mikermarza 0:54c5be5f26f4 39 }
mikermarza 0:54c5be5f26f4 40
mikermarza 7:0d941d1140ad 41 void LinStepMtr::set_speed(float rpm) {
mikermarza 7:0d941d1140ad 42 speed = floor((float)rpm * 10/3);
mikermarza 7:0d941d1140ad 43 }
mikermarza 7:0d941d1140ad 44
mikermarza 6:0c5418e05145 45 double LinStepMtr::get_rev()
mikermarza 6:0c5418e05145 46 {
mikermarza 6:0c5418e05145 47 return rev_cnt;
mikermarza 6:0c5418e05145 48 }
mikermarza 6:0c5418e05145 49
mikermarza 7:0d941d1140ad 50 void LinStepMtr::set_min_rev_cnt(double rc)
mikermarza 7:0d941d1140ad 51 {
mikermarza 7:0d941d1140ad 52 if(rc < MIN_DOUBLE_VAL || rc > MAX_DOUBLE_VAL)
mikermarza 7:0d941d1140ad 53 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 54 else
mikermarza 7:0d941d1140ad 55 min_rev_cnt = rc;
mikermarza 7:0d941d1140ad 56
mikermarza 7:0d941d1140ad 57 pc.printf("min: %f\n", min_rev_cnt);
mikermarza 7:0d941d1140ad 58 }
mikermarza 7:0d941d1140ad 59
mikermarza 7:0d941d1140ad 60 double LinStepMtr::get_min_rev_cnt()
mikermarza 7:0d941d1140ad 61 {
mikermarza 7:0d941d1140ad 62 return min_rev_cnt;
mikermarza 7:0d941d1140ad 63 }
mikermarza 7:0d941d1140ad 64
mikermarza 7:0d941d1140ad 65 void LinStepMtr::set_max_rev_cnt(double rc)
mikermarza 7:0d941d1140ad 66 {
mikermarza 7:0d941d1140ad 67 if(rc < MIN_DOUBLE_VAL || rc > MAX_DOUBLE_VAL)
mikermarza 7:0d941d1140ad 68 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 69 else
mikermarza 7:0d941d1140ad 70 max_rev_cnt = rc;
mikermarza 7:0d941d1140ad 71
mikermarza 7:0d941d1140ad 72 pc.printf("max: %f\n",max_rev_cnt);
mikermarza 7:0d941d1140ad 73 }
mikermarza 7:0d941d1140ad 74
mikermarza 7:0d941d1140ad 75 double LinStepMtr::get_max_rev_cnt()
mikermarza 7:0d941d1140ad 76 {
mikermarza 7:0d941d1140ad 77 return max_rev_cnt;
mikermarza 7:0d941d1140ad 78 }
mikermarza 7:0d941d1140ad 79
mikermarza 7:0d941d1140ad 80 void LinStepMtr::RESET_rev_cnts()
mikermarza 7:0d941d1140ad 81 {
mikermarza 7:0d941d1140ad 82 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 83 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 84 }
mikermarza 7:0d941d1140ad 85
mikermarza 7:0d941d1140ad 86
mikermarza 7:0d941d1140ad 87
mikermarza 7:0d941d1140ad 88
mikermarza 7:0d941d1140ad 89
mikermarza 0:54c5be5f26f4 90 LinStepMtr::Direction LinStepMtr::get_dir()
mikermarza 0:54c5be5f26f4 91 {
mikermarza 0:54c5be5f26f4 92 return dir;
mikermarza 0:54c5be5f26f4 93 }
mikermarza 0:54c5be5f26f4 94
mikermarza 7:0d941d1140ad 95 double LinStepMtr::rotate(Direction d, float rev)
mikermarza 7:0d941d1140ad 96 {
mikermarza 7:0d941d1140ad 97 int steps = floor(200 * rev);
mikermarza 7:0d941d1140ad 98 float w = 1/(float)speed;
mikermarza 7:0d941d1140ad 99 switch(d){
mikermarza 7:0d941d1140ad 100 case CW:
mikermarza 7:0d941d1140ad 101 for (int i = 0; i < steps; ++i) {
mikermarza 7:0d941d1140ad 102 if(rev_cnt > max_rev_cnt -.005){
mikermarza 7:0d941d1140ad 103 break;
mikermarza 7:0d941d1140ad 104 }
mikermarza 7:0d941d1140ad 105 mtr_ctrl = ++cur_step;
mikermarza 7:0d941d1140ad 106 rev_cnt += .005;
mikermarza 7:0d941d1140ad 107 wait(w);
mikermarza 7:0d941d1140ad 108 }
mikermarza 7:0d941d1140ad 109 break;
mikermarza 7:0d941d1140ad 110 case CCW:
mikermarza 7:0d941d1140ad 111 for (int i = 0; i < steps; ++i) {
mikermarza 7:0d941d1140ad 112 if (rev_cnt < min_rev_cnt + .005){
mikermarza 7:0d941d1140ad 113 break;
mikermarza 7:0d941d1140ad 114 }
mikermarza 7:0d941d1140ad 115 mtr_ctrl = --cur_step;
mikermarza 7:0d941d1140ad 116 rev_cnt -= .005;
mikermarza 7:0d941d1140ad 117 wait(w);
mikermarza 7:0d941d1140ad 118 }
mikermarza 7:0d941d1140ad 119 break;
mikermarza 1:757a52db1604 120
mikermarza 0:54c5be5f26f4 121 }
mikermarza 7:0d941d1140ad 122 mtr_ctrl = STOP;
mikermarza 7:0d941d1140ad 123 return rev_cnt;
mikermarza 0:54c5be5f26f4 124 }
mikermarza 0:54c5be5f26f4 125
mikermarza 3:2138b69ee3bd 126 #define SPIN_INCR 83 // steps
mikermarza 3:2138b69ee3bd 127 #define SPIN_WAIT 10 // ms
mikermarza 3:2138b69ee3bd 128 void LinStepMtr::spin_up(float rpm) {
mikermarza 7:0d941d1140ad 129 /*
mikermarza 3:2138b69ee3bd 130 int end_speed;
mikermarza 3:2138b69ee3bd 131
mikermarza 3:2138b69ee3bd 132 if(rpm == -1) {
mikermarza 3:2138b69ee3bd 133 end_speed = speed;
mikermarza 3:2138b69ee3bd 134 } else {
mikermarza 3:2138b69ee3bd 135 end_speed = (rpm > max_rpm) ? max_speed:floor(rpm * 10 / 3);
mikermarza 3:2138b69ee3bd 136 }
mikermarza 3:2138b69ee3bd 137 for(int i = min_speed; i < end_speed-SPIN_INCR; i+=SPIN_INCR){
mikermarza 3:2138b69ee3bd 138 speed = i;
mikermarza 3:2138b69ee3bd 139 Thread::wait(SPIN_WAIT);
mikermarza 3:2138b69ee3bd 140 }
mikermarza 3:2138b69ee3bd 141 speed = end_speed;
mikermarza 7:0d941d1140ad 142 */
mikermarza 3:2138b69ee3bd 143 }
mikermarza 3:2138b69ee3bd 144
mikermarza 3:2138b69ee3bd 145 int LinStepMtr::spin_down(float rpm) {
mikermarza 7:0d941d1140ad 146 /*
mikermarza 3:2138b69ee3bd 147 int end_speed;
mikermarza 3:2138b69ee3bd 148 int s = speed;
mikermarza 3:2138b69ee3bd 149
mikermarza 3:2138b69ee3bd 150 if(rpm == -1) {
mikermarza 3:2138b69ee3bd 151 end_speed = min_speed;
mikermarza 3:2138b69ee3bd 152 } else {
mikermarza 3:2138b69ee3bd 153 end_speed = (rpm < min_rpm) ? min_speed:floor(rpm * 10 / 3);
mikermarza 3:2138b69ee3bd 154 }
mikermarza 3:2138b69ee3bd 155
mikermarza 3:2138b69ee3bd 156 for(int i = speed; i > end_speed+SPIN_INCR; i-=SPIN_INCR){
mikermarza 3:2138b69ee3bd 157 speed = i;
mikermarza 3:2138b69ee3bd 158 Thread::wait(SPIN_WAIT);
mikermarza 3:2138b69ee3bd 159 }
mikermarza 3:2138b69ee3bd 160 speed = end_speed;
mikermarza 3:2138b69ee3bd 161 return s;
mikermarza 7:0d941d1140ad 162 */
mikermarza 7:0d941d1140ad 163
mikermarza 7:0d941d1140ad 164 return -1;
mikermarza 3:2138b69ee3bd 165 }
mikermarza 3:2138b69ee3bd 166
mikermarza 0:54c5be5f26f4 167 // Private Step Class functions
mikermarza 0:54c5be5f26f4 168 /*
mikermarza 0:54c5be5f26f4 169 LinStepMtr::Step::Step() : cur_step(ONE)
mikermarza 0:54c5be5f26f4 170 {
mikermarza 0:54c5be5f26f4 171 pc.printf("\n\nCalled Constructor\n cur_step: %x\n",cur_step);
mikermarza 0:54c5be5f26f4 172
mikermarza 0:54c5be5f26f4 173 pc.printf("Step_Num val:\n ONE = %x\n TWO = %x\n THREE = %x\n FOUR = %x\n\n", ONE, TWO, THREE, FOUR);
mikermarza 0:54c5be5f26f4 174 };
mikermarza 0:54c5be5f26f4 175 */
mikermarza 0:54c5be5f26f4 176 LinStepMtr::Step_Num LinStepMtr::Step::get_cur_step()
mikermarza 0:54c5be5f26f4 177 {
mikermarza 0:54c5be5f26f4 178 return cur_step;
mikermarza 0:54c5be5f26f4 179 }
mikermarza 0:54c5be5f26f4 180
mikermarza 0:54c5be5f26f4 181 LinStepMtr::Step_Num LinStepMtr::Step::operator++()
mikermarza 0:54c5be5f26f4 182 {
mikermarza 0:54c5be5f26f4 183 switch(cur_step){
mikermarza 0:54c5be5f26f4 184 case ONE:
mikermarza 0:54c5be5f26f4 185 cur_step=TWO;
mikermarza 0:54c5be5f26f4 186 break;
mikermarza 0:54c5be5f26f4 187 case TWO:
mikermarza 0:54c5be5f26f4 188 cur_step = THREE;
mikermarza 0:54c5be5f26f4 189 break;
mikermarza 0:54c5be5f26f4 190 case THREE:
mikermarza 0:54c5be5f26f4 191 cur_step = FOUR;
mikermarza 0:54c5be5f26f4 192 break;
mikermarza 0:54c5be5f26f4 193 case FOUR:
mikermarza 0:54c5be5f26f4 194 cur_step = ONE;
mikermarza 0:54c5be5f26f4 195 break;
mikermarza 0:54c5be5f26f4 196 }
mikermarza 1:757a52db1604 197 //pc.printf(" CUR_STEP = %x\n",cur_step);
mikermarza 0:54c5be5f26f4 198 return cur_step;
mikermarza 0:54c5be5f26f4 199 }
mikermarza 0:54c5be5f26f4 200
mikermarza 0:54c5be5f26f4 201 LinStepMtr::Step_Num LinStepMtr::Step::operator--()
mikermarza 0:54c5be5f26f4 202 {
mikermarza 0:54c5be5f26f4 203 switch(cur_step){
mikermarza 0:54c5be5f26f4 204 case ONE:
mikermarza 0:54c5be5f26f4 205 cur_step=FOUR;
mikermarza 0:54c5be5f26f4 206 break;
mikermarza 0:54c5be5f26f4 207 case TWO:
mikermarza 0:54c5be5f26f4 208 cur_step = ONE;
mikermarza 0:54c5be5f26f4 209 break;
mikermarza 0:54c5be5f26f4 210 case THREE:
mikermarza 0:54c5be5f26f4 211 cur_step = TWO;
mikermarza 0:54c5be5f26f4 212 break;
mikermarza 0:54c5be5f26f4 213 case FOUR:
mikermarza 0:54c5be5f26f4 214 cur_step = THREE;
mikermarza 0:54c5be5f26f4 215 break;
mikermarza 0:54c5be5f26f4 216 }
mikermarza 0:54c5be5f26f4 217 return cur_step;
mikermarza 1:757a52db1604 218 }
mikermarza 1:757a52db1604 219
mikermarza 1:757a52db1604 220 void LinStepMtr::Step::operator=(LinStepMtr::Step_Num s)
mikermarza 1:757a52db1604 221 {
mikermarza 1:757a52db1604 222 cur_step = s;
mikermarza 0:54c5be5f26f4 223 }