Zachary Hammond / Mbed 2 deprecated Stepper_Driver_Board_Test_Z

Dependencies:   mbed

Fork of Stepper_Driver_Board_Test by Bradley Perry

Committer:
perr1940
Date:
Fri Oct 10 22:30:40 2014 +0000
Revision:
0:a1abeb6aa42c
Original Version, modified for 5V motor with Eval board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
perr1940 0:a1abeb6aa42c 1 /* L6482 Driver code communicated via SPI
perr1940 0:a1abeb6aa42c 2 * file name: StepperDriver.cpp
perr1940 0:a1abeb6aa42c 3 * 07/15/2014 edited by Grace (Yi-Wen Liao)
perr1940 0:a1abeb6aa42c 4 */
perr1940 0:a1abeb6aa42c 5 #include "StepperDriver.h"
perr1940 0:a1abeb6aa42c 6 #include "mbed.h"
perr1940 0:a1abeb6aa42c 7
perr1940 0:a1abeb6aa42c 8 StepperDriver::StepperDriver(PinName CSPin, PinName mosi, PinName miso, PinName sck) : _CSPin(CSPin), SPIPin(mosi,miso,sck)
perr1940 0:a1abeb6aa42c 9 {
perr1940 0:a1abeb6aa42c 10 // When CSPin is high the device is unselected
perr1940 0:a1abeb6aa42c 11 _CSPin = 1;
perr1940 0:a1abeb6aa42c 12 SPIPin.format(8,3); // 8 bit data, Mode 3
perr1940 0:a1abeb6aa42c 13 SPIPin.frequency(5000000); // 8MHz clock rate
perr1940 0:a1abeb6aa42c 14 }
perr1940 0:a1abeb6aa42c 15
perr1940 0:a1abeb6aa42c 16 // StepperDrive Command Management (datasheet p.61)
perr1940 0:a1abeb6aa42c 17 void StepperDriver::setParam(char param, unsigned long value)
perr1940 0:a1abeb6aa42c 18 {
perr1940 0:a1abeb6aa42c 19 param |= SET_PARAM;
perr1940 0:a1abeb6aa42c 20 SPIWrite((char)param);
perr1940 0:a1abeb6aa42c 21 paramHandler(param, value);
perr1940 0:a1abeb6aa42c 22 }
perr1940 0:a1abeb6aa42c 23
perr1940 0:a1abeb6aa42c 24 unsigned long StepperDriver::getParam(char param)
perr1940 0:a1abeb6aa42c 25 {
perr1940 0:a1abeb6aa42c 26 SPIWrite(param|GET_PARAM);
perr1940 0:a1abeb6aa42c 27 return paramHandler(param,0);
perr1940 0:a1abeb6aa42c 28 }
perr1940 0:a1abeb6aa42c 29
perr1940 0:a1abeb6aa42c 30 int StepperDriver::getStatus()
perr1940 0:a1abeb6aa42c 31 {
perr1940 0:a1abeb6aa42c 32 int temp = 1;
perr1940 0:a1abeb6aa42c 33 char* bytePointer = (char*)&temp;
perr1940 0:a1abeb6aa42c 34 SPIWrite(GET_STATUS);
perr1940 0:a1abeb6aa42c 35 bytePointer[1] = SPIWrite(0);
perr1940 0:a1abeb6aa42c 36 bytePointer[0] = SPIWrite(0);
perr1940 0:a1abeb6aa42c 37 return temp;
perr1940 0:a1abeb6aa42c 38 }
perr1940 0:a1abeb6aa42c 39
perr1940 0:a1abeb6aa42c 40 void StepperDriver::run(char dir, float stepsPerSec)
perr1940 0:a1abeb6aa42c 41 {
perr1940 0:a1abeb6aa42c 42 SPIWrite(RUN|dir);
perr1940 0:a1abeb6aa42c 43 unsigned long integerSpeed = spdCalc(stepsPerSec);
perr1940 0:a1abeb6aa42c 44 if (integerSpeed > 0xFFFFF) integerSpeed = 0xFFFFF;
perr1940 0:a1abeb6aa42c 45
perr1940 0:a1abeb6aa42c 46 char *bytepointer = (char *)&integerSpeed;
perr1940 0:a1abeb6aa42c 47 for (int i=2; i>=0; i--) // most significant bytr first (datasheet p.61)
perr1940 0:a1abeb6aa42c 48 {
perr1940 0:a1abeb6aa42c 49 SPIWrite(bytepointer[i]);
perr1940 0:a1abeb6aa42c 50 }
perr1940 0:a1abeb6aa42c 51 }
perr1940 0:a1abeb6aa42c 52
perr1940 0:a1abeb6aa42c 53 void StepperDriver::move(char dir, unsigned long numSteps)
perr1940 0:a1abeb6aa42c 54 {
perr1940 0:a1abeb6aa42c 55 SPIWrite(MOVE|dir);
perr1940 0:a1abeb6aa42c 56 if (numSteps > 0x3FFFFF) numSteps = 0x3FFFFF;
perr1940 0:a1abeb6aa42c 57 char* bytePointer = (char*)&numSteps;
perr1940 0:a1abeb6aa42c 58
perr1940 0:a1abeb6aa42c 59 for (int i = 2; i >= 0; i--)
perr1940 0:a1abeb6aa42c 60 {
perr1940 0:a1abeb6aa42c 61 SPIWrite(bytePointer[i]);
perr1940 0:a1abeb6aa42c 62 }
perr1940 0:a1abeb6aa42c 63 }
perr1940 0:a1abeb6aa42c 64
perr1940 0:a1abeb6aa42c 65 // StepperDriver Programming Manual (Datasheet p.43)
perr1940 0:a1abeb6aa42c 66 void StepperDriver::setAcc(float stepsPerSecondPerSecond)
perr1940 0:a1abeb6aa42c 67 {
perr1940 0:a1abeb6aa42c 68 unsigned long integerAcc = accCalc(stepsPerSecondPerSecond);
perr1940 0:a1abeb6aa42c 69 setParam(ACC, integerAcc);
perr1940 0:a1abeb6aa42c 70 }
perr1940 0:a1abeb6aa42c 71
perr1940 0:a1abeb6aa42c 72 void StepperDriver::setDec(float stepsPerSecondPerSecond)
perr1940 0:a1abeb6aa42c 73 {
perr1940 0:a1abeb6aa42c 74 unsigned long integerDec = decCalc(stepsPerSecondPerSecond);
perr1940 0:a1abeb6aa42c 75 setParam(DEC, integerDec);
perr1940 0:a1abeb6aa42c 76 }
perr1940 0:a1abeb6aa42c 77
perr1940 0:a1abeb6aa42c 78 void StepperDriver::setMaxSpeed(float stepsPerSecond)
perr1940 0:a1abeb6aa42c 79 {
perr1940 0:a1abeb6aa42c 80 unsigned long integerSpeed = maxSpdCalc(stepsPerSecond);
perr1940 0:a1abeb6aa42c 81 setParam(MAX_SPEED, integerSpeed);
perr1940 0:a1abeb6aa42c 82 }
perr1940 0:a1abeb6aa42c 83
perr1940 0:a1abeb6aa42c 84 void StepperDriver::setFullSpeed(float stepsPerSecond)
perr1940 0:a1abeb6aa42c 85 {
perr1940 0:a1abeb6aa42c 86 unsigned long integerSpeed = FSCalc(stepsPerSecond);
perr1940 0:a1abeb6aa42c 87 setParam(FS_SPD, integerSpeed);
perr1940 0:a1abeb6aa42c 88 }
perr1940 0:a1abeb6aa42c 89
perr1940 0:a1abeb6aa42c 90 void StepperDriver::setAccTVAL(char tvalInput)
perr1940 0:a1abeb6aa42c 91 {
perr1940 0:a1abeb6aa42c 92 setParam(TVAL_ACC, (unsigned long)tvalInput);
perr1940 0:a1abeb6aa42c 93 }
perr1940 0:a1abeb6aa42c 94
perr1940 0:a1abeb6aa42c 95 void StepperDriver::setDecTVAL(char tvalInput)
perr1940 0:a1abeb6aa42c 96 {
perr1940 0:a1abeb6aa42c 97 setParam(TVAL_DEC, (unsigned long)tvalInput);
perr1940 0:a1abeb6aa42c 98 }
perr1940 0:a1abeb6aa42c 99
perr1940 0:a1abeb6aa42c 100 void StepperDriver::setRunTVAL(char tvalInput)
perr1940 0:a1abeb6aa42c 101 {
perr1940 0:a1abeb6aa42c 102 setParam(TVAL_RUN, (unsigned long)tvalInput);
perr1940 0:a1abeb6aa42c 103 }
perr1940 0:a1abeb6aa42c 104
perr1940 0:a1abeb6aa42c 105 void StepperDriver::setHoldTVAL(char tvalInput)
perr1940 0:a1abeb6aa42c 106 {
perr1940 0:a1abeb6aa42c 107 setParam(TVAL_HOLD, (unsigned long)tvalInput);
perr1940 0:a1abeb6aa42c 108 }
perr1940 0:a1abeb6aa42c 109
perr1940 0:a1abeb6aa42c 110 unsigned long StepperDriver::accCalc(float stepsPerSecSec)
perr1940 0:a1abeb6aa42c 111 {
perr1940 0:a1abeb6aa42c 112 float temp = stepsPerSecSec*0.06871947674;
perr1940 0:a1abeb6aa42c 113 if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
perr1940 0:a1abeb6aa42c 114 else return (unsigned long) long(temp);
perr1940 0:a1abeb6aa42c 115 }
perr1940 0:a1abeb6aa42c 116
perr1940 0:a1abeb6aa42c 117 unsigned long StepperDriver::decCalc(float stepsPerSecSec)
perr1940 0:a1abeb6aa42c 118 {
perr1940 0:a1abeb6aa42c 119 float temp = stepsPerSecSec*0.06871947674;
perr1940 0:a1abeb6aa42c 120 if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
perr1940 0:a1abeb6aa42c 121 else return (unsigned long) long(temp);
perr1940 0:a1abeb6aa42c 122 }
perr1940 0:a1abeb6aa42c 123
perr1940 0:a1abeb6aa42c 124 unsigned long StepperDriver::spdCalc(float stepsPerSec)
perr1940 0:a1abeb6aa42c 125 {
perr1940 0:a1abeb6aa42c 126 float temp = stepsPerSec*67.106;
perr1940 0:a1abeb6aa42c 127 if( (unsigned long) long(temp) > 0x000FFFFF) return 0x000FFFFF;
perr1940 0:a1abeb6aa42c 128 else return (unsigned long) temp;
perr1940 0:a1abeb6aa42c 129 }
perr1940 0:a1abeb6aa42c 130
perr1940 0:a1abeb6aa42c 131 unsigned long StepperDriver::maxSpdCalc(float stepsPerSec)
perr1940 0:a1abeb6aa42c 132 {
perr1940 0:a1abeb6aa42c 133 unsigned long temp = ceil(stepsPerSec * 0.065536);
perr1940 0:a1abeb6aa42c 134 if(temp > 0x000003FF) return 0x000003FF;
perr1940 0:a1abeb6aa42c 135 else return temp;
perr1940 0:a1abeb6aa42c 136 }
perr1940 0:a1abeb6aa42c 137
perr1940 0:a1abeb6aa42c 138 unsigned long StepperDriver::minSpdCalc(float stepsPerSec)
perr1940 0:a1abeb6aa42c 139 {
perr1940 0:a1abeb6aa42c 140 float temp = stepsPerSec * 4.194304;
perr1940 0:a1abeb6aa42c 141 if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
perr1940 0:a1abeb6aa42c 142 else return (unsigned long) long(temp);
perr1940 0:a1abeb6aa42c 143 }
perr1940 0:a1abeb6aa42c 144
perr1940 0:a1abeb6aa42c 145 unsigned long StepperDriver::FSCalc(float stepsPerSec)
perr1940 0:a1abeb6aa42c 146 {
perr1940 0:a1abeb6aa42c 147 float temp = (stepsPerSec * 0.065536)-0.5;
perr1940 0:a1abeb6aa42c 148 if( (unsigned long) long(temp) > 0x000003FF) return 0x000003FF;
perr1940 0:a1abeb6aa42c 149 else return (unsigned long) long(temp);
perr1940 0:a1abeb6aa42c 150 }
perr1940 0:a1abeb6aa42c 151
perr1940 0:a1abeb6aa42c 152 void StepperDriver::resetDev()
perr1940 0:a1abeb6aa42c 153 {
perr1940 0:a1abeb6aa42c 154 SPIWrite(RESET_DEVICE);
perr1940 0:a1abeb6aa42c 155 }
perr1940 0:a1abeb6aa42c 156
perr1940 0:a1abeb6aa42c 157 void StepperDriver::hardHiZ()
perr1940 0:a1abeb6aa42c 158 {
perr1940 0:a1abeb6aa42c 159 SPIWrite(HARD_HIZ);
perr1940 0:a1abeb6aa42c 160 }
perr1940 0:a1abeb6aa42c 161
perr1940 0:a1abeb6aa42c 162 void StepperDriver::softHiZ()
perr1940 0:a1abeb6aa42c 163 {
perr1940 0:a1abeb6aa42c 164 SPIWrite(SOFT_HIZ);
perr1940 0:a1abeb6aa42c 165 }
perr1940 0:a1abeb6aa42c 166
perr1940 0:a1abeb6aa42c 167 unsigned long StepperDriver::writeParam(unsigned long value, char bitLength)
perr1940 0:a1abeb6aa42c 168 {
perr1940 0:a1abeb6aa42c 169 char byteLength = bitLength/8;
perr1940 0:a1abeb6aa42c 170 if (bitLength%8 > 0) byteLength++;
perr1940 0:a1abeb6aa42c 171 unsigned long mask = 0xFFFFFFFF >> (32-bitLength);
perr1940 0:a1abeb6aa42c 172 if (value > mask) value = mask;
perr1940 0:a1abeb6aa42c 173 char *bytePointer = (char*)&value;
perr1940 0:a1abeb6aa42c 174
perr1940 0:a1abeb6aa42c 175 for(int i=byteLength-1; i>=0; i--)
perr1940 0:a1abeb6aa42c 176 {
perr1940 0:a1abeb6aa42c 177 bytePointer[i] = SPIWrite(bytePointer[i]);
perr1940 0:a1abeb6aa42c 178 }
perr1940 0:a1abeb6aa42c 179
perr1940 0:a1abeb6aa42c 180 return value;
perr1940 0:a1abeb6aa42c 181 }
perr1940 0:a1abeb6aa42c 182
perr1940 0:a1abeb6aa42c 183 char StepperDriver::SPIWrite(char data)
perr1940 0:a1abeb6aa42c 184 {
perr1940 0:a1abeb6aa42c 185 char rxData;
perr1940 0:a1abeb6aa42c 186 _CSPin = 0;
perr1940 0:a1abeb6aa42c 187 rxData = SPIPin.write(data);
perr1940 0:a1abeb6aa42c 188 _CSPin = 1;
perr1940 0:a1abeb6aa42c 189 return rxData;
perr1940 0:a1abeb6aa42c 190 }
perr1940 0:a1abeb6aa42c 191
perr1940 0:a1abeb6aa42c 192 unsigned long StepperDriver::paramHandler(char param, unsigned long value)
perr1940 0:a1abeb6aa42c 193 {
perr1940 0:a1abeb6aa42c 194 unsigned long returnValue = 0;
perr1940 0:a1abeb6aa42c 195 switch (param)
perr1940 0:a1abeb6aa42c 196 {
perr1940 0:a1abeb6aa42c 197 case ABS_POS:
perr1940 0:a1abeb6aa42c 198 returnValue = writeParam(value, 22);
perr1940 0:a1abeb6aa42c 199 break;
perr1940 0:a1abeb6aa42c 200
perr1940 0:a1abeb6aa42c 201 case EL_POS:
perr1940 0:a1abeb6aa42c 202 returnValue = writeParam(value, 9);
perr1940 0:a1abeb6aa42c 203 break;
perr1940 0:a1abeb6aa42c 204
perr1940 0:a1abeb6aa42c 205 case MARK:
perr1940 0:a1abeb6aa42c 206 returnValue = writeParam(value, 22);
perr1940 0:a1abeb6aa42c 207 break;
perr1940 0:a1abeb6aa42c 208
perr1940 0:a1abeb6aa42c 209 case SPEED:
perr1940 0:a1abeb6aa42c 210 returnValue = writeParam(0, 20);
perr1940 0:a1abeb6aa42c 211 break;
perr1940 0:a1abeb6aa42c 212
perr1940 0:a1abeb6aa42c 213 case MAX_SPEED:
perr1940 0:a1abeb6aa42c 214 returnValue = writeParam(value, 10);
perr1940 0:a1abeb6aa42c 215 break;
perr1940 0:a1abeb6aa42c 216
perr1940 0:a1abeb6aa42c 217 case ACC:
perr1940 0:a1abeb6aa42c 218 returnValue = writeParam(value, 12);
perr1940 0:a1abeb6aa42c 219 break;
perr1940 0:a1abeb6aa42c 220
perr1940 0:a1abeb6aa42c 221 case DEC:
perr1940 0:a1abeb6aa42c 222 returnValue = writeParam(value, 12);
perr1940 0:a1abeb6aa42c 223 break;
perr1940 0:a1abeb6aa42c 224
perr1940 0:a1abeb6aa42c 225 case MIN_SPEED:
perr1940 0:a1abeb6aa42c 226 returnValue = writeParam(value, 12);
perr1940 0:a1abeb6aa42c 227 break;
perr1940 0:a1abeb6aa42c 228
perr1940 0:a1abeb6aa42c 229 case FS_SPD:
perr1940 0:a1abeb6aa42c 230 returnValue = writeParam(value, 10);
perr1940 0:a1abeb6aa42c 231 break;
perr1940 0:a1abeb6aa42c 232
perr1940 0:a1abeb6aa42c 233 case TVAL_HOLD:
perr1940 0:a1abeb6aa42c 234 value &= 0x7F;
perr1940 0:a1abeb6aa42c 235 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 236 break;
perr1940 0:a1abeb6aa42c 237
perr1940 0:a1abeb6aa42c 238 case TVAL_RUN:
perr1940 0:a1abeb6aa42c 239 value &= 0x7F;
perr1940 0:a1abeb6aa42c 240 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 241 break;
perr1940 0:a1abeb6aa42c 242
perr1940 0:a1abeb6aa42c 243 case TVAL_ACC:
perr1940 0:a1abeb6aa42c 244 value &= 0x7F;
perr1940 0:a1abeb6aa42c 245 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 246 break;
perr1940 0:a1abeb6aa42c 247
perr1940 0:a1abeb6aa42c 248 case TVAL_DEC:
perr1940 0:a1abeb6aa42c 249 value &= 0x7F;
perr1940 0:a1abeb6aa42c 250 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 251 break;
perr1940 0:a1abeb6aa42c 252
perr1940 0:a1abeb6aa42c 253 case OCD_TH:
perr1940 0:a1abeb6aa42c 254 value &= 0x1F;
perr1940 0:a1abeb6aa42c 255 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 256 break;
perr1940 0:a1abeb6aa42c 257
perr1940 0:a1abeb6aa42c 258 case STEP_MODE:
perr1940 0:a1abeb6aa42c 259 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 260 break;
perr1940 0:a1abeb6aa42c 261
perr1940 0:a1abeb6aa42c 262 case CONFIG:
perr1940 0:a1abeb6aa42c 263 returnValue = writeParam(value, 16);
perr1940 0:a1abeb6aa42c 264 break;
perr1940 0:a1abeb6aa42c 265
perr1940 0:a1abeb6aa42c 266 case STATUS:
perr1940 0:a1abeb6aa42c 267 returnValue = writeParam(0, 16);
perr1940 0:a1abeb6aa42c 268 break;
perr1940 0:a1abeb6aa42c 269
perr1940 0:a1abeb6aa42c 270 case ALARM_EN:
perr1940 0:a1abeb6aa42c 271 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 272 break;
perr1940 0:a1abeb6aa42c 273
perr1940 0:a1abeb6aa42c 274 case GATECFG1:
perr1940 0:a1abeb6aa42c 275 returnValue = writeParam(value, 11);
perr1940 0:a1abeb6aa42c 276 break;
perr1940 0:a1abeb6aa42c 277
perr1940 0:a1abeb6aa42c 278 case GATECFG2:
perr1940 0:a1abeb6aa42c 279 returnValue = writeParam(value, 11);
perr1940 0:a1abeb6aa42c 280 break;
perr1940 0:a1abeb6aa42c 281
perr1940 0:a1abeb6aa42c 282 case T_FAST:
perr1940 0:a1abeb6aa42c 283 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 284 break;
perr1940 0:a1abeb6aa42c 285
perr1940 0:a1abeb6aa42c 286 case TON_MIN:
perr1940 0:a1abeb6aa42c 287 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 288 break;
perr1940 0:a1abeb6aa42c 289
perr1940 0:a1abeb6aa42c 290 case TOFF_MIN:
perr1940 0:a1abeb6aa42c 291 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 292 break;
perr1940 0:a1abeb6aa42c 293
perr1940 0:a1abeb6aa42c 294 case ADC_OUT:
perr1940 0:a1abeb6aa42c 295 returnValue = SPIWrite((char)value);
perr1940 0:a1abeb6aa42c 296 break;
perr1940 0:a1abeb6aa42c 297 }
perr1940 0:a1abeb6aa42c 298 return returnValue;
perr1940 0:a1abeb6aa42c 299 }
perr1940 0:a1abeb6aa42c 300
perr1940 0:a1abeb6aa42c 301
perr1940 0:a1abeb6aa42c 302
perr1940 0:a1abeb6aa42c 303