Michael Marzano / Mbed 2 deprecated Linear_Stepper_Motor_Nema17

Dependencies:   mbed

Committer:
mikermarza
Date:
Mon Apr 20 02:54:17 2020 +0000
Revision:
2:6c324fded7c1
Parent:
1:757a52db1604
Child:
3:2138b69ee3bd
Start and stop methods work

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 #include "debug.h"
mikermarza 0:54c5be5f26f4 5
mikermarza 0:54c5be5f26f4 6 //Construtor
mikermarza 0:54c5be5f26f4 7 LinStepMtr::LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r, int m_speed=MAX_SPEED)
mikermarza 0:54c5be5f26f4 8 :mtr_ctrl(B_r, A_r, B_f,A_f), max_speed((m_speed > MAX_SPEED) ? MAX_SPEED:m_speed)
mikermarza 0:54c5be5f26f4 9 {
mikermarza 0:54c5be5f26f4 10 mtr_ctrl = 0x0;
mikermarza 0:54c5be5f26f4 11 speed = floor((double)DEFAULT_SPEED * 10 / 3);
mikermarza 0:54c5be5f26f4 12 dir = CW;
mikermarza 1:757a52db1604 13 cur_step = ONE;
mikermarza 1:757a52db1604 14
mikermarza 1:757a52db1604 15 stop_mtr = true;
mikermarza 1:757a52db1604 16 terminate = false;
mikermarza 1:757a52db1604 17 rotate_th = NULL;
mikermarza 1:757a52db1604 18
mikermarza 1:757a52db1604 19 cur_state = STOP_MOTOR;
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 1:757a52db1604 23 :mtr_ctrl(B_r,A_r,B_f,A_f), max_speed(MAX_SPEED)
mikermarza 1:757a52db1604 24 {
mikermarza 1:757a52db1604 25 mtr_ctrl = 0x0;
mikermarza 1:757a52db1604 26 speed = floor((double)DEFAULT_SPEED * 10 / 3);
mikermarza 1:757a52db1604 27 dir = CW;
mikermarza 1:757a52db1604 28 cur_step = ONE;
mikermarza 0:54c5be5f26f4 29
mikermarza 0:54c5be5f26f4 30 stop_mtr = true;
mikermarza 0:54c5be5f26f4 31 terminate = false;
mikermarza 0:54c5be5f26f4 32
mikermarza 0:54c5be5f26f4 33 cur_state = STOP_MOTOR;
mikermarza 0:54c5be5f26f4 34 }
mikermarza 0:54c5be5f26f4 35
mikermarza 1:757a52db1604 36 LinStepMtr::~LinStepMtr()
mikermarza 1:757a52db1604 37 {
mikermarza 1:757a52db1604 38 this->end();
mikermarza 1:757a52db1604 39 }
mikermarza 1:757a52db1604 40
mikermarza 0:54c5be5f26f4 41
mikermarza 0:54c5be5f26f4 42 float LinStepMtr::get_speed()
mikermarza 0:54c5be5f26f4 43 {
mikermarza 0:54c5be5f26f4 44 return (float) speed * 3 / 10;
mikermarza 0:54c5be5f26f4 45 }
mikermarza 0:54c5be5f26f4 46
mikermarza 0:54c5be5f26f4 47 LinStepMtr::Direction LinStepMtr::get_dir()
mikermarza 0:54c5be5f26f4 48 {
mikermarza 0:54c5be5f26f4 49 return dir;
mikermarza 0:54c5be5f26f4 50 }
mikermarza 0:54c5be5f26f4 51
mikermarza 1:757a52db1604 52 void LinStepMtr::init(double rpm, Direction d)
mikermarza 1:757a52db1604 53 {
mikermarza 1:757a52db1604 54 terminate = false;
mikermarza 1:757a52db1604 55 speed = floor(rpm * 10 / 3);
mikermarza 1:757a52db1604 56 dir = d;
mikermarza 1:757a52db1604 57 if (!rotate_th) {
mikermarza 1:757a52db1604 58 rotate_th = new Thread(LinStepMtr::rotate_help, this);
mikermarza 1:757a52db1604 59 }
mikermarza 1:757a52db1604 60 }
mikermarza 1:757a52db1604 61
mikermarza 1:757a52db1604 62 void LinStepMtr::end() {
mikermarza 1:757a52db1604 63 terminate = true;
mikermarza 1:757a52db1604 64 Thread::wait(100);
mikermarza 1:757a52db1604 65 if (rotate_th) {
mikermarza 1:757a52db1604 66 delete rotate_th;
mikermarza 1:757a52db1604 67 rotate_th = NULL;
mikermarza 1:757a52db1604 68 }
mikermarza 1:757a52db1604 69 }
mikermarza 1:757a52db1604 70
mikermarza 1:757a52db1604 71 void LinStepMtr::start() {
mikermarza 2:6c324fded7c1 72 stop_mtr = false;
mikermarza 1:757a52db1604 73 }
mikermarza 1:757a52db1604 74
mikermarza 1:757a52db1604 75 void LinStepMtr::stop() {
mikermarza 2:6c324fded7c1 76 stop_mtr = true;
mikermarza 1:757a52db1604 77 }
mikermarza 1:757a52db1604 78
mikermarza 1:757a52db1604 79 void LinStepMtr::rotate_help(void const *args)
mikermarza 1:757a52db1604 80 {
mikermarza 1:757a52db1604 81 LinStepMtr *instPtr = static_cast<LinStepMtr *>(const_cast<void *>(args));
mikermarza 1:757a52db1604 82
mikermarza 1:757a52db1604 83 instPtr->rotate();
mikermarza 1:757a52db1604 84 }
mikermarza 1:757a52db1604 85
mikermarza 0:54c5be5f26f4 86 void LinStepMtr::rotate()
mikermarza 0:54c5be5f26f4 87 {
mikermarza 1:757a52db1604 88 pc.printf("Called rotate()\n");
mikermarza 1:757a52db1604 89 /*
mikermarza 1:757a52db1604 90 while(1) {
mikermarza 1:757a52db1604 91
mikermarza 1:757a52db1604 92 mtr_ctrl = ++cur_step;
mikermarza 1:757a52db1604 93 rev_cnt +=.005;
mikermarza 1:757a52db1604 94 wait(pause);
mikermarza 1:757a52db1604 95 }
mikermarza 1:757a52db1604 96 */
mikermarza 1:757a52db1604 97
mikermarza 0:54c5be5f26f4 98 while(!terminate) {
mikermarza 0:54c5be5f26f4 99 if(!stop_mtr){
mikermarza 0:54c5be5f26f4 100 switch(dir) {
mikermarza 0:54c5be5f26f4 101 case CW:
mikermarza 0:54c5be5f26f4 102 mtr_ctrl = ++cur_step;
mikermarza 0:54c5be5f26f4 103 rev_cnt +=.005;
mikermarza 0:54c5be5f26f4 104 break;
mikermarza 0:54c5be5f26f4 105 case CCW:
mikermarza 0:54c5be5f26f4 106 mtr_ctrl = --cur_step;
mikermarza 0:54c5be5f26f4 107 rev_cnt-=.005;
mikermarza 0:54c5be5f26f4 108 break;
mikermarza 0:54c5be5f26f4 109 }
mikermarza 1:757a52db1604 110 wait(1/ (float) speed);
mikermarza 0:54c5be5f26f4 111 } else {
mikermarza 0:54c5be5f26f4 112 mtr_ctrl = STOP;
mikermarza 0:54c5be5f26f4 113 Thread::yield();
mikermarza 0:54c5be5f26f4 114 }
mikermarza 0:54c5be5f26f4 115 }
mikermarza 1:757a52db1604 116
mikermarza 0:54c5be5f26f4 117 }
mikermarza 0:54c5be5f26f4 118
mikermarza 0:54c5be5f26f4 119 // Private Step Class functions
mikermarza 0:54c5be5f26f4 120 /*
mikermarza 0:54c5be5f26f4 121 LinStepMtr::Step::Step() : cur_step(ONE)
mikermarza 0:54c5be5f26f4 122 {
mikermarza 0:54c5be5f26f4 123 pc.printf("\n\nCalled Constructor\n cur_step: %x\n",cur_step);
mikermarza 0:54c5be5f26f4 124
mikermarza 0:54c5be5f26f4 125 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 126 };
mikermarza 0:54c5be5f26f4 127 */
mikermarza 0:54c5be5f26f4 128 LinStepMtr::Step_Num LinStepMtr::Step::get_cur_step()
mikermarza 0:54c5be5f26f4 129 {
mikermarza 0:54c5be5f26f4 130 return cur_step;
mikermarza 0:54c5be5f26f4 131 }
mikermarza 0:54c5be5f26f4 132
mikermarza 0:54c5be5f26f4 133 LinStepMtr::Step_Num LinStepMtr::Step::operator++()
mikermarza 0:54c5be5f26f4 134 {
mikermarza 0:54c5be5f26f4 135 switch(cur_step){
mikermarza 0:54c5be5f26f4 136 case ONE:
mikermarza 0:54c5be5f26f4 137 cur_step=TWO;
mikermarza 0:54c5be5f26f4 138 break;
mikermarza 0:54c5be5f26f4 139 case TWO:
mikermarza 0:54c5be5f26f4 140 cur_step = THREE;
mikermarza 0:54c5be5f26f4 141 break;
mikermarza 0:54c5be5f26f4 142 case THREE:
mikermarza 0:54c5be5f26f4 143 cur_step = FOUR;
mikermarza 0:54c5be5f26f4 144 break;
mikermarza 0:54c5be5f26f4 145 case FOUR:
mikermarza 0:54c5be5f26f4 146 cur_step = ONE;
mikermarza 0:54c5be5f26f4 147 break;
mikermarza 0:54c5be5f26f4 148 }
mikermarza 1:757a52db1604 149 //pc.printf(" CUR_STEP = %x\n",cur_step);
mikermarza 0:54c5be5f26f4 150 return cur_step;
mikermarza 0:54c5be5f26f4 151 }
mikermarza 0:54c5be5f26f4 152
mikermarza 0:54c5be5f26f4 153 LinStepMtr::Step_Num LinStepMtr::Step::operator--()
mikermarza 0:54c5be5f26f4 154 {
mikermarza 0:54c5be5f26f4 155 switch(cur_step){
mikermarza 0:54c5be5f26f4 156 case ONE:
mikermarza 0:54c5be5f26f4 157 cur_step=FOUR;
mikermarza 0:54c5be5f26f4 158 break;
mikermarza 0:54c5be5f26f4 159 case TWO:
mikermarza 0:54c5be5f26f4 160 cur_step = ONE;
mikermarza 0:54c5be5f26f4 161 break;
mikermarza 0:54c5be5f26f4 162 case THREE:
mikermarza 0:54c5be5f26f4 163 cur_step = TWO;
mikermarza 0:54c5be5f26f4 164 break;
mikermarza 0:54c5be5f26f4 165 case FOUR:
mikermarza 0:54c5be5f26f4 166 cur_step = THREE;
mikermarza 0:54c5be5f26f4 167 break;
mikermarza 0:54c5be5f26f4 168 }
mikermarza 0:54c5be5f26f4 169 return cur_step;
mikermarza 1:757a52db1604 170 }
mikermarza 1:757a52db1604 171
mikermarza 1:757a52db1604 172 void LinStepMtr::Step::operator=(LinStepMtr::Step_Num s)
mikermarza 1:757a52db1604 173 {
mikermarza 1:757a52db1604 174 cur_step = s;
mikermarza 0:54c5be5f26f4 175 }