Firmware for an Android accessory electric bicycle. See http://www.danielcasner.org/tag/ebike/ for some more information on my build.
Dependencies: AndroidAccessory mbed
throttle.h
- Committer:
- DanielC
- Date:
- 2012-08-25
- Revision:
- 3:dc564aaf8a81
- Parent:
- 2:e2c3c7340fb3
File content as of revision 3:dc564aaf8a81:
#ifndef _throttle_h_ #define _throttle_h_ #include "mbed.h" /** Enumeration of different throttle operation modes. * Determines how the throttle output is calculated from * all possible inputs. */ typedef enum ThrottleMode { off = 0, /// Throttle output is 0 raw = 1, /// Throttle output is throttle input (possibly with calibrated curve) torque = 2, /// Throttle output runs a PID loop on thorque output cruise_raw, /// Throttle output is held to grip throttle at time cruise was set cruise_speed, /// Throttle output runs cruise control PID on speed. cruise_torque, /// Throttle output runs cruise control PID on torque. droid, /// Throttle output is controlled by attached Android. calibrate_speed = 0x55, /// Throttle to speed calibration mode calibrate_torque = 0x56, /// Throttle to torque calibration mode calibrate_input = 0x57, /// Grip throttle calibration mode } ThrottleMode; /** State machine for running cruise control functions */ typedef enum CruiseState { waiting, /// Waiting for a valid precondition to be met to start running cruise control transition, /// A transition or ramp between cruise off and cruise on is in progress running, /// Full cruise control operating inhibited, /// Something (breaks) cause the cruise control to be inhibited } CruiseState; /** A singleton class representing all aspects of throttle control (input and output) * as well as regenerative breaking function and break inhibits. */ class Throttle { public: /** Get the singleton instance * All variables will be used asynchronously so they must be available throughout the program * @param I Motor current in Amps * @param v_f Front wheel speed in RPM * @param v_r Rear wheel speed in RPM * @param cadence cadence in RPM * @param break_l Left break input * @param break_r Right break input * @return A pointer to the singleton Throttle object */ static Throttle *getThrottle(float *I, float *v_f, float *v_r, float *cadence, AnalogIn* break_l, AnalogIn* break_r); /// Set the throttle control mode void setMode(ThrottleMode m); /// Set a limit on motor current for closed loop regulation void setILimit(float I); /** Set a speed limit * @param v Speed in RPM * @param enforce if true, regenerative breaking will be used to slow the * bike if it's going over the speed limit with the motor off. */ void setSpeedLimit(float v, bool enforce=false); /// Set the external input (from Droid) void input(float target); private: /// Private constructor Throttle(float *I, float *v_f, float *v_r, float *cadence, AnalogIn* break_l, AnalogIn* break_r); /// and destructor ~Throttle(); /// Control loop tick void onTick(); // The singleton instance static Throttle* instance; Ticker tick; ThrottleMode mode; CruiseState state; float *I, *v_f, *v_r, *cadence; AnalogIn *brkl, *brkr; float target, iLimit, speedLimit; bool enforceSpeedLimit; static const float break_inhibit_threshold = 0.1; /// The thrshold at which the breaks cut off the throttle }; #endif