STM32F302R8 with Konrad's inverter boards for senior design.
Fork of Blue_Board_Ticker by
main.cpp@19:085eb0579185, 2016-04-15 (annotated)
- Committer:
- vicyap
- Date:
- Fri Apr 15 21:35:50 2016 +0000
- Revision:
- 19:085eb0579185
- Parent:
- 18:d7033a38f20b
- Child:
- 20:029a58eb24ab
Added rpm and ticksPerHall counts
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BVanderWilp | 0:d445abf9a8e9 | 1 | #include "mbed.h" |
BVanderWilp | 0:d445abf9a8e9 | 2 | |
BVanderWilp | 1:69c06d3676fd | 3 | PwmOut phaseA(PA_8); //Out1, Green |
BVanderWilp | 0:d445abf9a8e9 | 4 | DigitalOut phaseAEN(PC_10); |
BVanderWilp | 1:69c06d3676fd | 5 | PwmOut phaseB(PA_9); //Out2, Blue |
BVanderWilp | 0:d445abf9a8e9 | 6 | DigitalOut phaseBEN(PC_11); |
BVanderWilp | 1:69c06d3676fd | 7 | PwmOut phaseC(PA_10); //Out3, White |
BVanderWilp | 0:d445abf9a8e9 | 8 | DigitalOut phaseCEN(PC_12); |
BVanderWilp | 0:d445abf9a8e9 | 9 | |
BVanderWilp | 5:6110655353ad | 10 | AnalogIn pot(PB_1); |
BVanderWilp | 5:6110655353ad | 11 | |
BVanderWilp | 0:d445abf9a8e9 | 12 | InterruptIn button(USER_BUTTON); |
BVanderWilp | 0:d445abf9a8e9 | 13 | |
BVanderWilp | 0:d445abf9a8e9 | 14 | DigitalOut redLed(PB_2); |
BVanderWilp | 0:d445abf9a8e9 | 15 | DigitalOut led(LED1); |
BVanderWilp | 1:69c06d3676fd | 16 | InterruptIn hallA(PA_15); //H1, Green |
BVanderWilp | 1:69c06d3676fd | 17 | InterruptIn hallB(PB_3); //H2, Blue |
BVanderWilp | 1:69c06d3676fd | 18 | InterruptIn hallC(PB_10); //H3, White |
BVanderWilp | 0:d445abf9a8e9 | 19 | |
BVanderWilp | 6:e401c592d2c3 | 20 | Ticker rpmInterrupt; |
vicyap | 12:d34b96d7f997 | 21 | Ticker spinTicker; |
BVanderWilp | 6:e401c592d2c3 | 22 | int revCount = 0; |
BVanderWilp | 6:e401c592d2c3 | 23 | int rpmPrintFlag = 0; |
BVanderWilp | 6:e401c592d2c3 | 24 | int currentRPM; |
BVanderWilp | 0:d445abf9a8e9 | 25 | |
BVanderWilp | 5:6110655353ad | 26 | float pwmMax = 0.9; |
BVanderWilp | 5:6110655353ad | 27 | float pwmDuty; |
BVanderWilp | 0:d445abf9a8e9 | 28 | int stall = 0; |
BVanderWilp | 7:9d90184335aa | 29 | int reverse = 0; |
BVanderWilp | 6:e401c592d2c3 | 30 | |
vicyap | 19:085eb0579185 | 31 | int spinTickerCounter = 0; |
vicyap | 19:085eb0579185 | 32 | int ticksPerHall = 0; |
vicyap | 19:085eb0579185 | 33 | int prevHallState = 0; |
vicyap | 19:085eb0579185 | 34 | |
vicyap | 19:085eb0579185 | 35 | int pole_pairs = 2; |
vicyap | 19:085eb0579185 | 36 | |
BVanderWilp | 6:e401c592d2c3 | 37 | void rpmCalc() |
BVanderWilp | 6:e401c592d2c3 | 38 | { |
vicyap | 19:085eb0579185 | 39 | currentRPM = revCount * 60; // 60 seconds in 1 minute |
vicyap | 19:085eb0579185 | 40 | currentRPM /= pole_pairs; // account for elec vs mech rpm |
BVanderWilp | 6:e401c592d2c3 | 41 | revCount = 0; |
BVanderWilp | 6:e401c592d2c3 | 42 | rpmPrintFlag = 1; |
BVanderWilp | 6:e401c592d2c3 | 43 | } |
BVanderWilp | 9:af60c737a93e | 44 | //original names: CBA CBA, new names: BAC BAC |
BVanderWilp | 9:af60c737a93e | 45 | void Brise() //state1, A0 B- C+ |
vicyap | 15:dddb511c39b4 | 46 | { |
vicyap | 17:5e27edd3d8e6 | 47 | phaseA.write(0); |
vicyap | 17:5e27edd3d8e6 | 48 | phaseB.write(0); |
vicyap | 17:5e27edd3d8e6 | 49 | phaseC.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 50 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 51 | phaseBEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 52 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 53 | } |
BVanderWilp | 1:69c06d3676fd | 54 | |
BVanderWilp | 9:af60c737a93e | 55 | void Afall() //state2, A+ B- C0 |
BVanderWilp | 1:69c06d3676fd | 56 | { |
vicyap | 17:5e27edd3d8e6 | 57 | phaseA.write(pwmDuty); |
vicyap | 17:5e27edd3d8e6 | 58 | phaseB.write(0); |
BVanderWilp | 1:69c06d3676fd | 59 | phaseC.write(0); |
BVanderWilp | 1:69c06d3676fd | 60 | phaseAEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 61 | phaseBEN = 1; |
vicyap | 17:5e27edd3d8e6 | 62 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 63 | } |
BVanderWilp | 1:69c06d3676fd | 64 | |
BVanderWilp | 9:af60c737a93e | 65 | void Crise() //state3, A+ B0 C- |
BVanderWilp | 1:69c06d3676fd | 66 | { |
vicyap | 17:5e27edd3d8e6 | 67 | phaseA.write(pwmDuty); |
vicyap | 17:5e27edd3d8e6 | 68 | phaseB.write(0); |
vicyap | 17:5e27edd3d8e6 | 69 | phaseC.write(0); |
vicyap | 17:5e27edd3d8e6 | 70 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 71 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 72 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 73 | } |
BVanderWilp | 1:69c06d3676fd | 74 | |
BVanderWilp | 9:af60c737a93e | 75 | void Bfall() //state4, A0 B+ C- |
BVanderWilp | 1:69c06d3676fd | 76 | { |
BVanderWilp | 0:d445abf9a8e9 | 77 | phaseA.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 78 | phaseB.write(pwmDuty); |
vicyap | 17:5e27edd3d8e6 | 79 | phaseC.write(0); |
vicyap | 17:5e27edd3d8e6 | 80 | phaseAEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 81 | phaseBEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 82 | phaseCEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 83 | } |
BVanderWilp | 0:d445abf9a8e9 | 84 | |
BVanderWilp | 9:af60c737a93e | 85 | void Arise() //state5, A- B+ C0 |
BVanderWilp | 0:d445abf9a8e9 | 86 | { |
vicyap | 17:5e27edd3d8e6 | 87 | phaseA.write(0); |
vicyap | 17:5e27edd3d8e6 | 88 | phaseB.write(pwmDuty); |
vicyap | 17:5e27edd3d8e6 | 89 | phaseC.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 90 | phaseAEN = 1; |
vicyap | 17:5e27edd3d8e6 | 91 | phaseCEN = 0; |
BVanderWilp | 3:2bcc36fe4de5 | 92 | phaseBEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 93 | } |
BVanderWilp | 0:d445abf9a8e9 | 94 | |
BVanderWilp | 9:af60c737a93e | 95 | void Cfall() //state6, A- B0 C+ |
BVanderWilp | 0:d445abf9a8e9 | 96 | { |
vicyap | 17:5e27edd3d8e6 | 97 | phaseAEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 98 | phaseBEN = 0; |
vicyap | 17:5e27edd3d8e6 | 99 | phaseCEN = 1; |
vicyap | 17:5e27edd3d8e6 | 100 | phaseA.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 101 | phaseB.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 102 | phaseC.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 103 | } |
BVanderWilp | 0:d445abf9a8e9 | 104 | |
vicyap | 14:0f50e85bd463 | 105 | void toggleRedLed() |
vicyap | 14:0f50e85bd463 | 106 | { |
vicyap | 15:dddb511c39b4 | 107 | redLed = !redLed; |
vicyap | 14:0f50e85bd463 | 108 | } |
BVanderWilp | 0:d445abf9a8e9 | 109 | |
BVanderWilp | 7:9d90184335aa | 110 | void jumpStart() |
BVanderWilp | 7:9d90184335aa | 111 | { |
BVanderWilp | 3:2bcc36fe4de5 | 112 | int h1 = hallA.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 113 | int h2 = hallB.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 114 | int h3 = hallC.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 115 | //check where we start |
vicyap | 19:085eb0579185 | 116 | int currentHallState = (h1 << 2) + (h2 << 1) + h3; |
vicyap | 19:085eb0579185 | 117 | if (currentHallState != prevHallState) |
vicyap | 19:085eb0579185 | 118 | { |
vicyap | 19:085eb0579185 | 119 | ticksPerHall = spinTickerCounter; |
vicyap | 19:085eb0579185 | 120 | spinTickerCounter = 0; // reset the number of ticks per hall sensor change |
vicyap | 19:085eb0579185 | 121 | if (prevHallState == 1) // arbitrarily choose state 1 |
vicyap | 19:085eb0579185 | 122 | { |
vicyap | 19:085eb0579185 | 123 | revCount += 1; |
vicyap | 19:085eb0579185 | 124 | } |
vicyap | 19:085eb0579185 | 125 | } |
vicyap | 19:085eb0579185 | 126 | prevHallState = currentHallState; |
vicyap | 19:085eb0579185 | 127 | spinTickerCounter += 1; // count the number of times spinTicker runs per hall sensor |
vicyap | 16:792055c232a5 | 128 | |
vicyap | 16:792055c232a5 | 129 | if (reverse == 0) |
vicyap | 16:792055c232a5 | 130 | { |
vicyap | 16:792055c232a5 | 131 | if(h1 == 0 && h2 == 1 && h3 == 1) { //state1 |
vicyap | 16:792055c232a5 | 132 | Afall(); |
vicyap | 16:792055c232a5 | 133 | } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2 |
vicyap | 16:792055c232a5 | 134 | Crise(); |
vicyap | 16:792055c232a5 | 135 | } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3 |
vicyap | 16:792055c232a5 | 136 | Bfall(); |
vicyap | 16:792055c232a5 | 137 | } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4 |
vicyap | 16:792055c232a5 | 138 | Arise(); |
vicyap | 16:792055c232a5 | 139 | } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5 |
vicyap | 16:792055c232a5 | 140 | Cfall(); |
vicyap | 16:792055c232a5 | 141 | } else { //(h1 == 0 && h2 == 1 && h3 == 0)state6 |
vicyap | 16:792055c232a5 | 142 | Brise(); |
vicyap | 16:792055c232a5 | 143 | } |
vicyap | 16:792055c232a5 | 144 | } |
vicyap | 18:d7033a38f20b | 145 | else if (reverse == 1) // to go in reverse, shift the mappings by 180 degrees |
vicyap | 16:792055c232a5 | 146 | { |
vicyap | 16:792055c232a5 | 147 | if(h1 == 0 && h2 == 1 && h3 == 1) { //state1 |
vicyap | 18:d7033a38f20b | 148 | Arise(); |
vicyap | 18:d7033a38f20b | 149 | } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2 |
vicyap | 16:792055c232a5 | 150 | Cfall(); |
vicyap | 18:d7033a38f20b | 151 | } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3 |
vicyap | 16:792055c232a5 | 152 | Brise(); |
vicyap | 18:d7033a38f20b | 153 | } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4 |
vicyap | 16:792055c232a5 | 154 | Afall(); |
vicyap | 18:d7033a38f20b | 155 | } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5 |
vicyap | 16:792055c232a5 | 156 | Crise(); |
vicyap | 18:d7033a38f20b | 157 | } else { //(h1 == 0 && h2 == 1 && h3 == 0) state6 |
vicyap | 16:792055c232a5 | 158 | Bfall(); |
vicyap | 16:792055c232a5 | 159 | } |
vicyap | 14:0f50e85bd463 | 160 | } |
vicyap | 14:0f50e85bd463 | 161 | toggleRedLed(); |
BVanderWilp | 7:9d90184335aa | 162 | } |
BVanderWilp | 7:9d90184335aa | 163 | |
BVanderWilp | 7:9d90184335aa | 164 | void activate() |
BVanderWilp | 7:9d90184335aa | 165 | { |
vicyap | 15:dddb511c39b4 | 166 | if(stall == 0) { |
BVanderWilp | 7:9d90184335aa | 167 | stall = 1; |
vicyap | 15:dddb511c39b4 | 168 | } else { |
vicyap | 17:5e27edd3d8e6 | 169 | if (pwmDuty < 0.4f) |
vicyap | 16:792055c232a5 | 170 | { |
vicyap | 16:792055c232a5 | 171 | reverse = reverse ^ 1; |
vicyap | 16:792055c232a5 | 172 | } |
BVanderWilp | 7:9d90184335aa | 173 | } |
BVanderWilp | 7:9d90184335aa | 174 | } |
BVanderWilp | 7:9d90184335aa | 175 | |
vicyap | 15:dddb511c39b4 | 176 | int main() |
vicyap | 15:dddb511c39b4 | 177 | { |
BVanderWilp | 7:9d90184335aa | 178 | //wait until button push to start |
BVanderWilp | 7:9d90184335aa | 179 | rpmInterrupt.attach(&rpmCalc, 1); |
BVanderWilp | 7:9d90184335aa | 180 | button.rise(&activate); |
BVanderWilp | 7:9d90184335aa | 181 | while(stall == 0) { |
BVanderWilp | 7:9d90184335aa | 182 | led = !led; |
BVanderWilp | 7:9d90184335aa | 183 | wait(1); |
BVanderWilp | 7:9d90184335aa | 184 | } |
BVanderWilp | 7:9d90184335aa | 185 | |
BVanderWilp | 7:9d90184335aa | 186 | pwmDuty = pot.read() * pwmMax; |
BVanderWilp | 7:9d90184335aa | 187 | |
BVanderWilp | 7:9d90184335aa | 188 | phaseA.period_us(50); |
BVanderWilp | 7:9d90184335aa | 189 | phaseB.period_us(50); |
BVanderWilp | 7:9d90184335aa | 190 | phaseC.period_us(50); |
vicyap | 15:dddb511c39b4 | 191 | |
BVanderWilp | 7:9d90184335aa | 192 | phaseA.write(0); |
BVanderWilp | 7:9d90184335aa | 193 | phaseB.write(0); |
vicyap | 15:dddb511c39b4 | 194 | phaseC.write(0); |
vicyap | 15:dddb511c39b4 | 195 | |
BVanderWilp | 7:9d90184335aa | 196 | phaseAEN = 0; |
BVanderWilp | 7:9d90184335aa | 197 | phaseBEN = 0; |
BVanderWilp | 7:9d90184335aa | 198 | phaseCEN = 0; |
vicyap | 19:085eb0579185 | 199 | |
vicyap | 19:085eb0579185 | 200 | // init the prevHallState |
vicyap | 19:085eb0579185 | 201 | int h1 = hallA.read(); |
vicyap | 19:085eb0579185 | 202 | int h2 = hallB.read(); |
vicyap | 19:085eb0579185 | 203 | int h3 = hallC.read(); |
vicyap | 19:085eb0579185 | 204 | prevHallState = (h1 << 2) + (h2 << 1) + h3; |
vicyap | 15:dddb511c39b4 | 205 | |
vicyap | 13:08c700d71324 | 206 | spinTicker.attach_us(&jumpStart, 50); |
vicyap | 16:792055c232a5 | 207 | float ADCSum = 0; |
BVanderWilp | 5:6110655353ad | 208 | int ADCCount = 0; |
BVanderWilp | 0:d445abf9a8e9 | 209 | while(1) { |
BVanderWilp | 0:d445abf9a8e9 | 210 | led = !led; |
BVanderWilp | 5:6110655353ad | 211 | ADCSum += pot.read(); |
BVanderWilp | 5:6110655353ad | 212 | ADCCount++; |
vicyap | 15:dddb511c39b4 | 213 | if(ADCCount == 20) { |
BVanderWilp | 5:6110655353ad | 214 | pwmDuty = (ADCSum/20) * pwmMax; |
BVanderWilp | 5:6110655353ad | 215 | ADCSum = 0; |
BVanderWilp | 5:6110655353ad | 216 | ADCCount = 0; |
BVanderWilp | 5:6110655353ad | 217 | } |
vicyap | 15:dddb511c39b4 | 218 | if(rpmPrintFlag == 1) { |
vicyap | 19:085eb0579185 | 219 | printf("%d rpm; %f duty; reverse: %d; ticksPerHall = %d\r\n", currentRPM, pwmDuty, reverse, ticksPerHall); |
BVanderWilp | 6:e401c592d2c3 | 220 | rpmPrintFlag = 0; |
BVanderWilp | 6:e401c592d2c3 | 221 | } |
BVanderWilp | 5:6110655353ad | 222 | wait(0.05); |
BVanderWilp | 0:d445abf9a8e9 | 223 | } |
BVanderWilp | 0:d445abf9a8e9 | 224 | } |