Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lin_step_mtr.cpp@7:0d941d1140ad, 2020-04-27 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |