黄工无刷电机学习
直播中

王婷

7年用户 974经验值
私信 关注
[问答]

PMSM有霍尔传感器与PMSM无霍尔传感器的程序有何区别

如何去编写PMSM有霍尔传感器的程序?

如何去编写PMSM无霍尔传感器的程序?
PMSM有霍尔传感器与PMSM无霍尔传感器的程序有何区别?

回帖(1)

赵群山

2021-8-6 17:41:34
  一、内容
  本期的学习内容主要是对PMSM有霍尔传感器和无霍尔传感器部分的程序进行比较性学习,其目的在于慢慢的实现有传感器到无传感器的学习过渡,并结合所学的算法原理,初步的理解无霍尔程序。
  二、知识点
  我们可以看出一个FOC矢量控制的一个基本模型,而就PMSM有霍尔传感器和无霍尔传感器在FOC矢量控制原理上来说,主要的区别在于转子速度/位置反馈上面,前者是通过电机的霍尔元件发送的信号来判断当前电机运动的状态,检测到转子的位置,然后控制器根据霍尔所采集的信号再控制控制器的输出来给电机供电,让电机持续正常的工作。而后者则是通过相关的算法,由计算得出转子的速度和位置,以实现控制效果。
  首先,根据所学的《现代永磁同步电机控制原理及MATLAB仿真》一书中所写的转子速度和检测算法,大致可以分成括滑模观测器算法、模型参考自适应控制算法、扩展卡尔曼滤波器算法三种,其中,滑模观测器算法随着研究的深入,可分为传统清模观测器算法、自适应清模观测器算法和同步旋转坐标系下滑模观测器算法三种。
  而在所给的PMSM无传感器程序中,首先,通过学习了解到有霍尔传感器和无霍尔传感器的程序主体上具有相似性,在程序上主要的区别之处在于程序中转子速度和位置检测模式的选择,具体代码如下所示:
  #ifdef ENCODER
  // ENC_Init();
  #ifdef OBSERVER_GAIN_TUNING
  STO_StateObserverInterface_Init();
  STO_Init();
  #endif
  #elif defined HALL_SENSORS
  // HALL_HallTimerInit();
  #ifdef OBSERVER_GAIN_TUNING
  STO_StateObserverInterface_Init();
  STO_Init();
  #endif
  #elif defined NO_SPEED_SENSORS
  STO_StateObserverInterface_Init();
  STO_Init();
  #ifdef VIEW_ENCODER_FEEDBACK
  ENC_Init();
  #elif defined VIEW_HALL_FEEDBACK
  HALL_HallTimerInit();
  #endif
  #endif
  从中,可以看出,程序中转子速度和位置检测模式有三种,编码器直接检测模式、霍尔传感器检测模式和无传感器检测模式,只需在头文件中定义相关的参数(ENCODER、HALL_SENSORS和NO_SPEED_SENSORS),及完成对三种检测模式的选择,随后调用对应初始化函数。
  而针对无传感器转子速度和检测算法所采用的算法是滑模观测器算法,所调用的函数是STO_StateObserverInterface_Init(),具体代码如下:
  void STO_StateObserverInterface_Init(void)
  {
  StateObserver_Const StateObserver_ConstStruct;
  StateObserver_ConstStruct.hC1 = C1;
  StateObserver_ConstStruct.hC3 = C3;
  StateObserver_ConstStruct.hC5 = C5;
  {
  s16 htempk;
  StateObserver_ConstStruct.hF3 = 1;
  htempk =(s16)((100*65536)/(F2*2*PI));
  while(htempk != 0)
  {
  htempk/=2;
  StateObserver_ConstStruct.hF3 *=2;
  }
  StateObserver_ConstStruct.hC6 =
  (s16)((F2*StateObserver_ConstStruct.hF3*2*PI)/65536);//10000
  }
  #ifdef OBSERVER_GAIN_TUNING
  /* lines below for debug porpose*/
  StateObserver_ConstStruct.hC2 = C2;
  StateObserver_ConstStruct.hC4 = C4;
  StateObserver_ConstStruct.hC2= (s16)((F1*wK1_LO)/SAMPLING_FREQ);
  StateObserver_ConstStruct.hC4 =
  (s16)((((wK2_LO*MAX_CURRENT)/(MAX_BEMF_VOLTAGE ))*F2)/(SAMPLING_FREQ));
  StateObserver_ConstStruct.PLL_P = hPLL_P_Gain;
  StateObserver_ConstStruct.PLL_I = hPLL_I_Gain;
  #else
  StateObserver_ConstStruct.hC2 = C2;
  StateObserver_ConstStruct.hC4 = C4;
  StateObserver_ConstStruct.PLL_P = PLL_KP_GAIN;
  StateObserver_ConstStruct.PLL_I = PLL_KI_GAIN;
  #endif
  StateObserver_ConstStruct.hF1 = F1;
  StateObserver_ConstStruct.hF2 = F2;
  StateObserver_ConstStruct.wMotorMaxSpeed_dpp = MOTOR_MAX_SPEED_DPP;
  StateObserver_ConstStruct.hPercentageFactor = PERCENTAGE_FACTOR;
  STO_Gains_Init(&StateObserver_ConstStruct);
  }
  其中,根据滑模观测器算法,所需的初始化参数如下:
  #define F1 (s16)(8192)
  #define F2 (s16)(8192)
  #define C1 (s32)((F1*RS)/(LS*SAMPLING_FREQ))
  #define C2 (s32)((F1*K1)/SAMPLING_FREQ)
  #define C3 (s32)((F1*MAX_BEMF_VOLTAGE)/(LS*MAX_CURRENT*SAMPLING_FREQ))
  #define C4 (s32)((((K2*MAX_CURRENT)/(MAX_BEMF_VOLTAGE))*F2)/(SAMPLING_FREQ))
  #define C5 (s32)((F1*MAX_VOLTAGE)/(LS*MAX_CURRENT*SAMPLING_FREQ))
  #define RS 1.50 /* Stator resistance , ohm*/
  #define LS 0.0006 /* Stator inductance , H */
  #define SAMPLING_FREQ ((u16)PWM_FREQ/((REP_RATE+1)/2)) // Resolution: 1Hz
  #define K1 (s32)(-19725) /* State Observer Gain 1 */
  // Values showed on LCD display must be here multiplied by 100
  #define K2 (s32)(74034) /* State Observer Gain 2 */
  #define PLL_KP_GAIN (s16)(532*MOTOR_MAX_SPEED_RPM*POLE_PAIR_NUM/SAMPLING_FREQ)
  #define PLL_KI_GAIN
  (s16)(1506742*POLE_PAIR_NUM/SAMPLING_FREQ *MOTOR_MAX_SPEED_RPM/SAMPLING_FREQ)
  三、总结
  本期主要是在学习完PMSM有霍尔传感器部分之后,自己通过尝试着修改程序中的相关参数,改变转子速度和位置检测模式,初步接触和学习无传感器内容。总的来说,结合FOC矢量控制原理和相关仿真内容,对程序的主体有了大致的了解,明白了将程序模块化之后,理解起来更加方便。但还有许多地方不是太懂,一方面,需要对原理性的内容进行深入学习;另一方面,需要结合无传感器控制原理,以及STM32数据手册,了解相关公式和库函数的作用,进而继续理解学习。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分