|
|
@@ -1,6 +1,8 @@
|
|
|
#include "e_ctrl.h"
|
|
|
#include "foc/foc_config.h"
|
|
|
#include "math/fix_math.h"
|
|
|
+#include "foc/core/PMSM_FOC_Core.h"
|
|
|
+
|
|
|
#include "libs/logger.h"
|
|
|
|
|
|
e_Ctrl g_eCtrl;
|
|
|
@@ -8,24 +10,26 @@ static void _eCtrl_set_TgtCurrent(float c);
|
|
|
static void _eCtrl_set_TgtSpeed(float s);
|
|
|
static void _eCtrl_set_TgtTorque(float t);
|
|
|
|
|
|
-void eCtrl_init(u16 ebrk_time, u16 accl_time){
|
|
|
- g_eCtrl.ebrk_time = ebrk_time;
|
|
|
+void eCtrl_init(u16 accl_time, u16 dec_time){
|
|
|
+ g_eCtrl.dec_time = dec_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;
|
|
|
+ if (g_eCtrl.dec_time == 0) {
|
|
|
+ g_eCtrl.dec_time = DEFAULT_D_TIME;
|
|
|
}
|
|
|
+ g_eCtrl.ebrk_time = 2;
|
|
|
+
|
|
|
g_eCtrl.ebrk_shadow = g_eCtrl.ebrk_time;
|
|
|
g_eCtrl.accl_shadow = g_eCtrl.accl_time;
|
|
|
-
|
|
|
+ g_eCtrl.dec_shadow = g_eCtrl.dec_time;
|
|
|
eRamp_init(&g_eCtrl.current);
|
|
|
eRamp_init(&g_eCtrl.speed);
|
|
|
+ eRamp_init(&g_eCtrl.torque);
|
|
|
}
|
|
|
|
|
|
-void eCtrl_set_accl_brk(u16 accl_time, u16 ebrk_time) {
|
|
|
- g_eCtrl.accl_shadow = accl_time;
|
|
|
+void eCtrl_set_ebrk_time(u16 ebrk_time) {
|
|
|
g_eCtrl.ebrk_shadow = ebrk_time;
|
|
|
}
|
|
|
|
|
|
@@ -42,10 +46,31 @@ void eCtrl_set_TgtSpeed(float s) {
|
|
|
g_eCtrl.speed_shadow = s;
|
|
|
}
|
|
|
|
|
|
+void eCtrl_enable_eBrake(bool enable) {
|
|
|
+ if (enable && PMSM_FOC_GetSpeed() > 1000.0f) {
|
|
|
+ g_eCtrl.is_ebrake_shadow = true;
|
|
|
+ }else if (!enable){
|
|
|
+ g_eCtrl.is_ebrake_shadow = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void _eCtrl_process_eBrake(void) {
|
|
|
+ if (g_eCtrl.is_ebrake) {
|
|
|
+ eRamp_init(&g_eCtrl.current);
|
|
|
+ eRamp_init(&g_eCtrl.speed);
|
|
|
+ eRamp_init(&g_eCtrl.torque);
|
|
|
+ PMSM_FOC_SetCtrlMode(CTRL_MODE_CURRENT_BRK);
|
|
|
+ eCtrl_set_TgtCurrent(-2.0f);
|
|
|
+ }else {
|
|
|
+ PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void eCtrl_Running(void) {
|
|
|
bool etime_changed = false;
|
|
|
- if (g_eCtrl.accl_shadow != g_eCtrl.accl_time || g_eCtrl.ebrk_shadow != g_eCtrl.ebrk_time) {
|
|
|
- g_eCtrl.ebrk_time = g_eCtrl.ebrk_shadow;
|
|
|
+ if (g_eCtrl.accl_shadow != g_eCtrl.accl_time || g_eCtrl.dec_shadow != g_eCtrl.dec_time) {
|
|
|
+ g_eCtrl.dec_time = g_eCtrl.dec_shadow;
|
|
|
g_eCtrl.accl_time = g_eCtrl.accl_shadow;
|
|
|
etime_changed = true;
|
|
|
}
|
|
|
@@ -57,7 +82,11 @@ void eCtrl_Running(void) {
|
|
|
}
|
|
|
if (g_eCtrl.torque_shadow != g_eCtrl.torque.target || etime_changed) {
|
|
|
_eCtrl_set_TgtTorque(g_eCtrl.torque_shadow);
|
|
|
- }
|
|
|
+ }
|
|
|
+ if (g_eCtrl.is_ebrake_shadow != g_eCtrl.is_ebrake) {
|
|
|
+ g_eCtrl.is_ebrake = g_eCtrl.is_ebrake_shadow;
|
|
|
+ _eCtrl_process_eBrake();
|
|
|
+ }
|
|
|
eRamp_running(&g_eCtrl.current);
|
|
|
eRamp_running(&g_eCtrl.speed);
|
|
|
eRamp_running(&g_eCtrl.torque);
|
|
|
@@ -78,7 +107,7 @@ static void _eCtrl_set_target(e_Ramp *ramp, float c) {
|
|
|
step_val = MIN_S16Q5;
|
|
|
}
|
|
|
}else if (sign < 0) {
|
|
|
- step_val = (c_now - c)/(g_eCtrl.ebrk_time/step_ms);
|
|
|
+ step_val = (c_now - c)/(g_eCtrl.dec_time/step_ms);
|
|
|
if (step_val < MIN_S16Q5) {
|
|
|
step_val = MIN_S16Q5;
|
|
|
}
|
|
|
@@ -86,8 +115,8 @@ static void _eCtrl_set_target(e_Ramp *ramp, float c) {
|
|
|
}
|
|
|
eRamp_set_target(ramp, c);
|
|
|
eRamp_set_step(ramp, step_val);
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
static void _eCtrl_set_TgtCurrent(float c) {
|
|
|
_eCtrl_set_target(&g_eCtrl.current, c);
|
|
|
}
|