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:
Thu Aug 08 09:36:39 2013 +0000
Revision:
3:57d3774612fc
Parent:
2:4102dd9293a6
before publish

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 3:57d3774612fc 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 3:57d3774612fc 59
ceri 3:57d3774612fc 60 // Set default val;ues .. no potr Endstops
ceri 3:57d3774612fc 61 //Port_MASK_L = 0;
ceri 3:57d3774612fc 62 //Port_INV_MASK_L = 0;
ceri 3:57d3774612fc 63
ceri 0:a509cc91f7c2 64 }
ceri 0:a509cc91f7c2 65 }
ceri 0:a509cc91f7c2 66
ceri 0:a509cc91f7c2 67 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 68
ceri 0:a509cc91f7c2 69
ceri 0:a509cc91f7c2 70 bool Stepper::Pulse()
ceri 0:a509cc91f7c2 71 {
ceri 0:a509cc91f7c2 72 // if (Step == NC)
ceri 0:a509cc91f7c2 73 // {
ceri 0:a509cc91f7c2 74 // return false;
ceri 0:a509cc91f7c2 75 // }
ceri 0:a509cc91f7c2 76 // else
ceri 0:a509cc91f7c2 77 // Enable motor .. if not enabled .. short delay befor moveing ..
ceri 0:a509cc91f7c2 78
ceri 2:4102dd9293a6 79 if (_En)
ceri 0:a509cc91f7c2 80 {
ceri 2:4102dd9293a6 81 _En = 0;
ceri 0:a509cc91f7c2 82 wait (0.005); // 5 mSec.
ceri 0:a509cc91f7c2 83 }
ceri 0:a509cc91f7c2 84
ceri 2:4102dd9293a6 85 _En = 0;
ceri 0:a509cc91f7c2 86
ceri 0:a509cc91f7c2 87
ceri 0:a509cc91f7c2 88 {
ceri 0:a509cc91f7c2 89 _Step = 1;
ceri 0:a509cc91f7c2 90 wait_us (2);
ceri 0:a509cc91f7c2 91 _Step = 0;
ceri 0:a509cc91f7c2 92 return true;
ceri 0:a509cc91f7c2 93 }
ceri 0:a509cc91f7c2 94 }
ceri 0:a509cc91f7c2 95
ceri 0:a509cc91f7c2 96 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 97
ceri 1:66e95666c3b5 98
ceri 3:57d3774612fc 99 void Stepper::Enable (bool OnOff)
ceri 1:66e95666c3b5 100 {
ceri 2:4102dd9293a6 101 _En = !OnOff;
ceri 1:66e95666c3b5 102 }
ceri 1:66e95666c3b5 103
ceri 1:66e95666c3b5 104 // ------------------------------------------------------------------------------------
ceri 1:66e95666c3b5 105
ceri 0:a509cc91f7c2 106 bool Stepper::Set_Dir (bool Dir2Set)
ceri 0:a509cc91f7c2 107 {
ceri 0:a509cc91f7c2 108 // if (Dir == NC)
ceri 0:a509cc91f7c2 109 // {
ceri 0:a509cc91f7c2 110 // return false;
ceri 0:a509cc91f7c2 111 // }
ceri 0:a509cc91f7c2 112 // else
ceri 0:a509cc91f7c2 113 {
ceri 0:a509cc91f7c2 114 if (Dir2Set)
ceri 0:a509cc91f7c2 115 {
ceri 0:a509cc91f7c2 116 _Invert_Dir ? _Dir = 0 : _Dir = 1;
ceri 0:a509cc91f7c2 117 }
ceri 0:a509cc91f7c2 118 else
ceri 0:a509cc91f7c2 119 {
ceri 0:a509cc91f7c2 120 _Invert_Dir ? _Dir = 1 : _Dir = 0;
ceri 0:a509cc91f7c2 121 }
ceri 0:a509cc91f7c2 122
ceri 0:a509cc91f7c2 123 return true;
ceri 0:a509cc91f7c2 124 }
ceri 0:a509cc91f7c2 125 }
ceri 0:a509cc91f7c2 126
ceri 0:a509cc91f7c2 127
ceri 0:a509cc91f7c2 128 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 129
ceri 0:a509cc91f7c2 130 // test if ENDSTOP is enabled .... _Endstop_Left
ceri 0:a509cc91f7c2 131
ceri 0:a509cc91f7c2 132 bool Stepper::ESL_Fitted()
ceri 0:a509cc91f7c2 133 {
ceri 0:a509cc91f7c2 134 // (ESL) ? return true : return false;
ceri 0:a509cc91f7c2 135 if (ESL)
ceri 0:a509cc91f7c2 136 return true;
ceri 0:a509cc91f7c2 137 else
ceri 0:a509cc91f7c2 138 return false;
ceri 0:a509cc91f7c2 139 }
ceri 0:a509cc91f7c2 140
ceri 0:a509cc91f7c2 141 //
ceri 0:a509cc91f7c2 142
ceri 0:a509cc91f7c2 143 bool Stepper::ESR_Fitted()
ceri 0:a509cc91f7c2 144 {
ceri 0:a509cc91f7c2 145 //ESR ? return true : return false;
ceri 0:a509cc91f7c2 146 if (ESR)
ceri 0:a509cc91f7c2 147 return true;
ceri 0:a509cc91f7c2 148 else
ceri 0:a509cc91f7c2 149 return false;
ceri 0:a509cc91f7c2 150 }
ceri 0:a509cc91f7c2 151
ceri 0:a509cc91f7c2 152 // ...............................................................................
ceri 0:a509cc91f7c2 153
ceri 0:a509cc91f7c2 154 bool Stepper::ESL_Activeated()
ceri 0:a509cc91f7c2 155 {
ceri 0:a509cc91f7c2 156 bool retval;
ceri 0:a509cc91f7c2 157
ceri 0:a509cc91f7c2 158 if (_Invert_ESL)
ceri 0:a509cc91f7c2 159 {
ceri 0:a509cc91f7c2 160 if (_Endstop_Left) retval = true; else retval = false;
ceri 0:a509cc91f7c2 161 }
ceri 0:a509cc91f7c2 162 else
ceri 0:a509cc91f7c2 163 {
ceri 0:a509cc91f7c2 164 if (_Endstop_Left) retval = false; else retval = true; //
ceri 0:a509cc91f7c2 165 }
ceri 0:a509cc91f7c2 166
ceri 0:a509cc91f7c2 167 if (retval)
ceri 0:a509cc91f7c2 168 {
ceri 1:66e95666c3b5 169 //StepCount = 0; // might be very bad for H-BOT
ceri 0:a509cc91f7c2 170 }
ceri 0:a509cc91f7c2 171
ceri 0:a509cc91f7c2 172 return retval;
ceri 0:a509cc91f7c2 173 }
ceri 0:a509cc91f7c2 174
ceri 0:a509cc91f7c2 175 //
ceri 0:a509cc91f7c2 176
ceri 0:a509cc91f7c2 177 bool Stepper::ESR_Activeated()
ceri 0:a509cc91f7c2 178 {
ceri 0:a509cc91f7c2 179 if (_Invert_ESR)
ceri 0:a509cc91f7c2 180 {
ceri 0:a509cc91f7c2 181 if(_Endstop_Right) return true; else return false;
ceri 0:a509cc91f7c2 182 }
ceri 0:a509cc91f7c2 183 else
ceri 0:a509cc91f7c2 184 {
ceri 0:a509cc91f7c2 185 if(_Endstop_Right) return false; else return true;
ceri 0:a509cc91f7c2 186 }
ceri 0:a509cc91f7c2 187 }
ceri 0:a509cc91f7c2 188 // ------------------------------------------------------------------------------------
ceri 0:a509cc91f7c2 189
ceri 0:a509cc91f7c2 190 // test if endstop is triggerd.
ceri 0:a509cc91f7c2 191 // ** will return false if not triggerd AND false if pin is NC
ceri 0:a509cc91f7c2 192 // ** user should test if connected befor in a nested routeen from MAIN !!
ceri 0:a509cc91f7c2 193
ceri 0:a509cc91f7c2 194
ceri 0:a509cc91f7c2 195
ceri 3:57d3774612fc 196 bool Stepper::ESL_Port(int PORT_In)
ceri 3:57d3774612fc 197 {
ceri 3:57d3774612fc 198 bool Ret = false;
ceri 3:57d3774612fc 199
ceri 3:57d3774612fc 200 if (!Port_MASK_L)
ceri 3:57d3774612fc 201 {
ceri 3:57d3774612fc 202 Ret = false;
ceri 3:57d3774612fc 203 }
ceri 3:57d3774612fc 204 else
ceri 3:57d3774612fc 205 {
ceri 3:57d3774612fc 206 if (PORT_In && Port_MASK_L)
ceri 3:57d3774612fc 207 {
ceri 3:57d3774612fc 208 (Port_INV_MASK_L) ? Ret = true : Ret = false;
ceri 3:57d3774612fc 209 }
ceri 3:57d3774612fc 210 else
ceri 3:57d3774612fc 211 {
ceri 3:57d3774612fc 212 (Port_INV_MASK_L) ? Ret = false : Ret = true;
ceri 3:57d3774612fc 213 }
ceri 3:57d3774612fc 214 }
ceri 3:57d3774612fc 215
ceri 3:57d3774612fc 216 return (Ret);
ceri 3:57d3774612fc 217 }
ceri 0:a509cc91f7c2 218
ceri 0:a509cc91f7c2 219
ceri 3:57d3774612fc 220 // .............................
ceri 0:a509cc91f7c2 221
ceri 3:57d3774612fc 222 void Stepper::ESL_Set_MASK (int Port_MASK_L_in)
ceri 3:57d3774612fc 223 {
ceri 3:57d3774612fc 224 Port_MASK_L = Port_MASK_L_in;
ceri 3:57d3774612fc 225 }
ceri 3:57d3774612fc 226
ceri 3:57d3774612fc 227 void Stepper::ESL_Set_INV_MASK (int Port_INV_MASK_L_in)
ceri 3:57d3774612fc 228 {
ceri 3:57d3774612fc 229 Port_INV_MASK_L = Port_INV_MASK_L_in;
ceri 3:57d3774612fc 230 }
ceri 0:a509cc91f7c2 231
ceri 0:a509cc91f7c2 232
ceri 0:a509cc91f7c2 233
ceri 0:a509cc91f7c2 234
ceri 0:a509cc91f7c2 235
ceri 0:a509cc91f7c2 236
ceri 0:a509cc91f7c2 237
ceri 0:a509cc91f7c2 238
ceri 0:a509cc91f7c2 239
ceri 0:a509cc91f7c2 240
ceri 0:a509cc91f7c2 241
ceri 0:a509cc91f7c2 242
ceri 0:a509cc91f7c2 243 /* **********************************************************************
ceri 0:a509cc91f7c2 244
ceri 0:a509cc91f7c2 245 **
ceri 0:a509cc91f7c2 246 * ` want an entity for a SINGLE Stepper motor, and assosiated things ..
ceri 0:a509cc91f7c2 247
ceri 0:a509cc91f7c2 248 PINS:
ceri 0:a509cc91f7c2 249 step,
ceri 0:a509cc91f7c2 250 Direction,
ceri 0:a509cc91f7c2 251 Enable,
ceri 0:a509cc91f7c2 252
ceri 0:a509cc91f7c2 253 endstop_left
ceri 0:a509cc91f7c2 254 endstop_right
ceri 0:a509cc91f7c2 255
ceri 0:a509cc91f7c2 256 Direction_Invert (T/F)
ceri 0:a509cc91f7c2 257
ceri 0:a509cc91f7c2 258 calls:
ceri 0:a509cc91f7c2 259 step
ceri 0:a509cc91f7c2 260 Endstop_Detected
ceri 0:a509cc91f7c2 261 **
ceri 0:a509cc91f7c2 262 *
ceri 0:a509cc91f7c2 263 *
ceri 0:a509cc91f7c2 264 Vars:
ceri 0:a509cc91f7c2 265 Number of steps to take
ceri 0:a509cc91f7c2 266 *
ceri 0:a509cc91f7c2 267 *
ceri 0:a509cc91f7c2 268 **
ceri 0:a509cc91f7c2 269 * also need to be able to tell if endstops are defined
ceri 0:a509cc91f7c2 270 *
ceri 0:a509cc91f7c2 271 *
ceri 0:a509cc91f7c2 272
ceri 0:a509cc91f7c2 273 if (ESR != NC) ESR_En = true; else ESR_En = false; // 44;
ceri 0:a509cc91f7c2 274
ceri 0:a509cc91f7c2 275 // got 340 with g1 defined ..
ceri 0:a509cc91f7c2 276 // got 44 with NO define :)
ceri 0:a509cc91f7c2 277
ceri 0:a509cc91f7c2 278 ***************************
ceri 0:a509cc91f7c2 279
ceri 0:a509cc91f7c2 280 if (Endstop_Right_Enabled)
ceri 0:a509cc91f7c2 281 {
ceri 0:a509cc91f7c2 282
ceri 0:a509cc91f7c2 283 }
ceri 0:a509cc91f7c2 284 else
ceri 0:a509cc91f7c2 285 {
ceri 0:a509cc91f7c2 286
ceri 0:a509cc91f7c2 287 }
ceri 0:a509cc91f7c2 288
ceri 0:a509cc91f7c2 289 * ********************************************************************* */