Prius IPM controller

Dependencies:   mbed

Fork of analoghalls5_5 by N K

Committer:
bwang
Date:
Mon Mar 09 03:32:32 2015 +0000
Revision:
19:280c62c71cf8
Parent:
16:fd6771a6685a
Child:
24:f1ff9c7256b5
stylistic changes (SVM code in the right class now); NOTE: SinusoidalModulator currently does nothing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bwang 11:dccbaa9274c5 1 #include "includes.h"
bwang 11:dccbaa9274c5 2 #include "core.h"
bwang 11:dccbaa9274c5 3 #include "meta.h"
bwang 11:dccbaa9274c5 4 #include "sensors.h"
bwang 11:dccbaa9274c5 5 #include "filters.h"
bwang 11:dccbaa9274c5 6 #include "context.h"
bwang 11:dccbaa9274c5 7
bwang 16:fd6771a6685a 8 float debug_registers[16];
bwang 15:c10d0aa3c0e1 9
bwang 11:dccbaa9274c5 10 Context::Context() {
bwang 11:dccbaa9274c5 11 _index = 0;
bwang 11:dccbaa9274c5 12 _time_upd_ticker = new Ticker();
bwang 11:dccbaa9274c5 13 _time_upd_ticker->attach_us(this, &Context::upd_function, 50);
bwang 11:dccbaa9274c5 14 }
bwang 11:dccbaa9274c5 15
bwang 11:dccbaa9274c5 16 void Context::ConfigureOutputs(PinName oa, PinName ob, PinName oc, PinName en) {
bwang 11:dccbaa9274c5 17 _oa = oa;
bwang 11:dccbaa9274c5 18 _ob = ob;
bwang 11:dccbaa9274c5 19 _oc = oc;
bwang 11:dccbaa9274c5 20 _en = en;
bwang 11:dccbaa9274c5 21 }
bwang 11:dccbaa9274c5 22
bwang 11:dccbaa9274c5 23 void Context::ConfigureCurrentSensors(PinName ib_pin, PinName ic_pin, float scale, float filter_strength) {
bwang 11:dccbaa9274c5 24 _ib_pin = ib_pin;
bwang 11:dccbaa9274c5 25 _ic_pin = ic_pin;
bwang 11:dccbaa9274c5 26 _scale = scale;
bwang 11:dccbaa9274c5 27 _filter_strength = filter_strength;
bwang 11:dccbaa9274c5 28 }
bwang 11:dccbaa9274c5 29
bwang 11:dccbaa9274c5 30 void Context::ConfigurePidControllers(float ki, float kp, float kd, float pidmax, float pidmin) {
bwang 11:dccbaa9274c5 31 _ki = ki;
bwang 11:dccbaa9274c5 32 _kp = kp;
bwang 11:dccbaa9274c5 33 _kd = kd;
bwang 11:dccbaa9274c5 34 _pidmax = pidmax;
bwang 11:dccbaa9274c5 35 _pidmin = pidmin;
bwang 11:dccbaa9274c5 36 }
bwang 11:dccbaa9274c5 37
bwang 11:dccbaa9274c5 38 void Context::ConfigureThrottle(PinName throttle_pin, float min, float max) {
bwang 11:dccbaa9274c5 39 _throttle_pin = throttle_pin;
bwang 11:dccbaa9274c5 40 _min = min;
bwang 11:dccbaa9274c5 41 _max = max;
bwang 11:dccbaa9274c5 42 }
bwang 11:dccbaa9274c5 43
bwang 11:dccbaa9274c5 44 void Context::ConfigurePositionSensor(PinName pos_a_pin, PinName pos_b_pin, float cal1_a, float cal2_a, float cal1_b, float cal2_b, float offset) {
bwang 11:dccbaa9274c5 45 _pos_a_pin = pos_a_pin;
bwang 11:dccbaa9274c5 46 _pos_b_pin = pos_b_pin;
bwang 11:dccbaa9274c5 47 _cal1_a = cal1_a;
bwang 13:79e247e54d78 48 _cal2_a = cal2_a;
bwang 11:dccbaa9274c5 49 _cal1_b = cal1_b;
bwang 11:dccbaa9274c5 50 _cal2_b = cal2_b;
bwang 11:dccbaa9274c5 51 _offset = offset;
bwang 11:dccbaa9274c5 52 }
bwang 11:dccbaa9274c5 53
bwang 11:dccbaa9274c5 54 void Context::ConfigureReference(float max_current) {
bwang 11:dccbaa9274c5 55 _max_current = max_current;
bwang 11:dccbaa9274c5 56 }
bwang 11:dccbaa9274c5 57
bwang 11:dccbaa9274c5 58 void Context::AttachCallBack(void (*f)(Context *), int freq) {
bwang 11:dccbaa9274c5 59 _call_times[_index] = 0;
bwang 11:dccbaa9274c5 60 _call_periods[_index] = 1000000 / freq;
bwang 11:dccbaa9274c5 61 _callbacks[_index++] = f;
bwang 11:dccbaa9274c5 62 }
bwang 11:dccbaa9274c5 63
bwang 11:dccbaa9274c5 64 void Context::Start() {
bwang 11:dccbaa9274c5 65 InitData();
bwang 11:dccbaa9274c5 66
bwang 11:dccbaa9274c5 67 for (;;) {
bwang 11:dccbaa9274c5 68 for (int i = 0; i < _index; i++) {
bwang 11:dccbaa9274c5 69 if (_time - _call_times[i] >= _call_periods[i]) {
bwang 11:dccbaa9274c5 70 (*_callbacks[i])(this);
bwang 11:dccbaa9274c5 71 _call_times[i] = _time;
bwang 11:dccbaa9274c5 72 }
bwang 11:dccbaa9274c5 73 }
bwang 11:dccbaa9274c5 74 }
bwang 11:dccbaa9274c5 75 }
bwang 11:dccbaa9274c5 76
bwang 11:dccbaa9274c5 77 void Context::InitData() {
bwang 13:79e247e54d78 78 sense_p = new AnalogHallPositionSensor(_pos_a_pin, _pos_b_pin, _cal1_a, _cal2_a, _cal1_b, _cal2_b, _offset);
bwang 11:dccbaa9274c5 79 sense_ib = new AnalogCurrentSensor(_ib_pin, _scale);
bwang 11:dccbaa9274c5 80 sense_ic = new AnalogCurrentSensor(_ic_pin, _scale);
bwang 11:dccbaa9274c5 81 throttle = new Throttle(_throttle_pin, _min, _max);
bwang 11:dccbaa9274c5 82 sense_bus = new VoltageSensor();
bwang 11:dccbaa9274c5 83 sense_t_motor = new TempSensor();
bwang 11:dccbaa9274c5 84 sense_t_inverter = new TempSensor();
bwang 11:dccbaa9274c5 85
bwang 11:dccbaa9274c5 86 pid_d = new PidController(_ki, _kd, _kp, _pidmax, _pidmin);
bwang 11:dccbaa9274c5 87 pid_q = new PidController(_ki, _kd, _kp, _pidmax, _pidmin);
bwang 11:dccbaa9274c5 88
bwang 11:dccbaa9274c5 89 motor = new Motor(sense_ic, sense_ib, sense_p, sense_t_motor);
bwang 11:dccbaa9274c5 90 inverter = new Inverter(_oa, _ob, _oc, _en, sense_bus, sense_t_inverter);
bwang 11:dccbaa9274c5 91 user = new User(throttle);
bwang 19:280c62c71cf8 92 modulator = new SvmModulator(inverter);
bwang 11:dccbaa9274c5 93 reference = new SynchronousReferenceSynthesizer(_max_current);
bwang 11:dccbaa9274c5 94 filter_d = new MeanFilter(_filter_strength);
bwang 11:dccbaa9274c5 95 filter_q = new MeanFilter(_filter_strength);
bwang 16:fd6771a6685a 96
bwang 16:fd6771a6685a 97 serial = new Serial(USBTX, USBRX);
bwang 11:dccbaa9274c5 98 serial->baud(115200);
bwang 11:dccbaa9274c5 99 }
bwang 11:dccbaa9274c5 100
bwang 11:dccbaa9274c5 101 void Context::upd_function() {
bwang 11:dccbaa9274c5 102 _time += 50;
bwang 11:dccbaa9274c5 103 }