motor_run.c 9.3 KB

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