MC_FOC_Driver.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. #include "my_obs.h"
  10. #define FluxWeak_Control 0
  11. //全局变量定义
  12. int32_t IqFdbFlt = 0;
  13. int32_t IdFdbFlt = 0;
  14. int32_t VoltSquareFlt = 0;
  15. int32_t UqVoltFlt = 0;
  16. int32_t UdVoltFlt = 0;
  17. uint8_t ShiftOBS_Flag = 0;
  18. //正常电流环
  19. void FOC_Model(int16_t IqRef, int16_t IdRef, int16_t MotorSpeed, uint16_t SVM_Angle, TrueOrFalse_Flag_Struct_t OBS_Flag)
  20. {
  21. int32_t UqVoltTmp;
  22. int16_t UdVoltTmp;
  23. static int16_t IqFdb = 0;
  24. static int16_t IdFdb = 0;
  25. #if FluxWeak_Control
  26. int32_t VoltSquare = 0; //弱磁控制预留
  27. int32_t VoltMax = 0;
  28. #endif
  29. static int32_t IdFluxLessRef = 0, IqFluxLessRef = 0;
  30. int32_t UqCal = 0;
  31. static int32_t FOC_IqLim = 0;
  32. static uint32_t Angle_Ref = 0;
  33. Curr_Components Stat_Curr_a_b; // Stator currents Ia,Ib
  34. Curr_Components Stat_Curr_alfa_beta; // Ialpha & Ibeta, Clarke's transformations of Ia & Ib
  35. Volt_Components Stat_Volt_alfa_beta; // Valpha & Vbeta, RevPark transformations of Vq & Vd
  36. /**********STARTS THE VECTOR CONTROL *********************** */
  37. Stat_Curr_a_b = SVPWM_3ShuntGetPhaseCurrentValues(); //读取2相的电流值
  38. Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b); // 得到Ialpha和Ibeta,Clark变换
  39. if(OBS_Flag == True)
  40. {
  41. switch(ShiftOBS_Flag)
  42. {
  43. case 0:default://初始状态,采用霍尔电角度
  44. {
  45. Angle_Ref = SVM_Angle;
  46. if(MC_RunInfo.MotorSpeed > 200) //高速时开始切换观测器电角度
  47. {
  48. if((int32_t)((observer_stObsOutPu.uwElecThetaPu << 1) - SVM_Angle) > 1000)
  49. ShiftOBS_Flag = 1; //速度超过200rpm后,开始切换
  50. }
  51. break;
  52. }
  53. case 1:
  54. {
  55. Angle_Ref += 100;
  56. if(Angle_Ref >= (observer_stObsOutPu.uwElecThetaPu << 1))
  57. ShiftOBS_Flag = 2; //切换完成
  58. break;
  59. }
  60. case 2:
  61. {
  62. Angle_Ref = (observer_stObsOutPu.uwElecThetaPu << 1);
  63. break;
  64. }
  65. }
  66. }
  67. else
  68. {
  69. ShiftOBS_Flag = 0;
  70. Angle_Ref = SVM_Angle;
  71. }
  72. Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, Angle_Ref); // Stat_Curr_q_d为当前的Id和Iq值//SVM_Angle // 给定值为 Stat_Curr_q_d_ref_ref
  73. IqFdbFlt += (((int32_t)(Stat_Curr_q_d.qI_Component1 << 10)) - IqFdbFlt)>>10; // KFlt = 2ms
  74. IqFdb = IqFdbFlt >> 10;
  75. IdFdbFlt += (((int32_t)(Stat_Curr_q_d.qI_Component2 << 10)) - IdFdbFlt)>>10; // KFlt = 2ms
  76. IdFdb = IdFdbFlt >> 10;
  77. if((MC_HallSensorData.BackwardFlag==True)&&(MC_CalParam.AssistRunMode == MC_AssistRunMode_GAS))
  78. {
  79. if( ADC1_Result[ADC1_RANK_VIN] < 3000) //53853mV 17.951 3000
  80. {
  81. IqFluxLessRef = IqRef;
  82. if(IdFluxLessRef<(-4))
  83. {
  84. IdFluxLessRef += 4;
  85. }
  86. else IdFluxLessRef = 0;
  87. }
  88. else if( ADC1_Result[ADC1_RANK_VIN] < 3210 ) //57622mV 3210
  89. {
  90. FOC_IqLim = 1050 - (ADC1_Result[ADC1_RANK_VIN] - 3000)*5;
  91. IqFluxLessRef = IqRef<FOC_IqLim ? IqRef : FOC_IqLim;
  92. IdFluxLessRef -= 2;
  93. if(IdFluxLessRef<-420) IdFluxLessRef = -420;
  94. }
  95. else
  96. {
  97. IqFluxLessRef=0;
  98. IdFluxLessRef = -420;
  99. }
  100. }
  101. else
  102. {
  103. if( ADC1_Result[ADC1_RANK_VIN] < 3100) //55648mV 17.951 3100
  104. {
  105. IqFluxLessRef = IqRef;
  106. if(IdFluxLessRef<(-4))
  107. {
  108. IdFluxLessRef += 4;
  109. }
  110. else IdFluxLessRef = 0;
  111. }
  112. else if( ADC1_Result[ADC1_RANK_VIN] < 3310 ) //59417mV 3310
  113. {
  114. FOC_IqLim = 1050 - (ADC1_Result[ADC1_RANK_VIN] - 3100)*5;
  115. IqFluxLessRef = IqRef<FOC_IqLim ? IqRef : FOC_IqLim;
  116. IdFluxLessRef -= 2;
  117. if(IdFluxLessRef<-420) IdFluxLessRef = -420;
  118. }
  119. else
  120. {
  121. IqFluxLessRef=0;
  122. IdFluxLessRef = -420;
  123. }
  124. }
  125. UqVoltTmp = PID_Regulator(IqFluxLessRef,\
  126. IqFdb,\
  127. &PID_Torque_InitStructure); // 电流闭环输出q轴电压
  128. UqVoltFlt += ((UqVoltTmp << 9) - UqVoltFlt) >> 3;
  129. /*
  130. UqCal = DbSpdMotor*VMax*0.7/1020
  131. = DbSpdMotor*VMax/(1020/0.7)
  132. = DbSpdMotor*VMax/1020
  133. */
  134. #if 1 //加入前馈
  135. uint16_t Cal_K;
  136. Cal_K = (MC_MotorParam.Rate_Speed * 183) >> 7; //电机转速 * 1.43
  137. UqCal = ((int32_t)MotorSpeed * MAX_MODULE) / ((Cal_K < 1000) ? 1000 : Cal_K);
  138. UqVoltTmp = UqCal + (UqVoltFlt >> 9);
  139. #else //去掉前馈
  140. UqVoltTmp = UqVoltFlt >> 9;
  141. #endif
  142. UqVoltTmp = (UqVoltTmp > ((int32_t)MAX_MODULE)) ? MAX_MODULE : UqVoltTmp;
  143. Stat_Volt_q_d.qV_Component1 = UqVoltTmp;
  144. if(IqRef == 0)
  145. {
  146. Stat_Volt_q_d.qV_Component1 = 0;
  147. IdFluxLessRef = IdRef;
  148. }
  149. UdVoltTmp = PID_Regulator(IdFluxLessRef,\
  150. IdFdb,\
  151. &PID_Flux_InitStructure); // 电流闭环输出d轴电压
  152. UdVoltFlt += ((UdVoltTmp << 9) - UdVoltFlt) >> 3;
  153. Stat_Volt_q_d.qV_Component2 = UdVoltFlt >> 9;
  154. //circle limitation
  155. RevPark_Circle_Limitation(&Stat_Volt_q_d); // 电压极限圈限制? 会不会出现波动情况?
  156. /*Performs the Reverse Park transformation,
  157. i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
  158. stationary reference frame*/
  159. Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
  160. /*Valpha and Vbeta finally drive the power stage*/
  161. SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta); //实际的电流输出控制
  162. //OBS Calculate
  163. my_ObsCal(Stat_Volt_alfa_beta.qV_Component2 * (MC_RunInfo.BusVoltage * 577 / 100000) / 32767,
  164. Stat_Volt_alfa_beta.qV_Component1 * (MC_RunInfo.BusVoltage * 577 / 100000) / 32767,
  165. Stat_Curr_alfa_beta.qI_Component1 * 1100 / 2048,
  166. Stat_Curr_alfa_beta.qI_Component2 * 1100 / 2048,
  167. MC_RunInfo.BusVoltage / 100,
  168. &observer_stObsOutPu);
  169. }
  170. void FOC_Enable(void)
  171. {
  172. FOC_Status = FOC_Status_RUN;
  173. }
  174. void FOC_Disable(void)
  175. {
  176. FOC_Status = FOC_Status_WAIT;
  177. Stat_Curr_q_d.qI_Component1 = 0;
  178. Stat_Curr_q_d.qI_Component2 = 0;
  179. Stat_Volt_q_d.qV_Component1 = 0;
  180. Stat_Volt_q_d.qV_Component2 = 0;
  181. }