MC_FOC_Driver.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "MC_FOC_Driver.h"
  2. #include "MC_type.h"
  3. #include "MC_Globals.h"
  4. #include "MC_PID_regulators.h"
  5. #include "MC_Clarke_park.h"
  6. #include "stm32f10x_svpwm_3shunt.h"
  7. #include "hall_sensor.h"
  8. #include "motor_control.h"
  9. #define FluxWeak_Control 0
  10. //全局变量定义
  11. int32_t IqFluxLessRef = 0;
  12. int32_t IdFluxLessRef = 0;
  13. int32_t IqFdbFlt = 0;
  14. int32_t IdFdbFlt = 0;
  15. int32_t VoltSquareFlt = 0;
  16. int32_t UqVoltFlt = 0;
  17. int32_t UdVoltFlt = 0;
  18. void FOC_Model(int16_t Ref, int16_t MotorSpeed, uint16_t SVM_Angle) //电流环处理函数,严格按照框图理解
  19. {
  20. int32_t UqVoltTmp;
  21. int16_t UdVoltTmp;
  22. static int16_t IqFdb = 0;
  23. static int16_t IdFdb = 0;
  24. #if FluxWeak_Control
  25. int32_t VoltSquare = 0; //弱磁控制预留
  26. int32_t VoltMax = 0;
  27. #endif
  28. int32_t UqCal = 0;
  29. static int32_t FOC_IqLim = 0;
  30. Curr_Components Stat_Curr_a_b; // Stator currents Ia,Ib
  31. Curr_Components Stat_Curr_alfa_beta; // Ialpha & Ibeta, Clarke's transformations of Ia & Ib
  32. Volt_Components Stat_Volt_alfa_beta; // Valpha & Vbeta, RevPark transformations of Vq & Vd
  33. /**********STARTS THE VECTOR CONTROL *********************** */
  34. Stat_Curr_a_b = SVPWM_3ShuntGetPhaseCurrentValues(); //读取2相的电流值
  35. Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b); // 得到Ialpha和Ibeta,Clark变换
  36. Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, SVM_Angle); // Stat_Curr_q_d为当前的Id和Iq值//SVM_Angle
  37. // 给定值为 Stat_Curr_q_d_ref_ref
  38. IqFdbFlt += (((int32_t)(Stat_Curr_q_d.qI_Component1 << 10)) - IqFdbFlt)>>10; // KFlt = 2ms
  39. IqFdb = IqFdbFlt >> 10;
  40. IdFdbFlt += (((int32_t)(Stat_Curr_q_d.qI_Component2 << 10)) - IdFdbFlt)>>10; // KFlt = 2ms
  41. IdFdb = IdFdbFlt >> 10;
  42. if((MC_HallSensorData.BackwardFlag == TRUE) && (MC_CalParam.AssistRunMode == MC_AssistRunMode_GAS))
  43. {
  44. if( ADC1_Result[ADC1_RANK_VIN] < 3000) //53853mV 17.951 3000
  45. {
  46. IqFluxLessRef = Ref;
  47. if(IdFluxLessRef < (-4))
  48. {
  49. IdFluxLessRef += 4;
  50. }
  51. else IdFluxLessRef = 0;
  52. }
  53. else if( ADC1_Result[ADC1_RANK_VIN] < 3210 ) //57622mV 3210
  54. {
  55. FOC_IqLim = 1050 - (ADC1_Result[ADC1_RANK_VIN] - 3000) * 5;
  56. IqFluxLessRef = Ref < FOC_IqLim ? Ref : FOC_IqLim;
  57. IdFluxLessRef -= 2;
  58. if(IdFluxLessRef < -420) IdFluxLessRef = -420;
  59. }
  60. else
  61. {
  62. IqFluxLessRef = 0;
  63. IdFluxLessRef = -420;
  64. }
  65. }
  66. else
  67. {
  68. if( ADC1_Result[ADC1_RANK_VIN] < 3100) //55648mV 17.951 3100
  69. {
  70. IqFluxLessRef = Ref;
  71. if(IdFluxLessRef < (-4))
  72. {
  73. IdFluxLessRef += 4;
  74. }
  75. else IdFluxLessRef = 0;
  76. }
  77. else if( ADC1_Result[ADC1_RANK_VIN] < 3310 ) //59417mV 3310
  78. {
  79. FOC_IqLim = 1050 - (ADC1_Result[ADC1_RANK_VIN] - 3100) * 5;
  80. IqFluxLessRef = Ref < FOC_IqLim ? Ref : FOC_IqLim;
  81. IdFluxLessRef -= 2;
  82. if(IdFluxLessRef < -420) IdFluxLessRef = -420;
  83. }
  84. else
  85. {
  86. IqFluxLessRef = 0;
  87. IdFluxLessRef = -420;
  88. }
  89. }
  90. UqVoltTmp = PID_Regulator(IqFluxLessRef,\
  91. IqFdb,\
  92. &PID_Torque_InitStructure); // 电流闭环输出q轴电压
  93. UqVoltFlt += ((UqVoltTmp << 9) - UqVoltFlt) >> 3;
  94. /*
  95. UqCal = DbSpdMotor*VMax*0.7/1020
  96. = DbSpdMotor*VMax/(1020/0.7)
  97. = DbSpdMotor*VMax/1020
  98. */
  99. #if 1 //加入前馈
  100. uint16_t Cal_K;
  101. Cal_K = (MC_MotorParam.Rate_Speed * 183) >> 7; //电机转速 * 1.43
  102. UqCal = ((int32_t)MotorSpeed * MAX_MODULE) / ((Cal_K < 1000) ? 1000 : Cal_K);
  103. UqVoltTmp = UqCal + (UqVoltFlt >> 9);
  104. #else //去掉前馈
  105. UqVoltTmp = UqVoltFlt >> 9;
  106. #endif
  107. UqVoltTmp = (UqVoltTmp > ((int32_t)MAX_MODULE)) ? MAX_MODULE : UqVoltTmp;
  108. Stat_Volt_q_d.qV_Component1 = UqVoltTmp;
  109. UdVoltTmp = PID_Regulator(IdFluxLessRef,\
  110. IdFdb,\
  111. &PID_Flux_InitStructure); // 电流闭环输出d轴电压
  112. UdVoltFlt += ((UdVoltTmp << 9) - UdVoltFlt) >> 3;
  113. Stat_Volt_q_d.qV_Component2 = UdVoltFlt >> 9;
  114. //circle limitation
  115. RevPark_Circle_Limitation(&Stat_Volt_q_d); // 电压极限圈限制? 会不会出现波动情况?
  116. /*Performs the Reverse Park transformation,
  117. i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
  118. stationary reference frame*/
  119. Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
  120. /*Valpha and Vbeta finally drive the power stage*/
  121. SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta); //实际的电流输出控制
  122. }
  123. void FOC_Enable(void)
  124. {
  125. FOC_Status = FOC_Status_RUN;
  126. }
  127. void FOC_Disable(void)
  128. {
  129. FOC_Status = FOC_Status_WAIT;
  130. Stat_Curr_q_d.qI_Component1 = 0;
  131. Stat_Curr_q_d.qI_Component2 = 0;
  132. Stat_Volt_q_d.qV_Component1 = 0;
  133. Stat_Volt_q_d.qV_Component2 = 0;
  134. }