STM32F302R8 with Konrad's inverter boards for senior design.

Dependencies:   mbed

Fork of Blue_Board_Ticker by Brad VanderWilp

Committer:
vicyap
Date:
Wed Apr 13 18:54:12 2016 +0000
Revision:
14:0f50e85bd463
Parent:
13:08c700d71324
Child:
15:dddb511c39b4
fixed the hall sensor mapping, draws much less current

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