STM32F302R8 with Konrad's inverter boards for senior design.

Dependencies:   mbed

Fork of Blue_Board_Ticker by Brad VanderWilp

Committer:
vicyap
Date:
Fri Apr 15 21:54:18 2016 +0000
Revision:
20:029a58eb24ab
Parent:
19:085eb0579185
Child:
21:2bf65c29a3c6
smoothed out the potentiometer reading

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
vicyap 20:029a58eb24ab 26 int ADCCountMax = 1000; // tune for responsiveness vs. stability, higher value -> less responsive -> more stable
vicyap 20:029a58eb24ab 27 float pwmMax = 0.9; // tune for max pwmDuty. higher value -> more power available
BVanderWilp 5:6110655353ad 28 float pwmDuty;
BVanderWilp 0:d445abf9a8e9 29 int stall = 0;
BVanderWilp 7:9d90184335aa 30 int reverse = 0;
BVanderWilp 6:e401c592d2c3 31
vicyap 19:085eb0579185 32 int spinTickerCounter = 0;
vicyap 20:029a58eb24ab 33 int spinTickerPeriod_us = 50; // tune for how often hall sensors are checked
vicyap 19:085eb0579185 34 int ticksPerHall = 0;
vicyap 19:085eb0579185 35 int prevHallState = 0;
vicyap 19:085eb0579185 36
vicyap 20:029a58eb24ab 37 int pole_pairs = 2; // tune for proper mech rpm calculation
vicyap 19:085eb0579185 38
BVanderWilp 6:e401c592d2c3 39 void rpmCalc()
BVanderWilp 6:e401c592d2c3 40 {
vicyap 19:085eb0579185 41 currentRPM = revCount * 60; // 60 seconds in 1 minute
vicyap 19:085eb0579185 42 currentRPM /= pole_pairs; // account for elec vs mech rpm
BVanderWilp 6:e401c592d2c3 43 revCount = 0;
BVanderWilp 6:e401c592d2c3 44 rpmPrintFlag = 1;
BVanderWilp 6:e401c592d2c3 45 }
BVanderWilp 9:af60c737a93e 46 //original names: CBA CBA, new names: BAC BAC
BVanderWilp 9:af60c737a93e 47 void Brise() //state1, A0 B- C+
vicyap 15:dddb511c39b4 48 {
vicyap 17:5e27edd3d8e6 49 phaseA.write(0);
vicyap 17:5e27edd3d8e6 50 phaseB.write(0);
vicyap 17:5e27edd3d8e6 51 phaseC.write(pwmDuty);
BVanderWilp 0:d445abf9a8e9 52 phaseAEN = 0;
BVanderWilp 1:69c06d3676fd 53 phaseBEN = 1;
BVanderWilp 3:2bcc36fe4de5 54 phaseCEN = 1;
BVanderWilp 1:69c06d3676fd 55 }
BVanderWilp 1:69c06d3676fd 56
BVanderWilp 9:af60c737a93e 57 void Afall() //state2, A+ B- C0
BVanderWilp 1:69c06d3676fd 58 {
vicyap 17:5e27edd3d8e6 59 phaseA.write(pwmDuty);
vicyap 17:5e27edd3d8e6 60 phaseB.write(0);
BVanderWilp 1:69c06d3676fd 61 phaseC.write(0);
BVanderWilp 1:69c06d3676fd 62 phaseAEN = 1;
BVanderWilp 3:2bcc36fe4de5 63 phaseBEN = 1;
vicyap 17:5e27edd3d8e6 64 phaseCEN = 0;
BVanderWilp 1:69c06d3676fd 65 }
BVanderWilp 1:69c06d3676fd 66
BVanderWilp 9:af60c737a93e 67 void Crise() //state3, A+ B0 C-
BVanderWilp 1:69c06d3676fd 68 {
vicyap 17:5e27edd3d8e6 69 phaseA.write(pwmDuty);
vicyap 17:5e27edd3d8e6 70 phaseB.write(0);
vicyap 17:5e27edd3d8e6 71 phaseC.write(0);
vicyap 17:5e27edd3d8e6 72 phaseAEN = 1;
BVanderWilp 1:69c06d3676fd 73 phaseBEN = 0;
BVanderWilp 1:69c06d3676fd 74 phaseCEN = 1;
BVanderWilp 1:69c06d3676fd 75 }
BVanderWilp 1:69c06d3676fd 76
BVanderWilp 9:af60c737a93e 77 void Bfall() //state4, A0 B+ C-
BVanderWilp 1:69c06d3676fd 78 {
BVanderWilp 0:d445abf9a8e9 79 phaseA.write(0);
BVanderWilp 0:d445abf9a8e9 80 phaseB.write(pwmDuty);
vicyap 17:5e27edd3d8e6 81 phaseC.write(0);
vicyap 17:5e27edd3d8e6 82 phaseAEN = 0;
BVanderWilp 0:d445abf9a8e9 83 phaseBEN = 1;
BVanderWilp 3:2bcc36fe4de5 84 phaseCEN = 1;
BVanderWilp 0:d445abf9a8e9 85 }
BVanderWilp 0:d445abf9a8e9 86
BVanderWilp 9:af60c737a93e 87 void Arise() //state5, A- B+ C0
BVanderWilp 0:d445abf9a8e9 88 {
vicyap 17:5e27edd3d8e6 89 phaseA.write(0);
vicyap 17:5e27edd3d8e6 90 phaseB.write(pwmDuty);
vicyap 17:5e27edd3d8e6 91 phaseC.write(0);
BVanderWilp 0:d445abf9a8e9 92 phaseAEN = 1;
vicyap 17:5e27edd3d8e6 93 phaseCEN = 0;
BVanderWilp 3:2bcc36fe4de5 94 phaseBEN = 1;
BVanderWilp 0:d445abf9a8e9 95 }
BVanderWilp 0:d445abf9a8e9 96
BVanderWilp 9:af60c737a93e 97 void Cfall() //state6, A- B0 C+
BVanderWilp 0:d445abf9a8e9 98 {
vicyap 17:5e27edd3d8e6 99 phaseAEN = 1;
BVanderWilp 0:d445abf9a8e9 100 phaseBEN = 0;
vicyap 17:5e27edd3d8e6 101 phaseCEN = 1;
vicyap 17:5e27edd3d8e6 102 phaseA.write(0);
BVanderWilp 0:d445abf9a8e9 103 phaseB.write(0);
BVanderWilp 0:d445abf9a8e9 104 phaseC.write(pwmDuty);
BVanderWilp 0:d445abf9a8e9 105 }
BVanderWilp 0:d445abf9a8e9 106
vicyap 14:0f50e85bd463 107 void toggleRedLed()
vicyap 14:0f50e85bd463 108 {
vicyap 15:dddb511c39b4 109 redLed = !redLed;
vicyap 14:0f50e85bd463 110 }
BVanderWilp 0:d445abf9a8e9 111
BVanderWilp 7:9d90184335aa 112 void jumpStart()
BVanderWilp 7:9d90184335aa 113 {
BVanderWilp 3:2bcc36fe4de5 114 int h1 = hallA.read();
BVanderWilp 3:2bcc36fe4de5 115 int h2 = hallB.read();
BVanderWilp 3:2bcc36fe4de5 116 int h3 = hallC.read();
BVanderWilp 3:2bcc36fe4de5 117 //check where we start
vicyap 19:085eb0579185 118 int currentHallState = (h1 << 2) + (h2 << 1) + h3;
vicyap 19:085eb0579185 119 if (currentHallState != prevHallState)
vicyap 19:085eb0579185 120 {
vicyap 19:085eb0579185 121 ticksPerHall = spinTickerCounter;
vicyap 19:085eb0579185 122 spinTickerCounter = 0; // reset the number of ticks per hall sensor change
vicyap 19:085eb0579185 123 if (prevHallState == 1) // arbitrarily choose state 1
vicyap 19:085eb0579185 124 {
vicyap 19:085eb0579185 125 revCount += 1;
vicyap 19:085eb0579185 126 }
vicyap 19:085eb0579185 127 }
vicyap 19:085eb0579185 128 prevHallState = currentHallState;
vicyap 19:085eb0579185 129 spinTickerCounter += 1; // count the number of times spinTicker runs per hall sensor
vicyap 16:792055c232a5 130
vicyap 16:792055c232a5 131 if (reverse == 0)
vicyap 16:792055c232a5 132 {
vicyap 16:792055c232a5 133 if(h1 == 0 && h2 == 1 && h3 == 1) { //state1
vicyap 16:792055c232a5 134 Afall();
vicyap 16:792055c232a5 135 } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2
vicyap 16:792055c232a5 136 Crise();
vicyap 16:792055c232a5 137 } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3
vicyap 16:792055c232a5 138 Bfall();
vicyap 16:792055c232a5 139 } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4
vicyap 16:792055c232a5 140 Arise();
vicyap 16:792055c232a5 141 } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5
vicyap 16:792055c232a5 142 Cfall();
vicyap 16:792055c232a5 143 } else { //(h1 == 0 && h2 == 1 && h3 == 0)state6
vicyap 16:792055c232a5 144 Brise();
vicyap 16:792055c232a5 145 }
vicyap 16:792055c232a5 146 }
vicyap 18:d7033a38f20b 147 else if (reverse == 1) // to go in reverse, shift the mappings by 180 degrees
vicyap 16:792055c232a5 148 {
vicyap 16:792055c232a5 149 if(h1 == 0 && h2 == 1 && h3 == 1) { //state1
vicyap 18:d7033a38f20b 150 Arise();
vicyap 18:d7033a38f20b 151 } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2
vicyap 16:792055c232a5 152 Cfall();
vicyap 18:d7033a38f20b 153 } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3
vicyap 16:792055c232a5 154 Brise();
vicyap 18:d7033a38f20b 155 } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4
vicyap 16:792055c232a5 156 Afall();
vicyap 18:d7033a38f20b 157 } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5
vicyap 16:792055c232a5 158 Crise();
vicyap 18:d7033a38f20b 159 } else { //(h1 == 0 && h2 == 1 && h3 == 0) state6
vicyap 16:792055c232a5 160 Bfall();
vicyap 16:792055c232a5 161 }
vicyap 14:0f50e85bd463 162 }
vicyap 14:0f50e85bd463 163 toggleRedLed();
BVanderWilp 7:9d90184335aa 164 }
BVanderWilp 7:9d90184335aa 165
BVanderWilp 7:9d90184335aa 166 void activate()
BVanderWilp 7:9d90184335aa 167 {
vicyap 15:dddb511c39b4 168 if(stall == 0) {
BVanderWilp 7:9d90184335aa 169 stall = 1;
vicyap 15:dddb511c39b4 170 } else {
vicyap 17:5e27edd3d8e6 171 if (pwmDuty < 0.4f)
vicyap 16:792055c232a5 172 {
vicyap 16:792055c232a5 173 reverse = reverse ^ 1;
vicyap 16:792055c232a5 174 }
BVanderWilp 7:9d90184335aa 175 }
BVanderWilp 7:9d90184335aa 176 }
BVanderWilp 7:9d90184335aa 177
vicyap 15:dddb511c39b4 178 int main()
vicyap 15:dddb511c39b4 179 {
BVanderWilp 7:9d90184335aa 180 //wait until button push to start
BVanderWilp 7:9d90184335aa 181 rpmInterrupt.attach(&rpmCalc, 1);
BVanderWilp 7:9d90184335aa 182 button.rise(&activate);
BVanderWilp 7:9d90184335aa 183 while(stall == 0) {
BVanderWilp 7:9d90184335aa 184 led = !led;
BVanderWilp 7:9d90184335aa 185 wait(1);
BVanderWilp 7:9d90184335aa 186 }
BVanderWilp 7:9d90184335aa 187
BVanderWilp 7:9d90184335aa 188 pwmDuty = pot.read() * pwmMax;
BVanderWilp 7:9d90184335aa 189
BVanderWilp 7:9d90184335aa 190 phaseA.period_us(50);
BVanderWilp 7:9d90184335aa 191 phaseB.period_us(50);
BVanderWilp 7:9d90184335aa 192 phaseC.period_us(50);
vicyap 15:dddb511c39b4 193
BVanderWilp 7:9d90184335aa 194 phaseA.write(0);
BVanderWilp 7:9d90184335aa 195 phaseB.write(0);
vicyap 15:dddb511c39b4 196 phaseC.write(0);
vicyap 15:dddb511c39b4 197
BVanderWilp 7:9d90184335aa 198 phaseAEN = 0;
BVanderWilp 7:9d90184335aa 199 phaseBEN = 0;
BVanderWilp 7:9d90184335aa 200 phaseCEN = 0;
vicyap 19:085eb0579185 201
vicyap 19:085eb0579185 202 // init the prevHallState
vicyap 19:085eb0579185 203 int h1 = hallA.read();
vicyap 19:085eb0579185 204 int h2 = hallB.read();
vicyap 19:085eb0579185 205 int h3 = hallC.read();
vicyap 19:085eb0579185 206 prevHallState = (h1 << 2) + (h2 << 1) + h3;
vicyap 15:dddb511c39b4 207
vicyap 20:029a58eb24ab 208 spinTicker.attach_us(&jumpStart, spinTickerPeriod_us);
vicyap 16:792055c232a5 209 float ADCSum = 0;
BVanderWilp 5:6110655353ad 210 int ADCCount = 0;
BVanderWilp 0:d445abf9a8e9 211 while(1) {
BVanderWilp 0:d445abf9a8e9 212 led = !led;
vicyap 20:029a58eb24ab 213 if(ADCCount == ADCCountMax) {
vicyap 20:029a58eb24ab 214 ADCSum = ADCSum - (ADCSum / ADCCountMax);
vicyap 20:029a58eb24ab 215 ADCSum += pot.read();
vicyap 20:029a58eb24ab 216 pwmDuty = (ADCSum/ADCCountMax) * pwmMax;
vicyap 20:029a58eb24ab 217 }
vicyap 20:029a58eb24ab 218 else
vicyap 20:029a58eb24ab 219 {
vicyap 20:029a58eb24ab 220 ADCSum += pot.read();
vicyap 20:029a58eb24ab 221 ADCCount++;
BVanderWilp 5:6110655353ad 222 }
vicyap 15:dddb511c39b4 223 if(rpmPrintFlag == 1) {
vicyap 19:085eb0579185 224 printf("%d rpm; %f duty; reverse: %d; ticksPerHall = %d\r\n", currentRPM, pwmDuty, reverse, ticksPerHall);
BVanderWilp 6:e401c592d2c3 225 rpmPrintFlag = 0;
BVanderWilp 6:e401c592d2c3 226 }
BVanderWilp 0:d445abf9a8e9 227 }
BVanderWilp 0:d445abf9a8e9 228 }