| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #include "e_ctrl.h"
- #include "foc/foc_config.h"
- static e_Ctrl g_eCtrl;
- void eCtrl_init(u16 ebrk_time, u16 accl_time){
- g_eCtrl.ebrk_time = ebrk_time;
- g_eCtrl.accl_time = accl_time;
- if (g_eCtrl.accl_time == 0) {
- g_eCtrl.accl_time = DEFAULT_D_TIME;
- }
- if (g_eCtrl.ebrk_time == 0) {
- g_eCtrl.ebrk_time = DEFAULT_D_TIME;
- }
- ramp_ctrl_init(&g_eCtrl.torque_ramp);
- ramp_ctrl_init(&g_eCtrl.speed_ramp);
- ramp_set_points(&g_eCtrl.torque_ramp, THROTTLE_MIN_IDQ, THROTTLE_MIN_IDQ);
- ramp_set_step_value(&g_eCtrl.torque_ramp, TORQUE_STEP);
- ramp_set_points(&g_eCtrl.speed_ramp, THROTTLE_MIN_RPM, THROTTLE_MIN_RPM);
- ramp_set_step_value(&g_eCtrl.speed_ramp, SPEED_STEP);
- }
- void eCtrl_set_TrqCurrent(float c) {
- ramp_t *ramp = &g_eCtrl.torque_ramp;
- float c_now = ramp_get_interpolation(ramp);
- float step_val = TORQUE_STEP;
- int sign = 1;
- if (c < c_now) {
- sign = -1;
- }
- u32 step_count = 1;
- u32 step_ms = eCTRL_STEP_TS;
- if (sign > 0) { //增加扭矩
- step_count = (c - c_now)/TORQUE_STEP + 1;
- step_ms = g_eCtrl.accl_time / step_count;
- if (step_ms < eCTRL_STEP_TS) {
- step_ms = eCTRL_STEP_TS;
- step_val = (c - c_now)/(g_eCtrl.accl_time / step_ms);
- }
- }else if (sign < 0) {
- step_count = (c_now - c)/TORQUE_STEP + 1;
- step_ms = g_eCtrl.ebrk_time / step_count;
- if (step_ms < eCTRL_STEP_TS) {
- step_ms = eCTRL_STEP_TS;
- step_val = (c_now - c)/(g_eCtrl.ebrk_time / step_ms);
- }
- }
- ramp_set_step_value(ramp, sign * step_val);
- ramp_set_step_time(ramp, step_ms);
- ramp_set_target(ramp, c);
-
- ramp_exc(ramp);
- }
- void eCtrl_set_TargetSpeed(float s) {
- ramp_t *ramp = &g_eCtrl.speed_ramp;
- float s_now = ramp_get_interpolation(ramp);
- float step_val = SPEED_STEP;
- int sign = 1;
- if (s < s_now) {
- sign = -1;
- }
- u32 step_count = 1;
- u32 step_ms = eCTRL_STEP_TS;
- if (sign > 0) { //加速
- step_count = (s - s_now)/SPEED_STEP + 1;
- step_ms = g_eCtrl.accl_time / step_count;
- if (step_ms < eCTRL_STEP_TS) {
- step_ms = eCTRL_STEP_TS;
- step_val = (s - s_now)/(g_eCtrl.accl_time / step_ms);
- }
- }else if (sign < 0) {
- step_count = (s_now - s)/SPEED_STEP + 1;
- step_ms = g_eCtrl.ebrk_time / step_count;
- if (step_ms < eCTRL_STEP_TS) {
- step_ms = eCTRL_STEP_TS;
- step_val = (s_now - s)/(g_eCtrl.ebrk_time / step_ms);
- }
- }
- ramp_set_step_value(ramp, sign * step_val);
- ramp_set_step_time(ramp, step_ms);
- ramp_set_target(ramp, s);
-
- ramp_exc(ramp);
- }
- float eCtrl_get_RefSpd(void) {
- return ramp_get_interpolation(&g_eCtrl.speed_ramp);
- }
- float eCtrl_get_RefTorque(void) {
- return ramp_get_interpolation(&g_eCtrl.torque_ramp);
- }
- float eCtrl_get_FinalSpd(void) {
- return ramp_get_target(&g_eCtrl.speed_ramp);
- }
- float eCtrl_get_FinalTorque(void) {
- return ramp_get_target(&g_eCtrl.torque_ramp);
- }
- void eCtrl_brake_signal(bool hw_brake) {
- if (hw_brake != g_eCtrl.hw_brake) {
- g_eCtrl.hw_brake = hw_brake;
- if (hw_brake) {
- g_eCtrl.brake_ts = shark_get_mseconds();
- }
- }
-
- if (g_eCtrl.hw_brake) {
- float ebrk_torque = 0.0f;
- float ebrk_speed = 0.0f;
- if (shark_get_mseconds() - g_eCtrl.brake_ts >= eCTRL_Brake_TIME) {
- if (g_eCtrl.accl_time != DEFAULT_D_TIME) {
- ebrk_torque = eCTRL_NEG_TORQUE;
- }
- }
- eCtrl_set_TrqCurrent(ebrk_torque);
- eCtrl_set_TargetSpeed(ebrk_speed);
- }
- }
|