|
|
@@ -210,23 +210,34 @@ void motor_mpta_fw_lookup(float rpm, float torque, DQ_t *dq_out) {
|
|
|
#else
|
|
|
void motor_mpta_fw_lookup(float rpm, float torque, DQ_t *dq_out) {
|
|
|
float d = 0;
|
|
|
-#if 0
|
|
|
- if (rpm < 50) {
|
|
|
- d = 0;
|
|
|
- }else if (rpm < 100) {
|
|
|
- d = -2;
|
|
|
- }else if (rpm < 500) {
|
|
|
- d = -6;
|
|
|
- }else if (rpm < 1000) {
|
|
|
- d = -12;
|
|
|
- }else if (rpm < 1600) {
|
|
|
- d = -16;
|
|
|
+ float q = 0;
|
|
|
+#if defined(CONFIG_MOT_ADV_ANGLE)
|
|
|
+ if (torque != 0) {
|
|
|
+ float advanced_angle = CONFIG_MOT_ADV_ANGLE;
|
|
|
+ float s, c;
|
|
|
+ SinCos_Lut(advanced_angle + 90.0f, &s, &c);
|
|
|
+ d = ABS(torque) * c;
|
|
|
+ d = fclamp(d, -mc_conf()->m.max_fw_id, mc_conf()->m.max_fw_id);
|
|
|
+ q = sqrtf(SQ(torque) - SQ(d));
|
|
|
+ if (torque < 0) {
|
|
|
+ q = -q;
|
|
|
+ }
|
|
|
}else {
|
|
|
- d = -20;
|
|
|
+ if (ABS(rpm) < 1000) {
|
|
|
+ d = 0;
|
|
|
+ }else if (ABS(rpm) < 3000) {
|
|
|
+ d = -5;
|
|
|
+ }else if (ABS(rpm) < 5000) {
|
|
|
+ d = -10;
|
|
|
+ }else {
|
|
|
+ d = -20;
|
|
|
+ }
|
|
|
}
|
|
|
+#else
|
|
|
+ q = torque;
|
|
|
#endif
|
|
|
- dq_out->d = d;
|
|
|
- dq_out->q = torque;
|
|
|
+ step_towards(&dq_out->d, d, 1.0f);
|
|
|
+ step_towards(&dq_out->q, q, 0.7f);
|
|
|
}
|
|
|
|
|
|
#endif
|