motor_run.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #include "foc_algorithm.h"
  2. #include "speed_pid.h"
  3. FOC_INTERFACE_STATES_DEF FOC_Interface_states;
  4. FOC_INPUT_DEF FOC_Input;
  5. FOC_OUTPUT_DEF FOC_Output;
  6. RT_MODEL rtM_;
  7. RT_MODEL *const rtM = &rtM_;
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. extern void stm32_ekf_Start_wrapper(real_T *xD);
  12. extern void stm32_ekf_Outputs_wrapper(const real32_T *u,
  13. real32_T *y,
  14. const real_T *xD);
  15. extern void stm32_ekf_Update_wrapper(const real32_T *u,
  16. real32_T *y,
  17. real_T *xD);
  18. extern void stm32_ekf_Terminate_wrapper(real_T *xD);
  19. #ifdef __cplusplus
  20. }
  21. #endif
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. extern void L_identification_Start_wrapper(real_T *xD);
  26. extern void L_identification_Outputs_wrapper(const real32_T *u,
  27. real32_T *y,
  28. const real_T *xD);
  29. extern void L_identification_Update_wrapper(const real32_T *u,
  30. real32_T *y,
  31. real_T *xD);
  32. extern void L_identification_Terminate_wrapper(real_T *xD);
  33. #ifdef __cplusplus
  34. }
  35. #endif
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39. extern void R_flux_identification_Start_wrapper(real_T *xD);
  40. extern void R_flux_identification_Outputs_wrapper(const real32_T *u,
  41. real32_T *y,
  42. const real_T *xD);
  43. extern void R_flux_identification_Update_wrapper(const real32_T *u,
  44. real32_T *y,
  45. real_T *xD);
  46. extern void R_flux_identification_Terminate_wrapper(real_T *xD);
  47. #ifdef __cplusplus
  48. }
  49. #endif
  50. static CURRENT_ABC_DEF Current_Iabc;
  51. static CURRENT_ALPHA_BETA_DEF Current_Ialpha_beta;
  52. static VOLTAGE_ALPHA_BETA_DEF Voltage_Alpha_Beta;
  53. static TRANSF_COS_SIN_DEF Transf_Cos_Sin;
  54. static CURRENT_DQ_DEF Current_Idq;
  55. static VOLTAGE_DQ_DEF Voltage_DQ;
  56. static CURRENT_PID_DEF Current_D_PID;
  57. static CURRENT_PID_DEF Current_Q_PID;
  58. FOC_INPUT_DEF* get_foc_input(void)
  59. {
  60. return &FOC_Input;
  61. }
  62. FOC_OUTPUT_DEF* get_foc_ouput(void)
  63. {
  64. return &FOC_Output;
  65. }
  66. CURRENT_PID_DEF* get_currd_pid(void)
  67. {
  68. return &Current_D_PID;
  69. }
  70. CURRENT_PID_DEF* get_currq_pid(void)
  71. {
  72. return &Current_Q_PID;
  73. }
  74. CURRENT_DQ_DEF* get_curr_dq(void)
  75. {
  76. return &Current_Idq;
  77. }
  78. /***************************************
  79. * FOC算法初始化
  80. * 功能:初始化FOC算法相关参数
  81. * 描述:包括PID参数、EKF和参数识别模块的初始化
  82. ***************************************/
  83. void foc_algorithm_initialize(void)
  84. {
  85. // 初始化电流PID控制器参数
  86. {
  87. Current_D_PID.P_Gain = D_PI_P;
  88. Current_D_PID.I_Gain = D_PI_I;
  89. Current_D_PID.B_Gain = D_PI_KB;
  90. Current_D_PID.Max_Output = D_PI_UP_LIMIT;
  91. Current_D_PID.Min_Output = D_PI_LOW_LIMIT;
  92. Current_D_PID.I_Sum = 0.0f;
  93. Current_Q_PID.P_Gain = Q_PI_P;
  94. Current_Q_PID.I_Gain = Q_PI_I;
  95. Current_Q_PID.B_Gain = Q_PI_KB;
  96. Current_Q_PID.Max_Output = Q_PI_UP_LIMIT;
  97. Current_Q_PID.Min_Output = Q_PI_LOW_LIMIT;
  98. Current_Q_PID.I_Sum = 0.0f;
  99. }
  100. // 初始化速度PID控制器
  101. speed_pid_initialize(); // 速度PID初始化
  102. // 初始化EKF
  103. stm32_ekf_Start_wrapper(&FOC_Interface_states.EKF_States[0]);// EKF初始化
  104. // 初始化电感识别模块
  105. L_identification_Start_wrapper(&FOC_Interface_states.L_Ident_States);// 电感识别初始化
  106. // 初始化电阻和磁链识别模块
  107. R_flux_identification_Start_wrapper(&FOC_Interface_states.R_flux_Ident_States);// 电阻和磁链识别初始化
  108. // 初始化EKF状态
  109. {
  110. real_T initVector[4] = { 0, 0, 0, 0 };
  111. {
  112. int_T i1;
  113. real_T *dw_DSTATE = &FOC_Interface_states.EKF_States[0];
  114. for (i1=0; i1 < 4; i1++) {
  115. dw_DSTATE[i1] = initVector[i1];
  116. }
  117. }
  118. }
  119. // 初始化电感识别状态
  120. {
  121. real_T initVector[1] = { 0 };
  122. {
  123. int_T i1;
  124. for (i1=0; i1 < 1; i1++) {
  125. FOC_Interface_states.L_Ident_States = initVector[0];
  126. }
  127. }
  128. }
  129. // 初始化电阻和磁链识别状态
  130. {
  131. real_T initVector[1] = { 0 };
  132. {
  133. int_T i1;
  134. for (i1=0; i1 < 1; i1++) {
  135. FOC_Interface_states.R_flux_Ident_States = initVector[0];
  136. }
  137. }
  138. }
  139. }
  140. /***************************************
  141. * FOC算法主函数
  142. * 功能:执行完整的FOC控制算法
  143. * 描述:包括坐标变换、电流控制、SVPWM计算和参数识别
  144. ***************************************/
  145. void motor_ekf_closeloop_run(void)
  146. {
  147. // 1. 读取三相电流
  148. Current_Iabc.Ia = FOC_Input.ia; // 读取A相电流
  149. Current_Iabc.Ib = FOC_Input.ib; // 读取B相电流
  150. Current_Iabc.Ic = FOC_Input.ic; // 读取C相电流
  151. // 2. 坐标变换
  152. Clarke_Transf(Current_Iabc,&Current_Ialpha_beta); // Clarke变换:三相到两相静止
  153. Angle_To_Cos_Sin(FOC_Input.theta,&Transf_Cos_Sin); // 计算角度的余弦和正弦值
  154. Park_Transf(Current_Ialpha_beta,Transf_Cos_Sin,&Current_Idq); // Park变换:两相静止到两相旋转
  155. // 3. 电流PID控制
  156. Current_PID_Calc(FOC_Input.Id_ref,Current_Idq.Id,&Voltage_DQ.Vd,&Current_D_PID); // D轴电流PID控制
  157. Current_PID_Calc(FOC_Input.Iq_ref,Current_Idq.Iq,&Voltage_DQ.Vq,&Current_Q_PID); // Q轴电流PID控制
  158. // 4. 反Park变换
  159. Rev_Park_Transf(Voltage_DQ,Transf_Cos_Sin,&Voltage_Alpha_Beta); // 反Park变换:两相旋转到两相静止
  160. // 5. 准备EKF输入数据
  161. FOC_Interface_states.EKF_Interface[0] = Voltage_Alpha_Beta.Valpha; // Alpha轴电压
  162. FOC_Interface_states.EKF_Interface[1] = Voltage_Alpha_Beta.Vbeta; // Beta轴电压
  163. FOC_Interface_states.EKF_Interface[2] = Current_Ialpha_beta.Ialpha; // Alpha轴电流
  164. FOC_Interface_states.EKF_Interface[3] = Current_Ialpha_beta.Ibeta; // Beta轴电流
  165. FOC_Interface_states.EKF_Interface[4] = FOC_Input.Rs; // 定子电阻
  166. FOC_Interface_states.EKF_Interface[5] = FOC_Input.Ls; // 定子电感
  167. FOC_Interface_states.EKF_Interface[6] = FOC_Input.flux; // 磁链
  168. // 6. 执行EKF输出计算
  169. stm32_ekf_Outputs_wrapper(&FOC_Interface_states.EKF_Interface[0], &FOC_Output.EKF[0],
  170. &FOC_Interface_states.EKF_States[0]);
  171. // 7. 准备电阻和磁链识别输入数据
  172. FOC_Interface_states.R_flux_Ident_Interface[0] = Current_Idq.Iq; // Q轴电流
  173. FOC_Interface_states.R_flux_Ident_Interface[1] = FOC_Input.speed_fdk; // 电机转速
  174. FOC_Interface_states.R_flux_Ident_Interface[2] = Voltage_DQ.Vq; // Q轴电压
  175. // 8. 准备电感识别输入数据
  176. FOC_Interface_states.L_Ident_Interface[0] = -(Current_Idq.Iq * FOC_Input.speed_fdk); // 计算电感识别输入
  177. FOC_Interface_states.L_Ident_Interface[1] = Voltage_DQ.Vd; // D轴电压
  178. // 9. 执行电感识别
  179. L_identification_Outputs_wrapper(&FOC_Interface_states.L_Ident_Interface[0],
  180. &FOC_Interface_states.L_Ident_Output, &FOC_Interface_states.L_Ident_States);
  181. // 10. 执行电阻和磁链识别
  182. R_flux_identification_Outputs_wrapper(&FOC_Interface_states.R_flux_Ident_Interface[0],
  183. &FOC_Interface_states.R_flux_Ident_Output[0], &FOC_Interface_states.R_flux_Ident_States);
  184. // 11. 计算SVPWM占空比
  185. SVPWM_Calc(Voltage_Alpha_Beta,FOC_Input.Udc,FOC_Input.Tpwm); // SVPWM计算
  186. // 12. 更新EKF状态
  187. stm32_ekf_Update_wrapper(&FOC_Interface_states.EKF_Interface[0], &FOC_Output.EKF[0],
  188. &FOC_Interface_states.EKF_States[0]);
  189. // 13. 更新电感识别状态
  190. L_identification_Update_wrapper(&FOC_Interface_states.L_Ident_Interface[0],
  191. &FOC_Interface_states.L_Ident_Output, &FOC_Interface_states.L_Ident_States);
  192. // 14. 更新电阻和磁链识别状态
  193. R_flux_identification_Update_wrapper(&FOC_Interface_states.R_flux_Ident_Interface[0],
  194. &FOC_Interface_states.R_flux_Ident_Output[0], &FOC_Interface_states.R_flux_Ident_States);
  195. // 15. 更新输出参数
  196. FOC_Output.L_RF[0] = FOC_Interface_states.L_Ident_Output; // 识别的电感
  197. FOC_Output.L_RF[1] = FOC_Interface_states.R_flux_Ident_Output[0]; // 识别的电阻
  198. FOC_Output.L_RF[2] = FOC_Interface_states.R_flux_Ident_Output[1]; // 识别的磁链
  199. }
  200. void motor_hall_close_run(void)
  201. {
  202. }
  203. void motor_foc_openloop_run(void)
  204. {
  205. // 1. 读取三相电流
  206. Current_Iabc.Ia = FOC_Input.ia; // 读取A相电流
  207. Current_Iabc.Ib = FOC_Input.ib; // 读取B相电流
  208. Current_Iabc.Ic = FOC_Input.ic; // 读取C相电流
  209. // 2. 坐标变换
  210. Clarke_Transf(Current_Iabc,&Current_Ialpha_beta); // Clarke变换:三相到两相静止
  211. Angle_To_Cos_Sin(FOC_Input.theta,&Transf_Cos_Sin); // 计算角度的余弦和正弦值
  212. Park_Transf(Current_Ialpha_beta,Transf_Cos_Sin,&Current_Idq); // Park变换:两相静止到两相旋转
  213. // 3. 电流PID控制
  214. Current_PID_Calc(FOC_Input.Id_ref,Current_Idq.Id,&Voltage_DQ.Vd,&Current_D_PID); // D轴电流PID控制
  215. Current_PID_Calc(FOC_Input.Iq_ref,Current_Idq.Iq,&Voltage_DQ.Vq,&Current_Q_PID); // Q轴电流PID控制
  216. // 4. 反Park变换
  217. Rev_Park_Transf(Voltage_DQ,Transf_Cos_Sin,&Voltage_Alpha_Beta); // 反Park变换:两相旋转到两相静止
  218. SVPWM_Calc(Voltage_Alpha_Beta,FOC_Input.Udc,FOC_Input.Tpwm); // SVPWM计算
  219. }