F_Calc.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "os/os_types.h"
  2. #include "foc/motor/motor.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 = mot_contrl_get_speed(&motor.controller) / 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. F_Te = 1.5f * mc_conf()->m.poles * (mc_conf()->m.flux * motor.controller.foc.out.curr_dq.q +
  36. (mc_conf()->m.ld - mc_conf()->m.lq) * motor.controller.foc.out.curr_dq.q * motor.controller.foc.out.curr_dq.d) * gear_ratio / (C / (2 * PI));
  37. mot_vel = kmph;
  38. }
  39. float F_get_Te(void) {
  40. return F_Te;
  41. }
  42. float F_get_accl(void) {
  43. return F_accl;
  44. }
  45. float F_get_air(void) {
  46. return F_Air;
  47. }
  48. float F_get_MotAccl(void) {
  49. return mot_accl;
  50. }
  51. void F_debug(void) {
  52. sys_debug("F: %f, %f, %f, %f, %f\n", F_Te, F_Air, F_accl, mot_vel, mot_accl);
  53. sys_debug("Vel: %f, %f, %f\n", C, M, gear_ratio);
  54. }