发 帖  
原厂入驻New

[经验] 大神的实战作品:自制无刷电机控制器

2020-8-5 07:30:00  670 无刷电机 电机控制
分享
10
很早之前就想做一款无刷电机控制器,忙于工作一直没有弄。最近有点时间画板,打样,焊接,调试,总算顺利的转起来。期间也遇到很多问题,上网查资料,自己量波形前前后后搞了差不多近一个月,(中间又出差一周)总算搞的差不多了,特意写个总结。

板子外观 100*60mm 中等大小。DC 12V 输入,设计最大电流 10A.(实际没试过那么大的电机,手头的电机也就 5 6A 的样子)硬件上可以切换有感(HALL)和无感(EMF)两种模式,外部滑动变阻器调速 预留有 PWM 输入、刹车、正反转、USB 和 uart 等接口

先来说下原理无刷电机其实就是直流电机,和传统的 DC 电机是一样的,只是把有刷的电滑环变成了电子换向器



因为少了电滑环的摩擦所以寿命静音方面有了很大的提升,转速也更高。



当然难点就在如何获取当前转子的位置好换相,所以又分为两种有感和无感。

有感就是在电机端盖的部位加装霍尔传感器分别相隔 30 度或 60 度。无感就是靠检测悬浮相的感应电动势过零点(后面在细讲)。

当然各有各的优缺点,有感在低速方面好,可以频繁启停换相。无感的结构简单成本低,航模上应用居多。

先说有感,电源首先被分成了 3 个绕组 U  V  W 这个交流电还是有区别的。

它只是 3 个 h 桥按一定的顺序导通模拟出来的,本质还是直流电。电机靠 hall 位置按一定顺序换相,转速与电压电流有关。这一点切记,不是换的越快转的越快。(位置决定换相时刻,电压决定转速)一般调速就是调电压,6 步 pwm 方式是目前常用的。当然后续还有 foc 等更好算法。

硬件部分网上基本都是成熟的方案。三相 H 桥,H 桥一般有上臂 mos 和下臂 mos 组成,如果只是简单的做演示上臂选 pmos 下臂选 nmos 控制电路简单直接用单片机的 io 就可以驱动。但是 pmos 低内阻的价格高。功率上面很难做大。

这也就是为什么基本所有的商业控制器全是 nmos 的原因。

但是上臂用 nmos 存在一个问题 vgs 控制电压大与 vcc 4v 以上才能完全导通。为了简化电路采用了 ir 公司出的驱动 ic,它内部有自举升压电路。外部仅需一个续流的二极管及储能电容即可。





有感模式控制相对简单,3 个霍尔传感器输出一般都是数字信号,分压后直接接单片机 io。



当然控制方式上也就简单很多,三个霍尔接中断输入,在中断处理程序中根据组合状态换相,程序上也没什么复杂的。主程序 一直检测 ad 值,改变 pwm 占空比,及电流保护等。

如下一个典型的换相代码。STM32 有两个高级定时器 tim1 tim8 可以输出 4 组互补型 pwm,还可以设定死区时间等,使用上非常方便。

switch(step)

{

case 4: //B+ C-

/* Next step: Step 2 Configuration -------------------------------------- */

TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable);

TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable);





}

下图为 UVw 三相的霍尔检测到的电平及 w 相的波形。



下图为 uvw 三相波形及 w 相霍尔电平



下图为 w 相电平, w 相上臂 on 下臂 pwm ,w 相霍尔信号



下图为 w 相 ir2304 芯片输出,上臂电压可明显看到已高于 vcc,下臂为 pwm 信号



在说说无感模式,由于没有了霍尔,电机无法知道转子当前的位置所以就无法换相,而感应电动势也只有在转起来之后才有,所以无感模式的启动是个难点。

一般方法都是分三段法:1 预定位 2 启动 3 进入闭环反馈

正如网友说的江湖一层纸,戳破不值半文钱。

1. 预定为就是强制给某一相通电一段时间,让电机定位到这个位置。占空比 30-50%不要太大,可能会发热。

2. 启动,就是逐步的强制换相,当然要有个加速的过程,使电机转起来。

这个过程太慢会抖动反转,太快会丢步。参数需要一点点试,有点像控制步进电机。要能使电机转的能产生电动势,我也是参照的德国 MK 电调的算法。

每次延时时间比上一次少 1/25,形成一个加速的过程,直到电机完全转起来产生足够的电动势。

3. 闭环反馈控制换相跟有感差不多一样。

speed_duty=30; //30% start

BLDC_PHASE_CHANGE(Step[Phase]); // 固定一相

Delay_MS(200);

speed_duty=pwm;

timer = 300;

while(1)

{

for(i=0;i<timer; i++)

{

Delay_US(120);   // 等待

}

timer-= timer/25+1;

IF(timer < 25)

{   

if(TEST_MANUELL)

{

timer = 25;   // 开环强制换向

}

else

{

bldc_dev.motor_state=RUN;

break;

}   

}

Phase++;

Phase %= 6;

BLDC_PHASE_CHANGE(Step[Phase]); //

}

说到感应电动势很多人不明白,先来说说电流,电机线圈的内阻通常很小比如 0.2 欧,电机的电压比如 10v,按理来说电流 100a 为何电机不烧哪?

其实电机线圈在通电的一瞬间并不是完全导通的,因为有反向电动感应势的存在,可能有 -9.8v。10v-9.8v = 0.2v /0.2 = 1A. 这样算起来电流还合理。

在说说那个初中学习的法拉第 ,当线圈切割磁场时会产生感应电动势,根据右手定则。。。。。。。。不懂的自行上网搜。



如下图当 ac 相在通电 12v 的情况下,静止状态下正中间中性点理论为 6v,但是转起来就不一定了,因为 b 相实际是在切割磁场,是会产生电动势的。而电动势的大小正负取决与当前在磁场 ns 极的位置。当切割 ns 时为 -1,切割 sn 时为 1,平行时为 0.



利用这一特性不就刚好可以获得转子的位置吗?

首先检测电路网上已经一大很成熟了。

如下图,当然很多时候需要在 4.7k 对地的电阻上并一个 100nf 的电容,做一个低通滤波。也可以在软件中做滤波处理。



我们所要做的就是检测这个悬浮相的电动势过零点。

网上常用的两种方法:1 单片机 ad 采集;2 比较器比较。我选择了比较器 lm339 价格已经很便宜了,在高速上比 ad 有明显优势,只要比较 cin bin ain 与 n 点的压差即可获得零点。



理想很完美,现实很残酷,实际中根本得不到这么完美的波形。

如下图,这个已经是比较好的了,还是有很多毛刺。这个给单片机中断,肯定一大堆问题,严重的换错相烧 mos 管。





为什么会有这些毛刺哪,有些还挺有规律。

参考了网上的介绍,这中间还有一个叫消磁的东西。



原理不深究了,反正时间很短,软件上做一个滤波消掉就可以了。

进入中断函数后做如下处理 ,定时器的中断我暂时用的 20us。

const unsigned int FilterNums = 0xff;

static unsigned int nums =0;

static unsigned int Queue_UStatus =0;

static unsigned int Queue_VStatus =0;

static unsigned int Queue_WStatus =0;

static unsigned char EMF_SVal =0;

unsigned char Filter_U_Status=0;

unsigned char Filter_V_Status=0;


unsigned char Filter_W_Status=0;

unsigned char EMF_Val=0;

unsigned int status_h;

unsigned int status_l;

unsigned int Delay30deg =0;

/* 清除中断标志位 */

if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )

{

TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);





至于网上说检测到过零点后,延时 30 度换相,对电源效率有影响。我试了下,好像没什么明显的差异。也有人说在大功率的电机下不延时反而更平滑等等。真实怎样有待各位实际实验了。

最后秀几张转起来的照片




硬盘电机 无感模式


电动工具电机 有感模式


加装散热片的样子

jiciwi 2020-8-5 22:04:45
看看
回复

举报

zym050328 2020-8-6 16:44:14
哈哈,我也做过类似的一个控制器
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表