STM32F302R8 with Konrad's inverter boards for senior design.

Dependencies:   mbed

Fork of Blue_Board_Ticker by Brad VanderWilp

main.cpp

Committer:
BVanderWilp
Date:
2016-04-06
Revision:
3:2bcc36fe4de5
Parent:
2:0fbba327c44f
Child:
4:ab4d51b5b1c8

File content as of revision 3:2bcc36fe4de5:

#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);

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 interrupt;

float pwmDuty = 0.5;
int stall = 0;
void activate()
{
    stall = 1;
}

void Crise()    //state1, A0 B- C+
{   
    phaseAEN = 0;
    phaseBEN = 1;
    
    phaseC.write(pwmDuty);
    phaseCEN = 1;
    redLed = ! redLed;
}

void Bfall()    //state2, A+ B- C0
{
    phaseCEN = 0;
    phaseC.write(0);
    phaseA.write(pwmDuty);
    phaseAEN = 1;
    
    phaseBEN = 1;
}

void Arise()    //state3, A+ B0 C-
{
    phaseBEN = 0;
    phaseCEN = 1;
    
    phaseA.write(pwmDuty);
    phaseAEN = 1;
}

void Cfall()    //state4, A0 B+ C-
{
    phaseAEN = 0;
    phaseA.write(0);
    phaseB.write(pwmDuty);
    phaseBEN = 1;
    
    phaseCEN = 1;
    redLed = ! redLed;
}

void Brise()    //state5, A- B+ C0
{
    phaseCEN = 0;
    phaseAEN = 1;
    
    phaseB.write(pwmDuty);
    phaseBEN = 1;
}

void Afall()    //state5, A- B0 C+
{
    phaseBEN = 0;
    phaseB.write(0);
    phaseC.write(pwmDuty);
    phaseCEN = 1;
    
    phaseAEN = 1;
}

int count = 0;
void intcall(){
    count = (count + 1) % 6;
    
    if(count == 0)  //B+, C-
    {
        phaseAEN = 0;
        phaseA.write(0);
        phaseB.write(pwmDuty);
        phaseBEN = 1;
    }
    else if(count == 1) //B+, A-
    {
        phaseCEN = 0;
        phaseAEN = 1;
    }
    else if(count == 2) //C+, A-
    {
        phaseBEN = 0;
        phaseB.write(0);
        phaseC.write(pwmDuty);
        phaseCEN = 1;
    }
    else if(count == 3) //C+, B-
    {
        phaseAEN = 0;
        phaseBEN = 1;
    }
    else if(count == 4) //A+, B-
    {
        phaseCEN = 0;
        phaseC.write(0);
        phaseA.write(pwmDuty);
        phaseAEN = 1;
    }
    else if(count == 5) //A+, C-
    {
        phaseBEN = 0;
        phaseCEN = 1;
    }
}


int main() {     
    //wait until button push to start
    button.rise(&activate);
    while(stall == 0) {
        led = !led;
        wait(2);
    }
    button.detach();

//    //startup with open loop
//    phaseA.period_us(10);
//    phaseB.period_us(10);
//    phaseC.period_us(10);
//    interrupt.attach(&intcall, .01);
//
//    
//    phaseA.write(0);
//    phaseB.write(pwmDuty);
//    phaseC.write(0);    
//    
//    phaseAEN = 0;
//    phaseBEN = 1;
//    phaseCEN = 1;
//    
//    for(int i = 0; i < 4; i++)
//    {
//        i++;
//        led = !led;
//        wait(0.5);
//    }
//    interrupt.detach();

    phaseA.period_us(10);
    phaseB.period_us(10);
    phaseC.period_us(10);
    
    phaseA.write(0);
    phaseB.write(0);
    phaseC.write(0);    
    
    phaseAEN = 0;
    phaseBEN = 0;
    phaseCEN = 0;
    //begin sensored mode 
    hallA.fall(&Afall);
    hallA.rise(&Arise);
    hallB.fall(&Bfall);
    hallB.rise(&Brise);
    hallC.fall(&Cfall);
    hallC.rise(&Crise); 
    
    int h1 = hallA.read();
    int h2 = hallB.read();
    int h3 = hallC.read();
    //check where we start
    if(h1 == 0 && h2 == 1 && h3 == 1)   //state1
    {
        Crise();
        Bfall();
    }
    else if(h1 == 0 && h2 == 0 && h3 == 1)  //state2
    {
        Bfall();
        Arise();
    }
    else if(h1 == 1 && h2 == 0 && h3 == 1)  //state3
    {
        Arise();
        Cfall();
    }
    else if(h1 == 1 && h2 == 0 && h3 == 0)     //state4
    {
        Cfall();
        Brise();
    }
    else if(h1 == 1 && h2 == 1 && h3 == 0)  //state5
    {
        Brise();
        Crise();
    }
    else    //state6
    {
        Afall();
    } 
    
    while(1) {
        led = !led;
        wait(0.2);
    }
}