[技术问答]

用N76E003做无刷电机控制器(BLCD)原创、连载

[复制链接]
15550|142
手机看帖
扫描二维码
随时随地手机跟帖
tianxj01|  楼主 | 2019-11-1 11:19 | 显示全部楼层 |阅读模式
本帖最后由 tianxj01 于 2019-11-2 09:55 编辑

网上关于单片机BLCD驱动资料很多,但还是有好多网友说起,看这些资料不得要领、源代码说看得是一头雾水,尤其关于PWM、换相完全不得其法。本文,就准备以最基本的通俗易懂的思维,带大家一步一步的来了解无刷电动机驱动的思路和设计。
由于属于入门级别的,所以只以有霍尔的三相无刷电机为例子来展开。其实搞懂了有霍尔,则无霍尔也仅仅只是程序上的升级版而已。
网上关于三相无刷电机的基本原理、UVW接法,转动原理,相信各位都已经门清了,重复也就没有意思了,这里就直接核心的内容,先根据霍尔来展开。
霍尔传感器,这里也假定大家已经知道其基本原理和输出信号(如果想理解原理,大家另行去找资料看),这里所说的,是已经获取到完整的霍尔信号,并进一步就霍尔信号和驱动信号来一步一步的展开。
说起霍尔,又绕不过去一个令很多人疑惑的概念:120°和60°。
所谓120°霍尔,和60°霍尔,从实际上来说,是以物理角度安装位置就可以明确区分的,其安装角度步距角度为60°就叫60°霍尔,120°的类推。
下面是旋转一个360度电气角度的120°霍尔信号时序:
120.png
行业标准霍尔编码从100开始,这里图片的波形时序也按照该标准。
这里特别称为360度电气角度,是因为,360度完成了一个循环,而并不是电机转了360°,电机到底转了多少角度还和电机的极数有关,极数越多,则360°一个循环驱动周期电机转动的角度越小。UVW都是一个极的,则电机真的转了360度,而都是2个极的则只转了180°,以此类推,这个大家了解就好,关系就是驱动扭矩和转速等的区别,和原理、程序基本没什么区别。
下图是60°霍尔信号的时序:
60.png
对比上面2个时序图,大家应该可以发现,60°和120°时序的差别,也就是各个霍尔是在角度差异120°还是60°时候改变状态而已。
现在,我们把60°霍尔的Hb信号反一个相,或者在电机上面转换一个面安装,同时把这个这个信号当成Hc,而把原来的Hc当成Hb,再来看看新是时序逻辑,发现了没,它就是120°霍尔的时序图了。图是直接在60度时序上面变换,所以看起来第一顺序就不是典型的100了,大家顺延类推就好。
60-120.png
这就是网上常常说的,60°-120°其实安装位置是一样的,只是中间一个反了个个安装而已说法的由来,当然这个说法好像都忽略了,相位顺序最后2个必须颠倒一下。
上面说了120°和60°的关系了,相信大家都已经明白,其实这些问题,如果放到程序里面去处理,会更加简单,所以,这里就只讨论120°霍尔条件下的电机及其驱动,弄清楚这个,大家肯定可以非常简单的处理出60度霍尔的对应方法。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-1 11:47 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-1 16:17 编辑

输出.png
图为一个三相无刷电机典型的输出驱动线路简化图。这里分别标注了各个驱动信号的位置和意义,当然这里的AH---CL都只是逻辑上的高低电平表述,实际上我们必须通过浮栅驱动等手段来实现MOS管的具体驱动线路,这些,会在后面讲到。
有了典型驱动线路,那么,我们该怎么去驱动这个线路能?
下面就通过另一个时序图,清楚的了解一下单片机各驱动端输出逻辑和霍尔的关系。
输出时序.png
经过对单片机6个端口的驱动时序要求,我们进一步分析,可以得到时序图后面标注的输出和霍尔ABC的逻辑关系。各个关系自己看图就好了。
对应这样的驱动时序要求,我们会单片机编程的,已经在想了,这逻辑实现起来,在程序上面不怎么难嘛,是的,这就是我们说的换相逻辑,其实,到这里,如果你会基本的编程,那么你就已经可以根据输入的3个霍尔信号,编程完成AH-CL6个驱动IO端口的逻辑了。为了编程过程更加清晰明了,我们下面根据上图的换相逻辑,用一个混合的逻辑图来进一步说明:
输出逻辑.png
这里,我们把3个IO,分别接到3个霍尔信号端,同时采用N76E003管脚中断方式,每个霍尔状态变化都将引起一次中断,用一个寄存器(可位寻址),每个中断分别读取3个霍尔点位,并取反存储到对应bit,然后根据竖线所表示的逻辑关系,直接逻辑运算,就已经获得了各端口输出信号,如果我们把各位集中暂存在某寄存器,等六位完成后,一次性送到一个IO寄存器,就可以一次性输出变化后的驱动信号,而不会有任何时序上的先后。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-1 11:49 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-1 16:20 编辑

上面的霍尔换相驱动,我们是基于时序图并用基本的逻辑运算来实现,看起来有点复杂,其特点是思路明确,直接模拟逻辑运算过程实现换相。缺点是程序过程稍嫌复杂,换相运算量相对大点,而这个是不利于提高转速的。
那么是不是有更简洁快速的方法呢?当然有,我们马上可以想到另外一种常用手段那就是查表。我只需要把可能的几种组合,变成表里面的数据,直接查表不就成了。
请看下面的图:
查表.png
我们把各输出端口,分别定义为bit5-bit0,其中,AH=bit5;AL=bit4;....CL=bit0,程序输出时候,这些位,将直接对应单片机P端口的输出寄存器。
再看看把霍尔信号当成地址数据,则可以发现,地址占3位,而状态只有6种就开始重复了,那么其中有000和111是非法地址,其他都是合法地址。根据上面的思路,我们按照地址升序排列,就可以获得下面的表格:
表格.png
就这样,当霍尔信号边沿变化,中断到来时候,我们只需要检查一下是不是非法地址,并直接排除,然后就把霍尔数据当成3位地址查表,将查表数据直接填入到IO输出寄存器,就实现了非常简单的换相逻辑,而且运算量非常小。
到这里,有人会问了,你上面描述的,换相是有了,可都只是方波,这里没PWM什么事情啊。对的,为了清除的说明问题,这里还真没有加入PWM,你可以理解为,上面说的所有换相逻辑,都是PWM100%时候的波形,也就是,如果我们按照上面的去做,我保证电机完全可以正常转起来的,缺点就是转起来就是最高速度,它是不会调速的.......。当然还有启动时候电流大什么的,这些我们暂时就先忽略了吧。
电机不能调速怎么成,我们当然必须要能够用PWM无级变速、那么实际的速度控制的我们该怎么做呢?
其实非常简单,我们把上面描述的换相逻辑当中的波形,每路驱动信号幅度为1的那高电平部分,直接替换成我们可以控制的PWM信号,则一个带PWM调速的无刷有霍尔电机就完成了。
PWM.png
当我们能够把输出变成这样一种驱动信号的时候,再描述一下PWM调速的过程:
当我们准备运转电机时候,则单片机PWM开始增加,然后电机在换相逻辑控制下,输出符合上面时序图的带PWM的驱动波形,然后电机开始旋转,在某个合适的PWM占空比条件下,电机最终就会稳定在一个合适的速度,而不再是上面那个简单方波,一接上电机,电机就是全速运转。
到这里,关于换相逻辑的部分都已经说明白了,那么我们怎么具体去实现呢?
N76E003其实为电机驱动做好了充分的准备,人家芯片硬件都弄的好好的,我们只需要把这些硬件驱动起来便是了。。。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-1 11:50 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-1 17:36 编辑

线路图.png
好了,现在线路图来了。
为了降低难度,这里,输出驱动直接采用了EG2132,样品店也就是几毛一个,耐压300V,驱动典型的中低压无刷控制器MOS管没有压力,大家注意一下各路驱动的接法,按照AH-AL-----CL,跟着003的PWM5----PWM0顺序来的,这个顺序弄好了,做换相表什么的都清楚明白,乱了不是不可以,但是这个换相表你的脑子再转几个弯才成。同样道理,Ha、Hb、Hc的输入,分别对应P17--P15。
也是同样道理,这里也是有讲究的,先解释为什么霍尔是这样选择的:
我们开始就说了,霍尔信号,用中断处理最方便,N76E003也很好的为我们准备了这个功能,那就是003的管脚中断功能,由于003管脚中断编组只能成组进行,所以,当我们准备用多个管脚中断时候,则必须是在同一个P口,这里根据已经占用的PWM等端口,最合适的就是P1.7-P1.5共三个端口,同时这里还可以留出P1.3端口作为刹车信号输入中断。霍尔管脚分配这里确定了,下面再看AH--CL驱动端口的分配。
我们知道,正常的电机运转过程,各路带换相信号的PWM驱动,占空比是一致的,只是各路PWM分别根据输出逻辑输出就成了。
这方面,N76E003也给我们准备的好好的了。
看看官方对于N76E003PWM部分的数据:
6路,同频率,不同占空比,可以互补也可以独立输出,如果占空比一样,可以进入编组模式(看看,连快捷方式都给我们准备好了)。
最重要的,芯片对于PWM应用有这样一个功能,看看官方说明书上面怎么说来着:
输出掩码控制  17.1.4
通过软件设置PWM的掩码寄存器可以屏蔽每个通道的PWM信号,PWM掩码输出功能广泛应用于电子换向电机如直流无刷电机BLDC。PMEN寄存器包含6位掩码使能位,每个掩码使能位掩码使能各自的PWM通道。PMEN的默认值为00H,即所有PWM通道输出都不掩码。注:掩码电位按照PMD设定值决定,并不受PNP寄存器影响。
PMEN5  PMEN4  PMEN3  PMEN2  PMEN1  PMEN0
读/写    读/写     读/写    读/写    读/写     读/写
PMENn  PWMn输出掩码使能位
0 = PWMn 信号输出
1 = PWMn 根据PMDn设定的电位值掩码

看到了没,我们只需要设置好6个PWM,并直接采用编组模式,采用H L 二个占空比寄存器,就可以控制全部占空比。
然后,我们只需要做好换相表格,然后,在霍尔中断到来时候,查表,将查到的数,直接填入掩码寄存器PMEN就完成了换相的所有动作。只有掩码允许输出的PWM端口,才会有输出,而不允许输出的,则根据我们的驱动逻辑,填充0或者1,很显然,这里我们芯片采用的是正逻辑,则填充的掩码就为低电平。这个,在另外一个叫做PMD的寄存器里面设置就可以了。
细心地可能发现了,掩码逻辑PMEN寄存器位=0时候,该路有PWM驱动输出,而我们开始讲解换相表时候,用的好像是正逻辑吧,这很简单不是,我们把前面定义好的换相表格内容,位取反后填进去就万事大吉了不是?.......

使用特权

评论回复
tianxj01|  楼主 | 2019-11-1 11:50 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-3 10:17 编辑

下面解析一下P3.0和外面电位器的作用,想必如果我不特意说明,大家基本上也已经猜到,这个应该就是调速电位器了,没错,就是这个,在电动车上面,为了提高寿命和可靠性,这个采用的不是电位器,而是一个转把,里面呢,是一个装了磁铁和霍尔元件的东东,随着转把角度变化,则霍尔可以输出0-5V的转把电压,我们作为学习,这里直接采用了电位器,转动电位器,N76E003的AIN1脚就可以获得0-5V的输入电压,编程时候,我们必须打开N76E003的ADC,在主函数里面,通过查询,读取AIN1的电压,并根据电压,即时调整PWM0H和PWM0L,由于上面已经说过,PWM6个通道设置为编组模式,则只需要实时更新PWM0H和PWM0L,就可以完成所有PWM调制工作了。这里关于转速信号ADC和PWM关系,我们着重讲3个方面需要注意的地方:
1、为了防止电位器底部有接触电阻导致电位器到最低位置输出不为0,我们设计ADC采集结果和输出对应的PWM值,必须设置一个死区,比如10个bit。在10个bit值下面,统一视为0,只有超过10单位,才根据ADC结果,增加PWM输出占空比。
2、假如,我们采用的是16MHz内部高速时钟,PWM输入时钟就高速时钟,不分频则我们对PWM初始化时候,而一般建议电机PWM调速的基频在20KHz左右,则PWMPH+PWM=800,实际PWM是输出频率就等于20KHz,则PWM最小占空PWM0H+PWM0L必须设置为0,当电位器在最低位置(包括电位器死区)时候,PWM实际上是没有输出的,为低电平,这时候,哪怕我们的换相逻辑按照霍尔查表已经给出了正确的掩码,N76E003的任何一个PWM端口实际输出还是0,只有当从PWM0L被加上1开始,对应的端口才会有PWM驱动输出,这样就实现了电机停止不需要进行特别处理,该有的换相中断初始化就可以全部开通,中断动作也完全一样。
3、根据上一条同样条件,则PWM最大占空比只能设置为794而不是800,因为我们电机输出高边驱动是采用的浮栅自举模式,则很明显,最大占空比如果是800,而不带有一定宽度的方波,则上管自举就会失效。一般我们将该最大值设置为最大占空比的99%即可,所以,这里最大占空比就只能是794。当然这个数据只是一个经验,理论上只需要在某个值,上管能够很好的驱动起来而不会异常就行,当然,你最好还是留点余量,否则也许批量做的时候,某台机器就会不正常了。
到这里,关于电机转动、霍尔信号处理、换相逻辑、调速相关的程序控制原理和方法就已经讲完了。
//==========================================================
下面在根据线路图,讲一下更多和电机运行其他相关连的部分。
线路图,只连接了最基本的转动调速几个IO口,如果我们正常做一个控制器,好像还不够吧?对的,别的不说,至少刹车断电还没有不是?保护呢?也没有,而且线路图上面,单片机编程端口、RESET、供电、退偶都没处理。我提供的图纸画成这样,是为了大家能更清楚的看明白电机驱动最基本的IO结构而特意省略的。实际做板子时候,大家自己加上就成了。

1、刹车信号
刹车信号,像电动车常见的为常高,刹车动作变低电平的,当然也也别反过来的,这里我们只需要把刹车信号接到P13,设置好刹车信号是高电平刹车还是低电平刹车,然后等中断发生,刹车就是把所有的PWM全部变成0,这就是一个最基础的刹车断电系统了。

2、过流保护
线路图到现在还留了一个P1.4端口,一直没用,这可不是随便留的,这里,该端口同时是PWM驱动的FB端口,也就是内部硬件刹车端口,当N76E003内部刹车使能,则该端口在接受到超过门限电平8个机器时钟周期长度时候,将自动启动内部硬件刹车,所有PWM端口都会按照刹车逻辑设置的电平直接动作,同时停止所有PWM动作,详细的关于PWM刹车功能,请参照官方说明书故障刹车  17.1.5 部分。
到这里估计好多人已经明白了,这不就是保护端口嘛,过流保护,而且自带数字滤波,对抗PWM边沿干扰无需外来其他措施,直接放大了用就是了。一个采样电阻直接采集干线电流,一个几十倍的放大器,接到该端口,开启N76E003硬件刹车和刹车中断,写入相应的代码,就OK了。

到这里,一个可以实际应用的BLCD驱动板已经全部介绍完了,同时也已经非常明确的把程序的方法、思路都介绍完了。下面,就给出可以实际应用的线路图,该线路图包含上面说到的所有部分。
裁剪.png
这里添加了上一个图没有的N76E003供电、退偶、编程接口,也添加了完整的输入输出接口。
和上个图有明显区别的是,去掉了一个7812,增加了一个由Q7以及外围组成的RCC,非隔离降压DC-DC。目的明确,提高供电适用范围,提高输入电源利用效率,该部分线路完整的放在一起,原理也很简单,大家可以自行分析。这里开关管直接采用TO-92封装的13003,变压器采用电动车控制器里面通用的EE13变压器,型号为EE13-YF12V或者 EE13**12什么的,都是电动车控制器用。某宝上面就有卖的,很便宜。
增加了一个LM321组成的反相放大器放大电流采样信号,限流后送N76E003硬件刹车采样端,图示参数放大倍数为25倍多点,如果采样电阻是10毫欧,则控制阈值大概10A左右,由于芯片具有数字滤波器功能,因此这里反相放大器基本上不需要低通什么的处理手段就可以直接送出放大信号给芯片采样。
这里C5C6需要着重说明一下,在驱动功率比较大时候,电容必须采用低内阻的高频电解,而不能用普通电解电容,否则很容易发热鼓包,图里面标称耐压为50V,适用48电压的时候,随着电压提高这个耐压也必须提高,这个就不用说了吧。
关于几个输出输入端口:
其中、编程接口就不介绍了,反正和官方NU-LINK输出接口顺序一样就是了。
霍尔接口一般就是5个,5V--三个霍尔--GND。
电机3根线不用说也看得明白接在UVW3个OUT端子。
电源由POWER端子接入,正式线路图修改了供电范围,可以工作到60V(铅酸蓄电池的60V标准)。
授人以鱼不如授人以渔,所以,本文会提供具体的思路和资料,但是并不会直接提供拿来就用的SCH、PCB,这个相信大家能够理解,真想掌握这些知识的,自己动手做一遍,和直接拿来,意义是完全不一样的。
关于软件方法、思路和硬件部分,就讲解到这里,下一节,将会就程序具体的编程、初始化、中断进行详细的分析。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-1 11:50 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-3 17:09 编辑

先贴一个用于上面线路图的完整的换相表:

volatile u8 code SWITCH_TAB[]={0xED,0xF6,0xE7,0xDB,0xF9,0xDE};

接着给出程序流程和各种初始化选项:

程序.png

程序只考虑了一个方向旋转,如果你会一个方向旋转,则逆转只是更改一个换相表而已,具体的,就留给各位自己去完成了,线路图上还有空余的端口,可以作为正反方向选择端口。
这里刹车只采用了断电模式,事实上,断电模式是配合着机械刹车系统来同步实现的,以达到快速制动的目的。
在实际的电动车控制器上,可以采用EABS,电子刹车模式来进行电子刹车,其原理为根据霍尔相位,反相驱动电机转动,以实现快速刹车的目标,这个在电池供电系统,由于可以将刹车产生的能量通过电池充电来吸收掉,因此,想做EABS功能的,必须注意,供电必须是双向电源,可吸收也可释放电能给控制器,如果是普通电源,你就必须另外设计一套能耗系统来消耗EABS产生的能量,否则将可能损坏控制器板子和电源本身。
至于无霍尔系统,则属于高级应用,其实也就是上面程序功能的高级版本而已,这个在以后有机会再讨论吧。
上面的线路已经是可以正常工作的电路了,也许你还可以增加什么钥匙断电、低功耗、自学习等真正的电动车控制器功能,这些都不在本帖子研究范围了,增加驱动功率的,请注意管子的功耗和散热。
同时也请不要索取PCB和源代码,本帖子的目的就是供大家理解后去学着做出来一个这样的东东,伸手党请绕道..................
好了........这个连载,到这里就结束了,上面所有内容,均为本人原创,如有转发,请注明出处。
对于帖子范围里面或者外面的内容有不理解或者有不同看法的,欢迎跟帖.........................
吐槽一下,一个一个码字,做图片很辛苦的,这个板块好像管理的都睡觉了一样,怎么说也该给个表示不是?这板块以后还.............

使用特权

评论回复
somexu| | 2019-11-1 19:18 | 显示全部楼层
这么好的贴子必须支持,谢谢楼主分享,我一定跟下去

使用特权

评论回复
00750| | 2019-11-2 10:59 | 显示全部楼层
好贴必须顶起来!!!

使用特权

评论回复
tianxj01|  楼主 | 2019-11-4 08:30 | 显示全部楼层
本帖最后由 tianxj01 于 2019-11-4 08:52 编辑
最后,留下一个思考题:


根据带PWM驱动的三相半桥时序图,大家可以发现,当上管驱动起来后,下管是截止的,下管驱动起来,则上管是截止的。
而UVW分别是一个Y型接法的电机三相,我们看第一个60°部分,PWM方波在AH和BL有输出,也就是该时刻,实际上是U-V有PWM电压,当PWM低电平截止toff时刻,电机线圈U-V是一个串联电感,必须续流,这时候是靠截止的AL对应的下管和BH对应的上管的体二极管来进行续流的。
由于我们6个端口都可以独立控制,那么用什么样的驱动,可以实现续流时候,可以让续流的管子不是靠体二极管而是靠导通来完成,参考一般半桥实施同步整流概念的典型做法,那就是半桥带死区互补应该就可以了,这样带来的好处应该是很明显的,续流时刻,管子功耗可以进一步降低。
那么如果想实现这样的效果,具体的到程序里面,驱动该怎么设置,时序又变成怎么样了呢?该怎么做才能正确的实现该目的。


使用特权

评论回复
评论
mldse 2022-10-8 15:10 回复TA
在6个MOS各加1个续流二极管,可以减轻MOS的发热量 
zhuotuzi| | 2019-11-4 09:00 | 显示全部楼层
是的,没有原理配合,那真难懂。

使用特权

评论回复
rgbgirl| | 2019-11-4 09:45 | 显示全部楼层
感谢楼主分享,这也是非常宝贵的经验。

使用特权

评论回复
somexu| | 2019-11-6 10:59 | 显示全部楼层
谢谢楼主热心分享

使用特权

评论回复
643757107| | 2019-11-6 15:37 | 显示全部楼层
围观楼主大作。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-7 10:23 | 显示全部楼层
最后一波操作还是21姨小管家在干活,这板块的堂主,估计都忙着推销芯片去了..................

使用特权

评论回复
631717730| | 2019-11-7 13:33 | 显示全部楼层

使用特权

评论回复
wwj868| | 2019-11-19 16:19 | 显示全部楼层
谢谢楼主分享

使用特权

评论回复
叶春勇| | 2019-11-22 21:23 | 显示全部楼层
tianxj01 发表于 2019-11-4 08:30
根据带PWM驱动的三相半桥时序图,大家可以发现,当上管驱动起来后,下管是截止的,下管驱动起来,则上管 ...

都是干货,顶贴

使用特权

评论回复
wanduzi| | 2019-11-22 22:44 | 显示全部楼层
三相无刷电机,666.
75N75

使用特权

评论回复
wanduzi| | 2019-11-22 22:45 | 显示全部楼层
75N75挺大的。

使用特权

评论回复
tianxj01|  楼主 | 2019-11-23 09:19 | 显示全部楼层

你好像没看见出现在这个版块嘛。
看都看了,来几块板砖呗。。。。。。。。。。。。。。
找找茬,看有没有疏漏的地方。

使用特权

评论回复
评论
power2019 2021-1-30 15:24 回复TA
电源自举好像有点问题 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

3210

帖子

87

粉丝