STM32F302R8 with Konrad's inverter boards for senior design.
Fork of Blue_Board_Ticker by
main.cpp@5:6110655353ad, 2016-04-06 (annotated)
- Committer:
- BVanderWilp
- Date:
- Wed Apr 06 20:36:41 2016 +0000
- Revision:
- 5:6110655353ad
- Parent:
- 4:ab4d51b5b1c8
- Child:
- 6:e401c592d2c3
Added variable speed with potentiometer;
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 | 1:69c06d3676fd | 20 | Ticker interrupt; |
BVanderWilp | 0:d445abf9a8e9 | 21 | |
BVanderWilp | 5:6110655353ad | 22 | float pwmMax = 0.9; |
BVanderWilp | 5:6110655353ad | 23 | float pwmDuty; |
BVanderWilp | 0:d445abf9a8e9 | 24 | int stall = 0; |
BVanderWilp | 0:d445abf9a8e9 | 25 | void activate() |
BVanderWilp | 0:d445abf9a8e9 | 26 | { |
BVanderWilp | 0:d445abf9a8e9 | 27 | stall = 1; |
BVanderWilp | 0:d445abf9a8e9 | 28 | } |
BVanderWilp | 0:d445abf9a8e9 | 29 | |
BVanderWilp | 1:69c06d3676fd | 30 | void Crise() //state1, A0 B- C+ |
BVanderWilp | 0:d445abf9a8e9 | 31 | { |
BVanderWilp | 0:d445abf9a8e9 | 32 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 33 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 34 | |
BVanderWilp | 3:2bcc36fe4de5 | 35 | phaseC.write(pwmDuty); |
BVanderWilp | 3:2bcc36fe4de5 | 36 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 37 | redLed = ! redLed; |
BVanderWilp | 1:69c06d3676fd | 38 | } |
BVanderWilp | 1:69c06d3676fd | 39 | |
BVanderWilp | 1:69c06d3676fd | 40 | void Bfall() //state2, A+ B- C0 |
BVanderWilp | 1:69c06d3676fd | 41 | { |
BVanderWilp | 1:69c06d3676fd | 42 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 43 | phaseC.write(0); |
BVanderWilp | 1:69c06d3676fd | 44 | phaseA.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 45 | phaseAEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 46 | |
BVanderWilp | 3:2bcc36fe4de5 | 47 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 48 | } |
BVanderWilp | 1:69c06d3676fd | 49 | |
BVanderWilp | 1:69c06d3676fd | 50 | void Arise() //state3, A+ B0 C- |
BVanderWilp | 1:69c06d3676fd | 51 | { |
BVanderWilp | 1:69c06d3676fd | 52 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 53 | phaseCEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 54 | |
BVanderWilp | 3:2bcc36fe4de5 | 55 | phaseA.write(pwmDuty); |
BVanderWilp | 3:2bcc36fe4de5 | 56 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 57 | } |
BVanderWilp | 1:69c06d3676fd | 58 | |
BVanderWilp | 1:69c06d3676fd | 59 | void Cfall() //state4, A0 B+ C- |
BVanderWilp | 1:69c06d3676fd | 60 | { |
BVanderWilp | 1:69c06d3676fd | 61 | phaseAEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 62 | phaseA.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 63 | phaseB.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 64 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 65 | |
BVanderWilp | 3:2bcc36fe4de5 | 66 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 67 | redLed = ! redLed; |
BVanderWilp | 0:d445abf9a8e9 | 68 | } |
BVanderWilp | 0:d445abf9a8e9 | 69 | |
BVanderWilp | 1:69c06d3676fd | 70 | void Brise() //state5, A- B+ C0 |
BVanderWilp | 0:d445abf9a8e9 | 71 | { |
BVanderWilp | 0:d445abf9a8e9 | 72 | phaseCEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 73 | phaseAEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 74 | |
BVanderWilp | 3:2bcc36fe4de5 | 75 | phaseB.write(pwmDuty); |
BVanderWilp | 3:2bcc36fe4de5 | 76 | phaseBEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 77 | } |
BVanderWilp | 0:d445abf9a8e9 | 78 | |
BVanderWilp | 1:69c06d3676fd | 79 | void Afall() //state5, A- B0 C+ |
BVanderWilp | 0:d445abf9a8e9 | 80 | { |
BVanderWilp | 0:d445abf9a8e9 | 81 | phaseBEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 82 | phaseB.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 83 | phaseC.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 84 | phaseCEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 85 | |
BVanderWilp | 3:2bcc36fe4de5 | 86 | phaseAEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 87 | } |
BVanderWilp | 0:d445abf9a8e9 | 88 | |
BVanderWilp | 1:69c06d3676fd | 89 | int count = 0; |
BVanderWilp | 1:69c06d3676fd | 90 | void intcall(){ |
BVanderWilp | 1:69c06d3676fd | 91 | count = (count + 1) % 6; |
BVanderWilp | 1:69c06d3676fd | 92 | |
BVanderWilp | 1:69c06d3676fd | 93 | if(count == 0) //B+, C- |
BVanderWilp | 1:69c06d3676fd | 94 | { |
BVanderWilp | 1:69c06d3676fd | 95 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 96 | phaseA.write(0); |
BVanderWilp | 1:69c06d3676fd | 97 | phaseB.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 98 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 99 | } |
BVanderWilp | 1:69c06d3676fd | 100 | else if(count == 1) //B+, A- |
BVanderWilp | 1:69c06d3676fd | 101 | { |
BVanderWilp | 1:69c06d3676fd | 102 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 103 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 104 | } |
BVanderWilp | 1:69c06d3676fd | 105 | else if(count == 2) //C+, A- |
BVanderWilp | 1:69c06d3676fd | 106 | { |
BVanderWilp | 1:69c06d3676fd | 107 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 108 | phaseB.write(0); |
BVanderWilp | 1:69c06d3676fd | 109 | phaseC.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 110 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 111 | } |
BVanderWilp | 1:69c06d3676fd | 112 | else if(count == 3) //C+, B- |
BVanderWilp | 1:69c06d3676fd | 113 | { |
BVanderWilp | 1:69c06d3676fd | 114 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 115 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 116 | } |
BVanderWilp | 1:69c06d3676fd | 117 | else if(count == 4) //A+, B- |
BVanderWilp | 1:69c06d3676fd | 118 | { |
BVanderWilp | 1:69c06d3676fd | 119 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 120 | phaseC.write(0); |
BVanderWilp | 1:69c06d3676fd | 121 | phaseA.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 122 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 123 | } |
BVanderWilp | 1:69c06d3676fd | 124 | else if(count == 5) //A+, C- |
BVanderWilp | 1:69c06d3676fd | 125 | { |
BVanderWilp | 1:69c06d3676fd | 126 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 127 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 128 | } |
BVanderWilp | 0:d445abf9a8e9 | 129 | } |
BVanderWilp | 0:d445abf9a8e9 | 130 | |
BVanderWilp | 0:d445abf9a8e9 | 131 | |
BVanderWilp | 0:d445abf9a8e9 | 132 | int main() { |
BVanderWilp | 1:69c06d3676fd | 133 | //wait until button push to start |
BVanderWilp | 0:d445abf9a8e9 | 134 | button.rise(&activate); |
BVanderWilp | 0:d445abf9a8e9 | 135 | while(stall == 0) { |
BVanderWilp | 0:d445abf9a8e9 | 136 | led = !led; |
BVanderWilp | 4:ab4d51b5b1c8 | 137 | wait(1); |
BVanderWilp | 0:d445abf9a8e9 | 138 | } |
BVanderWilp | 1:69c06d3676fd | 139 | |
BVanderWilp | 3:2bcc36fe4de5 | 140 | // //startup with open loop |
BVanderWilp | 3:2bcc36fe4de5 | 141 | // phaseA.period_us(10); |
BVanderWilp | 3:2bcc36fe4de5 | 142 | // phaseB.period_us(10); |
BVanderWilp | 3:2bcc36fe4de5 | 143 | // phaseC.period_us(10); |
BVanderWilp | 3:2bcc36fe4de5 | 144 | // interrupt.attach(&intcall, .01); |
BVanderWilp | 3:2bcc36fe4de5 | 145 | // |
BVanderWilp | 3:2bcc36fe4de5 | 146 | // |
BVanderWilp | 3:2bcc36fe4de5 | 147 | // phaseA.write(0); |
BVanderWilp | 3:2bcc36fe4de5 | 148 | // phaseB.write(pwmDuty); |
BVanderWilp | 3:2bcc36fe4de5 | 149 | // phaseC.write(0); |
BVanderWilp | 3:2bcc36fe4de5 | 150 | // |
BVanderWilp | 3:2bcc36fe4de5 | 151 | // phaseAEN = 0; |
BVanderWilp | 3:2bcc36fe4de5 | 152 | // phaseBEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 153 | // phaseCEN = 1; |
BVanderWilp | 3:2bcc36fe4de5 | 154 | // |
BVanderWilp | 3:2bcc36fe4de5 | 155 | // for(int i = 0; i < 4; i++) |
BVanderWilp | 3:2bcc36fe4de5 | 156 | // { |
BVanderWilp | 3:2bcc36fe4de5 | 157 | // i++; |
BVanderWilp | 3:2bcc36fe4de5 | 158 | // led = !led; |
BVanderWilp | 3:2bcc36fe4de5 | 159 | // wait(0.5); |
BVanderWilp | 3:2bcc36fe4de5 | 160 | // } |
BVanderWilp | 3:2bcc36fe4de5 | 161 | // interrupt.detach(); |
BVanderWilp | 3:2bcc36fe4de5 | 162 | |
BVanderWilp | 5:6110655353ad | 163 | pwmDuty = pot.read() * pwmMax; |
BVanderWilp | 5:6110655353ad | 164 | |
BVanderWilp | 0:d445abf9a8e9 | 165 | phaseA.period_us(10); |
BVanderWilp | 0:d445abf9a8e9 | 166 | phaseB.period_us(10); |
BVanderWilp | 0:d445abf9a8e9 | 167 | phaseC.period_us(10); |
BVanderWilp | 0:d445abf9a8e9 | 168 | |
BVanderWilp | 0:d445abf9a8e9 | 169 | phaseA.write(0); |
BVanderWilp | 3:2bcc36fe4de5 | 170 | phaseB.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 171 | phaseC.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 172 | |
BVanderWilp | 0:d445abf9a8e9 | 173 | phaseAEN = 0; |
BVanderWilp | 3:2bcc36fe4de5 | 174 | phaseBEN = 0; |
BVanderWilp | 3:2bcc36fe4de5 | 175 | phaseCEN = 0; |
BVanderWilp | 3:2bcc36fe4de5 | 176 | //begin sensored mode |
BVanderWilp | 1:69c06d3676fd | 177 | hallA.fall(&Afall); |
BVanderWilp | 1:69c06d3676fd | 178 | hallA.rise(&Arise); |
BVanderWilp | 1:69c06d3676fd | 179 | hallB.fall(&Bfall); |
BVanderWilp | 1:69c06d3676fd | 180 | hallB.rise(&Brise); |
BVanderWilp | 1:69c06d3676fd | 181 | hallC.fall(&Cfall); |
BVanderWilp | 1:69c06d3676fd | 182 | hallC.rise(&Crise); |
BVanderWilp | 1:69c06d3676fd | 183 | |
BVanderWilp | 3:2bcc36fe4de5 | 184 | int h1 = hallA.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 185 | int h2 = hallB.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 186 | int h3 = hallC.read(); |
BVanderWilp | 3:2bcc36fe4de5 | 187 | //check where we start |
BVanderWilp | 3:2bcc36fe4de5 | 188 | if(h1 == 0 && h2 == 1 && h3 == 1) //state1 |
BVanderWilp | 3:2bcc36fe4de5 | 189 | { |
BVanderWilp | 3:2bcc36fe4de5 | 190 | Crise(); |
BVanderWilp | 3:2bcc36fe4de5 | 191 | Bfall(); |
BVanderWilp | 3:2bcc36fe4de5 | 192 | } |
BVanderWilp | 3:2bcc36fe4de5 | 193 | else if(h1 == 0 && h2 == 0 && h3 == 1) //state2 |
BVanderWilp | 3:2bcc36fe4de5 | 194 | { |
BVanderWilp | 3:2bcc36fe4de5 | 195 | Bfall(); |
BVanderWilp | 3:2bcc36fe4de5 | 196 | Arise(); |
BVanderWilp | 3:2bcc36fe4de5 | 197 | } |
BVanderWilp | 3:2bcc36fe4de5 | 198 | else if(h1 == 1 && h2 == 0 && h3 == 1) //state3 |
BVanderWilp | 3:2bcc36fe4de5 | 199 | { |
BVanderWilp | 3:2bcc36fe4de5 | 200 | Arise(); |
BVanderWilp | 3:2bcc36fe4de5 | 201 | Cfall(); |
BVanderWilp | 3:2bcc36fe4de5 | 202 | } |
BVanderWilp | 3:2bcc36fe4de5 | 203 | else if(h1 == 1 && h2 == 0 && h3 == 0) //state4 |
BVanderWilp | 3:2bcc36fe4de5 | 204 | { |
BVanderWilp | 3:2bcc36fe4de5 | 205 | Cfall(); |
BVanderWilp | 3:2bcc36fe4de5 | 206 | Brise(); |
BVanderWilp | 3:2bcc36fe4de5 | 207 | } |
BVanderWilp | 3:2bcc36fe4de5 | 208 | else if(h1 == 1 && h2 == 1 && h3 == 0) //state5 |
BVanderWilp | 3:2bcc36fe4de5 | 209 | { |
BVanderWilp | 3:2bcc36fe4de5 | 210 | Brise(); |
BVanderWilp | 4:ab4d51b5b1c8 | 211 | Afall(); |
BVanderWilp | 3:2bcc36fe4de5 | 212 | } |
BVanderWilp | 3:2bcc36fe4de5 | 213 | else //state6 |
BVanderWilp | 3:2bcc36fe4de5 | 214 | { |
BVanderWilp | 3:2bcc36fe4de5 | 215 | Afall(); |
BVanderWilp | 4:ab4d51b5b1c8 | 216 | Crise(); |
BVanderWilp | 3:2bcc36fe4de5 | 217 | } |
BVanderWilp | 5:6110655353ad | 218 | float ADCSum = 0;; |
BVanderWilp | 5:6110655353ad | 219 | int ADCCount = 0; |
BVanderWilp | 0:d445abf9a8e9 | 220 | while(1) { |
BVanderWilp | 0:d445abf9a8e9 | 221 | led = !led; |
BVanderWilp | 5:6110655353ad | 222 | ADCSum += pot.read(); |
BVanderWilp | 5:6110655353ad | 223 | ADCCount++; |
BVanderWilp | 5:6110655353ad | 224 | if(ADCCount == 20) |
BVanderWilp | 5:6110655353ad | 225 | { |
BVanderWilp | 5:6110655353ad | 226 | pwmDuty = (ADCSum/20) * pwmMax; |
BVanderWilp | 5:6110655353ad | 227 | ADCSum = 0; |
BVanderWilp | 5:6110655353ad | 228 | ADCCount = 0; |
BVanderWilp | 5:6110655353ad | 229 | } |
BVanderWilp | 5:6110655353ad | 230 | // pwmDuty = pot.read() * 0.7; |
BVanderWilp | 5:6110655353ad | 231 | wait(0.05); |
BVanderWilp | 0:d445abf9a8e9 | 232 | } |
BVanderWilp | 0:d445abf9a8e9 | 233 | } |