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@11:2507965c1bec, 2020-04-29 (annotated)
- 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?
| 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 | 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 | } |