STM32F302R8 with Konrad's inverter boards for senior design.
Fork of Blue_Board_Ticker by
main.cpp@2:0fbba327c44f, 2016-04-06 (annotated)
- Committer:
- BVanderWilp
- Date:
- Wed Apr 06 19:45:47 2016 +0000
- Revision:
- 2:0fbba327c44f
- Parent:
- 1:69c06d3676fd
- Child:
- 3:2bcc36fe4de5
Better timing for smooth open-loop startup
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 | 0:d445abf9a8e9 | 10 | InterruptIn button(USER_BUTTON); |
BVanderWilp | 0:d445abf9a8e9 | 11 | |
BVanderWilp | 0:d445abf9a8e9 | 12 | DigitalOut redLed(PB_2); |
BVanderWilp | 0:d445abf9a8e9 | 13 | DigitalOut led(LED1); |
BVanderWilp | 1:69c06d3676fd | 14 | InterruptIn hallA(PA_15); //H1, Green |
BVanderWilp | 1:69c06d3676fd | 15 | InterruptIn hallB(PB_3); //H2, Blue |
BVanderWilp | 1:69c06d3676fd | 16 | InterruptIn hallC(PB_10); //H3, White |
BVanderWilp | 0:d445abf9a8e9 | 17 | |
BVanderWilp | 1:69c06d3676fd | 18 | Ticker interrupt; |
BVanderWilp | 0:d445abf9a8e9 | 19 | |
BVanderWilp | 1:69c06d3676fd | 20 | float pwmDuty = 0.5; |
BVanderWilp | 0:d445abf9a8e9 | 21 | int stall = 0; |
BVanderWilp | 0:d445abf9a8e9 | 22 | void activate() |
BVanderWilp | 0:d445abf9a8e9 | 23 | { |
BVanderWilp | 0:d445abf9a8e9 | 24 | stall = 1; |
BVanderWilp | 0:d445abf9a8e9 | 25 | } |
BVanderWilp | 0:d445abf9a8e9 | 26 | |
BVanderWilp | 1:69c06d3676fd | 27 | void Crise() //state1, A0 B- C+ |
BVanderWilp | 0:d445abf9a8e9 | 28 | { |
BVanderWilp | 0:d445abf9a8e9 | 29 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 30 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 31 | |
BVanderWilp | 1:69c06d3676fd | 32 | redLed = ! redLed; |
BVanderWilp | 1:69c06d3676fd | 33 | } |
BVanderWilp | 1:69c06d3676fd | 34 | |
BVanderWilp | 1:69c06d3676fd | 35 | void Bfall() //state2, A+ B- C0 |
BVanderWilp | 1:69c06d3676fd | 36 | { |
BVanderWilp | 1:69c06d3676fd | 37 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 38 | phaseC.write(0); |
BVanderWilp | 1:69c06d3676fd | 39 | phaseA.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 40 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 41 | } |
BVanderWilp | 1:69c06d3676fd | 42 | |
BVanderWilp | 1:69c06d3676fd | 43 | void Arise() //state3, A+ B0 C- |
BVanderWilp | 1:69c06d3676fd | 44 | { |
BVanderWilp | 1:69c06d3676fd | 45 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 46 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 47 | } |
BVanderWilp | 1:69c06d3676fd | 48 | |
BVanderWilp | 1:69c06d3676fd | 49 | void Cfall() //state4, A0 B+ C- |
BVanderWilp | 1:69c06d3676fd | 50 | { |
BVanderWilp | 1:69c06d3676fd | 51 | phaseAEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 52 | phaseA.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 53 | phaseB.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 54 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 55 | |
BVanderWilp | 1:69c06d3676fd | 56 | redLed = ! redLed; |
BVanderWilp | 0:d445abf9a8e9 | 57 | } |
BVanderWilp | 0:d445abf9a8e9 | 58 | |
BVanderWilp | 1:69c06d3676fd | 59 | void Brise() //state5, A- B+ C0 |
BVanderWilp | 0:d445abf9a8e9 | 60 | { |
BVanderWilp | 0:d445abf9a8e9 | 61 | phaseCEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 62 | phaseAEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 63 | } |
BVanderWilp | 0:d445abf9a8e9 | 64 | |
BVanderWilp | 1:69c06d3676fd | 65 | void Afall() //state5, A- B0 C+ |
BVanderWilp | 0:d445abf9a8e9 | 66 | { |
BVanderWilp | 0:d445abf9a8e9 | 67 | phaseBEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 68 | phaseB.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 69 | phaseC.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 70 | phaseCEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 71 | } |
BVanderWilp | 0:d445abf9a8e9 | 72 | |
BVanderWilp | 1:69c06d3676fd | 73 | int count = 0; |
BVanderWilp | 1:69c06d3676fd | 74 | void intcall(){ |
BVanderWilp | 1:69c06d3676fd | 75 | count = (count + 1) % 6; |
BVanderWilp | 1:69c06d3676fd | 76 | |
BVanderWilp | 1:69c06d3676fd | 77 | if(count == 0) //B+, C- |
BVanderWilp | 1:69c06d3676fd | 78 | { |
BVanderWilp | 1:69c06d3676fd | 79 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 80 | phaseA.write(0); |
BVanderWilp | 1:69c06d3676fd | 81 | phaseB.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 82 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 83 | } |
BVanderWilp | 1:69c06d3676fd | 84 | else if(count == 1) //B+, A- |
BVanderWilp | 1:69c06d3676fd | 85 | { |
BVanderWilp | 1:69c06d3676fd | 86 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 87 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 88 | } |
BVanderWilp | 1:69c06d3676fd | 89 | else if(count == 2) //C+, A- |
BVanderWilp | 1:69c06d3676fd | 90 | { |
BVanderWilp | 1:69c06d3676fd | 91 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 92 | phaseB.write(0); |
BVanderWilp | 1:69c06d3676fd | 93 | phaseC.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 94 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 95 | } |
BVanderWilp | 1:69c06d3676fd | 96 | else if(count == 3) //C+, B- |
BVanderWilp | 1:69c06d3676fd | 97 | { |
BVanderWilp | 1:69c06d3676fd | 98 | phaseAEN = 0; |
BVanderWilp | 1:69c06d3676fd | 99 | phaseBEN = 1; |
BVanderWilp | 1:69c06d3676fd | 100 | } |
BVanderWilp | 1:69c06d3676fd | 101 | else if(count == 4) //A+, B- |
BVanderWilp | 1:69c06d3676fd | 102 | { |
BVanderWilp | 1:69c06d3676fd | 103 | phaseCEN = 0; |
BVanderWilp | 1:69c06d3676fd | 104 | phaseC.write(0); |
BVanderWilp | 1:69c06d3676fd | 105 | phaseA.write(pwmDuty); |
BVanderWilp | 1:69c06d3676fd | 106 | phaseAEN = 1; |
BVanderWilp | 1:69c06d3676fd | 107 | } |
BVanderWilp | 1:69c06d3676fd | 108 | else if(count == 5) //A+, C- |
BVanderWilp | 1:69c06d3676fd | 109 | { |
BVanderWilp | 1:69c06d3676fd | 110 | phaseBEN = 0; |
BVanderWilp | 1:69c06d3676fd | 111 | phaseCEN = 1; |
BVanderWilp | 1:69c06d3676fd | 112 | } |
BVanderWilp | 0:d445abf9a8e9 | 113 | } |
BVanderWilp | 0:d445abf9a8e9 | 114 | |
BVanderWilp | 0:d445abf9a8e9 | 115 | |
BVanderWilp | 0:d445abf9a8e9 | 116 | int main() { |
BVanderWilp | 1:69c06d3676fd | 117 | //wait until button push to start |
BVanderWilp | 0:d445abf9a8e9 | 118 | button.rise(&activate); |
BVanderWilp | 0:d445abf9a8e9 | 119 | while(stall == 0) { |
BVanderWilp | 0:d445abf9a8e9 | 120 | led = !led; |
BVanderWilp | 0:d445abf9a8e9 | 121 | wait(2); |
BVanderWilp | 0:d445abf9a8e9 | 122 | } |
BVanderWilp | 1:69c06d3676fd | 123 | |
BVanderWilp | 1:69c06d3676fd | 124 | //startup with open loop |
BVanderWilp | 0:d445abf9a8e9 | 125 | phaseA.period_us(10); |
BVanderWilp | 0:d445abf9a8e9 | 126 | phaseB.period_us(10); |
BVanderWilp | 0:d445abf9a8e9 | 127 | phaseC.period_us(10); |
BVanderWilp | 2:0fbba327c44f | 128 | interrupt.attach(&intcall, .01); |
BVanderWilp | 1:69c06d3676fd | 129 | |
BVanderWilp | 0:d445abf9a8e9 | 130 | |
BVanderWilp | 0:d445abf9a8e9 | 131 | phaseA.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 132 | phaseB.write(pwmDuty); |
BVanderWilp | 0:d445abf9a8e9 | 133 | phaseC.write(0); |
BVanderWilp | 0:d445abf9a8e9 | 134 | |
BVanderWilp | 0:d445abf9a8e9 | 135 | phaseAEN = 0; |
BVanderWilp | 0:d445abf9a8e9 | 136 | phaseBEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 137 | phaseCEN = 1; |
BVanderWilp | 0:d445abf9a8e9 | 138 | |
BVanderWilp | 1:69c06d3676fd | 139 | for(int i = 0; i < 4; i++) |
BVanderWilp | 1:69c06d3676fd | 140 | { |
BVanderWilp | 1:69c06d3676fd | 141 | i++; |
BVanderWilp | 1:69c06d3676fd | 142 | led = !led; |
BVanderWilp | 1:69c06d3676fd | 143 | wait(0.5); |
BVanderWilp | 1:69c06d3676fd | 144 | } |
BVanderWilp | 1:69c06d3676fd | 145 | interrupt.detach(); |
BVanderWilp | 1:69c06d3676fd | 146 | //begin sensored mode |
BVanderWilp | 1:69c06d3676fd | 147 | |
BVanderWilp | 1:69c06d3676fd | 148 | // hallA.fall(&Arise); |
BVanderWilp | 1:69c06d3676fd | 149 | // hallA.rise(&Afall); |
BVanderWilp | 1:69c06d3676fd | 150 | // hallB.fall(&Brise); |
BVanderWilp | 1:69c06d3676fd | 151 | // hallB.rise(&Bfall); |
BVanderWilp | 1:69c06d3676fd | 152 | // hallC.fall(&Crise); |
BVanderWilp | 1:69c06d3676fd | 153 | // hallC.rise(&Cfall); |
BVanderWilp | 1:69c06d3676fd | 154 | |
BVanderWilp | 1:69c06d3676fd | 155 | hallA.fall(&Afall); |
BVanderWilp | 1:69c06d3676fd | 156 | hallA.rise(&Arise); |
BVanderWilp | 1:69c06d3676fd | 157 | hallB.fall(&Bfall); |
BVanderWilp | 1:69c06d3676fd | 158 | hallB.rise(&Brise); |
BVanderWilp | 1:69c06d3676fd | 159 | hallC.fall(&Cfall); |
BVanderWilp | 1:69c06d3676fd | 160 | hallC.rise(&Crise); |
BVanderWilp | 1:69c06d3676fd | 161 | |
BVanderWilp | 0:d445abf9a8e9 | 162 | while(1) { |
BVanderWilp | 0:d445abf9a8e9 | 163 | led = !led; |
BVanderWilp | 0:d445abf9a8e9 | 164 | wait(0.2); |
BVanderWilp | 0:d445abf9a8e9 | 165 | } |
BVanderWilp | 0:d445abf9a8e9 | 166 | } |