Main code of our project.

Dependencies:   TextLCD mbed PID

main.cpp

Committer:
nicovv44
Date:
2018-09-21
Revision:
2:e612706e18eb
Parent:
1:f31a46c62d10
Child:
3:a1b11dfd26f3

File content as of revision 2:e612706e18eb:

// Hello World! for the TextLCD

#include "mbed.h"
#include "TextLCD.h"

TextLCD             lcd(D2, D3, D4, D5, D6, D7); // rs, e, d4-d7
Serial              pc(USBTX, USBRX); // tx, rx
//PwmOut              pwm1(D9);
DigitalOut          relaySync(D8);

AnalogIn            analog_pin1(A0);

const float         sqrt2 = 1.414213562;

Timeout             timeout;
volatile bool       looping = false;






// ##############################################
// ########## PROTOTYPES ########################
// #############################################################################
void stopLooping(void);
float getVolageRMS(AnalogIn ana_pin);
float getVolageReadedMax(AnalogIn ana_pin);
float getFrequency(AnalogIn ana_pin);













// ##############################################
// ########## MAIN ##############################
// #############################################################################
int main() {
    float Vm;
    float freq1;
    
    relaySync = 1;//Relay off=1, on=0
    while(1){
        if(getVolageReadedMax(analog_pin1) < 0.020){
            relaySync = 0;//Relay off=1, on=0
            lcd.locate(0,0);
            lcd.printf("SYNC");
        }
    }
    
    
    // specify period first
    //pwm1.period(0.1f);      // 4 second period
    //pwm1.write(0.50f);      // 50% duty cycle, relative to period
    
    
    Vm = getVolageRMS(analog_pin1);
    lcd.locate(0,0);
    lcd.printf("Vm=%f", Vm);
    freq1 = getFrequency(analog_pin1);
    lcd.locate(0,1);
    lcd.printf("freq1=%f", freq1);
}







// ##############################################
// ########## FUNCTIONS #########################
// #############################################################################
// ISR to stop loping
void stopLooping(void) {
    looping = false;//looping is volatile bool
}

// #############################################################################
float getVolageRMS(AnalogIn ana_pin){
    float v1;//readed voltage
    float v1Max = 0;//max readed voltage
    float VRMS; //RMS voltage
    looping = true;
    timeout.attach(callback(&stopLooping), 0.020);//T=20ms because f=50Hz
    while(looping){
        v1 = ana_pin.read()*3.3;
        if(v1 > v1Max){
            v1Max = v1;
        }
    }
    VRMS = (v1Max+0.685)*20.8/sqrt2;
    pc.printf("VRMS: %f\r\n",VRMS);
    return VRMS;
}


// #############################################################################
float getVolageReadedMax(AnalogIn ana_pin){
    float v1;//readed voltage
    float v1Max = 0;//max readed voltage
    looping = true;
    timeout.attach(callback(&stopLooping), 0.025);//T=25>20ms because f=50Hz
    while(looping){
        v1 = ana_pin.read()*3.3;
        if(v1 > v1Max){
            v1Max = v1;
        }
    }
    return v1Max;
}


// #############################################################################
// getFrequency #######
float getFrequency(AnalogIn ana_pin){
    float   freq; //frequency
    float   maxReadedVoltage;//maximum voltage readed by the ADC
    float   readedVoltage;//readed voltage
    int     nbrRisingEdge=0;// number of rising edge detected
    float   T;//Periode
    Timer   timer;
    maxReadedVoltage = getVolageReadedMax(ana_pin);
    pc.printf("maxReadedVoltage: %f\r\n",maxReadedVoltage);
    bool aboveLine = true;
    looping = true;
    timeout.attach(callback(&stopLooping), 1);//try to find rising edges during 1sec max
    while(nbrRisingEdge<2 and looping){
        readedVoltage = ana_pin.read()*3.3;
        if(readedVoltage<(maxReadedVoltage/2)){//rising edge detection ready
            aboveLine = false;
        }
        if((maxReadedVoltage/2)<readedVoltage && aboveLine==false){//rising edge detected
            aboveLine = true;
            if(nbrRisingEdge==0)
                timer.start();
            if(nbrRisingEdge==1)
                timer.stop();
            nbrRisingEdge++;
        }
    }
    if(nbrRisingEdge!=2){
        lcd.locate(13,1);
        lcd.printf("f!%d",nbrRisingEdge);
    }
    T = timer.read();
    freq = 1/T;
    pc.printf("T: %f\r\n",T);
    pc.printf("freq: %f\r\n\n",freq);
    return freq;
}