Prius IPM controller

Dependencies:   mbed

Fork of analoghalls5_5 by N K

Committer:
bwang
Date:
Mon Mar 09 11:33:14 2015 +0000
Revision:
24:f1ff9c7256b5
Parent:
19:280c62c71cf8
Child:
25:0003b824dd7d
Added multi-channel debug logger in debug/, set up #channels and depth in main(), write in log() function. motor stops turning after trace is captured, requires reset to restart

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