Libary for Strpper motor controller, eg: Rep-Rap smart stick Catering for both, Phisical 'PIN' endstops, and PORT Expander end stops . ** BOTH IN TEST ** ** Phisical PIN tested (minimal) **** PORT PIN NOT TESTED ****

Committer:
ceri
Date:
Fri Aug 02 13:59:28 2013 +0000
Revision:
2:4102dd9293a6
Parent:
1:66e95666c3b5
Child:
3:57d3774612fc
Added little bit to allow pull up on End stops.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ceri 0:a509cc91f7c2 1
ceri 0:a509cc91f7c2 2
ceri 0:a509cc91f7c2 3
ceri 0:a509cc91f7c2 4 #include "mbed.h"
ceri 0:a509cc91f7c2 5 #include "Stepper.h"
ceri 0:a509cc91f7c2 6
ceri 0:a509cc91f7c2 7
ceri 0:a509cc91f7c2 8 /* .......................................
ceri 0:a509cc91f7c2 9
ceri 0:a509cc91f7c2 10 ? Pars Expanded Byte(s)
ceri 0:a509cc91f7c2 11
ceri 0:a509cc91f7c2 12 Assuming Port expander is used;
ceri 0:a509cc91f7c2 13
ceri 0:a509cc91f7c2 14 then on ISR, read chip registors ..
ceri 0:a509cc91f7c2 15 -> code ->
ceri 0:a509cc91f7c2 16 ........................................ */
ceri 0:a509cc91f7c2 17
ceri 0:a509cc91f7c2 18
ceri 0:a509cc91f7c2 19
ceri 0:a509cc91f7c2 20 Stepper::Stepper(PinName Step, PinName Dir, PinName En,
ceri 0:a509cc91f7c2 21 PinName Endstop_Left,
ceri 0:a509cc91f7c2 22 PinName Endstop_Right,
ceri 0:a509cc91f7c2 23
ceri 0:a509cc91f7c2 24 bool Invert_Dir,
ceri 0:a509cc91f7c2 25 bool Invert_ESL,
ceri 0:a509cc91f7c2 26 bool Invert_ESR)
ceri 0:a509cc91f7c2 27
ceri 0:a509cc91f7c2 28
ceri 0:a509cc91f7c2 29 : _Step (Step), _Dir(Dir), _En(En), _Endstop_Left(Endstop_Left), _Endstop_Right(Endstop_Right)
ceri 0:a509cc91f7c2 30 {
ceri 0:a509cc91f7c2 31
ceri 0:a509cc91f7c2 32 // Assume End Stop Left is MIN,
ceri 0:a509cc91f7c2 33 // and End Stop Right is MAX endstop.
ceri 0:a509cc91f7c2 34
ceri 0:a509cc91f7c2 35 _Invert_Dir = Invert_Dir,
ceri 0:a509cc91f7c2 36 _Invert_ESL = Invert_ESL,
ceri 0:a509cc91f7c2 37 _Invert_ESR = Invert_ESR;
ceri 0:a509cc91f7c2 38
ceri 0:a509cc91f7c2 39 {
ceri 0:a509cc91f7c2 40 // bool read_1();
ceri 2:4102dd9293a6 41 if (Endstop_Left != NC)
ceri 2:4102dd9293a6 42 {
ceri 2:4102dd9293a6 43 ESL = true;
ceri 2:4102dd9293a6 44 _Endstop_Left.mode (PullUp);
ceri 2:4102dd9293a6 45 }
ceri 2:4102dd9293a6 46 else
ceri 2:4102dd9293a6 47 {
ceri 2:4102dd9293a6 48 ESL = false;
ceri 2:4102dd9293a6 49 }
ceri 2:4102dd9293a6 50 if (Endstop_Right != NC)
ceri 2:4102dd9293a6 51 {
ceri 2:4102dd9293a6 52 ESR = true;
ceri 2:4102dd9293a6 53 _Endstop_Right.mode (PullUp);
ceri 2:4102dd9293a6 54 }
ceri 2:4102dd9293a6 55 else
ceri 2:4102dd9293a6 56 {
ceri 2:4102dd9293a6 57 ESR = false;
ceri 2:4102dd9293a6 58 }
ceri 0:a509cc91f7c2 59
ceri 0:a509cc91f7c2 60 }
ceri 0:a509cc91f7c2 61 }
ceri 0:a509cc91f7c2 62
ceri 0:a509cc91f7c2 63 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 64
ceri 0:a509cc91f7c2 65
ceri 0:a509cc91f7c2 66 bool Stepper::Pulse()
ceri 0:a509cc91f7c2 67 {
ceri 0:a509cc91f7c2 68 // if (Step == NC)
ceri 0:a509cc91f7c2 69 // {
ceri 0:a509cc91f7c2 70 // return false;
ceri 0:a509cc91f7c2 71 // }
ceri 0:a509cc91f7c2 72 // else
ceri 0:a509cc91f7c2 73 // Enable motor .. if not enabled .. short delay befor moveing ..
ceri 0:a509cc91f7c2 74
ceri 2:4102dd9293a6 75 if (_En)
ceri 0:a509cc91f7c2 76 {
ceri 2:4102dd9293a6 77 _En = 0;
ceri 0:a509cc91f7c2 78 wait (0.005); // 5 mSec.
ceri 0:a509cc91f7c2 79 }
ceri 0:a509cc91f7c2 80
ceri 2:4102dd9293a6 81 _En = 0;
ceri 0:a509cc91f7c2 82
ceri 0:a509cc91f7c2 83
ceri 0:a509cc91f7c2 84 {
ceri 0:a509cc91f7c2 85 _Step = 1;
ceri 0:a509cc91f7c2 86 wait_us (2);
ceri 0:a509cc91f7c2 87 _Step = 0;
ceri 0:a509cc91f7c2 88 return true;
ceri 0:a509cc91f7c2 89 }
ceri 0:a509cc91f7c2 90 }
ceri 0:a509cc91f7c2 91
ceri 0:a509cc91f7c2 92 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 93
ceri 1:66e95666c3b5 94
ceri 1:66e95666c3b5 95 bool Stepper::Enable (bool OnOff)
ceri 1:66e95666c3b5 96 {
ceri 2:4102dd9293a6 97 _En = !OnOff;
ceri 1:66e95666c3b5 98 }
ceri 1:66e95666c3b5 99
ceri 1:66e95666c3b5 100 // ------------------------------------------------------------------------------------
ceri 1:66e95666c3b5 101
ceri 0:a509cc91f7c2 102 bool Stepper::Set_Dir (bool Dir2Set)
ceri 0:a509cc91f7c2 103 {
ceri 0:a509cc91f7c2 104 // if (Dir == NC)
ceri 0:a509cc91f7c2 105 // {
ceri 0:a509cc91f7c2 106 // return false;
ceri 0:a509cc91f7c2 107 // }
ceri 0:a509cc91f7c2 108 // else
ceri 0:a509cc91f7c2 109 {
ceri 0:a509cc91f7c2 110 if (Dir2Set)
ceri 0:a509cc91f7c2 111 {
ceri 0:a509cc91f7c2 112 _Invert_Dir ? _Dir = 0 : _Dir = 1;
ceri 0:a509cc91f7c2 113 }
ceri 0:a509cc91f7c2 114 else
ceri 0:a509cc91f7c2 115 {
ceri 0:a509cc91f7c2 116 _Invert_Dir ? _Dir = 1 : _Dir = 0;
ceri 0:a509cc91f7c2 117 }
ceri 0:a509cc91f7c2 118
ceri 0:a509cc91f7c2 119 return true;
ceri 0:a509cc91f7c2 120 }
ceri 0:a509cc91f7c2 121 }
ceri 0:a509cc91f7c2 122
ceri 0:a509cc91f7c2 123
ceri 0:a509cc91f7c2 124 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 125
ceri 0:a509cc91f7c2 126 // test if ENDSTOP is enabled .... _Endstop_Left
ceri 0:a509cc91f7c2 127
ceri 0:a509cc91f7c2 128 bool Stepper::ESL_Fitted()
ceri 0:a509cc91f7c2 129 {
ceri 0:a509cc91f7c2 130 // (ESL) ? return true : return false;
ceri 0:a509cc91f7c2 131 if (ESL)
ceri 0:a509cc91f7c2 132 return true;
ceri 0:a509cc91f7c2 133 else
ceri 0:a509cc91f7c2 134 return false;
ceri 0:a509cc91f7c2 135 }
ceri 0:a509cc91f7c2 136
ceri 0:a509cc91f7c2 137 //
ceri 0:a509cc91f7c2 138
ceri 0:a509cc91f7c2 139 bool Stepper::ESR_Fitted()
ceri 0:a509cc91f7c2 140 {
ceri 0:a509cc91f7c2 141 //ESR ? return true : return false;
ceri 0:a509cc91f7c2 142 if (ESR)
ceri 0:a509cc91f7c2 143 return true;
ceri 0:a509cc91f7c2 144 else
ceri 0:a509cc91f7c2 145 return false;
ceri 0:a509cc91f7c2 146 }
ceri 0:a509cc91f7c2 147
ceri 0:a509cc91f7c2 148 // ...............................................................................
ceri 0:a509cc91f7c2 149
ceri 0:a509cc91f7c2 150 bool Stepper::ESL_Activeated()
ceri 0:a509cc91f7c2 151 {
ceri 0:a509cc91f7c2 152 bool retval;
ceri 0:a509cc91f7c2 153
ceri 0:a509cc91f7c2 154 if (_Invert_ESL)
ceri 0:a509cc91f7c2 155 {
ceri 0:a509cc91f7c2 156 if (_Endstop_Left) retval = true; else retval = false;
ceri 0:a509cc91f7c2 157 }
ceri 0:a509cc91f7c2 158 else
ceri 0:a509cc91f7c2 159 {
ceri 0:a509cc91f7c2 160 if (_Endstop_Left) retval = false; else retval = true; //
ceri 0:a509cc91f7c2 161 }
ceri 0:a509cc91f7c2 162
ceri 0:a509cc91f7c2 163 if (retval)
ceri 0:a509cc91f7c2 164 {
ceri 1:66e95666c3b5 165 //StepCount = 0; // might be very bad for H-BOT
ceri 0:a509cc91f7c2 166 }
ceri 0:a509cc91f7c2 167
ceri 0:a509cc91f7c2 168 return retval;
ceri 0:a509cc91f7c2 169 }
ceri 0:a509cc91f7c2 170
ceri 0:a509cc91f7c2 171 //
ceri 0:a509cc91f7c2 172
ceri 0:a509cc91f7c2 173 bool Stepper::ESR_Activeated()
ceri 0:a509cc91f7c2 174 {
ceri 0:a509cc91f7c2 175 if (_Invert_ESR)
ceri 0:a509cc91f7c2 176 {
ceri 0:a509cc91f7c2 177 if(_Endstop_Right) return true; else return false;
ceri 0:a509cc91f7c2 178 }
ceri 0:a509cc91f7c2 179 else
ceri 0:a509cc91f7c2 180 {
ceri 0:a509cc91f7c2 181 if(_Endstop_Right) return false; else return true;
ceri 0:a509cc91f7c2 182 }
ceri 0:a509cc91f7c2 183 }
ceri 0:a509cc91f7c2 184 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 185
ceri 0:a509cc91f7c2 186 // test if endstop is triggerd.
ceri 0:a509cc91f7c2 187 // ** will return false if not triggerd AND false if pin is NC
ceri 0:a509cc91f7c2 188 // ** user should test if connected befor in a nested routeen from MAIN !!
ceri 0:a509cc91f7c2 189
ceri 0:a509cc91f7c2 190
ceri 0:a509cc91f7c2 191
ceri 0:a509cc91f7c2 192
ceri 0:a509cc91f7c2 193
ceri 0:a509cc91f7c2 194
ceri 0:a509cc91f7c2 195
ceri 0:a509cc91f7c2 196
ceri 0:a509cc91f7c2 197
ceri 0:a509cc91f7c2 198
ceri 0:a509cc91f7c2 199
ceri 0:a509cc91f7c2 200
ceri 0:a509cc91f7c2 201
ceri 0:a509cc91f7c2 202
ceri 0:a509cc91f7c2 203
ceri 0:a509cc91f7c2 204
ceri 0:a509cc91f7c2 205
ceri 0:a509cc91f7c2 206
ceri 0:a509cc91f7c2 207
ceri 0:a509cc91f7c2 208 /* **********************************************************************
ceri 0:a509cc91f7c2 209
ceri 0:a509cc91f7c2 210 **
ceri 0:a509cc91f7c2 211 * ` want an entity for a SINGLE Stepper motor, and assosiated things ..
ceri 0:a509cc91f7c2 212
ceri 0:a509cc91f7c2 213 PINS:
ceri 0:a509cc91f7c2 214 step,
ceri 0:a509cc91f7c2 215 Direction,
ceri 0:a509cc91f7c2 216 Enable,
ceri 0:a509cc91f7c2 217
ceri 0:a509cc91f7c2 218 endstop_left
ceri 0:a509cc91f7c2 219 endstop_right
ceri 0:a509cc91f7c2 220
ceri 0:a509cc91f7c2 221 Direction_Invert (T/F)
ceri 0:a509cc91f7c2 222
ceri 0:a509cc91f7c2 223 calls:
ceri 0:a509cc91f7c2 224 step
ceri 0:a509cc91f7c2 225 Endstop_Detected
ceri 0:a509cc91f7c2 226 **
ceri 0:a509cc91f7c2 227 *
ceri 0:a509cc91f7c2 228 *
ceri 0:a509cc91f7c2 229 Vars:
ceri 0:a509cc91f7c2 230 Number of steps to take
ceri 0:a509cc91f7c2 231 *
ceri 0:a509cc91f7c2 232 *
ceri 0:a509cc91f7c2 233 **
ceri 0:a509cc91f7c2 234 * also need to be able to tell if endstops are defined
ceri 0:a509cc91f7c2 235 *
ceri 0:a509cc91f7c2 236 *
ceri 0:a509cc91f7c2 237
ceri 0:a509cc91f7c2 238 if (ESR != NC) ESR_En = true; else ESR_En = false; // 44;
ceri 0:a509cc91f7c2 239
ceri 0:a509cc91f7c2 240 // got 340 with g1 defined ..
ceri 0:a509cc91f7c2 241 // got 44 with NO define :)
ceri 0:a509cc91f7c2 242
ceri 0:a509cc91f7c2 243 ***************************
ceri 0:a509cc91f7c2 244
ceri 0:a509cc91f7c2 245 if (Endstop_Right_Enabled)
ceri 0:a509cc91f7c2 246 {
ceri 0:a509cc91f7c2 247
ceri 0:a509cc91f7c2 248 }
ceri 0:a509cc91f7c2 249 else
ceri 0:a509cc91f7c2 250 {
ceri 0:a509cc91f7c2 251
ceri 0:a509cc91f7c2 252 }
ceri 0:a509cc91f7c2 253
ceri 0:a509cc91f7c2 254 * ********************************************************************* */