查看: 2361|回复: 0

[评测分享] 【灵动Motor-DK电机控制板】DK电机驱动的代码分析和运行

[复制链接]

该用户从未签到

发表于 2023-7-19 14:28:49 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 北方. 于 2023-7-19 16:03 编辑

DK电机驱动的代码分析和运行
1 DK开发板的原理分析
24V 电机驱动开发板系统方块图如下 Capture.PNG
这个回路是标准的三相电机控制回路,MCU控制双臂MOSFET驱动实现对BLDC的电机电流输出控制,反馈环节是读取电机端电压,相电流和中性点电流,这个图中没有包括Hall传感器的位置信号。如果包括就是3个电压,2个相电流,1个中性点电流和3个Hall传感器位置信号。
Capture.PNG
主要实现以下功能
  输入电压范围 : 12V~30V,MCU 电源使用 5V,支持有/无霍, 方波/弦波驱动,支持1/2/3 Shunt R 三相电流采样,BEMF 电压回授使用ADC 采样,DC Bus 电压, 总电流量测。
  在参数设定中,限制了最小电压为15V,这样DK开发板就有5V,12V,>15V三组电压轨,实现不同的功能。如果希望修改参数,需要在parameter.h这个文件中修改。
2 电机控制原理
  电机控制的原理相对复杂,这里以PMSM 矢量控制简述如下。  电机的驱动方程为,这个回路的直流电阻Rs通常较小,主要是由磁链的变化形成的感应电压为主,
Capture.PNG
  三相电压和旋转磁场相对应,形成一个正弦波的交变回路,计算中的集体效果电机显现为一个单向旋转的过程,这个过程用一个正交成90度的矢量电流合成表示。换言之,就是通过对三相交流的控制,实现一个单向旋转的单磁极过程,这个过程涉及了Clark变换和反Clark变化,就是用两组公式分别实现这个变换过程。具体可以参考灵动提供的文档。
  这个三相电机需要调速运行,也需要控制转矩和保护。这个就需要采集反馈信号量来确定当下的旋转速度,通过调整控制电压的增减来控制转速。矢量控制技术——称磁场定向控制(FOC),FOC 最基本的思想就是将定子电流解耦成一个控制磁场的电流分量和一个控制转矩的电流分量。经过解耦后,两个电流分量独立受控。
  无传感器的测量方式是分解反向电动势的方法,使用差分的方式,计算连续测量的反电动势分量,对应于采样时间差值的变量而形成的一个二元一次差分方程求解的方式进行位置计算,这个过程可以节省位置传感器,但是计算的过程需要克服采样的众多干扰和不确定因素,需要各种滤波和算法,提取最终的真实位置。
  传感器的方法比较直观,准确性高,但是安装方法比较复杂,也增大成本。这里是用了Hall传感器的方式,计量相对120度分布的3个传感器的位置信号。
Capture.PNG
这个位置信号是离散的信号组合如下,需要通过PWM插值补全时间
Capture.PNG

3 代码分析
  经过上述分析,在FOC范例代码中实现了这个过程。重要的函数如下,
Capture.PNG

  灵动用封装库的方式提供了电机控制数学库(MLIB)和电机控制数学库(MCFLIB),其中MLIB主要提供基础的计算,MCFLIB提供高层的滤波原理和Clark变换等,提供了使用手册可以查阅和使用。其他的电机控制逻辑完全开放,提供了充分的测试和使用机会,可以根据项目和对于电机的理解自行修改。  主函数是通过polling状态机模式来实现电机的控制。这个是一个低速旋转电机的控制loop。
  1. int main(void)
  2. {
  3.          /* Configure the system clock */
  4.     Systick_Init(SystemCoreClock / 1000);
  5.     Systick_Delay(200);
  6.          /* Initialize  motor control parameters */
  7.     Init_Parameter(&Motor_1st);
  8.          /* Initialize all GPIO */
  9.     Bsp_Gpio_Init();
  10.          /* Initialize all configured peripherals */
  11.     Peripheral_Init();
  12.          /* Initialize interrupts */
  13.     Interrupt_Init();
  14.          /* Infinite loop */
  15.     while(1)
  16.     {
  17.                          /*IWDG_ReloadCounter*/
  18.         IWDG_RELOAD_COUNT();
  19.         if(Motor_1st.USER.bSlowLoopFlag)
  20.         {
  21.             /* Slow Loop Statemachine */
  22.             s_STATE_SLOW[eM1_MainState]();
  23.             Motor_1st.USER.bSlowLoopFlag =  0;
  24.         }
  25.     }
  26. }
复制代码
状态机模式如下,
  1. typedef enum _m1_app_mainstate_t
  2. {
  3. MainState_Fault = 0,
  4. MainState_Init = 1,
  5. MainState_Stop = 2,
  6. MainState_Run = 3,
  7. } m1_app_mainstate_t; /* Main States */

  8. /*! @brief States of machine enumeration */
  9. typedef enum _m1_run_substate_t
  10. {
  11. RunState_Calib = 0,
  12. RunState_Ready = 1,
  13. RunState_Align = 2,
  14. RunState_Startup = 3,
  15. RunState_Spin = 4,
  16. RunState_Freewheel = 5,
  17. } m1_run_substate_t; /* Run sub-states */

  18. void M1_Fault_Fast(void);
  19. void M1_Init_Fast(void);
  20. void M1_Stop_Fast(void);
  21. void M1_Run_Fast(void);

  22. void M1_Fault_Slow(void);
  23. void M1_Init_Slow(void);
  24. void M1_Stop_Slow(void);
  25. void M1_Run_Slow(void);

  26. static void M1_SwitchFaultStop(void);
  27. static void M1_SwitchInitStop(void);
  28. static void M1_SwitchStopFault(void);
  29. static void M1_SwitchStopRun(void);
  30. static void M1_SwitchRunFault(void);
  31. //static void M1_SwitchRunStop(void);

  32. static void M1_RunCalibFast(void);
  33. static void M1_RunReadyFast(void);
  34. static void M1_RunAlignFast(void);
  35. static void M1_RunStartupFast(void);
  36. static void M1_RunSpinFast(void);
  37. static void M1_RunFreewheelFast(void);

  38. static void M1_RunCalibSlow(void);
  39. static void M1_RunReadySlow(void);
  40. static void M1_RunAlignSlow(void);
  41. static void M1_RunStartupSlow(void);
  42. static void M1_RunSpinSlow(void);
  43. static void M1_RunFreewheelSlow(void);

  44. static void M1_SwitchRunCalibReady(void);
  45. static void M1_SwitchRunReadyAlign(void);
  46. static void M1_SwitchRunAlignStartup(void);
  47. static void M1_SwitchRunAlignReady(void);
  48. static void M1_SwitchRunStartupSpin(void);
  49. static void M1_SwitchRunStartupFreewheel(void);
  50. static void M1_SwitchRunSpinFreewheel(void);
  51. static void M1_SwitchRunFreewheelReady(void);

  52. static void M1_FaultDetection(void);
  53. static void Fault_LED_Disp(void);

  54. static void PWM_Update(Motor_TypeDef *Motor);
复制代码
这个模块化的控制,提供了用户功能定义userfunction.c入口,可以自定义控制模式,控制方法就是直接设定状态机的参数,这里demo提供了参考的编写方式。
  那么,在正式运行代码的时候,这个最重要的parameter.h是需要仔细研究并根据电机的参数修订的。包括了控制电压范围,过压设定和低压设定,PWM采样频率等。

  1. #define SYS_REFV                                    5.0         //  unit:v      MCU VCC must be 5.0V or 3.3V  
  2. #define SYSCLK_HSI_60MHz                            60000000    //  unit:Hz

  3. #define PWMFREQ                                     16000      //  unit:Hz
  4. #define DEAD_TIME                                   1.0        //  unit:us     determined by Hardware parameter   
  5. #define SLOWLOOP_FREQ                               1000       //  unit:Hz

  6. /*Board parameter setting*/
  7. // Current Sampling
  8. #define ADC_REFV                                    SYS_REFV
  9. #define R_SHUNT                                     (0.05)     //  unit:ohm
  10. #define CURRENT_OPA_GAIN                            (5.00)     //  OPA_GAIN  
  11. #define I_MAX                                       (ADC_REFV/2/CURRENT_OPA_GAIN/R_SHUNT)  //  unit:A   Max current of Hardware         

  12. // Voltage Sampling
  13. #define UDC_MAX                                     (55.0)     //  unit:V      Max DC Voltage of Hardware
  14. #define U_MAX                                       (UDC_MAX/1.732)  // unit:V      Max Voltage
  15. #define DCBUS_OVER                                  (30.0)     //  unit:V        if DC Bus voltage over this, it will stop motor
  16. #define DCBUS_UNDER                                 (15.0)     //  unit:V        if DC Bus voltage under this, it will stop motor

  17. /*State machine setting*/

  18. // PreCharge stage
  19. #define PRECHARGE_TIME                              100        //  unit:ms       precharge time setup

  20. #define STOP_TO_RUN_SPEED                           500.0      //  unit:RPM      if speed command higher this, Switch from Stop to Run state
  21. #define STARTUP_TO_SPIN_SPEED                       400.0      //  unit:RPM      if actual speed  higher this, Switch from Startup to Spin state
  22. #define FREEWHEEL_SPEED                             400.0      //  unit:RPM      if speed command lower this,  Switch to Freewheel state

  23. // Align state
  24. #define IQ_ALIGN                                    1.0        //  unit:A        q axis current for align      
  25. #define ALIGN_CURRENT_RAMP                          1.0        //  unit:A/s      ramp of  align current
  26. #define ALIGN_TIME                                  1.0        //  unit:s        align time

  27. // Startup state
  28. #define IQ_STARTUP                                  1.0        //  unit:A        q axis current for startup      
  29. #define MAXSTARTUP_SPEED                            500.0      //  unit:RPM      max startup speed
  30. #define STARTUP_SPEED_RAMP                          500.0      //  unit:RPM/s    ramp of startup speed
  31. #define SPEED_TO_THETA                              Q15(2*SPEED_MAX*POLEPAIRS/60.0/PWMFREQ) //unit: speed to theta Integral constant
  32. #define STARTUP_TIME                                1.0        //  unit:s

  33. // run state
  34. #define RAMP_UP                                     1000.0     //  RPM/s            ramp of speed command increase
  35. #define RAMP_DOWN                                   1000.0     //  RPM/s            ramp of speed command decrease

  36. // freewheel state
  37. #define FREEWHEEL_TIME                              5.0        //  unit:s           freewheel time
  38. #define FAULTRELEASE_TIME                           20.0       //  unit:s           fault release time


  39. /*motor releated paremeter setting*/
  40. //Motor parameter
  41. #define Rs                                          0.5        //  unit:ohm
  42. #define Ls                                          0.001      //  unit:H
  43. #define POLEPAIRS                                   2.0        //  unit
  44. #define SPEED_MAX                                   (5000.0)  //  unit:rpm    max speed of motor

  45. #define MAX_DUTY                                    (0.92)    //   unit
  46. #define D_PI_LIMIT                                  (14.0)    //   unit:V      Vd PI output limitation
  47. #define Q_PI_LIMIT                                  (14.0)    //   unit:V      Vq PI output limitation
  48. #define SPD_PI_LIMIT                                (3.0)     //   unit:A      Speed PI output limitation

  49. // CURRENT LOOP PI PARAMETER
  50. #define M1_IQ_KP                                    Q15(0.87) //   KP Value of Q-axis Current loop
  51. #define M1_IQ_KP_SHIFT                              (-5)      //   KP Shift Value of Q-axis Current loop
  52. #define M1_IQ_KI                                    Q15(0.88) //   KI Value of Q-axis Current loop
  53. #define M1_IQ_KI_SHIFT                              (-7)      //   KI Shift Value of Q-axis Current loop
  54. #define M1_ID_KP                                    Q15(0.87) //   KP Value of D-axis Current loop
  55. #define M1_ID_KP_SHIFT                              (-5)      //   KP Shift Value of D-axis Current loop
  56. #define M1_ID_KI                                    Q15(0.88) //   KI Value of D-axis Current loop
  57. #define M1_ID_KI_SHIFT                              (-7)      //   KI Shift Value of D-axis Current loop

  58. // SPEED LOOP PI PARAMETER
  59. #define M1_SPEED_KP                                 Q15(0.6)  //   KP Value of speed loop
  60. #define M1_SPEED_KP_SHIFT                           (0)       //   KP Shift Value of speed loop
  61. #define M1_SPEED_KI                                 Q15(0.5)  //   KI Value of speed loop
  62. #define M1_SPEED_KI_SHIFT                           (-9)      //   KI Shift Value of speed loop

  63. // SMO Observer
  64. #define GS_SHIFT                                   (0)       //  Right Shift the Gs Value to anti overflow
  65. #define SMO_ERR_MAX                                 Q15(0.3)  //   Max value of SMO error
  66. #define SLIDE_GIAN                                  Q15(0.3)  //   Kslide gain value
  67. #define IERR_GIAN                                          Q15(0.5)  //   Current gain value
  68. #define IERR_GIAN_SHIFT                             (1)       //   Shift Value of Current gain

  69. // track observer
  70. #define M1_TO_KP_GAIN                               Q15(0.6528)  //   KP Value of track observer
  71. #define M1_TO_KP_SHIFT                              (1)          //   KP Shift Value of track observer
  72. #define M1_TO_KI_GAIN                               Q15(0.988)   //   KI Value of track observer
  73. #define M1_TO_KI_SHIFT                              (-9)         //   KI Shift Value of track observer
  74. #define M1_TO_THETA_GAIN                            Q15(0.666667)//   Theta gain value
  75. #define M1_TO_THETA_SHIFT                           (-5)         //   Theta gain shift value
复制代码





4 参数设定
首先需要在开发板选择运行模式,其中SW1和SW2是选择是无传感器还是Hall传感器
Capture.PNG


5 下载和运行
编译后下载,
Capture.PNG
如下连接,这里是无传感器的运行模式
762353175.jpg

直接上电,就可以实现电机控制和运行了。
1781227853.jpg

Capture.PNG
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-12-28 15:03 , Processed in 0.124298 second(s), 17 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.