STM32F302R8 with Konrad's inverter boards for senior design.
Fork of Blue_Board_Ticker by
main.cpp
- Committer:
- vicyap
- Date:
- 2016-04-15
- Revision:
- 19:085eb0579185
- Parent:
- 18:d7033a38f20b
- Child:
- 20:029a58eb24ab
File content as of revision 19:085eb0579185:
#include "mbed.h" PwmOut phaseA(PA_8); //Out1, Green DigitalOut phaseAEN(PC_10); PwmOut phaseB(PA_9); //Out2, Blue DigitalOut phaseBEN(PC_11); PwmOut phaseC(PA_10); //Out3, White DigitalOut phaseCEN(PC_12); AnalogIn pot(PB_1); InterruptIn button(USER_BUTTON); DigitalOut redLed(PB_2); DigitalOut led(LED1); InterruptIn hallA(PA_15); //H1, Green InterruptIn hallB(PB_3); //H2, Blue InterruptIn hallC(PB_10); //H3, White Ticker rpmInterrupt; Ticker spinTicker; int revCount = 0; int rpmPrintFlag = 0; int currentRPM; float pwmMax = 0.9; float pwmDuty; int stall = 0; int reverse = 0; int spinTickerCounter = 0; int ticksPerHall = 0; int prevHallState = 0; int pole_pairs = 2; void rpmCalc() { currentRPM = revCount * 60; // 60 seconds in 1 minute currentRPM /= pole_pairs; // account for elec vs mech rpm revCount = 0; rpmPrintFlag = 1; } //original names: CBA CBA, new names: BAC BAC void Brise() //state1, A0 B- C+ { phaseA.write(0); phaseB.write(0); phaseC.write(pwmDuty); phaseAEN = 0; phaseBEN = 1; phaseCEN = 1; } void Afall() //state2, A+ B- C0 { phaseA.write(pwmDuty); phaseB.write(0); phaseC.write(0); phaseAEN = 1; phaseBEN = 1; phaseCEN = 0; } void Crise() //state3, A+ B0 C- { phaseA.write(pwmDuty); phaseB.write(0); phaseC.write(0); phaseAEN = 1; phaseBEN = 0; phaseCEN = 1; } void Bfall() //state4, A0 B+ C- { phaseA.write(0); phaseB.write(pwmDuty); phaseC.write(0); phaseAEN = 0; phaseBEN = 1; phaseCEN = 1; } void Arise() //state5, A- B+ C0 { phaseA.write(0); phaseB.write(pwmDuty); phaseC.write(0); phaseAEN = 1; phaseCEN = 0; phaseBEN = 1; } void Cfall() //state6, A- B0 C+ { phaseAEN = 1; phaseBEN = 0; phaseCEN = 1; phaseA.write(0); phaseB.write(0); phaseC.write(pwmDuty); } void toggleRedLed() { redLed = !redLed; } void jumpStart() { int h1 = hallA.read(); int h2 = hallB.read(); int h3 = hallC.read(); //check where we start int currentHallState = (h1 << 2) + (h2 << 1) + h3; if (currentHallState != prevHallState) { ticksPerHall = spinTickerCounter; spinTickerCounter = 0; // reset the number of ticks per hall sensor change if (prevHallState == 1) // arbitrarily choose state 1 { revCount += 1; } } prevHallState = currentHallState; spinTickerCounter += 1; // count the number of times spinTicker runs per hall sensor if (reverse == 0) { if(h1 == 0 && h2 == 1 && h3 == 1) { //state1 Afall(); } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2 Crise(); } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3 Bfall(); } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4 Arise(); } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5 Cfall(); } else { //(h1 == 0 && h2 == 1 && h3 == 0)state6 Brise(); } } else if (reverse == 1) // to go in reverse, shift the mappings by 180 degrees { if(h1 == 0 && h2 == 1 && h3 == 1) { //state1 Arise(); } else if(h1 == 0 && h2 == 0 && h3 == 1) { //state2 Cfall(); } else if(h1 == 1 && h2 == 0 && h3 == 1) { //state3 Brise(); } else if(h1 == 1 && h2 == 0 && h3 == 0) { //state4 Afall(); } else if(h1 == 1 && h2 == 1 && h3 == 0) { //state5 Crise(); } else { //(h1 == 0 && h2 == 1 && h3 == 0) state6 Bfall(); } } toggleRedLed(); } void activate() { if(stall == 0) { stall = 1; } else { if (pwmDuty < 0.4f) { reverse = reverse ^ 1; } } } int main() { //wait until button push to start rpmInterrupt.attach(&rpmCalc, 1); button.rise(&activate); while(stall == 0) { led = !led; wait(1); } pwmDuty = pot.read() * pwmMax; phaseA.period_us(50); phaseB.period_us(50); phaseC.period_us(50); phaseA.write(0); phaseB.write(0); phaseC.write(0); phaseAEN = 0; phaseBEN = 0; phaseCEN = 0; // init the prevHallState int h1 = hallA.read(); int h2 = hallB.read(); int h3 = hallC.read(); prevHallState = (h1 << 2) + (h2 << 1) + h3; spinTicker.attach_us(&jumpStart, 50); float ADCSum = 0; int ADCCount = 0; while(1) { led = !led; ADCSum += pot.read(); ADCCount++; if(ADCCount == 20) { pwmDuty = (ADCSum/20) * pwmMax; ADCSum = 0; ADCCount = 0; } if(rpmPrintFlag == 1) { printf("%d rpm; %f duty; reverse: %d; ticksPerHall = %d\r\n", currentRPM, pwmDuty, reverse, ticksPerHall); rpmPrintFlag = 0; } wait(0.05); } }