premiere ebauche

Dependencies:   mbed PinDetect

speedlimiter.hpp

Committer:
shovelcat
Date:
2018-10-25
Revision:
6:1a4ed88c9a4b
Parent:
5:aef1fc6c0df1
Child:
10:f0b382368614

File content as of revision 6:1a4ed88c9a4b:

/*
author: Sebastian Pelchat
date: october 2018
*/
#ifndef SPEED_LIMITER_HPP
#define SPEED_LIMITER_HPP

#include "mbed.h"

class SpeedLimiter
{
public:

    static const float TRANSFER_FUNCTION_PERIOD = 0.1; // seconds
    static const float DISABLE_ECO_ALGO_TRIGGER = 999; // TODO: probably defined somewhere else.

    static const float ADC_INPUT_MAX_VALUE = 3.3; // Volts
    static const float ADC_OUTPUT_MAX_VALUE = 3.3; // Volts

    static const float PEDAL_HI_MIN_VALUE = 0.48; // Volts
    static const float PEDAL_HI_MAX_VALUE = 2.96; // Volts
    static const float PEDAL_LO_MIN_VALUE = PEDAL_HI_MIN_VALUE / 2;
    static const float PEDAL_LO_MAX_VALUE = PEDAL_HI_MAX_VALUE / 2;

    static const float TORQUE_MAX = 20.0; // Newtons

    static const float SPEED_MAX = 40.0;

    SpeedLimiter(const PinName& pedalInHi, const PinName& pedalInLo, const PinName& pedalOutHi, const PinName& pedalOutLo);
    ~SpeedLimiter();

    void ipControllerTransferFunction();

    inline float getReferenceSpeed() {
        float retval = _referenceSpeed;
        return retval;
    }
    inline float getMeasuredSpeed() {
        float retval = _measuredSpeed;
        return retval;
    }
    inline void setReferenceSpeed(const float speed) {
        _referenceSpeed = speed;
    }
    inline void setMeasuredSpeed(const float speed) {
        _measuredSpeed = speed;
    }

    float ecoEnabledAlgorithm();
    
    inline float readAdcTest() {
        AnalogIn adc(PF_3);
        return adc.read();
    }
    
private:
    float readAdcPedalHi();
    float readAdcPedalLo();
    void writeAdcPedalHi(const float voltage);
    void writeAdcPedalLo(const float voltage);
    float ecoDisabledAlgorithm();

    float boundValue(float value, const float lowerBound, const float upperBound);
    float voltageToDecimal(const float decimal, const float reference);

    inline void setOutputPedalVoltageHi(const float voltage) {
        _outputPedalVoltageHi = voltage;
    }
    inline void setOutputPedalVoltageLo(const float voltage) {
        _outputPedalVoltageLo = voltage;
    }
    inline float getOutputPedalVoltageHi() {
        return _outputPedalVoltageHi;
    }
    inline float getOutputPedalVoltageLo() {
        return _outputPedalVoltageLo;
    }

protected:
    AnalogIn    _pedalInHi;
    AnalogIn    _pedalInLo;
    AnalogOut   _pedalOutHi;
    AnalogOut   _pedalOutLo;

    volatile float _referenceSpeed;
    volatile float _measuredSpeed;
    volatile float _outputPedalVoltageHi;
    volatile float _outputPedalVoltageLo;

    static Serial* pc; // for communication / debugging
};

#endif