STM32F302R8 with Konrad's inverter boards for senior design.

Dependencies:   mbed

Fork of Blue_Board_Ticker by Brad VanderWilp

Committer:
BVanderWilp
Date:
Mon Apr 11 16:38:16 2016 +0000
Revision:
6:e401c592d2c3
Parent:
5:6110655353ad
Child:
7:9d90184335aa
Added RPM printf output

Who changed what in which revision?

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