Telescope Control Library
AMIS30543StepperDriver.cpp@0:6cb2eaf8b133, 2018-08-19 (annotated)
- Committer:
- caoyuan9642
- Date:
- Sun Aug 19 05:21:20 2018 +0000
- Revision:
- 0:6cb2eaf8b133
v0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caoyuan9642 | 0:6cb2eaf8b133 | 1 | /* |
caoyuan9642 | 0:6cb2eaf8b133 | 2 | * AMIS30543StepperDriver.cpp |
caoyuan9642 | 0:6cb2eaf8b133 | 3 | * |
caoyuan9642 | 0:6cb2eaf8b133 | 4 | * Created on: 2018��2��8�� |
caoyuan9642 | 0:6cb2eaf8b133 | 5 | * Author: caoyuan9642 |
caoyuan9642 | 0:6cb2eaf8b133 | 6 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 7 | |
caoyuan9642 | 0:6cb2eaf8b133 | 8 | #include <AMIS30543StepperDriver.h> |
caoyuan9642 | 0:6cb2eaf8b133 | 9 | #include "mbed.h" |
caoyuan9642 | 0:6cb2eaf8b133 | 10 | #include "pinmap.h" |
caoyuan9642 | 0:6cb2eaf8b133 | 11 | AMIS30543StepperDriver::AMIS30543StepperDriver(SPI *spi, PinName cs, |
caoyuan9642 | 0:6cb2eaf8b133 | 12 | PinName step, PinName dir, PinName err, bool invert) : |
caoyuan9642 | 0:6cb2eaf8b133 | 13 | StepperMotor(invert), spi(spi), cs(cs, 1), step(step), dir(dir), err( |
caoyuan9642 | 0:6cb2eaf8b133 | 14 | err), status(IDLE), inc(1), stepCount(0) |
caoyuan9642 | 0:6cb2eaf8b133 | 15 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 16 | if (dir != NC) |
caoyuan9642 | 0:6cb2eaf8b133 | 17 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 18 | useDIR = true; |
caoyuan9642 | 0:6cb2eaf8b133 | 19 | this->dir = 0; /*Forward*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 20 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 21 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 22 | useDIR = false; |
caoyuan9642 | 0:6cb2eaf8b133 | 23 | if (err != NC) |
caoyuan9642 | 0:6cb2eaf8b133 | 24 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 25 | useERR = true; |
caoyuan9642 | 0:6cb2eaf8b133 | 26 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 27 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 28 | useERR = false; |
caoyuan9642 | 0:6cb2eaf8b133 | 29 | |
caoyuan9642 | 0:6cb2eaf8b133 | 30 | spi->frequency(400000); |
caoyuan9642 | 0:6cb2eaf8b133 | 31 | |
caoyuan9642 | 0:6cb2eaf8b133 | 32 | /*CPOL=0, CPHA=0*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 33 | spi->format(8, 0); |
caoyuan9642 | 0:6cb2eaf8b133 | 34 | |
caoyuan9642 | 0:6cb2eaf8b133 | 35 | wait_us(10); |
caoyuan9642 | 0:6cb2eaf8b133 | 36 | |
caoyuan9642 | 0:6cb2eaf8b133 | 37 | /*Perform initialization*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 38 | writeReg(CR0, 0x00); // 1/32 step |
caoyuan9642 | 0:6cb2eaf8b133 | 39 | writeReg(CR1, 0x00); // |
caoyuan9642 | 0:6cb2eaf8b133 | 40 | writeReg(CR2, 0x80); // MOTEN = 1 |
caoyuan9642 | 0:6cb2eaf8b133 | 41 | writeReg(CR3, 0x00); // 1/32 step |
caoyuan9642 | 0:6cb2eaf8b133 | 42 | |
caoyuan9642 | 0:6cb2eaf8b133 | 43 | microstep = 32; |
caoyuan9642 | 0:6cb2eaf8b133 | 44 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 45 | |
caoyuan9642 | 0:6cb2eaf8b133 | 46 | AMIS30543StepperDriver::~AMIS30543StepperDriver() |
caoyuan9642 | 0:6cb2eaf8b133 | 47 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 48 | printf("AMIS Shutdown\n"); |
caoyuan9642 | 0:6cb2eaf8b133 | 49 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 50 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 51 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 52 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 53 | |
caoyuan9642 | 0:6cb2eaf8b133 | 54 | void AMIS30543StepperDriver::writeReg(regaddr_t addr, uint8_t data) |
caoyuan9642 | 0:6cb2eaf8b133 | 55 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 56 | assertCS(); |
caoyuan9642 | 0:6cb2eaf8b133 | 57 | wait_us(3); |
caoyuan9642 | 0:6cb2eaf8b133 | 58 | txbuf[0] = (char) (addr & 0x1F) | 0x80; |
caoyuan9642 | 0:6cb2eaf8b133 | 59 | txbuf[1] = data; |
caoyuan9642 | 0:6cb2eaf8b133 | 60 | spi->write(txbuf, 2, NULL, 0); |
caoyuan9642 | 0:6cb2eaf8b133 | 61 | wait_us(3); |
caoyuan9642 | 0:6cb2eaf8b133 | 62 | deassertCS(); |
caoyuan9642 | 0:6cb2eaf8b133 | 63 | wait_us(6); |
caoyuan9642 | 0:6cb2eaf8b133 | 64 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 65 | |
caoyuan9642 | 0:6cb2eaf8b133 | 66 | uint8_t AMIS30543StepperDriver::readReg(regaddr_t addr) |
caoyuan9642 | 0:6cb2eaf8b133 | 67 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 68 | assertCS(); |
caoyuan9642 | 0:6cb2eaf8b133 | 69 | wait_us(3); |
caoyuan9642 | 0:6cb2eaf8b133 | 70 | txbuf[0] = (char) (addr & 0x1F); |
caoyuan9642 | 0:6cb2eaf8b133 | 71 | spi->write(txbuf, 2, rxbuf, 2); |
caoyuan9642 | 0:6cb2eaf8b133 | 72 | wait_us(3); |
caoyuan9642 | 0:6cb2eaf8b133 | 73 | deassertCS(); |
caoyuan9642 | 0:6cb2eaf8b133 | 74 | wait_us(6); |
caoyuan9642 | 0:6cb2eaf8b133 | 75 | return rxbuf[1]; |
caoyuan9642 | 0:6cb2eaf8b133 | 76 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 77 | |
caoyuan9642 | 0:6cb2eaf8b133 | 78 | void AMIS30543StepperDriver::start(stepdir_t dir) |
caoyuan9642 | 0:6cb2eaf8b133 | 79 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 80 | /*Set Direction*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 81 | if (status == IDLE) |
caoyuan9642 | 0:6cb2eaf8b133 | 82 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 83 | if (useDIR) |
caoyuan9642 | 0:6cb2eaf8b133 | 84 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 85 | /*Hard switch*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 86 | if ((dir == STEP_FORWARD) ^ invert) |
caoyuan9642 | 0:6cb2eaf8b133 | 87 | this->dir = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 88 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 89 | this->dir = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 90 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 91 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 92 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 93 | /*Soft switch*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 94 | uint8_t cr1 = readReg(CR1) & 0x7F; |
caoyuan9642 | 0:6cb2eaf8b133 | 95 | if ((dir == STEP_FORWARD) ^ invert) |
caoyuan9642 | 0:6cb2eaf8b133 | 96 | cr1 |= 0x00; |
caoyuan9642 | 0:6cb2eaf8b133 | 97 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 98 | cr1 |= 0x80; |
caoyuan9642 | 0:6cb2eaf8b133 | 99 | writeReg(CR1, cr1); |
caoyuan9642 | 0:6cb2eaf8b133 | 100 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 101 | |
caoyuan9642 | 0:6cb2eaf8b133 | 102 | inc = (dir == STEP_FORWARD) ? 1 : -1; |
caoyuan9642 | 0:6cb2eaf8b133 | 103 | |
caoyuan9642 | 0:6cb2eaf8b133 | 104 | // Start stepping |
caoyuan9642 | 0:6cb2eaf8b133 | 105 | step.start(); |
caoyuan9642 | 0:6cb2eaf8b133 | 106 | step.resetCount(); |
caoyuan9642 | 0:6cb2eaf8b133 | 107 | status = STEPPING; |
caoyuan9642 | 0:6cb2eaf8b133 | 108 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 109 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 110 | |
caoyuan9642 | 0:6cb2eaf8b133 | 111 | void AMIS30543StepperDriver::stop() |
caoyuan9642 | 0:6cb2eaf8b133 | 112 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 113 | if (status == STEPPING) |
caoyuan9642 | 0:6cb2eaf8b133 | 114 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 115 | status = IDLE; |
caoyuan9642 | 0:6cb2eaf8b133 | 116 | step.stop(); |
caoyuan9642 | 0:6cb2eaf8b133 | 117 | stepCount += ((double) step.getCount()) * inc / microstep; // the stepCount should be divided by microstep |
caoyuan9642 | 0:6cb2eaf8b133 | 118 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 119 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 120 | |
caoyuan9642 | 0:6cb2eaf8b133 | 121 | double AMIS30543StepperDriver::setFrequency(double frequency) |
caoyuan9642 | 0:6cb2eaf8b133 | 122 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 123 | return step.setFrequency(frequency * microstep) / microstep; //Use the microstepping frequency |
caoyuan9642 | 0:6cb2eaf8b133 | 124 | |
caoyuan9642 | 0:6cb2eaf8b133 | 125 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 126 | |
caoyuan9642 | 0:6cb2eaf8b133 | 127 | double AMIS30543StepperDriver::getStepCount() |
caoyuan9642 | 0:6cb2eaf8b133 | 128 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 129 | if (status == IDLE) |
caoyuan9642 | 0:6cb2eaf8b133 | 130 | return stepCount; |
caoyuan9642 | 0:6cb2eaf8b133 | 131 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 132 | return stepCount + ((double) step.getCount()) * inc / microstep; // the step count should be divided by microstep |
caoyuan9642 | 0:6cb2eaf8b133 | 133 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 134 | |
caoyuan9642 | 0:6cb2eaf8b133 | 135 | void AMIS30543StepperDriver::setMicroStep(int microstep) |
caoyuan9642 | 0:6cb2eaf8b133 | 136 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 137 | uint8_t cr0 = readReg(CR0) & ~(0xE0); |
caoyuan9642 | 0:6cb2eaf8b133 | 138 | |
caoyuan9642 | 0:6cb2eaf8b133 | 139 | switch (microstep) |
caoyuan9642 | 0:6cb2eaf8b133 | 140 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 141 | case 1: |
caoyuan9642 | 0:6cb2eaf8b133 | 142 | writeReg(CR3, 0x03); // Compensated full-step |
caoyuan9642 | 0:6cb2eaf8b133 | 143 | writeReg(CR0, cr0 | (0x00 << 5)); // 1/32-step |
caoyuan9642 | 0:6cb2eaf8b133 | 144 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 145 | case 2: |
caoyuan9642 | 0:6cb2eaf8b133 | 146 | writeReg(CR3, 0x00); |
caoyuan9642 | 0:6cb2eaf8b133 | 147 | writeReg(CR0, cr0 | (0x04 << 5)); // Compensated half-step |
caoyuan9642 | 0:6cb2eaf8b133 | 148 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 149 | case 4: |
caoyuan9642 | 0:6cb2eaf8b133 | 150 | writeReg(CR3, 0x00); |
caoyuan9642 | 0:6cb2eaf8b133 | 151 | writeReg(CR0, cr0 | (0x03 << 5)); // 1/4-step |
caoyuan9642 | 0:6cb2eaf8b133 | 152 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 153 | case 8: |
caoyuan9642 | 0:6cb2eaf8b133 | 154 | writeReg(CR3, 0x00); |
caoyuan9642 | 0:6cb2eaf8b133 | 155 | writeReg(CR0, cr0 | (0x02 << 5)); // 1/8-step |
caoyuan9642 | 0:6cb2eaf8b133 | 156 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 157 | case 16: |
caoyuan9642 | 0:6cb2eaf8b133 | 158 | writeReg(CR3, 0x00); |
caoyuan9642 | 0:6cb2eaf8b133 | 159 | writeReg(CR0, cr0 | (0x01 << 5)); // 1/16-step |
caoyuan9642 | 0:6cb2eaf8b133 | 160 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 161 | case 32: |
caoyuan9642 | 0:6cb2eaf8b133 | 162 | writeReg(CR3, 0x00); |
caoyuan9642 | 0:6cb2eaf8b133 | 163 | writeReg(CR0, cr0 | (0x00 << 5)); // 1/32-step |
caoyuan9642 | 0:6cb2eaf8b133 | 164 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 165 | case 64: |
caoyuan9642 | 0:6cb2eaf8b133 | 166 | writeReg(CR3, 0x02); // 1/64-step |
caoyuan9642 | 0:6cb2eaf8b133 | 167 | writeReg(CR0, cr0 | (0x00 << 5)); // 1/32-step |
caoyuan9642 | 0:6cb2eaf8b133 | 168 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 169 | case 128: |
caoyuan9642 | 0:6cb2eaf8b133 | 170 | writeReg(CR3, 0x01); |
caoyuan9642 | 0:6cb2eaf8b133 | 171 | writeReg(CR0, cr0 | (0x00 << 5)); // 1/32-step |
caoyuan9642 | 0:6cb2eaf8b133 | 172 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 173 | default: |
caoyuan9642 | 0:6cb2eaf8b133 | 174 | debug("Error: microsteps must be a power of 2\n"); |
caoyuan9642 | 0:6cb2eaf8b133 | 175 | return; |
caoyuan9642 | 0:6cb2eaf8b133 | 176 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 177 | |
caoyuan9642 | 0:6cb2eaf8b133 | 178 | // Update the microstep variable only if the value is valid |
caoyuan9642 | 0:6cb2eaf8b133 | 179 | this->microstep = microstep; |
caoyuan9642 | 0:6cb2eaf8b133 | 180 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 181 | |
caoyuan9642 | 0:6cb2eaf8b133 | 182 | void AMIS30543StepperDriver::setCurrent(double current) |
caoyuan9642 | 0:6cb2eaf8b133 | 183 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 184 | uint8_t reg_cur = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 185 | uint8_t cr0 = readReg(CR0) & ~(0x1F); |
caoyuan9642 | 0:6cb2eaf8b133 | 186 | |
caoyuan9642 | 0:6cb2eaf8b133 | 187 | if (current <= 0.132) |
caoyuan9642 | 0:6cb2eaf8b133 | 188 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 189 | reg_cur = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 190 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 191 | else if (current <= 0.245) |
caoyuan9642 | 0:6cb2eaf8b133 | 192 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 193 | reg_cur = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 194 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 195 | else if (current <= 0.355) |
caoyuan9642 | 0:6cb2eaf8b133 | 196 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 197 | reg_cur = 2; |
caoyuan9642 | 0:6cb2eaf8b133 | 198 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 199 | else if (current <= 0.395) |
caoyuan9642 | 0:6cb2eaf8b133 | 200 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 201 | reg_cur = 3; |
caoyuan9642 | 0:6cb2eaf8b133 | 202 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 203 | else if (current <= 0.445) |
caoyuan9642 | 0:6cb2eaf8b133 | 204 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 205 | reg_cur = 4; |
caoyuan9642 | 0:6cb2eaf8b133 | 206 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 207 | else if (current <= 0.485) |
caoyuan9642 | 0:6cb2eaf8b133 | 208 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 209 | reg_cur = 5; |
caoyuan9642 | 0:6cb2eaf8b133 | 210 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 211 | else if (current <= 0.540) |
caoyuan9642 | 0:6cb2eaf8b133 | 212 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 213 | reg_cur = 6; |
caoyuan9642 | 0:6cb2eaf8b133 | 214 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 215 | else if (current <= 0.585) |
caoyuan9642 | 0:6cb2eaf8b133 | 216 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 217 | reg_cur = 7; |
caoyuan9642 | 0:6cb2eaf8b133 | 218 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 219 | else if (current <= 0.640) |
caoyuan9642 | 0:6cb2eaf8b133 | 220 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 221 | reg_cur = 8; |
caoyuan9642 | 0:6cb2eaf8b133 | 222 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 223 | else if (current <= 0.715) |
caoyuan9642 | 0:6cb2eaf8b133 | 224 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 225 | reg_cur = 9; |
caoyuan9642 | 0:6cb2eaf8b133 | 226 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 227 | else if (current <= 0.780) |
caoyuan9642 | 0:6cb2eaf8b133 | 228 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 229 | reg_cur = 10; |
caoyuan9642 | 0:6cb2eaf8b133 | 230 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 231 | else if (current <= 0.870) |
caoyuan9642 | 0:6cb2eaf8b133 | 232 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 233 | reg_cur = 11; |
caoyuan9642 | 0:6cb2eaf8b133 | 234 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 235 | else if (current <= 0.955) |
caoyuan9642 | 0:6cb2eaf8b133 | 236 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 237 | reg_cur = 12; |
caoyuan9642 | 0:6cb2eaf8b133 | 238 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 239 | else if (current <= 1.060) |
caoyuan9642 | 0:6cb2eaf8b133 | 240 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 241 | reg_cur = 13; |
caoyuan9642 | 0:6cb2eaf8b133 | 242 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 243 | else if (current <= 1.150) |
caoyuan9642 | 0:6cb2eaf8b133 | 244 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 245 | reg_cur = 14; |
caoyuan9642 | 0:6cb2eaf8b133 | 246 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 247 | else if (current <= 1.260) |
caoyuan9642 | 0:6cb2eaf8b133 | 248 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 249 | reg_cur = 15; |
caoyuan9642 | 0:6cb2eaf8b133 | 250 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 251 | else if (current <= 1.405) |
caoyuan9642 | 0:6cb2eaf8b133 | 252 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 253 | reg_cur = 16; |
caoyuan9642 | 0:6cb2eaf8b133 | 254 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 255 | else if (current <= 1.520) |
caoyuan9642 | 0:6cb2eaf8b133 | 256 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 257 | reg_cur = 17; |
caoyuan9642 | 0:6cb2eaf8b133 | 258 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 259 | else if (current <= 1.695) |
caoyuan9642 | 0:6cb2eaf8b133 | 260 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 261 | reg_cur = 18; |
caoyuan9642 | 0:6cb2eaf8b133 | 262 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 263 | else if (current <= 1.820) |
caoyuan9642 | 0:6cb2eaf8b133 | 264 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 265 | reg_cur = 19; |
caoyuan9642 | 0:6cb2eaf8b133 | 266 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 267 | else if (current <= 2.070) |
caoyuan9642 | 0:6cb2eaf8b133 | 268 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 269 | reg_cur = 20; |
caoyuan9642 | 0:6cb2eaf8b133 | 270 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 271 | else if (current <= 2.240) |
caoyuan9642 | 0:6cb2eaf8b133 | 272 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 273 | reg_cur = 21; |
caoyuan9642 | 0:6cb2eaf8b133 | 274 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 275 | else if (current <= 2.440) |
caoyuan9642 | 0:6cb2eaf8b133 | 276 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 277 | reg_cur = 22; |
caoyuan9642 | 0:6cb2eaf8b133 | 278 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 279 | else if (current <= 2.700) |
caoyuan9642 | 0:6cb2eaf8b133 | 280 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 281 | reg_cur = 23; |
caoyuan9642 | 0:6cb2eaf8b133 | 282 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 283 | else if (current <= 2.845) |
caoyuan9642 | 0:6cb2eaf8b133 | 284 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 285 | reg_cur = 24; |
caoyuan9642 | 0:6cb2eaf8b133 | 286 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 287 | else if (current <= 3.000) |
caoyuan9642 | 0:6cb2eaf8b133 | 288 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 289 | reg_cur = 25; |
caoyuan9642 | 0:6cb2eaf8b133 | 290 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 291 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 292 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 293 | debug("Error: maximum current supported is 3.0A/phase\n"); |
caoyuan9642 | 0:6cb2eaf8b133 | 294 | return; |
caoyuan9642 | 0:6cb2eaf8b133 | 295 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 296 | writeReg(CR0, cr0 | reg_cur); |
caoyuan9642 | 0:6cb2eaf8b133 | 297 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 298 | |
caoyuan9642 | 0:6cb2eaf8b133 | 299 | inline void AMIS30543StepperDriver::assertCS() |
caoyuan9642 | 0:6cb2eaf8b133 | 300 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 301 | cs = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 302 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 303 | |
caoyuan9642 | 0:6cb2eaf8b133 | 304 | inline void AMIS30543StepperDriver::deassertCS() |
caoyuan9642 | 0:6cb2eaf8b133 | 305 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 306 | cs = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 307 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 308 | |
caoyuan9642 | 0:6cb2eaf8b133 | 309 | void AMIS30543StepperDriver::poweron() |
caoyuan9642 | 0:6cb2eaf8b133 | 310 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 311 | writeReg(CR2, 0x80); // MOTEN = 80, start driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 312 | writeReg(CR2, 0x80); // MOTEN = 80, start driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 313 | writeReg(CR2, 0x80); // MOTEN = 80, start driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 314 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 315 | |
caoyuan9642 | 0:6cb2eaf8b133 | 316 | void AMIS30543StepperDriver::poweroff() |
caoyuan9642 | 0:6cb2eaf8b133 | 317 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 318 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 319 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 320 | writeReg(CR2, 0x00); // MOTEN = 0, stop driving the motor |
caoyuan9642 | 0:6cb2eaf8b133 | 321 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 322 |