黄工无刷电机学习
直播中

温暖镜头

9年用户 999经验值
擅长:电源/新能源 制造/封装
私信 关注
[问答]

过零点检测在无传感器的无刷直流电机控制中有何作用

六步换相原理是什么?
如何去编写六步换相函数的代码程序呢?
过零点检测在无传感器的无刷直流电机控制中有何作用?

回帖(1)

胡少莹

2021-9-15 17:04:12
  一、内容
  本期的学习主要是针对之前方波部分内容的一个查漏补缺和正弦波部分的一个前期准备。方波主要是学习了《无刷直流电机控制应用》一书的234-272页,对无刷直流电机控制的一个应用实例进行学习。正弦波部分主要是对FOC控制原理的学习。
  二、知识点
  1.六步换相函数,对于方波的有、无传感器无刷直流电机的换相原理,都是六步换相原理,其贯穿于电机控制的整个过程。三个绕组,根据单片机反馈的转子位置信息,有序的PWM信号,实现理想的控制效果,具体程序如下所示:
  void BLDC_SwitchStep(void)
  {
  if(ClockDir==0)
  {
  MotorA.Step= (MotorA.Step + 1) % 6;
  }
  else
  {
  MotorA.Step = (MotorA.Step + 6-1) % 6;
  }
  MotorA.PWMTicksPre=MotorA.PWMTicks;
  MotorA.FlagBEMF = 0;
  MotorA.PWMTicks = 0;
  //MotorA.Step=0;
  //6步法驱动
  switch(MotorA.Step)
  {
  case 0://step1
  TIM1-》CCR1=My_PWM; //A+
  Delay1Us();
  T1CH1NON();
  T1CH2NOFF(); //B-
  Delay1Us();
  TIM1-》CCR2=0;
  T1CH3NON(); //C
  TIM1-》CCR3=0;
  break;
  case1://step2
  TIM1-》CCR1=My_PWM; //A+
  Delay1Us();
  T1CH1NON();
  T1CH3NOFF(); //C-
  Delay1Us();
  TIM1-》CCR3=0;
  T1CH2NON(); //B
  TIM1-》CCR2=0;
  break;
  case2://step3
  TIM1-》CCR2=My_PWM;//B+
  Delay1Us();
  T1CH2NON();
  T1CH3NOFF();//C-
  Delay1Us();
  TIM1-》CCR3= 0; //12.5%占空比
  T1CH1NON(); //A
  TIM1-》CCR1=0;
  break;
  case3://step4
  TIM1-》CCR2=My_PWM;//B+
  Delay1Us();
  T1CH2NON();
  T1CH1NOFF(); //A-
  Delay1Us();
  TIM1-》CCR1=0;
  T1CH3NON(); //C
  TIM1-》CCR3=0;
  break;
  case4://step5
  TIM1-》CCR3=My_PWM; //C+
  Delay1Us();
  T1CH3NON();
  T1CH1NOFF(); //A-
  Delay1Us();
  TIM1-》CCR1 = 0; // 37.5%占空比
  T1CH2NON(); //B
  Delay1Us();
  TIM1-》CCR2=0;
  break;
  case5://step6
  TIM1-》CCR3=My_PWM; //C+
  Delay1Us();
  T1CH3NON();
  T1CH2NOFF(); //B-
  Delay1Us();
  TIM1-》CCR2=0;
  T1CH1NON(); //A
  TIM1-》CCR1=0;
  break;
  default:break;
  }
  }
  2.过零点检测,对于无传感器的无刷直流电机控制来说,过零点检测是判断转子位置的依据,它的检测原理是根据反电动势法,当两个绕组通电时,检测未通电绕组的状态,当其位置过零点时,也就意味着需要换相,其具体的检测程序如下:
  unsigned long BEMF(void)
  {
  unsigned short VoltBEMF = 0;
  unsigned long dir = 0;
  if(ucMotorStep!=MotorA.Step)
  {
  ucMotorStep=MotorA.Step;
  ucMotorAD=0;
  }
  switch(MotorA.Step)
  {
  case 0:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[2]; dir =1;//下降 break;
  case 1:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[1]; break;
  case 2:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[0]; dir =1; break;
  case 3:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[2]; break;
  case 4:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[1]; dir =1; break;
  case 5:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[0]; break;
  default: break;
  }
  if(ucMotorAD《2)
  {
  ucMotorAD++;
  }
  else
  {
  //ucMotorAD=0;
  if(((dir == 1)&&(ClockDir==0))||((dir == 0)&&(ClockDir==1))) //下降,PWM-OFF检测BEMF,过零点标志是BEMF电压为0
  if((VoltBEMF[0]》0)&&(VoltBEMF[1]==0))
  {
  usOZTimeS++;
  return 1;
  }
  }
  else
  {
  if((VoltBEMF[0]==0)&&(VoltBEMF[1]》0))
  {
  usOZTimeS++;
  return 1;
  }
  }
  VoltBEMF[0]=VoltBEMF[1];
  VoltBEMF[1]=VoltBEMF[2];
  return 0;
  }
  三、总结
  通过本期的学习,对方波部分有了更好的认识,对有传感器和无传感器的无刷直流电机的控制系统有了更深的印象。但通过对正弦波部分中部分原理的了解,感受到了正弦波部分的学习难度远高于方波,之后需要投入更大的时间和精力进去。
举报

更多回帖

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