Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Component_Test_Interface
Fork of BridgeDriver by
BridgeDriver.cpp@4:87768972db3f, 2014-07-21 (annotated)
- Committer:
- jason701802
- Date:
- Mon Jul 21 19:03:42 2014 +0000
- Revision:
- 4:87768972db3f
- Parent:
- 3:247939286d2c
- Child:
- 6:d4afd3284a04
Cleaned up ordering of enabling/disabling and setting output for each channel
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jason701802 | 0:b1e3fa917367 | 1 | |
| jason701802 | 0:b1e3fa917367 | 2 | #include "BridgeDriver.h" |
| jason701802 | 0:b1e3fa917367 | 3 | #include "mbed.h" |
| jason701802 | 1:c8e328389a98 | 4 | #include "TextLCD.h" // if using diagnostic |
| jason701802 | 0:b1e3fa917367 | 5 | |
| jason701802 | 0:b1e3fa917367 | 6 | #include "MCP23017.h" |
| jason701802 | 0:b1e3fa917367 | 7 | |
| jason701802 | 0:b1e3fa917367 | 8 | |
| jason701802 | 1:c8e328389a98 | 9 | BridgeDriver::BridgeDriver( I2C *i2c, uint8_t enPwmA, uint8_t enPwmB, uint8_t enPwmC, uint8_t enPwmD, uint8_t enAddr, uint8_t ledAddr) : |
| jason701802 | 0:b1e3fa917367 | 10 | _i2c(i2c), |
| jason701802 | 0:b1e3fa917367 | 11 | _enAddr(enAddr), |
| jason701802 | 0:b1e3fa917367 | 12 | _ledAddr(ledAddr), |
| jason701802 | 1:c8e328389a98 | 13 | _pwmCh(0x00), |
| jason701802 | 0:b1e3fa917367 | 14 | _oldLedState(0x00) |
| jason701802 | 0:b1e3fa917367 | 15 | { |
| jason701802 | 0:b1e3fa917367 | 16 | |
| jason701802 | 0:b1e3fa917367 | 17 | |
| jason701802 | 0:b1e3fa917367 | 18 | _pwm[0] = enPwmA; |
| jason701802 | 0:b1e3fa917367 | 19 | _pwm[1] = enPwmB; |
| jason701802 | 0:b1e3fa917367 | 20 | _pwm[2] = enPwmC; |
| jason701802 | 0:b1e3fa917367 | 21 | _pwm[3] = enPwmD; |
| jason701802 | 0:b1e3fa917367 | 22 | |
| jason701802 | 0:b1e3fa917367 | 23 | for(int i = 0; i<4; i++){ |
| jason701802 | 0:b1e3fa917367 | 24 | _dir[i] = 0; |
| jason701802 | 0:b1e3fa917367 | 25 | _braking[i] = 0; |
| jason701802 | 0:b1e3fa917367 | 26 | } |
| jason701802 | 0:b1e3fa917367 | 27 | |
| jason701802 | 0:b1e3fa917367 | 28 | |
| jason701802 | 0:b1e3fa917367 | 29 | _EnCtl = new MCP23017(*_i2c, _enAddr); //MCP23008 -Only use PORT_A |
| jason701802 | 0:b1e3fa917367 | 30 | _IO = new MCP23017(*_i2c, _ledAddr); |
| jason701802 | 0:b1e3fa917367 | 31 | |
| jason701802 | 0:b1e3fa917367 | 32 | _IO->direction(PORT_B, 0x00); //LEDs are outputs |
| jason701802 | 0:b1e3fa917367 | 33 | _IO->write(PORT_B, ~0x00); //bitwise not (~) b/c leds are active low |
| jason701802 | 0:b1e3fa917367 | 34 | _EnCtl->configureBanked(BNK); |
| jason701802 | 0:b1e3fa917367 | 35 | _EnCtl->direction(PORT_A, 0x00); //all outputs |
| jason701802 | 0:b1e3fa917367 | 36 | _EnCtl->write(PORT_A, 0x00); //leave all channels disabled |
| jason701802 | 0:b1e3fa917367 | 37 | |
| jason701802 | 0:b1e3fa917367 | 38 | |
| jason701802 | 0:b1e3fa917367 | 39 | |
| jason701802 | 0:b1e3fa917367 | 40 | _d[0] = new DigitalOut(PIN_CH1); |
| jason701802 | 0:b1e3fa917367 | 41 | _d[1] = new DigitalOut(PIN_CH2); |
| jason701802 | 0:b1e3fa917367 | 42 | _d[2] = new DigitalOut(PIN_CH3); |
| jason701802 | 0:b1e3fa917367 | 43 | _d[3] = new DigitalOut(PIN_CH4); |
| jason701802 | 0:b1e3fa917367 | 44 | _d[4] = new DigitalOut(PIN_CH5); |
| jason701802 | 0:b1e3fa917367 | 45 | _d[5] = new DigitalOut(PIN_CH6); |
| jason701802 | 0:b1e3fa917367 | 46 | _d[6] = new DigitalOut(PIN_CH7); |
| jason701802 | 0:b1e3fa917367 | 47 | _d[7] = new DigitalOut(PIN_CH8); |
| jason701802 | 0:b1e3fa917367 | 48 | |
| jason701802 | 0:b1e3fa917367 | 49 | |
| jason701802 | 0:b1e3fa917367 | 50 | |
| jason701802 | 0:b1e3fa917367 | 51 | } |
| jason701802 | 0:b1e3fa917367 | 52 | |
| jason701802 | 0:b1e3fa917367 | 53 | |
| jason701802 | 0:b1e3fa917367 | 54 | BridgeDriver::~BridgeDriver(){ |
| jason701802 | 0:b1e3fa917367 | 55 | for(int i=0; i<4; i++){ |
| jason701802 | 0:b1e3fa917367 | 56 | if(_pwm[i]){ |
| jason701802 | 0:b1e3fa917367 | 57 | switch(_dir[i]){ |
| jason701802 | 0:b1e3fa917367 | 58 | case 1: |
| jason701802 | 0:b1e3fa917367 | 59 | delete _p[2*i]; |
| jason701802 | 0:b1e3fa917367 | 60 | delete _d[2*i + 1]; |
| jason701802 | 0:b1e3fa917367 | 61 | break; |
| jason701802 | 0:b1e3fa917367 | 62 | case -1: |
| jason701802 | 0:b1e3fa917367 | 63 | delete _d[2*i]; |
| jason701802 | 0:b1e3fa917367 | 64 | delete _p[2*i + 1]; |
| jason701802 | 0:b1e3fa917367 | 65 | break; |
| jason701802 | 0:b1e3fa917367 | 66 | case 0: |
| jason701802 | 0:b1e3fa917367 | 67 | delete _d[2*i]; |
| jason701802 | 0:b1e3fa917367 | 68 | delete _d[2*i + 1]; |
| jason701802 | 0:b1e3fa917367 | 69 | break; |
| jason701802 | 0:b1e3fa917367 | 70 | } |
| jason701802 | 0:b1e3fa917367 | 71 | }else{ |
| jason701802 | 0:b1e3fa917367 | 72 | delete _d[2*i]; |
| jason701802 | 0:b1e3fa917367 | 73 | delete _d[2*i + 1]; |
| jason701802 | 0:b1e3fa917367 | 74 | } |
| jason701802 | 0:b1e3fa917367 | 75 | } |
| jason701802 | 0:b1e3fa917367 | 76 | } |
| jason701802 | 0:b1e3fa917367 | 77 | |
| jason701802 | 0:b1e3fa917367 | 78 | |
| jason701802 | 0:b1e3fa917367 | 79 | void BridgeDriver::enablePwm(uint8_t enPwmA, uint8_t enPwmB, uint8_t enPwmC, uint8_t enPwmD){ |
| jason701802 | 0:b1e3fa917367 | 80 | enablePwm(BRIDGE_A, enPwmA); |
| jason701802 | 0:b1e3fa917367 | 81 | enablePwm(BRIDGE_B, enPwmB); |
| jason701802 | 0:b1e3fa917367 | 82 | enablePwm(BRIDGE_C, enPwmC); |
| jason701802 | 0:b1e3fa917367 | 83 | enablePwm(BRIDGE_D, enPwmD); |
| jason701802 | 0:b1e3fa917367 | 84 | } |
| jason701802 | 0:b1e3fa917367 | 85 | void BridgeDriver::enablePwm(Bridges bridge, uint8_t enPwm){ |
| jason701802 | 0:b1e3fa917367 | 86 | int bNum = static_cast<int>(bridge); //numeric bridge |
| jason701802 | 0:b1e3fa917367 | 87 | if(enPwm == _pwm[bNum]){ |
| jason701802 | 0:b1e3fa917367 | 88 | return; |
| jason701802 | 0:b1e3fa917367 | 89 | }else if(enPwm == 0){ //disable pwm |
| jason701802 | 0:b1e3fa917367 | 90 | setPwm(2*bNum, 0); //channels are disabled in setPwm() |
| jason701802 | 0:b1e3fa917367 | 91 | setPwm(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 92 | _pwm[bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 93 | }else{ //enable pwm |
| jason701802 | 0:b1e3fa917367 | 94 | enableCh(2*bNum, 0); //disable channels |
| jason701802 | 0:b1e3fa917367 | 95 | enableCh(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 96 | _pwm[bNum] = 1; //pwm for individual channels is turned on as necessary when running motor |
| jason701802 | 0:b1e3fa917367 | 97 | _dir[bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 98 | } |
| jason701802 | 0:b1e3fa917367 | 99 | } |
| jason701802 | 0:b1e3fa917367 | 100 | |
| jason701802 | 0:b1e3fa917367 | 101 | void BridgeDriver::enableBraking(uint8_t enBrakeA, uint8_t enBrakeB, uint8_t enBrakeC, uint8_t enBrakeD){ //1 - drives output to GND when off; 0 - floats output when off |
| jason701802 | 0:b1e3fa917367 | 102 | enableBraking(BRIDGE_A, enBrakeA); |
| jason701802 | 0:b1e3fa917367 | 103 | enableBraking(BRIDGE_B, enBrakeB); |
| jason701802 | 0:b1e3fa917367 | 104 | enableBraking(BRIDGE_C, enBrakeC); |
| jason701802 | 0:b1e3fa917367 | 105 | enableBraking(BRIDGE_D, enBrakeD); |
| jason701802 | 0:b1e3fa917367 | 106 | } |
| jason701802 | 0:b1e3fa917367 | 107 | void BridgeDriver::enableBraking(Bridges bridge, uint8_t enBrake) { |
| jason701802 | 0:b1e3fa917367 | 108 | _braking[static_cast<int>(bridge)] = enBrake; |
| jason701802 | 0:b1e3fa917367 | 109 | } |
| jason701802 | 0:b1e3fa917367 | 110 | |
| jason701802 | 0:b1e3fa917367 | 111 | int BridgeDriver::forceBrake(uint8_t ch){ //force a specific channel to GND without changing braking default |
| jason701802 | 0:b1e3fa917367 | 112 | if( _pwm[(ch-1)/2]){ |
| jason701802 | 0:b1e3fa917367 | 113 | return -1; |
| jason701802 | 0:b1e3fa917367 | 114 | }else{ |
| jason701802 | 0:b1e3fa917367 | 115 | *_d[ch-1] = 0; |
| jason701802 | 0:b1e3fa917367 | 116 | enableCh(ch-1, 1); |
| jason701802 | 0:b1e3fa917367 | 117 | setLed(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 118 | return 0; |
| jason701802 | 0:b1e3fa917367 | 119 | } |
| jason701802 | 0:b1e3fa917367 | 120 | } |
| jason701802 | 0:b1e3fa917367 | 121 | int BridgeDriver::forceBrake(Bridges bridge){ //force a specific motor to GND without changing braking default |
| jason701802 | 0:b1e3fa917367 | 122 | return static_cast<int>(drive(bridge, 0, 0)); |
| jason701802 | 0:b1e3fa917367 | 123 | } |
| jason701802 | 0:b1e3fa917367 | 124 | int BridgeDriver::forceFloat(uint8_t ch){ //force a specific channel to float without changing braking default |
| jason701802 | 0:b1e3fa917367 | 125 | if( _pwm[(ch-1)/2]){ |
| jason701802 | 0:b1e3fa917367 | 126 | return -1; |
| jason701802 | 0:b1e3fa917367 | 127 | }else{ |
| jason701802 | 0:b1e3fa917367 | 128 | enableCh(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 129 | setLed(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 130 | return *_d[ch-1] = 0; |
| jason701802 | 0:b1e3fa917367 | 131 | } |
| jason701802 | 0:b1e3fa917367 | 132 | } |
| jason701802 | 0:b1e3fa917367 | 133 | int BridgeDriver::forceFloat(Bridges bridge){ //force a specific motor to float without changing braking default |
| jason701802 | 0:b1e3fa917367 | 134 | int bNum = static_cast<int>(bridge); //numeric bridge |
| jason701802 | 0:b1e3fa917367 | 135 | |
| jason701802 | 0:b1e3fa917367 | 136 | if(_pwm[bNum] == 0){ |
| jason701802 | 0:b1e3fa917367 | 137 | return -1; |
| jason701802 | 0:b1e3fa917367 | 138 | }else{ |
| jason701802 | 4:87768972db3f | 139 | setPwm(2*bNum, 0); //channel is disabled in setPwm() |
| jason701802 | 4:87768972db3f | 140 | setPwm(2*bNum + 1, 0); //channel is disabled in setPwm() |
| jason701802 | 4:87768972db3f | 141 | _dir[bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 142 | setLed(2*bNum, 0); |
| jason701802 | 0:b1e3fa917367 | 143 | setLed(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 144 | *_d[2*bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 145 | return *_d[2*bNum + 1] = 0; |
| jason701802 | 0:b1e3fa917367 | 146 | } |
| jason701802 | 0:b1e3fa917367 | 147 | } |
| jason701802 | 0:b1e3fa917367 | 148 | |
| jason701802 | 0:b1e3fa917367 | 149 | int BridgeDriver::drive(uint8_t state){ |
| jason701802 | 0:b1e3fa917367 | 150 | if(_pwm[0] || _pwm[1] || _pwm[2] || _pwm[3]){ |
| jason701802 | 0:b1e3fa917367 | 151 | return -1; |
| jason701802 | 0:b1e3fa917367 | 152 | }else{ |
| jason701802 | 0:b1e3fa917367 | 153 | setLed(state); |
| jason701802 | 0:b1e3fa917367 | 154 | for(int i=0; i<8; i++){ |
| jason701802 | 0:b1e3fa917367 | 155 | if(state & (1 << i)){ //channel i should be on |
| jason701802 | 0:b1e3fa917367 | 156 | *_d[i] = 1; |
| jason701802 | 0:b1e3fa917367 | 157 | enableCh(i, 1); |
| jason701802 | 0:b1e3fa917367 | 158 | }else{ //channel i should be off |
| jason701802 | 3:247939286d2c | 159 | if(_braking[i/2]){ |
| jason701802 | 0:b1e3fa917367 | 160 | *_d[i] = 0; //brake output |
| jason701802 | 0:b1e3fa917367 | 161 | enableCh(i, 1); |
| jason701802 | 0:b1e3fa917367 | 162 | }else{ |
| jason701802 | 0:b1e3fa917367 | 163 | enableCh(i, 0); |
| jason701802 | 4:87768972db3f | 164 | *_d[i] = 0; //float/coast output |
| jason701802 | 0:b1e3fa917367 | 165 | } |
| jason701802 | 0:b1e3fa917367 | 166 | } |
| jason701802 | 0:b1e3fa917367 | 167 | } |
| jason701802 | 0:b1e3fa917367 | 168 | return !!state; |
| jason701802 | 0:b1e3fa917367 | 169 | } |
| jason701802 | 0:b1e3fa917367 | 170 | } |
| jason701802 | 0:b1e3fa917367 | 171 | int BridgeDriver::drive(uint8_t ch, uint8_t on){ |
| jason701802 | 0:b1e3fa917367 | 172 | if( _pwm[(ch-1)/2]){ |
| jason701802 | 0:b1e3fa917367 | 173 | return -1; |
| jason701802 | 0:b1e3fa917367 | 174 | }else if(on){ //on |
| jason701802 | 4:87768972db3f | 175 | *_d[ch-1] = 1; |
| jason701802 | 0:b1e3fa917367 | 176 | enableCh(ch-1, 1); |
| jason701802 | 0:b1e3fa917367 | 177 | setLed(ch-1, 1); |
| jason701802 | 4:87768972db3f | 178 | return 1; |
| jason701802 | 4:87768972db3f | 179 | }else if(_braking[(ch-1)/2]){ //off, brake |
| jason701802 | 0:b1e3fa917367 | 180 | *_d[ch-1] = 0; |
| jason701802 | 0:b1e3fa917367 | 181 | enableCh(ch-1, 1); |
| jason701802 | 0:b1e3fa917367 | 182 | setLed(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 183 | return 0; |
| jason701802 | 0:b1e3fa917367 | 184 | }else{ //off, float |
| jason701802 | 0:b1e3fa917367 | 185 | enableCh(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 186 | setLed(ch-1, 0); |
| jason701802 | 0:b1e3fa917367 | 187 | return *_d[ch-1] = 0; |
| jason701802 | 0:b1e3fa917367 | 188 | } |
| jason701802 | 0:b1e3fa917367 | 189 | } |
| jason701802 | 0:b1e3fa917367 | 190 | float BridgeDriver::drive(Bridges bridge, float speed){ //speed from -1 to 1, speed of 0 will coast or brake depending on setting of _braking |
| jason701802 | 0:b1e3fa917367 | 191 | int bNum = static_cast<int>(bridge); //numeric bridge |
| jason701802 | 0:b1e3fa917367 | 192 | |
| jason701802 | 0:b1e3fa917367 | 193 | if(_pwm[bNum] == 0){ |
| jason701802 | 1:c8e328389a98 | 194 | return -20 - bNum; |
| jason701802 | 0:b1e3fa917367 | 195 | } |
| jason701802 | 0:b1e3fa917367 | 196 | |
| jason701802 | 0:b1e3fa917367 | 197 | if(speed == 0){ |
| jason701802 | 0:b1e3fa917367 | 198 | return drive(bridge, 1, 0); |
| jason701802 | 0:b1e3fa917367 | 199 | }else if(speed > 0){ |
| jason701802 | 0:b1e3fa917367 | 200 | return drive(bridge, 1, speed); |
| jason701802 | 0:b1e3fa917367 | 201 | }else{ |
| jason701802 | 0:b1e3fa917367 | 202 | return drive(bridge, -1, -1*speed); |
| jason701802 | 0:b1e3fa917367 | 203 | } |
| jason701802 | 0:b1e3fa917367 | 204 | } |
| jason701802 | 0:b1e3fa917367 | 205 | float BridgeDriver::drive(Bridges bridge, int8_t dir, float speed){ |
| jason701802 | 0:b1e3fa917367 | 206 | //dir: 1=fwd, -1=rev, 0=brake (regardless of setting of _braking |
| jason701802 | 0:b1e3fa917367 | 207 | //speed from 0 to 1, speed of 0 will coast or brake depending on setting of _braking |
| jason701802 | 0:b1e3fa917367 | 208 | |
| jason701802 | 0:b1e3fa917367 | 209 | int bNum = static_cast<uint8_t>(bridge); //numeric bridge |
| jason701802 | 0:b1e3fa917367 | 210 | |
| jason701802 | 0:b1e3fa917367 | 211 | if(_pwm[bNum] == 0){ |
| jason701802 | 1:c8e328389a98 | 212 | return -10 - bNum; |
| jason701802 | 0:b1e3fa917367 | 213 | } |
| jason701802 | 0:b1e3fa917367 | 214 | if(speed < -1 || speed > 1){ //maybe this should be bounding instead? |
| jason701802 | 0:b1e3fa917367 | 215 | return -1; |
| jason701802 | 0:b1e3fa917367 | 216 | } |
| jason701802 | 0:b1e3fa917367 | 217 | |
| jason701802 | 0:b1e3fa917367 | 218 | if(dir == 0 || (speed == 0 && _braking[bNum])){ //brake |
| jason701802 | 0:b1e3fa917367 | 219 | if(_dir[bNum] != 0){ |
| jason701802 | 0:b1e3fa917367 | 220 | setPwm(2*bNum, 0); |
| jason701802 | 0:b1e3fa917367 | 221 | setPwm(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 222 | _dir[bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 223 | } |
| jason701802 | 0:b1e3fa917367 | 224 | *_d[2*bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 225 | *_d[2*bNum + 1] = 0; |
| jason701802 | 0:b1e3fa917367 | 226 | enableCh(2*bNum, 1); //enable channels for braking |
| jason701802 | 0:b1e3fa917367 | 227 | enableCh(2*bNum + 1, 1); |
| jason701802 | 4:87768972db3f | 228 | setLed(2*bNum, 0); |
| jason701802 | 4:87768972db3f | 229 | setLed(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 230 | |
| jason701802 | 0:b1e3fa917367 | 231 | return 0; |
| jason701802 | 0:b1e3fa917367 | 232 | |
| jason701802 | 0:b1e3fa917367 | 233 | }else if(speed == 0){ //coast |
| jason701802 | 4:87768972db3f | 234 | setPwm(2*bNum, 0); //channel is disabled in setPwm() |
| jason701802 | 4:87768972db3f | 235 | setPwm(2*bNum + 1, 0); //channel is disabled in setPwm() |
| jason701802 | 4:87768972db3f | 236 | _dir[bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 237 | setLed(2*bNum, 0); |
| jason701802 | 0:b1e3fa917367 | 238 | setLed(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 239 | *_d[2*bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 240 | return *_d[2*bNum + 1] = 0; |
| jason701802 | 4:87768972db3f | 241 | }else if(dir == 1){ //forward |
| jason701802 | 0:b1e3fa917367 | 242 | if(_dir[bNum] != 1){ |
| jason701802 | 0:b1e3fa917367 | 243 | setPwm(2*bNum, 1); |
| jason701802 | 0:b1e3fa917367 | 244 | setPwm(2*bNum + 1, 0); |
| jason701802 | 1:c8e328389a98 | 245 | _dir[bNum] = 1; |
| jason701802 | 0:b1e3fa917367 | 246 | } |
| jason701802 | 0:b1e3fa917367 | 247 | *_p[2*bNum] = speed; |
| jason701802 | 0:b1e3fa917367 | 248 | *_d[2*bNum + 1] = 0; |
| jason701802 | 0:b1e3fa917367 | 249 | enableCh(2*bNum, 1); //enable channels |
| jason701802 | 0:b1e3fa917367 | 250 | enableCh(2*bNum + 1, 1); |
| jason701802 | 4:87768972db3f | 251 | setLed(2*bNum, 1); |
| jason701802 | 4:87768972db3f | 252 | setLed(2*bNum + 1, 0); |
| jason701802 | 0:b1e3fa917367 | 253 | return speed; |
| jason701802 | 4:87768972db3f | 254 | }else if(dir == -1){ //reverse |
| jason701802 | 1:c8e328389a98 | 255 | if(_dir[bNum] != -1){ |
| jason701802 | 0:b1e3fa917367 | 256 | setPwm(2*bNum, 0); |
| jason701802 | 0:b1e3fa917367 | 257 | setPwm(2*bNum + 1, 1); |
| jason701802 | 1:c8e328389a98 | 258 | _dir[bNum] = -1; |
| jason701802 | 0:b1e3fa917367 | 259 | } |
| jason701802 | 0:b1e3fa917367 | 260 | *_d[2*bNum] = 0; |
| jason701802 | 0:b1e3fa917367 | 261 | *_p[2*bNum + 1] = speed; |
| jason701802 | 0:b1e3fa917367 | 262 | enableCh(2*bNum, 1); //enable channels |
| jason701802 | 0:b1e3fa917367 | 263 | enableCh(2*bNum + 1, 1); |
| jason701802 | 4:87768972db3f | 264 | setLed(2*bNum, 0); |
| jason701802 | 4:87768972db3f | 265 | setLed(2*bNum + 1, 1); |
| jason701802 | 0:b1e3fa917367 | 266 | return speed; |
| jason701802 | 0:b1e3fa917367 | 267 | } |
| jason701802 | 1:c8e328389a98 | 268 | return -2; |
| jason701802 | 0:b1e3fa917367 | 269 | } |
| jason701802 | 0:b1e3fa917367 | 270 | |
| jason701802 | 0:b1e3fa917367 | 271 | void BridgeDriver::enableCh(uint8_t ch, uint8_t en){ |
| jason701802 | 0:b1e3fa917367 | 272 | static uint8_t state = 0x00; |
| jason701802 | 0:b1e3fa917367 | 273 | static uint8_t oldState = 0x00; |
| jason701802 | 0:b1e3fa917367 | 274 | |
| jason701802 | 0:b1e3fa917367 | 275 | if(en){ |
| jason701802 | 0:b1e3fa917367 | 276 | state = state | (1 << ch); |
| jason701802 | 0:b1e3fa917367 | 277 | }else{ |
| jason701802 | 0:b1e3fa917367 | 278 | state = state & ~(1 << ch); |
| jason701802 | 0:b1e3fa917367 | 279 | } |
| jason701802 | 0:b1e3fa917367 | 280 | |
| jason701802 | 0:b1e3fa917367 | 281 | if(state != oldState){ |
| jason701802 | 0:b1e3fa917367 | 282 | _EnCtl->write(PORT_A, state); |
| jason701802 | 0:b1e3fa917367 | 283 | oldState = state; |
| jason701802 | 0:b1e3fa917367 | 284 | } |
| jason701802 | 0:b1e3fa917367 | 285 | } |
| jason701802 | 0:b1e3fa917367 | 286 | |
| jason701802 | 0:b1e3fa917367 | 287 | void BridgeDriver::setLed(uint8_t ch, uint8_t en){ |
| jason701802 | 0:b1e3fa917367 | 288 | uint8_t state; |
| jason701802 | 0:b1e3fa917367 | 289 | if(en){ |
| jason701802 | 0:b1e3fa917367 | 290 | state = _oldLedState | (1 << ch); |
| jason701802 | 0:b1e3fa917367 | 291 | }else{ |
| jason701802 | 0:b1e3fa917367 | 292 | state = _oldLedState & ~(1 << ch); |
| jason701802 | 0:b1e3fa917367 | 293 | } |
| jason701802 | 0:b1e3fa917367 | 294 | |
| jason701802 | 0:b1e3fa917367 | 295 | if(state != _oldLedState){ |
| jason701802 | 0:b1e3fa917367 | 296 | _IO->write(PORT_B, ~state); //bitwise not (~) b/c leds are active low |
| jason701802 | 0:b1e3fa917367 | 297 | _oldLedState = state; |
| jason701802 | 0:b1e3fa917367 | 298 | } |
| jason701802 | 0:b1e3fa917367 | 299 | } |
| jason701802 | 0:b1e3fa917367 | 300 | |
| jason701802 | 0:b1e3fa917367 | 301 | void BridgeDriver::setLed(uint8_t state){ |
| jason701802 | 0:b1e3fa917367 | 302 | if(state != _oldLedState){ |
| jason701802 | 0:b1e3fa917367 | 303 | _IO->write(PORT_B, ~state); //bitwise not (~) b/c leds are active low |
| jason701802 | 0:b1e3fa917367 | 304 | _oldLedState = state; |
| jason701802 | 0:b1e3fa917367 | 305 | } |
| jason701802 | 0:b1e3fa917367 | 306 | } |
| jason701802 | 0:b1e3fa917367 | 307 | |
| jason701802 | 0:b1e3fa917367 | 308 | void BridgeDriver::setPwm(uint8_t ch, uint8_t en){ |
| jason701802 | 0:b1e3fa917367 | 309 | enableCh(ch, 0); |
| jason701802 | 0:b1e3fa917367 | 310 | |
| jason701802 | 1:c8e328389a98 | 311 | |
| jason701802 | 1:c8e328389a98 | 312 | if(_pwmCh & (1 << ch)){ //pwm is currently enabled on this channel |
| jason701802 | 0:b1e3fa917367 | 313 | if(en == 0){ |
| jason701802 | 0:b1e3fa917367 | 314 | delete _p[ch]; |
| jason701802 | 0:b1e3fa917367 | 315 | switch(ch){ |
| jason701802 | 1:c8e328389a98 | 316 | case 0: |
| jason701802 | 1:c8e328389a98 | 317 | _d[ch] = new DigitalOut(PIN_CH1); |
| jason701802 | 1:c8e328389a98 | 318 | break; |
| jason701802 | 1:c8e328389a98 | 319 | case 1: |
| jason701802 | 1:c8e328389a98 | 320 | _d[ch] = new DigitalOut(PIN_CH2); |
| jason701802 | 1:c8e328389a98 | 321 | break; |
| jason701802 | 1:c8e328389a98 | 322 | case 2: |
| jason701802 | 1:c8e328389a98 | 323 | _d[ch] = new DigitalOut(PIN_CH3); |
| jason701802 | 1:c8e328389a98 | 324 | break; |
| jason701802 | 1:c8e328389a98 | 325 | case 3: |
| jason701802 | 1:c8e328389a98 | 326 | _d[ch] = new DigitalOut(PIN_CH4); |
| jason701802 | 1:c8e328389a98 | 327 | break; |
| jason701802 | 1:c8e328389a98 | 328 | case 4: |
| jason701802 | 1:c8e328389a98 | 329 | _d[ch] = new DigitalOut(PIN_CH5); |
| jason701802 | 1:c8e328389a98 | 330 | break; |
| jason701802 | 1:c8e328389a98 | 331 | case 5: |
| jason701802 | 1:c8e328389a98 | 332 | _d[ch] = new DigitalOut(PIN_CH6); |
| jason701802 | 1:c8e328389a98 | 333 | break; |
| jason701802 | 1:c8e328389a98 | 334 | case 6: |
| jason701802 | 1:c8e328389a98 | 335 | _d[ch] = new DigitalOut(PIN_CH7); |
| jason701802 | 1:c8e328389a98 | 336 | break; |
| jason701802 | 1:c8e328389a98 | 337 | case 7: |
| jason701802 | 1:c8e328389a98 | 338 | _d[ch] = new DigitalOut(PIN_CH8); |
| jason701802 | 1:c8e328389a98 | 339 | break; |
| jason701802 | 0:b1e3fa917367 | 340 | } |
| jason701802 | 1:c8e328389a98 | 341 | _pwmCh = _pwmCh & ~(1 << ch); |
| jason701802 | 1:c8e328389a98 | 342 | |
| jason701802 | 0:b1e3fa917367 | 343 | } |
| jason701802 | 0:b1e3fa917367 | 344 | }else{ //pwm is currently disabled on this channel |
| jason701802 | 0:b1e3fa917367 | 345 | if(en == 1){ |
| jason701802 | 0:b1e3fa917367 | 346 | delete _d[ch]; |
| jason701802 | 0:b1e3fa917367 | 347 | switch(ch){ |
| jason701802 | 1:c8e328389a98 | 348 | case 0: |
| jason701802 | 1:c8e328389a98 | 349 | _p[ch] = new PwmOut(PIN_CH1); |
| jason701802 | 1:c8e328389a98 | 350 | break; |
| jason701802 | 1:c8e328389a98 | 351 | case 1: |
| jason701802 | 1:c8e328389a98 | 352 | _p[ch] = new PwmOut(PIN_CH2); |
| jason701802 | 1:c8e328389a98 | 353 | break; |
| jason701802 | 1:c8e328389a98 | 354 | case 2: |
| jason701802 | 1:c8e328389a98 | 355 | _p[ch] = new PwmOut(PIN_CH3); |
| jason701802 | 1:c8e328389a98 | 356 | break; |
| jason701802 | 1:c8e328389a98 | 357 | case 3: |
| jason701802 | 1:c8e328389a98 | 358 | _p[ch] = new PwmOut(PIN_CH4); |
| jason701802 | 1:c8e328389a98 | 359 | break; |
| jason701802 | 1:c8e328389a98 | 360 | case 4: |
| jason701802 | 1:c8e328389a98 | 361 | _p[ch] = new PwmOut(PIN_CH5); |
| jason701802 | 1:c8e328389a98 | 362 | break; |
| jason701802 | 1:c8e328389a98 | 363 | case 5: |
| jason701802 | 1:c8e328389a98 | 364 | _p[ch] = new PwmOut(PIN_CH6); |
| jason701802 | 1:c8e328389a98 | 365 | break; |
| jason701802 | 1:c8e328389a98 | 366 | case 6: |
| jason701802 | 1:c8e328389a98 | 367 | _p[ch] = new PwmOut(PIN_CH7); |
| jason701802 | 1:c8e328389a98 | 368 | break; |
| jason701802 | 1:c8e328389a98 | 369 | case 7: |
| jason701802 | 1:c8e328389a98 | 370 | _p[ch] = new PwmOut(PIN_CH8); |
| jason701802 | 1:c8e328389a98 | 371 | break; |
| jason701802 | 0:b1e3fa917367 | 372 | } |
| jason701802 | 4:87768972db3f | 373 | _p[ch]->period(PWM_PERIOD); |
| jason701802 | 1:c8e328389a98 | 374 | _pwmCh = _pwmCh | (1 << ch); |
| jason701802 | 0:b1e3fa917367 | 375 | } |
| jason701802 | 0:b1e3fa917367 | 376 | } |
| jason701802 | 0:b1e3fa917367 | 377 | |
| jason701802 | 0:b1e3fa917367 | 378 | |
| jason701802 | 0:b1e3fa917367 | 379 | } |
| jason701802 | 0:b1e3fa917367 | 380 | |
| jason701802 | 1:c8e328389a98 | 381 | void BridgeDriver::diagnostic(TextLCD_I2C *lcd){ |
| jason701802 | 1:c8e328389a98 | 382 | lcd->setAddress(0,1); |
| jason701802 | 1:c8e328389a98 | 383 | lcd->printf("PWM:%d,%d,%d,%d ", _pwm[0], _pwm[1], _pwm[2], _pwm[3]); |
| jason701802 | 1:c8e328389a98 | 384 | lcd->setAddress(0,2); |
| jason701802 | 1:c8e328389a98 | 385 | lcd->printf("pCH:%i%i%i%i%i%i%i%i", !!(_pwmCh & (1 << 0)), |
| jason701802 | 1:c8e328389a98 | 386 | !!(_pwmCh & (1 << 1)), |
| jason701802 | 1:c8e328389a98 | 387 | !!(_pwmCh & (1 << 2)), |
| jason701802 | 1:c8e328389a98 | 388 | !!(_pwmCh & (1 << 3)), |
| jason701802 | 1:c8e328389a98 | 389 | !!(_pwmCh & (1 << 4)), |
| jason701802 | 1:c8e328389a98 | 390 | !!(_pwmCh & (1 << 5)), |
| jason701802 | 1:c8e328389a98 | 391 | !!(_pwmCh & (1 << 6)), |
| jason701802 | 1:c8e328389a98 | 392 | !!(_pwmCh & (1 << 7)) |
| jason701802 | 1:c8e328389a98 | 393 | ); |
| jason701802 | 1:c8e328389a98 | 394 | lcd->setAddress(0,3); |
| jason701802 | 1:c8e328389a98 | 395 | lcd->printf("dir:%+d,%+d,%+d,%+d ", _dir[0], _dir[1], _dir[2], _dir[3]); |
| jason701802 | 1:c8e328389a98 | 396 | } |
