premiere ebauche

Dependencies:   mbed PinDetect

main.cpp

Committer:
shovelcat
Date:
2018-10-17
Revision:
1:c6b4ccebd483
Parent:
0:011f69c1276c
Child:
2:06f128641b62

File content as of revision 1:c6b4ccebd483:

#include "mbed.h"

/* 
##############################
uC I/O
##############################
*/ 
AnalogIn        pedal_in_hi(PA_3);
AnalogIn        pedal_in_lo(PC_0);
AnalogOut       pedal_out_hi(PA_4);
AnalogOut       pedal_out_lo(PA_5);

// test i/o
InterruptIn     b1(PC_13);
DigitalOut      led(LED1);
DigitalOut      canLed(LED2);
Serial          pc(USBTX, USBRX); // for communication / debugging
CAN             can1(PD_0, PD_1);

/* 
##############################
Constants
##############################
*/ 
const float ADC_INPUT_MAX_VALUE = 5;
const float ADC_OUTPUT_MAX_VALUE = 5;

const float PEDAL_HI_MIN_VALUE = 0.48;
const float PEDAL_HI_MAX_VALUE = 2.96;
const float PEDAL_LO_MIN_VALUE = 0.25;
const float PEDAL_LO_MAX_VALUE = 1.48;

const float SPEED_MAX = 40.0;

/* 
##############################
Static variables and functions
##############################
*/ 
static float __reference_speed = 0;
static float __measured_speed = 0;

static void setReferenceSpeed(const float speed) {
    // TODO insert mutex here
    __reference_speed = speed;
}

static void setMeasuredSpeed(const float speed) {
    // TODO insert mutex here
    __measured_speed = speed;
}

static float getReferenceSpeed() {
    // TODO insert mutex here
    return __reference_speed;
}
static float getMeasuredSpeed() {
    // TODO insert mutex here
    return __measured_speed;
}

/* 
##############################
Utility functions
##############################
*/ 

// Returns 'value' bounded between 'lowerBound' and 'upperBound'
float boundValue(float value, const float lowerBound, const float upperBound) {
    if(value < lowerBound) {
        value = lowerBound;
    }
    else if(value > upperBound) {
        value = upperBound;
    }
    return value;
}

// Returns "value/reference" as a percentage in decimal form (0.5 for 50%)
float toDecimalPercent(const float value, const float reference) {
    return value/reference;
}

// Returns voltage read on analog input port chosen for pedal input 1
float readAdcPedalHi() {
    const float decPcValue = pedal_in_hi.read();
    const float voltage = decPcValue * ADC_INPUT_MAX_VALUE;
    return voltage;
}

// Returns voltage read on analog input port chosen for pedal input 2
float readAdcPedalLo() {
    const float decPcValue = pedal_in_lo.read();
    const float voltage = decPcValue * ADC_INPUT_MAX_VALUE;
    return voltage;
}


// Accepts a value in volts, converts to % and sets ADC for pedal output 1
void writeAdcPedalHi(const float voltage) {
    const float boundedValue = boundValue(voltage, PEDAL_HI_MIN_VALUE, PEDAL_HI_MAX_VALUE);
    const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE);
    pedal_out_hi.write(decPcValue);
}

// Accepts a value in volts, converts to % and sets ADC for pedal output 2
void writeAdcPedalLo(const float voltage) {
    const float boundedValue = boundValue(voltage, PEDAL_LO_MIN_VALUE, PEDAL_LO_MAX_VALUE);
    const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE);
    pedal_out_lo.write(decPcValue);
}

// main transfer function
void limvitCallback() {
//    const float T_gb_r = (0.3175*2/2.0)/20.5;
//    
//    // constantes du controleur IP (Ziegler-Nichols method)
//    const float Ki = 0;
//    const float Kp = 1.0;
//    
//    // facteur de conversion
////    const float pedal_HI_range = PEDAL_HI_MAX_VALUE - PEDAL_HI_MIN_VALUE;
//    
//    const float speedVoltageConversionFactor = PEDAL_HI_MAX_VALUE / SPEED_MAX;
//    const float Kc = T_gb_r * speedVoltageConversionFactor;
//      
//    // algorithme 
//    const float Vref = getReferenceSpeed();
//    const float Vmes = getMeasuredSpeed();
//    const float err = Vref - Vmes;
//    const float errKi = err * Ki;
//    const float err2 = errKi - Vmes;
//    const float udHi = err2 * Kp * Kc;
//    const float udLo = (float)udHi / 2;
//
////    const float umHi = readAdcPedalHi();
////    const float umLo = readAdcPedalLo();
//    writeAdcPedalHi(udHi);
////    writeAdcPedalLo(udLo);
//    writeAdcPedalLo(Vref * speedVoltageConversionFactor);
//    
//    
//    // test
//    setMeasuredSpeed(udHi / speedVoltageConversionFactor);
//    

    const float tmpHi = readAdcPedalHi();
    const float tmpLo = readAdcPedalLo();
//    pc.printf("Callback\n\r");
//    pc.printf("Hi: %f\n\r", tmpHi);
//    pc.printf("Lo: %f\n\r", tmpLo);
    
    // fonction suiveur
    writeAdcPedalHi(tmpHi);
    writeAdcPedalLo(tmpLo);

}

// Main loop to be run in thread
void limvitMain() {
//    const float period = 0.001;
    const float period = 0.5;
    Ticker limvitSync;
    limvitSync.attach(&limvitCallback, period);
    
//    while(1) {
//        led = !led;
//        wait(1.0);        
//    }
}

void canCallback() {
    CANMessage msg;
    canLed = true;
    wait(1.0);
    canLed = false;
    int status = can1.read(msg);
    if(status) {
        pc.printf("CAN msg received: %x\n\r", msg.data);
    }
    else {
        pc.printf("Error: %d\n\r", status);
    }
}

void b1Callback() {
    static bool state = false;
    pc.printf("User pressed b1.\n\r");
    if (state) {
        // reset speed
        setReferenceSpeed(0.0);
        state = !state;
    }
    else {
        setReferenceSpeed(30.0);
        state = !state;
    }    
    pc.printf("%s\n\r", can1.rderror());
    canCallback();
}

int main() {
    pc.printf("\n\rAnalogIn example\n\r");
    setReferenceSpeed(0);
    setMeasuredSpeed(0);
    b1.rise(&b1Callback);
    
    // CAN test
    can1.frequency(500000);
    can1.attach(&canCallback, CAN::RxIrq);
    
    limvitMain();
    while(1) {
        wait(1.0);
    }
}