打印
[方案相关]

基于比较器换相的L130 高速BLDC驱动参考

[复制链接]
141|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1 BLDC驱动的核心就是电子换相;以方波驱动为例,常用的手法就是过零点换相;
那么如何检测过零点,常见的可以采用两种方式:
1 ADC端口电压检测,与虚拟中点电压值比较,受ADC转换时间的影响,这种方式无法在高速及超高速BLDC中应用;
2 基于VC比较器,将悬空相与虚拟中点比较,VC比较器的响应时间可以做到ns级别,非常适合高速BLDC的驱动;



图中, PHASE_A,PHASE_B, PHASE_C 分别接电机的 A, B, C 线,经过一个分压网络后分别为 NULL_A, NULL_B, NULL_C, 再连接到单片机的ADC0, ADC1, ADC2 引脚。而MITTEL 为估测的变形后的中点电压,接单片机的 AIN0 引脚。只要在 AB 通电期间开通NULL_C 和 MITTEL 的比较; AC 通电期间开通 NULL_B和 MITTLE 的比较; BC 通电期间开通NULL_A 的比较,就可以成功检测出各相的过零事件。(VC比较器的用法类似,核心就是比较中点电压和悬空相的分压)
下面来说说这个分压网络到底是怎么回事,这是个比较经典的反电动势采集电路,很多无刷电机的教材上都有照搬。现在我们来分析,先无视图中这几个电容,把它当成纯电阻网络。假设AB 相开始通电的时候, PHASE_A的电压约为 12V, PHASE_B 的电压约为 0V, C 线圈此时产生 6V 的反向感生电动势,叠加在绕组中点上后,在 PHASE_C 输出的电压应为 12V 左右,问:此时MITTEL 点电压值是多少? NULL_C点电压值又是多少?

基尔霍夫定律学得好的朋友可以手算,学得不好的朋友,可以用电路软件仿真。答案是: MITTEL=4V, NULL_C=5.3V。此时 NULL_C 点电压高于 MITTEL 点电压,模拟比较器输出 AC0为 0。接着转子继续向前转动, C 线圈的感生电动势逐渐减小,当减小到零时,PHASE_C 端输出的电压就是绕组中点电压 6V,此时可以算得: MITTLE=3V, NULL_C=3V,可见此时模拟比较器处于零界状态。随着转子继续转动 C 线圈产生的电动势方向变反, PHASE_C 端测得的电压会小于中点 6V,假设现在 C 线圈产生-1V 的电动势,则PHASE_C端测得的电压为 5V,放到这个电阻网络里一计算,结果得: MITTEL=2.8V, NULL_C=2.6V。此时 MITTLE 点电压高于 NULL_C 点电压,说明刚才模拟比较器的输出已发生了一次跳变,过零事件被检测到。

3 VC比较器换相核心功能函数:
void Phase_Change(void)
{

unsigned char sense = 0;

   do
{
if(SENSE_H) sense = 1; else sense = 0;

switch(uvstep)
  {
  case 0:
          FETs_OFF();
          A_H;
                SET_ADT0_CHA_PWM;

          if(sense)
           {
              C_L;

              SENSE_FALLING_INT;
              SENSE_B;
              uvstep++;
              VC_IRQ_CNT++;
            }
                      else
            {
              B_L;
            }
         break;

  case 1:
          FETs_OFF();
          C_L;
          if(!sense)
           {
              B_H;
                      SET_ADT1_CHA_PWM;

              SENSE_A;
              SENSE_RISING_INT;
              uvstep++;
              VC_IRQ_CNT++;
            }
            else
            {
               A_H;
                                                  SET_ADT0_CHA_PWM;
            }

         break;


  case 2:  
          FETs_OFF();
          B_H;
                SET_ADT1_CHA_PWM;
          if(sense)
           {
              A_L;

              SENSE_C;
              SENSE_FALLING_INT;
              uvstep++;
              VC_IRQ_CNT++;
            }
            else
            {
              C_L;
            }

         break;

  case 3:  
          FETs_OFF();
                A_L;
          if(!sense)
           {
              C_H;
                                                 SET_ADT2_CHA_PWM;

              SENSE_B;
              SENSE_RISING_INT;
              uvstep++;
              VC_IRQ_CNT++;
            }
            else
            {
              B_H;
                                                 SET_ADT1_CHA_PWM;
            }


         break;

  case 4:  
          FETs_OFF();
                 C_H;
                 SET_ADT2_CHA_PWM;
          if(sense)
           {
              B_L;

              SENSE_A;                        
              SENSE_FALLING_INT;
              uvstep++;
              VC_IRQ_CNT++;
            }
                else
            {
               A_L;
            }

         break;

  case 5:  
              FETs_OFF();
          B_L;
          if(!sense)
           {
              A_H;
                                                 SET_ADT0_CHA_PWM;

              SENSE_C;
              SENSE_RISING_INT;
              uvstep = 0;
                                                 VC_IRQ_CNT++;

            }
            else
            {
              C_H;
                                                 SET_ADT2_CHA_PWM;
            }
         break;
  }
}
while((SENSE_L && sense) || (SENSE_H && !sense));  

}

3 参考意义:
HC32L130 BLDC电机基础驱动参考(ADT,PWM, VC比较器的配置方法);


4 软硬件参考详见附件;欢迎讨论。

HC32L130_12V_FAN.pdf

571.26 KB

HC32L136_DDL_Rev1.0.0(High speed BLDC).zip

7.55 MB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

48

帖子

0

粉丝