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 19:09:10 2016 +0000
Revision:
16:792055c232a5
Parent:
15:dddb511c39b4
Child:
17:5e27edd3d8e6
user button will reverse if pwmDuty is less than 20%

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