Michael Marzano / Mbed 2 deprecated Linear_Stepper_Motor_Nema17

Dependencies:   mbed

Committer:
mikermarza
Date:
Wed Apr 29 04:00:45 2020 +0000
Revision:
11:2507965c1bec
Parent:
8:f1d869d9b8df
Updated Documentation

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 0:54c5be5f26f4 4
mikermarza 8:f1d869d9b8df 5 //Construtors
mikermarza 3:2138b69ee3bd 6 LinStepMtr::LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r, int m_rpm=MAX_RPM)
mikermarza 3:2138b69ee3bd 7 :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 8 max_rpm(m_rpm)
mikermarza 0:54c5be5f26f4 9 {
mikermarza 0:54c5be5f26f4 10 mtr_ctrl = 0x0;
mikermarza 3:2138b69ee3bd 11 speed = floor((float)DEFAULT_RPM * 10 / 3);
mikermarza 0:54c5be5f26f4 12 dir = CW;
mikermarza 1:757a52db1604 13 cur_step = ONE;
mikermarza 1:757a52db1604 14
mikermarza 7:0d941d1140ad 15 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 16 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 1:757a52db1604 17 }
mikermarza 1:757a52db1604 18
mikermarza 1:757a52db1604 19 LinStepMtr::LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r)
mikermarza 3:2138b69ee3bd 20 :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 21 {
mikermarza 1:757a52db1604 22 mtr_ctrl = 0x0;
mikermarza 3:2138b69ee3bd 23 speed = floor((double)DEFAULT_RPM * 10 / 3);
mikermarza 1:757a52db1604 24 dir = CW;
mikermarza 1:757a52db1604 25 cur_step = ONE;
mikermarza 0:54c5be5f26f4 26 }
mikermarza 0:54c5be5f26f4 27
mikermarza 8:f1d869d9b8df 28 // Destructor
mikermarza 1:757a52db1604 29 LinStepMtr::~LinStepMtr()
mikermarza 1:757a52db1604 30 {
mikermarza 1:757a52db1604 31 }
mikermarza 1:757a52db1604 32
mikermarza 8:f1d869d9b8df 33 // Member Functions
mikermarza 0:54c5be5f26f4 34 float LinStepMtr::get_speed()
mikermarza 0:54c5be5f26f4 35 {
mikermarza 0:54c5be5f26f4 36 return (float) speed * 3 / 10;
mikermarza 0:54c5be5f26f4 37 }
mikermarza 0:54c5be5f26f4 38
mikermarza 7:0d941d1140ad 39 void LinStepMtr::set_speed(float rpm) {
mikermarza 7:0d941d1140ad 40 speed = floor((float)rpm * 10/3);
mikermarza 7:0d941d1140ad 41 }
mikermarza 7:0d941d1140ad 42
mikermarza 6:0c5418e05145 43 double LinStepMtr::get_rev()
mikermarza 6:0c5418e05145 44 {
mikermarza 6:0c5418e05145 45 return rev_cnt;
mikermarza 6:0c5418e05145 46 }
mikermarza 6:0c5418e05145 47
mikermarza 7:0d941d1140ad 48 void LinStepMtr::set_min_rev_cnt(double rc)
mikermarza 7:0d941d1140ad 49 {
mikermarza 7:0d941d1140ad 50 if(rc < MIN_DOUBLE_VAL || rc > MAX_DOUBLE_VAL)
mikermarza 7:0d941d1140ad 51 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 52 else
mikermarza 7:0d941d1140ad 53 min_rev_cnt = rc;
mikermarza 7:0d941d1140ad 54 }
mikermarza 7:0d941d1140ad 55
mikermarza 7:0d941d1140ad 56 void LinStepMtr::set_max_rev_cnt(double rc)
mikermarza 7:0d941d1140ad 57 {
mikermarza 7:0d941d1140ad 58 if(rc < MIN_DOUBLE_VAL || rc > MAX_DOUBLE_VAL)
mikermarza 7:0d941d1140ad 59 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 60 else
mikermarza 7:0d941d1140ad 61 max_rev_cnt = rc;
mikermarza 7:0d941d1140ad 62 }
mikermarza 7:0d941d1140ad 63
mikermarza 11:2507965c1bec 64 double LinStepMtr::get_min_rev_cnt()
mikermarza 11:2507965c1bec 65 {
mikermarza 11:2507965c1bec 66 return min_rev_cnt;
mikermarza 11:2507965c1bec 67 }
mikermarza 11:2507965c1bec 68
mikermarza 7:0d941d1140ad 69 double LinStepMtr::get_max_rev_cnt()
mikermarza 7:0d941d1140ad 70 {
mikermarza 7:0d941d1140ad 71 return max_rev_cnt;
mikermarza 7:0d941d1140ad 72 }
mikermarza 7:0d941d1140ad 73
mikermarza 7:0d941d1140ad 74 void LinStepMtr::RESET_rev_cnts()
mikermarza 7:0d941d1140ad 75 {
mikermarza 7:0d941d1140ad 76 max_rev_cnt = MAX_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 77 min_rev_cnt = MIN_DOUBLE_VAL;
mikermarza 7:0d941d1140ad 78 }
mikermarza 7:0d941d1140ad 79
mikermarza 0:54c5be5f26f4 80 LinStepMtr::Direction LinStepMtr::get_dir()
mikermarza 0:54c5be5f26f4 81 {
mikermarza 0:54c5be5f26f4 82 return dir;
mikermarza 0:54c5be5f26f4 83 }
mikermarza 0:54c5be5f26f4 84
mikermarza 8:f1d869d9b8df 85 /* NOT SUPPORTED
mikermarza 8:f1d869d9b8df 86 LinStepMtr::set_dir(Direction d)
mikermarza 8:f1d869d9b8df 87 {
mikermarza 8:f1d869d9b8df 88 if(dir !=d)
mikermarza 8:f1d869d9b8df 89 dir = d;
mikermarza 8:f1d869d9b8df 90 }
mikermarza 8:f1d869d9b8df 91 */
mikermarza 8:f1d869d9b8df 92
mikermarza 8:f1d869d9b8df 93 // NOTE: uses wait() instead of Thread::wait() because depending on speed, can be
mikermarza 8:f1d869d9b8df 94 // waiting for under a millisecond, and Thread::wait() only supports ms
mikermarza 8:f1d869d9b8df 95 double LinStepMtr::rotate(Direction d, float rev=1)
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 8:f1d869d9b8df 126 /*
mikermarza 3:2138b69ee3bd 127 #define SPIN_INCR 83 // steps
mikermarza 3:2138b69ee3bd 128 #define SPIN_WAIT 10 // ms
mikermarza 3:2138b69ee3bd 129 void LinStepMtr::spin_up(float rpm) {
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 8:f1d869d9b8df 142
mikermarza 3:2138b69ee3bd 143 }
mikermarza 3:2138b69ee3bd 144
mikermarza 3:2138b69ee3bd 145 int LinStepMtr::spin_down(float rpm) {
mikermarza 8:f1d869d9b8df 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 8:f1d869d9b8df 162
mikermarza 7:0d941d1140ad 163
mikermarza 7:0d941d1140ad 164 return -1;
mikermarza 3:2138b69ee3bd 165 }
mikermarza 8:f1d869d9b8df 166 */
mikermarza 3:2138b69ee3bd 167
mikermarza 8:f1d869d9b8df 168 // Private Class: Step Functions
mikermarza 8:f1d869d9b8df 169
mikermarza 0:54c5be5f26f4 170 LinStepMtr::Step_Num LinStepMtr::Step::get_cur_step()
mikermarza 0:54c5be5f26f4 171 {
mikermarza 0:54c5be5f26f4 172 return cur_step;
mikermarza 0:54c5be5f26f4 173 }
mikermarza 0:54c5be5f26f4 174
mikermarza 0:54c5be5f26f4 175 LinStepMtr::Step_Num LinStepMtr::Step::operator++()
mikermarza 0:54c5be5f26f4 176 {
mikermarza 0:54c5be5f26f4 177 switch(cur_step){
mikermarza 0:54c5be5f26f4 178 case ONE:
mikermarza 0:54c5be5f26f4 179 cur_step=TWO;
mikermarza 0:54c5be5f26f4 180 break;
mikermarza 0:54c5be5f26f4 181 case TWO:
mikermarza 0:54c5be5f26f4 182 cur_step = THREE;
mikermarza 0:54c5be5f26f4 183 break;
mikermarza 0:54c5be5f26f4 184 case THREE:
mikermarza 0:54c5be5f26f4 185 cur_step = FOUR;
mikermarza 0:54c5be5f26f4 186 break;
mikermarza 0:54c5be5f26f4 187 case FOUR:
mikermarza 0:54c5be5f26f4 188 cur_step = ONE;
mikermarza 0:54c5be5f26f4 189 break;
mikermarza 0:54c5be5f26f4 190 }
mikermarza 0:54c5be5f26f4 191 return cur_step;
mikermarza 0:54c5be5f26f4 192 }
mikermarza 0:54c5be5f26f4 193
mikermarza 0:54c5be5f26f4 194 LinStepMtr::Step_Num LinStepMtr::Step::operator--()
mikermarza 0:54c5be5f26f4 195 {
mikermarza 0:54c5be5f26f4 196 switch(cur_step){
mikermarza 0:54c5be5f26f4 197 case ONE:
mikermarza 0:54c5be5f26f4 198 cur_step=FOUR;
mikermarza 0:54c5be5f26f4 199 break;
mikermarza 0:54c5be5f26f4 200 case TWO:
mikermarza 0:54c5be5f26f4 201 cur_step = ONE;
mikermarza 0:54c5be5f26f4 202 break;
mikermarza 0:54c5be5f26f4 203 case THREE:
mikermarza 0:54c5be5f26f4 204 cur_step = TWO;
mikermarza 0:54c5be5f26f4 205 break;
mikermarza 0:54c5be5f26f4 206 case FOUR:
mikermarza 0:54c5be5f26f4 207 cur_step = THREE;
mikermarza 0:54c5be5f26f4 208 break;
mikermarza 0:54c5be5f26f4 209 }
mikermarza 0:54c5be5f26f4 210 return cur_step;
mikermarza 1:757a52db1604 211 }
mikermarza 1:757a52db1604 212
mikermarza 1:757a52db1604 213 void LinStepMtr::Step::operator=(LinStepMtr::Step_Num s)
mikermarza 1:757a52db1604 214 {
mikermarza 1:757a52db1604 215 cur_step = s;
mikermarza 0:54c5be5f26f4 216 }