F_Calc.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "os/os_types.h"
  2. #include "foc/core/PMSM_FOC_Core.h"
  3. #include "libs/logger.h"
  4. #include "math/fast_math.h"
  5. #include "foc/mc_config.h"
  6. static float F_Te = 0.0f; //电磁转矩生成的力
  7. static float F_Air = 0.0f; //空气阻力
  8. static float F_accl = 0.0f; //加速阻力
  9. static float mot_vel = 0.0f; //公里每小时
  10. static float mot_accl = 0.0f; //加速度 m/ss
  11. static float C = 1.4f; //轮子周长
  12. static float gear_ratio = 6.5f; //传动比
  13. static float M = 190.0f; //190公斤
  14. static bool _init = false;
  15. void F_all_Calc(void) {
  16. if (!_init) {
  17. _init = true;
  18. C = (float)mc_conf()->m.wheel_c / 100.0f;
  19. M = (float)mc_conf()->m.vehicle_w;
  20. gear_ratio = (float)mc_conf()->m.gear_ratio;
  21. }
  22. float kmph = PMSM_FOC_GetSpeed() / gear_ratio * C * 60.0f / 1000.0f;
  23. if (mot_vel == 0.0f) {
  24. mot_vel = kmph;
  25. mot_accl = 0.0f;
  26. F_Air = 0.0f;
  27. F_accl = 0.0f;
  28. return;
  29. }
  30. float delta_mph = (kmph - mot_vel) * 1000.0f / 3600.0f;
  31. float diff = delta_mph / (CONFIG_SPD_CTRL_MS / 1000.0f);
  32. LowPass_Filter(mot_accl, diff, 0.01f);
  33. F_accl = M * mot_accl;
  34. F_Air = SQ(kmph) * 0.02f;
  35. PMSM_FOC_Ctrl *foc = PMSM_FOC_Get();
  36. F_Te = 1.5f * foc->params.n_poles * (foc->params.flux * foc->out.s_RealIdq.q +
  37. (foc->params.ld - foc->params.lq) * foc->out.s_RealIdq.q * foc->out.s_RealIdq.d) * gear_ratio / (C / (2 * PI));
  38. mot_vel = kmph;
  39. }
  40. float F_get_Te(void) {
  41. return F_Te;
  42. }
  43. float F_get_accl(void) {
  44. return F_accl;
  45. }
  46. float F_get_air(void) {
  47. return F_Air;
  48. }
  49. float F_get_MotAccl(void) {
  50. return mot_accl;
  51. }
  52. void F_debug(void) {
  53. sys_debug("F: %f, %f, %f, %f, %f\n", F_Te, F_Air, F_accl, mot_vel, mot_accl);
  54. sys_debug("Vel: %f, %f, %f\n", C, M, gear_ratio);
  55. }