[应用方案]

航模电调 DIY —— 第2季 , Mini51 如何控制 BLDC 转动

[复制链接]
918|30
手机看帖
扫描二维码
随时随地手机跟帖
两只袜子|  楼主 | 2021-3-2 15:18 | 显示全部楼层 |阅读模式
CPU 控制 BLDC 转动的过程是检过零与换相轮流做,如下图, 鼠标左击看大图。

124235ijxejjxtxjmxmf8x.png


看上图,黑块时间是检测过零时间,约占用了 CPU 的 1/4 时间。

这里说一下 Mini51 D版芯片的自动换相功能:
    每次换相后,要改变驱动 上MOS 的  PWM 输出引脚,改变驱动 下MOS 的 GPIO 输出 0 或 1 的状态,还要改变比较器的输入脚——换一相检测过 0 了。 Mini51 系列有个 换相寄存器:PWM-> PHCHG——phase change 之意, 写这一个寄存器,完成上面三件事。


110241yihhb7indz7wz3n7.png

    还有一个下一相寄存器:PWM-> PHCHGNXT,这个寄存器定义与上述寄存器相同,Timer0 溢出时,PWM-> PHCHGNXT 的值会自动写入换相寄存器 PWM-> PHCHG 中。在 Timer1 中断代码里,检到过 0 时,就准备好下一相数据 PWM-> PHCHGNXT,并写好 Timer0 的溢出时间——换相时刻点

Mini51 A 版芯片无此功能,购买芯片要问清楚,要买 D 版芯片。

void TMR1_IRQHandler(void)                                    
{  
    TIMER0->CMPR   = ~0 ;                                       // 拉长 Timer0 时间,防止检过 0 时 Timer0 自动换相了
    TIMER1->ISR      = ~0 ;                                                             // 清中断标志                  
    DeadLine_Detec = PeriodNow << 1 ;                                           // 检过 0 超时时间, 防止中断内死等
    do{
        if((*pPhase) & DetectUpBit){                     
              if(ACMP->SR & AcmpOutBit){ ++StepCount; break; }           //  检到上过 0
        }
        else{                                    
              if((ACMP->SR & AcmpOutBit)==0){ ++StepCount; break;}    // 检到下过 0
        }
    }while(TIMER0->DR < DeadLine_Detec) ;   
    PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;                   // 两次过 0 时刻相减,得当前周期。
    ZeroTick   = TIMER1->DR ;                                                       // 本次过 0 时刻,下次计算周期用
    PeriodNow  = (PeriodNow + PeriodLast)>>1 ;                             // 软件滤波   
    if(PeriodNow > Period_Max) PeriodNow = Period_Max ;  
    TIMER0->CMPR  = TIMER0->DR + (PeriodNow >> 1) ;                //  延时周期的 1/2 时间后,换相
    TIMER1->CMPR  = TIMER1->DR + ((PeriodNow*3)>>2)  ;           //  延时周期的 3/4 时间后, Timer1 再次中断检过 0
    if(++pPhase   > pPhaseEnd) pPhase -= 6 ;   
    PWM-> PHCHGNXT = *pPhase ;      // 这是下一相数据, Timer0 计数到 CMPR 时会自动写入PWM-> PHCHG 改变输出
}

改变导通角:
   改变 TIMER0 的定时即可,比如写成 TIMER0->CMPR  = TIMER0->DR + (PeriodNow >> 2) ; 过 0 后 1/4 周期换相,就等于换相超前了 15 度。


正反转
    转向由指针 pPhase 指向的数组决定。指向不同的数组,不仅可以实现正反转,还可改变上 MOS 或下 MOS 做 PWM等功能。  

150 度方波
     Timer1 中断返回时刚好是过 0 时刻,这时立即换成两相同时输出,Timer0 定时到会自动变成下一相输出,这样就成了 150度方波 。

下载 Mini51 电调全部代码,请到"航模电调 DIY——第3季 Mini51ZDE 电调代码: http://www.nuvoton-mcu.com/forum.php?mod=viewthread&tid=1459&extra=page%3D1

使用特权

评论回复
七毛钱| | 2021-3-2 16:03 | 显示全部楼层

有两个问题需要请教版主
第一个:过零检测电路是有延时的,代码里用周期的一半其实已经超过了30度,如果速度非常高,有可能换相滞后的严重;
第二个:每次换相时立即配置过零比较器,比较器配置后就会工作,当执行定时器1中断时,不论是否到了过零点,比较器都会有输出,这样岂不是检测不准过零位置?
以上两个问题不知我理解的对不对,希望能得到版主的指点,非常感谢。

使用特权

评论回复
海滨消消| | 2021-3-2 16:04 | 显示全部楼层
版主您好:
请教一个问题,当TIMER1在中断里面查询过零点的时候,此时PWM信号在工作状态,比较器的输入端会有PWM信号在里面,而您这边的RC常数非常小,不能滤掉PWM的信号,比较器输出的信号应该也是和PWM同步变化的,您这边是如何判断过零点的?

使用特权

评论回复
yangxiaor520| | 2021-3-2 19:01 | 显示全部楼层
感谢讲解,学习了。

使用特权

评论回复
jiekou001| | 2021-3-2 21:26 | 显示全部楼层
设计电机控制器。

使用特权

评论回复
usysm| | 2021-3-6 20:45 | 显示全部楼层
新唐N76E003AT20的无刷电调BLDC原理图

使用特权

评论回复
jkl21| | 2021-3-6 20:45 | 显示全部楼层
好资料啊,谢谢楼主的共享呀

使用特权

评论回复
wwppd| | 2021-3-6 20:46 | 显示全部楼层
bldc无刷电机和普通电机有什么不同

使用特权

评论回复
maqianqu| | 2021-3-6 20:46 | 显示全部楼层
无刷直流电机控制有哪些方法

使用特权

评论回复
dspmana| | 2021-3-6 20:47 | 显示全部楼层
新唐电机NM1200是ARM Cortex-M0内核

使用特权

评论回复
eefas| | 2021-3-6 20:47 | 显示全部楼层
bldc原理图相关文档代码  

使用特权

评论回复
pl202| | 2021-3-6 20:48 | 显示全部楼层
         

使用特权

评论回复
typeof| | 2021-3-6 20:48 | 显示全部楼层
MINI51系列的安装包在哪下啊

使用特权

评论回复
yujielun| | 2021-3-6 20:48 | 显示全部楼层
什么是BLDC电机?

使用特权

评论回复
htmlme| | 2021-3-6 20:49 | 显示全部楼层
单片机怎样控制bldc无刷电机

使用特权

评论回复
wwppd| | 2021-3-6 20:49 | 显示全部楼层
BLDC和步进电机如何区别

使用特权

评论回复
jkl21| | 2021-3-6 20:49 | 显示全部楼层
   

使用特权

评论回复
maqianqu| | 2021-3-6 20:49 | 显示全部楼层
用新唐m0516驱动BLDC电机初始化PWM

使用特权

评论回复
usysm| | 2021-3-6 20:49 | 显示全部楼层
NUVOTON是一直都有 8051 base MPU吧  

使用特权

评论回复
yujielun| | 2021-3-6 20:49 | 显示全部楼层
BLDC控制程序怎么编程

使用特权

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

本版积分规则

1867

主题

6389

帖子

7

粉丝