Prius IPM controller

Dependencies:   mbed

Fork of analoghalls5_5 by N K

Committer:
bwang
Date:
Mon Mar 16 15:40:07 2015 +0000
Revision:
35:83cf9564bd0c
Parent:
25:0003b824dd7d
Set for 3A Iq, 0A Id, Ki = 1e-3, Kp = Kd = 0, loop still oscillates but is passable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bwang 11:dccbaa9274c5 1 #include "includes.h"
bwang 11:dccbaa9274c5 2 #include "filters.h"
bwang 11:dccbaa9274c5 3
bwang 11:dccbaa9274c5 4 PidController::PidController(float ki, float kp, float kd, float out_max, float out_min) {
bwang 11:dccbaa9274c5 5 _ki = ki;
bwang 11:dccbaa9274c5 6 _kp = kp;
bwang 11:dccbaa9274c5 7 _kd = kd;
bwang 11:dccbaa9274c5 8 _last_in = 0.0f;
bwang 11:dccbaa9274c5 9 _integral = 0.0f;
bwang 11:dccbaa9274c5 10 _out_max = out_max;
bwang 11:dccbaa9274c5 11 _out_min = out_min;
bwang 11:dccbaa9274c5 12 }
bwang 11:dccbaa9274c5 13
bwang 11:dccbaa9274c5 14 float PidController::Update(float ref, float in) {
bwang 11:dccbaa9274c5 15 float error = ref - in;
nki 25:0003b824dd7d 16
bwang 11:dccbaa9274c5 17 _integral += error;
nki 25:0003b824dd7d 18
bwang 11:dccbaa9274c5 19 if (_integral * _ki > _out_max) _integral = _out_max / _ki;
bwang 11:dccbaa9274c5 20 if (_integral * _ki < _out_min) _integral = _out_min / _ki;
nki 25:0003b824dd7d 21
bwang 11:dccbaa9274c5 22 float deriv = _last_in - in;
bwang 11:dccbaa9274c5 23 _last_in = in;
bwang 11:dccbaa9274c5 24 float tmp = _ki * _integral + _kp * error + _kd * deriv;
nki 25:0003b824dd7d 25
bwang 11:dccbaa9274c5 26 if (tmp > _out_max) tmp = _out_max;
bwang 11:dccbaa9274c5 27 if (tmp < _out_min) tmp = _out_min;
nki 25:0003b824dd7d 28
bwang 11:dccbaa9274c5 29 return tmp;
bwang 11:dccbaa9274c5 30 }