liangzhou1988 发表于 2024-6-30 11:49

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

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 软硬件参考详见附件;欢迎讨论。

weifeng90 发表于 2024-7-12 07:52

感谢楼主分享,参考一下。
页: [1]
查看完整版本: 基于比较器换相的L130 高速BLDC驱动参考