电动车无刷马达控制器硬件电路详解/软件设计详解
作者:谢渊斌 原作发表在《电子报2007年合订本》下册
版权保留,转帖请注明出处
硬件电路详解
电动车无刷电机是目前最普及的电动车用动力源,无刷电机以其相对有刷电机长寿,免维护的特点得到广泛应用,然而由于其使用直流电而无换向用的电刷,其换向控制相对有刷电机要复杂许多,同时由于电动车负载极不稳定,又使用电池作电源,因此控制器自身的保护及对电机,电源的保护均对控制器提出更多要求。
自电动车用无刷电动机问世以来,其控制器发展分两个阶段:第一阶段为使用专用无刷电动机控制芯片为主组成的纯硬件电路控制器,这种电路较为简单,其中控制芯片的代表是摩托罗拉的MC33035,这个不是这里的主题,所以也不作深入介绍。第二阶段是以MCU为主的控制芯片。这是这篇文章介绍的重点,在MCR版本的设计中,揉和了模拟、数字、大功率MOSFET驱动等等许多重要应用,结合MCU智能化控制,是一个非常有启迪性的设计。
今以应用最广泛的以PIC16F72为智能控制中心,350W的整机电路为例,整机电路如图1:
图1:350W整机电路图
整机电路看起来很复杂,我们将其简化成框图再看看:
图2:电路框图
电路大体上可以分成五部分:
一、电源稳压,供应部分;
二、信号输入与预处理部分;
三、智能信号处理,控制部分;
四、驱动控制信号预处理部分;
五、功率驱动开关部分。
下面我们先来看看此电路最核心的部分:PIC16F72组成的单片机智能处理、控制部分,因为其他电路都是为其服务或被其控制,弄清楚这部分,其它电路就比较容易明白。
图3:PIC16F72在控制器中的各引脚应用图
我们先来简单介绍一下PIC16F72的外部资源:该单片机有28个引脚,去掉电源、复位、振荡器等,共有22个可复用的IO口,其中第13脚是CCP1输出口,可输出最大分辨率达10BIT的可调PWM信号,另有AN0-AN4共5路AD模数转换输入口,可提供检测外部电路的电压,一个外部中断输入脚,可处理突发事件。内部软件资源我们在软件部分讲解,这里并不需要很关心。
各引脚应用如下:
1:MCLR复位/烧写高压输入两用口
2:模拟量输入口:放大后的电流信号输入口,单片机将此信号进行A-D转换后经过运算来控制PWM的输出,使电流不致过大而烧毁功率管。正常运转时电压应在0-1.5V左右
3:模拟量输入口:电源电压经分压后的输入口,单片机将此信号进行A-D转换后判断电池电压是否过低,如果低则切断输出以保护电池,避免电池因过放电而损坏。正常时电压应在3V以上
4:模拟量输入口:线性霍尔组成的手柄调速电压输入口,单片机根据此电压高低来控制输出给电机的总功率,从而达到调整速度的目的。
5:模拟/数字量输入口:刹车信号电压输入口。可以使用AD转换器判断,或根据电平高低判断,平时该脚为高电平,当有刹车信号输入时,该脚变成低电平,单片机收到该信号后切断给电机的供电,以减少不必要的损耗。
6:数字量输入口:1+1助力脉冲信号输入口,当骑行者踏动踏板使车前行时,该口会收到齿轮传感器发出的脉冲信号,该信号被单片机接收到后会给电机输出一定功率以帮助骑行者更轻松地往前走。
7:模拟/数字量输入口:由于电机的位置传感器排列方法不同,该口的电平高低决定适合于哪种电机,目前市场上常见的有所谓120°和60°排列的电机。有的控制器还可以根据该口的电压高低来控制起动时电流的大小,以适合不同的力度需求。
8:单片机电源地。
9:单片机外接振荡器输入脚。
10:单片机外接振荡器反馈输出脚。
11:数字输入口:功能开关1
12:数字输入口:功能开关2
13:数字输出口:PWM调制信号输出脚,速度或电流由其输出的脉冲占空比宽度控制。
14:数字输入口:功能开关3
15、16、17:数字输入口:电机转子位置传感器信号输入口,单片机根据其信号变化决定让电机的相应绕组通电,从而使电机始终向需要的方向转动。这个信号上面讲过有120°和60°之分,这个角度实际上是这三个信号的电相位之差,120°就是和三相电一样,每个相位和前面的相位角相差120°。60°就是相差60°。
18:数字输出口:该口控制一个LED指示灯,大部分厂商都将该指示灯用作故障情况显示,当控制器有重大故障时该指示灯闪烁不同的次数表示不同的故障类型以方便生产、维修。
19:单片机电源地。
20:单片机电源正。上限是5.5V。
21:数字输入口:外部中断输入,当电流由于意外原因突然增大而不在控制范围时,该口有低电平脉冲输入。单片机收到此信号时产生中断,关闭电机的输出,从而保护重要器件不致损坏或故障不再扩大。
22:数字输出口:同步续流控制端,当电流比较大时,该口输出低电平,控制其后逻辑电路,使同步续流功能开启。该功能在后面详细讲解。
23–28:数字输出口:是功率管的逻辑开关,单片机根据电机转子位置传感器的信号,由这里输出三相交流信号控制功率MOSFET开关的导通和关闭,使电机正常运转。
有了智能化的控制中心,就需要有其它电路来为其服务,我们在这里从头开始介绍。
一、电源部分
见图4:
控制器有三组电源,第一组当然是提供总能源的电池,板子上的电解电容C1:1000μF,63V)C11:47μF,63V及C13,C33:0.1μF63V是退耦用的,用于消除由于电源线、电路板走线所带来的电阻、寄生电感等引起的杂波干扰,由于工作在大电流、高频率、高温状态下,特别对电解电容有损耗角小、耐高温的要求,普通的电解电容容易发热爆裂。
第二组电源提供12-15V的电压,这组电压主要提供给MOSFET的开通电压,由于场效应管的驱动要求比较特殊,必须有10V以上20V以下的电压才能很好导通,所以必须有合适的电压供给,同时该组电压也为后面5V稳压块提供预稳压。这组电压由LM317提供,输出大约13.5V。由于LM317的输入输出压差不能超过40V,而输入电压可能高达60V,因此在前面加了一个330Ω,2W的电阻,既预先降压,又替317分担了一部分功耗。
第三组电源是5V,由LM78L05提供,由于78L05提供的最大电流只有100mA,所以另并联了两个1.5K的电阻以扩流,同时也分担一部分功耗。在整个系统中,对5V电源的要求比较高,不单单是因为逻辑电路,MCU等的电源电压都不能过高,而且由于MCU的所有AD转换都是以5V电压为基准,所以当5V不准时会出现电流,欠压值,手柄控制等均不能达到设计要求的情况,甚至不能动作,因此该电压的范围应被严格限制在4.90-5.10V之间。
二、信号输入与预处理部分
这部分电路包括电源电压输入、工作电流比较,放大输入、手柄电压输入、电机转子位置传感器的霍尔信号输入、刹车信号输入及各种其它功能开关信号输入等。
1.电源电压输入:由于MCU只接受0-5V的信号,所以电源电压必须经过分压才能输入MCU。
2.工作电流放大、输入:电路如图5
图5:略
U3A是一个放大电路,它将康铜丝R55采样过来的电流信号经过6.5倍放大送入单片机。最早的设计在R23上并联了一个0.1μF的电容组成低通放大器,后来为了更好地实时检测电流,将该电容去掉,这样放大后的电压和电流的实际变化基本一致以便MCU采样值更接近于实际值。
U3B是一个比较器接法,实际也是一个比较器,正常时的电流绝对不会让该比较器翻转,当电流由于某种原因突然增大到一定程度,该比较器翻转从而触发单片机的外部中断,单片机就会完全关闭电机的输出进入保护状态,避免故障进一步扩大。
这里有人会问,为什么放大器的放大倍数取得这么小,如果放大倍数再大一点的话,单片机经过AD转换后的数字相对比较大,分辨率可以做得比较高,何乐而不为呢?这种想法是有道理的,但是限于LM358的频率响应不够高,15KHZ(PWM的工作频率大约为15.6K)的方波经358放大之后变成梯形波了,我们目前对电流峰值的采样应当采取梯形波的上边,如果放大倍数过大,梯形波的上边就会变得很窄而使单片机采样困难,甚至采样错误,比如采样到梯形波的斜边,因而不能正确反映电流的实际大小,这就会导致电流控制的紊乱。所以宁愿放大倍数取小点以保证采样位置的准确无误。
图6:略
3.手柄输入部分:手柄输出的电压范围在1.2-4.2V的范围内,经过阻容滤波后输入到单片机处理。手柄需要一个5V的电源才能工作。
图7:略
4.电机转子位置传感器输入部分:由于该传感器安装在电机内部,采用开路输出的办法,所以除提供5V电源外,每个传感器都必须接上拉电阻,并对其输出的信号进行阻容滤波以抗干扰,同时在电源处接二极管、接地采用细铜膜做保险丝,防止电机相线与霍尔信号线短路后高电压反串近来损坏板子上别的零件。
图8:略
5.刹车信号输入:由于刹车信号开关往往和刹车灯共用一个开关,每个厂商的刹车电压也不统一,所以必须接入二极管防止高压串入。高电平输入部分,要做到8-50V输入时都能正常工作。
6.其它功能开关信号比较简单,功能实现均依靠内部程序实现,在硬件中就不一一介绍。
三、智能信号处理,控制部分,上面已经介绍过,不再重复。
四、驱动控制信号预处理部分;
驱动控制信号大致由两种信号合成:PWM信号和相位逻辑开关信号,这里不得不先介绍一下功率开关部分:功率开关部分是由三组半桥开关组成的三相开关,用以改变电机线圈的通电顺序和通电方向,我们一般把与电源正相接的功率管称为上桥,与电源地相接的功率管称为下桥,参考图一,上桥的相位逻辑开关信号由A+、B+、C+提供,这三个控制信号必须与PWM信号合成后控制对应的上桥,下桥的相位逻辑开关信号由A-、B-、C-提供,基本上直接被用来控制下桥的开关。单片机这六个脚上都接了一个2.2K-10K的电阻到地,是为了防止单片机处在复位时,由于这些脚均处于高阻状态,有可能会引入干扰信号而导致后面逻辑电路误动作,这个比较简单,但是我们现在看到控制部分的电路图并非上面所说的那么简单,实际电路中间弯弯绕绕经过了4个逻辑电路处理后才到达上下桥的驱动电路,许多朋友会问:为什么要如此复杂呢?
其实这些电路都是为了实现一个功能:同步续流。
为什么要同步续流
需要说明一下,这里的“同步续流”,被一些人称为“同步整流”,同步整流是用在电源上的名词,用在这里明显不太合适。
先参考图9
图9:同步续流示意图
假设此时A相上桥和C相下桥通电,当A相上桥PWM占空比没有达到100%时,通过电机线圈的电流是断续的,但上桥关闭的时候,由于电机线圈是一个电感,线圈上必定会出现一个自感反电动势,这个反电动势必须维持线圈电流的方向不变,由于A相上桥已经关闭,这个电流就会通过原来已经开通的C相下桥,地,A相下桥的续流二极管继续流动,见图6。当总电流小时这个自感电流并不大,但总电流大时,线圈中储存的能量多起来,这个自感电流也会相当大,我们知道MOSFET的续流二极管本身的压降大约在0.7-1V,在通过的自感电流大时,功耗便会相当大,假设自感电流为10A,二极管压降为0.7V时,功耗为7W,显然这个发热量是相当大的,这时下桥便会变得很烫,假如我们此时把下桥打开,让自感电流直接从MOSFET的沟道里走掉(MOSFET导通时电流可以双向流通),再假设MOSFET导通电阻RDSON=10mΩ,10A的时候功耗就变为1W,理论上就可以大大降低下桥的功耗,从而降低温升。但在实际上,由于上下桥在交叉导通时需要一个死区以避免双管直通造成电源短路,这个作用会打一些折扣,不过效果还是很明显。这也是为什么很多产品的下桥会用好一点的管子的原因。
同步续流的实现
1.倒向,截波与死区控制,
电路见图10
图10:倒向,死区发生器.略
单片机产生的PWM占空比信号一路通过与门,经R53,R52,C71截波(缩小占空比)后输出,相位不变,截波量大约为1.5μS,形成PWM信号,此路输出至上桥驱动,与上桥逻辑开关信号相与后驱动上桥MOSFET。另一路经R57和C24,反相器U5A移相,相移量大约750nS,再经U5B反相,形成PWM-信号,最后合成至下桥驱动。此时两个信号输出时相位相同,但PWM-信号占空比比PWM信号占空比大1.5μS,但由于PWM-信号已经偏移750nS,所以PWM信号刚好套在PWM-信号中间,两边空出750nS作为MOSFET开关的死区。
处理后波形示意图如图11
图11:死区发生器输出波形
2.同步续流的逻辑关系
图12为A相驱动电路的实际电路
图12
因为三相驱动相同,所以我们这里仅以A相为例说明同步续流功能的实现过程
当A向的逻辑开关信号“A+”为高电平时,A相上桥被“PWM”信号驱动,在整机电流较小的情况下,PV信号为高电平,不管或非门U3C其它两个输入脚电平如何,其输出总是低,所以此时或非门U2B仅受“A-”信号控制,“A-”信号是下桥的逻辑开关,它仅在下桥需要导通时置高,平时为低。当整机电流比较大,而PWM占空比小于100%时,由于A相上桥在PWM间隙关断导致电机线圈中出现较大感应电流,感应电流通过另一相的下桥和A相下桥的二极管泄放,为降低该二极管的功耗,此时应将A相下桥MOSFET打开以减小压降,这时单片机将“PV”信号端拉低,在PV信号和反向后的“A+”信号共同作用下,“PWM-”信号通过U3C传递到U2B,而此时由于“A-”为低,所以U2B受“PWM-”信号控制,在PWM信号关断的间隙使下桥MOSFET导通。当“A+”信号为低电平时,“PWM-”信号并不影响下桥,保证了下桥的正确逻辑而不会误导通。
五、功率驱动开关部分。
以单独一组A相上下桥驱动为例,见图12
见了这种电路,很多人首先会问:为何上桥的驱动电路如此复杂?
很显然,这么复杂的电路一定有其用途,如果要简单一点话,上桥的功率开关直接用P沟道的MOSFET来做就可以,这样驱动电路会简单很多,但P沟道的功率MOSFET又贵又难买,为了节省成本,只能用N沟道的代替,但N沟道的MOSFET导通时其栅极G的电压必须比源极S高出10V以上才能保证完全导通,这样在上桥导通时,假设电源电压为48V,那么上桥G极的电压就必须比电源电压高12V,也就是大于60V才行。但怎样获得比电源电压还高的驱动电压呢?一般情况可以通过变压器耦合驱动信号,电荷泵升压提供高压等方法,而在这里,则采用了一种叫做“高压浮栅型驱动电路”来驱动上桥。
顾名思义,浮栅驱动的栅极是浮动的,这是一个很形象的描述,我们根据线路图来分析一下栅极是怎样“浮动”起来的
我们先看一下C5的接法,这是整个驱动的关键所在,C5正极通过二极管接到13.5V电源(实际在13.5V左右),负极很奇怪地接到电机的相位线,与它所驱动的MOSFET V1的源极接在一起,在电机不动的情况下,所有的MOSFET关闭,此时C5通过二极管D1,电阻R40充电至接近13.5V,当A+和PWM的合成信号使U4A的3脚输出高电平时,q1导通带动t1导通,这样12V多的电压就会加到V1的栅极使V1导通,而V1导通使电源电压加至负载,也就是V1的源极电压会升高至48V,而此时由于C5充满电,C5上的电压仍然是12V,所以可以维持t1的导通并使V1栅极的电压始终保持高于VCC,这样V1的栅极就好像随着源极电压浮动而浮动,所以叫做“浮栅驱动”。这时如果U4A的3脚一直维持高电平的话,在电容k1和MOSFET本身GS间电容充饱电之后,C5上的储存的电荷主要通过t1的BE结,电阻a1到三极管q1放电(由于此时二极管D7处于正偏状态,所以t2的BE结反偏而截止,因此t2并不参与放电),如果C5足够大,那么可以在相当长的一段时间内保证V1的驱动电压在合理的范围内。这里b1放在q1的射极上组成一个近似恒流的驱动电路,用以保证在C5正极电压升得很高时,通过三极管q1的放电电流不致过大而导致电容很快放完。当U4A的3脚输出低电平时,q1,t1迅速关闭,t2开始导通,将k1和栅极本身积累的电荷迅速泄放,V1被关闭,而此时由于另两组中的一组之下桥维持在导通状态,电容C5就会通过电机绕组和该下桥迅速充电补充电能,为下一个周期做准备。
从上面的过程可以看出,电容C5的充电量应该是越大越好,但电容大了,可能二极管来不及给电容充电,电容小了,又不能保证导通时间,所以这种驱动不能使V1长时间维持在导通状态,这也是为什么PWM信号要耦合到上桥的一个原因。
其次对于这个驱动电路有人还会产生一个疑问:按理说用作功率开关的MOSFET,为了减少开关损耗,应尽量避免MOSFET工作在放大状态,按照这个原则,驱动MOSFET的电平应该是快速上升、快速下降,而且这个速度是越快越好,但此电路中增加了电阻e1、e2,电容k1、k2,这四个元件在这里的作用显然有悖于快升快降的原则,实际上这四个零件在电路中的作用也确实是有意减慢MOSFET的开启速度,使驱动MOSFET的电压波形上升沿没那么陡峭,为什么要这样做呢?
这个要从MOSFET的结构来看,MOSFET本身各极之间存在极间电容,这个电容被称为密勒电容。而我们现在这种上下桥类似推挽结构的电路,上桥导通时,由于下桥漏极的电压急剧升高,这种电压变化会通过下桥的密勒电容传递给下桥的栅极,我们把上桥导通时下桥漏极电压升高的速度以Δv/Δt表示,当Δv/Δt足够大时,传递给下桥栅极的电荷便会积蓄到足以使下桥导通的地步,这样就会导致上下桥直接将电源短路,而解决这个问题最简单的办法,就是让上下桥开通的速度不要那么快,所以加上阻容延时,并且这里的k1,k2还有吸收部分冲击电压的功效,这里就不多做描述了。
————————————————————–
软件设计详解
本文以MICROCHIP 公司所生产的PIC16F72为基础说明软件编程方面所涉及的要点,此文所涉及的源程序均以PIC的汇编语言为例。
由于软件不可避免需与硬件相结合,所以此文可能出现硬件电路图或示意图。
本文适合在单片机编程方面有一定经验的读者,有些基础知识恕不一一介绍。
我们先列一下电动车无刷马达控制器的基本要求:
功能性要求:
1.电子换相
2.无级调速
3.刹车断电
4.附加功能
a.限速
b.1+1助力
c.EBS柔性电磁刹车
d.定速巡航
e.其它功能(消除换相噪音,倒车等)
安全性要求:
1.限流驱动
2.过流保护
3.堵转保护
3.电池欠压保护
4.节能和降低温升
5.附加功能(防盗锁死,温升限制等)
6.附加故障检测功能
从上面的要求来看,功能性要求和安全性要求的前三项用专用的无刷马达驱动芯片加上适当的外围电路均不难解决,代表芯片是摩托罗拉的MC33035,早期的控制器方案均用该集成块解决。但后来随着竞争加剧,很多厂商都增加了不少附加功能,一些附加功能用硬件来实现就比较困难,所以使用单片机来做控制的控制器迅速取代了硬件电路芯片。
但是硬件控制和软件控制有很大的区别,硬件控制的反应速度仅仅受限于逻辑门的开关速度,而软件的运行则需要时间。要使软件跟得上电机控制的需求,就必须要求软件在最短的时间内能够正确处理换相,电流限制等各种复杂动作,这就涉及到一个对外部信号的采样频率,采样时机,信号的内部处理判断及处理结果的输出,还有一些抗干扰措施等,这些都是软件设计中需要再三仔细考虑的东西。
PIC16F72是一款哈佛结构,精简指令集的MCU,由于其数据总线和指令总线分开,总共35条单字指令,0-20M的时钟速度,所以其运算速度和抗干扰性能都非常出色,2K字长的FLASH程序空间,22个可用的IO口,同时又附加了3个定时/计数器,5个8位AD口,1个比较/捕捉/脉宽调制器,8个中断源,这些优异的性能为电动车控制器控制提供了良好的硬件环境和软件基础,一经推出就赢得众多设计人员的热捧。
那么如何使用PIC16F72来设计一个电动车控制器呢?我们下面以目前市面流行的硬件设计为基础,尽量通俗易懂地介绍一下程序设计思路和注意点。
要使无刷电机转起来,并且听从驾驶者的调速、刹车等基本指挥,最基本的要求就是要实现硬件所能实现的电子换向和调速,刹车等功能。实际上软件的整体设计也和硬件一样,也是一个模块化堆砌的过程,问题在于模块的合理化堆砌,使堆砌后形成的整体能够坚固,协调、高效率运作。我们先说一说各种模块功能的简单实现,然后再来讨论如何使这些模块协调运转。
1.首先说说电子换相模块
我们知道,直流永磁电机在运转时需要一对电刷和与线圈相对应的换向整流子来使线圈中的电流方向根据磁场方向来不断改变,从而转子持续向一个方向运转,我们称这种电机为有刷电机,在电动车刚刚面世时一般均使用这种电机,但有刷电机有一个致命的缺陷,就是用作电刷的碳刷非常容易磨损,换向整流子也非常容易被油污,碳刷碎屑填满空隙而漏电,而且功率越大,这种毛病越严重,导致有刷电机维护量和故障率急剧上升,严重影响其推广,因此在较大功率的场合,无刷电机应运而生。
无刷电机,顾名思义就是没有了电刷,不能自动换向,因此要依靠传感器检测转子的位置、用电子开关来改变线圈中电流的方向,所以其控制器要对转子永磁体位置进行精确检测,并用电子开关切换不同绕组通电以获得持续向前的动力。转子位置检测传感器有很多,比如光传感器,磁感应传感器等,电子开关可以用大功率三极管、功率型场效应管、IGBT等制作,在目前的绝大多数电动车三相无刷电机中均使用三个开关式的霍尔传感器检测永磁体相对于定子线圈的位置,控制器跟据三个霍尔传感器输出的六种不同信号输出相应的控制信号驱动功率型场效应管(MOSFET)组成的电子开关向马达供电。这就是所谓六步换相法。从电机原理可以看出,这种电机是一种特殊的同步电机,因此换相必须及时,否则会导致电机失步,从而使电机噪音增大,效率降低,严重的还会导致控制器,电机烧毁。
鉴于以上要求,我们先必须测一下市面上普通的无刷马达在最高转速时(考虑到顺风和下坡的情况)的换向情况,这个比较简单,用示波器测量之后得到在最高速时每相霍尔传感器输出的频率大概在140HZ左右,折合到换向的最小时间,那么应该是1.2mS左右换相一次,根据际的使用效果,软件的反应时间必须在0.12mS左右,也就是说在检测到换相信号的改变并且输出换相驱动信号时的过程必须在0.1-0.2mS之内完成。
另一个需要考虑的是,电机驱动是一个大电流驱动,又是一个电感性负载,控制器在运行时不可避免有干扰引入,因此除了在硬件布局,布线上注意外,软件上也要做相应的抗干扰措施以避免错误的换向动作。考虑到输入到单片机的换相信号容易受干扰,加上线路上滤波电容的影响,单片机程序在读取换相信号时应至少连续读取3次,以3次信号完全一致时才采用该值作为换相信号的真值,如果其中一次不对,那么干脆就重新再读3次,这就是一个有抗干扰措施的鉴相过程。取得换相信号后,我们将其与上次读到的值做对比,如果相同,则表示没有换相,如果不同,则要跟据这个值去取得一个相对应的驱动信号,从而驱动电子开关动作。这个过程可以使用逐项比较法,查表法等来实现。鉴于查表法比较快捷,一般使用查表法。其中需要考虑的是,一旦获得的信号与所有的六个信号都不相同,可能表示电机中霍尔元件或者其连接线路出现故障,此时我们应该让电机断电以避免误操作。
市面上有两种电机,即所谓的120°和60°霍尔信号,这个角度代表三个霍尔器件输出的三相电信号其相位角相差的角度,其实这里面的区别仅仅是电平的不一样,在马达内部的安装上,位置没什么不同,只是中间一相的相位相反,所以仍然是六种信号对应六种驱动,软件上将表稍作调整即可。需要提一下的是,在120°的霍尔信号中,不可能出现二进制0B000和0B111的编码,所以在一定程度上避免了因霍尔零件故障而导致的误操作。因为霍尔元件是开路输出,高电平依靠电路上的上拉电阻提供,一旦霍尔零件断电,霍尔信号输出就是0B111。一旦霍尔零件短路,霍尔信号输出就是0B000,而60°的霍尔信号在正常工作时这两种信号均会出现,所以一定程度上影响了软件判断故障的准确率。目前市面马达已经逐渐舍弃60°相位的霍尔排列。
编程提示:
在程序上,我们综合考虑单片机的处理速度,采用定时中断去检测相位变化,中断周期采用128μS,中断源可使用TMR0,或者PWM本身的TMR2中断。在同一个中断中,我们还将安排其它更重要的工作,这个在后面的电流控制中再说明。
编程技巧:
从硬件电路图中我们看到,位置霍尔信号在PORTC口的RC4、RC5、RC6三个口输入,以120°相位为例,如果直接读出来,对应十六进制值是0X10-0X60,考虑到霍尔出错的可能,那么对应的值是0X00-0X70,显然这个值对今后的查表处理造成非常大的麻烦,我们不可能去弄一个0X70这么大的表格而其中只放仅仅8个元素,所以有必要考虑编程时的优化,且看下面一个例程:
读取相位值的例程:
READHALL:
SWAPF PORTC,W ;将PORTC的高,低半字节交换后读至W
ANDLW 0X07 ;屏蔽掉不必要的位,
MOVWF HALLTEMP ;存人暂存器
SWAPF PORTC,W ;再次读
ANDLW 0X07
SUBWF HALLTEMP,W ;与旧值比较
BTFSS STATUS,Z
GOTO READHALL ;如果与第一次读取的不一样,则从头再来
SWAPF PORTC,W ;第三次读
ANDLW 0X07
SUBWF HALLTEMP,W ;再次比较
BTFSS STATUS,Z
GOTO READHALL ;不一样则从头再来
RETURN ;三次读取值一致,返回。
这个程序中,最关键是 SWAPF PORTC,W 这句,这句语句一方面读取了霍尔值,另一方面与下句语句结合还将此值变为0-7的最小值,这样使得我们后面的查表只需要8个空间的元素。
以上程序,也有人认为有可能会导致程序陷入死循环,但不必担心,因为要导致这个程序进入死循环的信号频率必须非常高,有兴趣的读者可计算一下。
有了上面的霍尔读取程序,我们下面的查表读取相应驱动值就会变的比较方便,但查表也有很多种,在PIC16F72中,查表可以用RETLW在程序空间查,也可以用专用的读取FLASH空间的指令去读,考虑到我们这个表格一共只有8个元素,我们可以将器放在内存寄存器中,利用用FSR去读取表内容。这样做有好处,就是查表时不用去考虑查表偏移量造成程序计数器溢出,另一方面是120°和60°可以使用同一个表格而不用切换。这个表格,我们可以放在寄存器空间不太方便使用的BANK1,在程序初始化时预先写入正确的换向对应值。这个程序在时间上并不比其它两种查表法显得快多少,而且程序空间也不节省,在这里只是作为一个方法示例,可以让我们看到实现同一个功能可以走不同的路。
使用内存查表法的驱动值获取例程:
;
HALLSTART EQU 0XA1 ;定义霍尔-驱动表格的起始地址在BANK1的0XA1开始处
;
HALL_DRIVER: ;由霍尔值取得对应驱动值的内存查表例程
MOVF HALLTEMP,W ;取得HALL的真值
ADDLW HALLSTART ;加上表格的起始地址
MOVWF FSR ;放到间接读内存的指针中。
MOVF INDF,W ;读出驱动值
MOVWF PORTB ;不管返回值如何,先写入驱动端口,
SUBLW STOP_D ;与电机停止值相比较,
BTFSC STATUS,Z
GOTO HALL_ERR ;如果获得停止电机值,那么表示霍尔信号有问题
RETURN
无级调速模块部分:
由于使用直流电源,电机的速度得依靠调节加在电机两端的电压来调整,较简单的办法是使用PWM脉宽调制来调节加到电机两端的电压。PWM的工作周期根据电机的使用环境,采用64μS,折算成频率大约15.625KHz,频率太低了会产生人耳能明显感觉到的高频噪声,电流也不容易控制;太高了又增加电子开关的开关损耗;PWM脉冲的宽度是调节加到电机两端有效电压高低的手段,直接影响到电机的输出功率,我们可以根据手柄输出的电压决定最终应该分配给电机多高的电压。
手柄电压检测比较简单,人对速度的感觉很迟钝,所以手柄的检测不需要很频繁,这个AD检测与电源电压AD等检测均不需要很快的速度,所以每隔10mS-50mS轮番检测一次便足够,AD的检测在定时中断中做,而结果则放在中断外做,这样不会占用中断太多的时间。
编程提示:
由于现在大多采用线性霍尔作为手柄调节速度方案,优点是无触电,故障率极低。缺点是在5V供电的情况下,电压只能在1.1V-4.3V的范围内变化,因此软件的处理相对复杂一点。这只需要我们做一点简单的运算,或者采用查表的方法,将这期间的AD数值转换成PWM占空比的值即可。虽然讲是无级调速,实际上分32级时人已经感觉不出速度的细微变化了。但是有一点,根据手柄得出的PWM脉冲宽度不能直接用来控制PWM占空比,需要在电流允许的情况下才能让占空比达到设定值。
程序中所用关键控制寄存器及其作用:
PR2:决定PWM的工作周期,也就是PWM的调制频率,工作中其值不断地与TMR2中的值相比较,当TMR2的值等于PR2时TMR2归零重新开始另一个周期,由于用到TMR2,所以TMR2的预分频器也同样影响到PWM的工作周期。具体计算公式在数据手册上可以找到,下同。
CCPR1L及CCP1CON的第4,5位:决定PWM的占空比,单片机在运行时TMR2的值不断与CCPR1L中的值比较,当TMR2=CCPR1L时,PWM输出脚输出低电平。当CCPR1L中的值大于PR2时,PWM输出脚持续输出高电平。注意:CCP1CON中的第4,5位在这里并非无用,在后面的电流调节中可以用来微调PWM的占空比。
T2CON:决定TMR2的预分频器和后分频器的分频比,预分频器和前面讲过的PR2共同决定PWM频率,后分频器决定TMR2的中断周期。
刹车断电模块:
电动车在刹车手柄附近装了一个微动开关,一方面在刹车时点亮刹车灯,一方面给控制器提供一个刹车高或低电平信号,各厂家不一定,在电路上作一些电平转换很容易就可以提供给单片机一个准确的信号,我们可以采用数字测量的方法测量这个电平是高还是低,也可以使用AD去测量有几伏,总之监测到这个信号后必须关闭所有的驱动输出和PWM输出,这样就可以实现刹车断电。编程方面我就不多说了。至于如何实现EBS电子刹车,我们后面在附加功能再讲。
4。限流驱动
这是整个控制器的灵魂,如果限流驱动没做好,其他功能再好还是一个字:烧!。
电动车控制器的电子开关均使用功率MOSFET控制,MOSFET的最大允许电流,最大允许功耗都有其限制,如果没有电流控制,或者电流控制不好,均会导致功率MOSFET的烧毁,从而导致整个控制器报废,因此电流控制是本程序的重中之重,这个做不好,其它功能一概免谈。
说起来严重,其实做起来,摸到窍门也是很简单的,其秘诀也只有四个字:准确,及时
电流信号经康铜丝采样之后分两路,一路送至放大器,一路送至比较器。具体电路见硬件部分。放大器用来实时放大电流信号,放大倍数大约6.5倍,放大后的信号提供给单片机进行AD采样转换,转换所得数字用来控制电流不超过我们所允许的值。另一路信号送至比较器,当电流突然由于某种原因大大超过允许值,比如一只MOSFET击穿或误导通时,比较器翻转送出低电平,触发单片机的INT0外部中断,使单片机能够快速关断驱动,从而保护MOSFET避免更大伤害。我们这里所要讲述的准确,及时两个要素,主要是针对放大器放大之后的信号处理过程来表述的。
准确
图1
首先一个条件是准确,这里所指的是电流的AD采样和转换的时机。我们现在使用的是PWM脉冲驱动,这种脉冲驱动导致的直接结果是放大后的电流信号与PWM脉冲频率相同,相位上滞后一定时间的脉动电流波形,见图1。这种波形会类似于一个梯形,如果我们要获得准确的电流AD转换值,最好的办法就是在梯形波的上边中间采样电流信号,这样所获得的电流AD值才能较为准确地反应电流的实际大小。在本文所选的单片机上,AD转换的采样开始时间由ADCON0中的ADON位控制开始,AD转换则由ADGO位启动,采样时间,在单片机的数据手册里有明确的规定,在一般控制器放大电路中,采样的时间一般采用10-20μS,在这期间可以做一些固定的事,比如系统计时之类的,以免浪费资源。而转换时间,只要保证不小于数据手册所规定的1.6μS/bit的最低要求,当然是越快越好,这里设定为2μS/bit。
那么怎样保证采样的准确性呢?这里有一个前面提过的办法,就是使用定时中断,我们可以设定好使定时中断和PWM周期同步,这里采用TMR2经以PWM频率1:2的后分频之后产生的中断。此中断发生在每两个PWM信号起始时刻,预先设定好AD的通道,将AD转换器切换到检测电流的那个通道,当进入TMR2中断处理完现场保护,中断源判断等一系列动作之后,再延时一段时间,开启ADON的时刻,也就是对电流波形采样的时刻刚好落在电流梯形波的前部,采样完毕之后马上进行转换。在等待转换结果出来的过程中,我们也不能闲着,毕竟那是>20μS的时间,在资源比较紧张的时候浪费了可惜,我们可以做一些比如”鉴相”的工作,就是在电子换相中所作必须作的工作。
中断中AD采样时机的掌握例程:
BCF PIR1,TMR2IF ;6μS,TMR2中断
CALL HENGLIU ;恒流查表程序,利用这个程序延时一段时间以便在合适的时间准确采样电流值。
BTFSC INTCON,INTF
GOTO INTB0 ;是否过流
MOVF AD_CHANNEL,W ;AD检测部分,设置合适的AD通道,并且开启AD模块开始采样
MOVWF ADCON0 ;
CALL TIME05 ;大于4.5μS采样时间FOR 16F886
BTFSC INTCON,INTF
GOTO INTB0 ;是否过流
BSF ADCON0,GO ;开始AD转换
CALL READ_HALL ;利用AD转换的间歇做别的事
LOOP_TMR2
BTFSC INTCON,INTF
GOTO INTB0 ;是否过流
BTFSC ADCON0,GO
GOTO LOOP_TMR2
及时
其次是要及时。如果我们想及时准确地控制电流,采样次数也是要求越多越好,因为电流的变化相当快,在一个PWM周期中变化量可能会很大,所以我们最好是在一个PWM周期里采样数次,但是我们的单片机没有这么快的速度,再说PWM的占空比在一个周期中只接受最后的改变,新的占空比参数要到下个周期才能发挥作用,所以一个PWM周期采样一次就够了,但每个采样周期采样单片机还是来不及处理,为了更好地处理其它事情,我们两个PWM周期才对电流采样一次。
采样转换之后的工作,就是处理了。怎样根据AD结果去调节电流?我们不需要想到PID控制那么复杂的概念,只需要在电流没达到限制值时逐渐增加CCPR1L的值,直到等于手柄设定值为止,如果在此过程中电流接近限制值,那么应该不再增加CCPR1L的值,直到电流减小。如果电流超过了限制值,则根据超过的量,找一个比较合适的减小量,比如CCPR1L减1或减3,一切以电流比较稳定为准,不要有太大的波动,但波动越小,我们要求PWM占空比调整精度越高。
这里要提一下的是PWM分辨率,以PIC16F72的条件,在16M时钟的工作频率和15.625K的PWM频率前提下,PWM的占空比调整可以有10BIT的精度,可调整的为数越多,电流细调就越精确,但10BIT的数据涉及2个字节的运算,所以我们还是只采用8BIT的调整精度,实践证明,8BIT的精度对调整电流来说足够。所以我们只对CCPR1L进行操作就可以,前提是TMR2预分频值为1:1
恒流算法–电流即时值和有效值的矛盾:
也许我们注意到大多数控制器的最大电流并没有出现在堵转的时候,这是因为上面我们所检测到的是电流的即时值,我们在电流表上看到的是电源电流的有效值,当PWM占空比不是100%的情况下,电流有效值≈电流即时值*PWM占空比,也就是说,占空比越小,要保证电流有效值达到我们的期望值,电流的即时值要提高,这样就涉及一个算法问题:提高多少?我们可以根据上面那个公式做一个表格,或者根据CCPR1L中的值做一个简单的换算。总之是算法不能太复杂,不能占用太多的系统时间。
电流的测量和控制还涉及到其他两个附加功能:换相消噪和降低温升。这里就只讲讲换相消噪。
怎样减小换相噪声?
在电动车刚刚起步的时候我们会发现换相时电机会发出很大的突突声,这是由于电机起步时电流比较大,而电机是个感性负载,换相后由于电机线圈电流不会一下增大到换相前的水平,这样就造成换相前后电流反差非常大,从而导致牵引力的急剧变化,这种变化便会引起电机强烈振动,这种振动噪声我们不能完全消除,但有简单的方法减小,就是在换相后的一段时间使PWM脉冲占空比达到100%来使电流增长快一点,从而减轻振动噪声。需要提醒的是在这个过程中我们需要随时监测电流变化,电流一达到换相前的水平就可以恢复换相前的PWM占空比。如果电流始终达不到以前的水平,那么最多延时十多个PWM周期即可,时间长了也没用,以不影响到鉴相等其它重要工作为度。
降低温升这个我在《硬件电路详解要点》中已经初步介绍过,主要的手段就是加入同步续流的概念,那么,在软件中什么时候开始开启同步续流开关呢?在电流小的时候,电机线圈中的感应电流并不大,所以没必要开启;在PWM占空比达到100%时,由于没有上桥的开关损耗,也没必要开,或在PWM占空比接近100%时,下桥没来得及开就被关闭,也没有必要开,所以开启同步续流功能的条件可归纳为:电流超过3-5A时,PWM占空比≤95%时开启同步整流,由于硬件电路设计得比较完善,在软件中,开启同步续流只需将RB1置为低电平即可。
关于电流的另一点:过流保护,当有MOSFET击穿或MOSFET误导通时,比如死区发生器有故障时,会造成上下桥直通将电源直接短路,这样会有很大的电流,为避免更大的伤害,在电流信号引起比较器翻转时触发INT0中断,由于PIC16F72没有中断嵌套,因此在整个定时中断中均要随时检测INT0中断标志,防止短路发生。一般说来,上下桥直通不超过30μS时对管子损害不大,超过30μS后功率管就会有报销的危险,所以在中断中执行其他程序时,一定要保证每隔30μS必须去检测一次INT0的中断标志,如果发现INT0中断标志置1,应立即关断所有的驱动输出。
堵转保护模块
为了防止电机发生堵转时电流始终通过同一组MOSFET而造成永久损害,因此有必要在堵转发生之后数秒钟之内切断电机的供电。一般堵转保护时间是2秒。要注意的是有时电机虽然发生堵转,但刚好在换相的临界点,此时会产生频繁的换相动作,这对MOSFET也是有害的,所以也应当作堵转来对待。
堵转保护实际与系统计时捆绑在一起,在电动机运行时,如果检测到换向则将堵转计时寄存器清空,如果堵转计时寄存器溢出则进入保护状态,关闭所有驱动输出。
欠压保护模块
这是针对电池的保护动作,如果电池过放电,将导致电池的永久损坏。注意欠压保护和电池电压上升后恢复供电这两个电压应有一定回差,比如48V电池欠压点在42V,而恢复供电点在45V,当电池电压回到45V时还应延时数秒再恢复供电,避免控制器频繁进入保护状态使骑行者感到不适。另一点要注意的是,电池是具有内阻的电源,因此在大电流放电的情况下因适当调低欠压值。
在一些产品中,当电池电压接近欠压时,控制器会减小供给电机的电流,这在一方面可以提醒使用者电池处于亏欠状态,小电流放电避免了电池的损坏;另一方面还可以使电动车继续跑动相当长的距离而不会经常进入保护状态,避免使用者感到不舒适或者要受到推车之苦,这也不失为一种比较好的方法。
电压值的检测也是不需要非常频繁的,所以和手柄,刹车一道,在中断中每隔10-50ms轮流检测一次AD值即可,检测后的结果保存起来放在全局变量中,等到退出中断后,利用单片机的”空余时间”来处理这些值。
AD通道的切换及基本程序结构安排
由于单片机的AD模块是复用的,在必须的几个功能中,单片机必须完成电流,手柄,电源电压等AD检测,由于电流的AD检测非常重要,并且在中断中,所以AD通道的切换就必须非常注意,通常,手柄,电源电压变化比较缓慢,为了仅可能把资源让给电流,手柄和电源电压的检测只需要20-30mS轮换检测一次就够了。还有一个要考虑的是在换向时由于消音程序需要用到电流通道的AD转换,所以所有的AD结果必须安排在换向之前取出,并且根据当时通道将结果放到相应的结果寄存器中保存起来,以避免AD结果造成控制紊乱。
程序结构的安排涉及两个方面:定时中断中的结构安排和非中断中的结构安排。
定时中断中程序结构的一种安排:
中断保护————系统计时————AD通道选择————开始AD采样————AD转换开始————检测相位变化————AD结果保存————电流判断及处理————根据相位变化是否换向,消噪————中断恢复并返回
非中断中的程序结构安排:
见图2:主循环流程图
图2:
以上电子换相,电流检测、处理等大部分要紧的工作均在同一个128μS的定时中断中完成。另外中断中还要完成计时工作,其它对时间,时机要求不严格的则放在中断外空余时间处理。
故障的检测,保护及告警显示:
使用了单片机这样的可以智能化操作的零件,我们就可以做一些工作来帮助生产和维修:
由于生产过程中不可避免会造成一些诸如虚焊,连锡之类的缺陷,所以在产品组装成半成品测试时就会出现一些故障,轻则某些功能失效,重的会导致元器件烧毁,这是老板绝对不愿意看到的,所以我们可以多做一些工作最大限度上避免此类问题的发生:
我们最担心的是生产过程中由于连锡或虚焊导致MOSFET烧毁,一个MOSFET好几块RMB,烧一个谁都心疼。幸好现在有单片机,在开机时可以用极短的时间(大概10-20μS)全部开启一下上桥,关闭,同时检测电流,然后再开启一下下桥,如果其中有MOSFET短路就会产生比较大的电流,这个电流我们可以用单片机在开启MOSFET的同时检测到,而在这么短的时间内即使某个MOSFET短路,也不至于把另外一个烧掉,所以可以利用这个检验方法来初步检查产品的好坏,也便于修理工修理。其他的故障比较好检测,这里就不一一赘述。
故障检测出来了,需要显示出来以告知人们出了什么故障,目前一般采用LED闪烁次数来表示,次数可以自己定,也可以采用比较流行的办法:
慢闪:
1秒钟闪一次,表示没有检测出故障。
快闪:
连续闪两次,停一下,表示刹车,或者刹车部分有故障。
连续闪三次,停一下,表示INT0口始终为低电平,很有可能是比较器部分有问题。
连续闪四次,停一下,表示上桥有短路现象
连续闪五次,停一下,表示下桥有短路现象
连续闪六次,停一下,表示电机霍尔信号有故障,或者相位选择有误。
连续闪七次,停一下,表示刚刚发生了过流保护,INT0口有低电平脉冲出现
连续闪八次,停一下,表示电源电压过低或给单片机供电的5V电源电压过高。
附加功能:
一、1+1助力:
大多数电动自行车都有踏脚板,可以使用人力驱动,如果在人力驱动的同时电动机也开始输出一部分功率以提供“助力”。这需要在脚踏齿轮边上安装一个自锁相位的开关型霍尔传感器,在脚踏齿轮上安装一个带若干磁铁的感应盘,当脚踏动踏板时霍尔感应器感应到磁铁经过便输出频率与踏板齿轮转速成正比的方波,根据方波的频率再估算一个值输出一个对应的电压给电机,由于自锁相位的开关型霍尔对磁铁的运动方向敏感,输出的方波针对不同磁铁运动方向,上下半波的占空比不是50%,所以可以判断踏板正转还是反转,可以做到只在正转时输出电压给电机,以避免在推动车辆倒车时还输出助力。
二、回馈型电制动及反充电
业界对该功能的称谓五花八门,一般文字的表达方法是柔性电子刹车,这个称谓比较通俗易懂。
电动机电制动的原理有很多,在电动车的电制动应用中,一般均采用将三相线圈短路,类似再生回馈制动方法制动,这种制动方法控制相当简单,仅需将上桥或下桥全部开通即可。由于靠惯性运转的直流永磁电动机相当于一个发电机,上桥或下桥全部开通后即是将发电机输出端短路,完全依靠线间电阻消耗能量,所以有两个坏处:第一是车速越快时制动力越大,容易在高速时发生事故;第二是对MOSFET及线路损害相当严重,使零部件过热烧毁。为了克服这种毛病,人们在制动初期使用PWM调制短路开关,使其工作在间歇状态,这就叫柔性刹车。最简单的办法莫过于使用PWM信号直接调制上桥,但由于电动车控制器上桥的浮栅驱动的特殊结构,使上桥不可能工作在上桥持续开通,而下桥持续关闭的状态,所以一般还是采用模拟出的PWM信号控制下桥。因为自举电容必须在某个下桥开通时充电,如果下桥持续关闭,自举电容没办法在很短的时间内通过10K的电阻充饱,这样就会导致上桥在持续开通的情况下驱动电压不足而产生发热,烧毁的情况。
现在有一个题外话不得不说:这样的控制方法获得了一个意外的效果:在制动的同时,很多人发现电流表反转,电源电压升高的现象,发生这种现象只说明一个道理:电动机在向电源反充电!
从表面上来讲,明明下桥将绕组输出端全部短路至地,为何还有电流反流到电源呢?
实际上,在制动过程中由于使用了所谓“柔性刹车”,因而在开始时下桥并不是持续导通的,而是不断导通————关闭,这样在导通的时候就有感应电流通过线圈————下桥————地————下桥————线圈流通,当下桥在关闭时,线圈中的电流不能马上消失,产生的感应电流就会通过线圈————上桥反向二极管————电源+————地————下桥反向二极管————线圈流通,这样就会产生反充电现象。而且下桥导通占空比越大,这个反充电流也越大。但到了100%占空比时,因为所有电流都被短路,充电电流反而没有了。
最后说明一下,这种制动方法是有风险的,因为在电动车高速运转时,由于整个系统的惯性很大,所以刹车的过程产生的能量也相当惊人,这对功率MOSFET是一个很大的负担,实践中在一个75KG的人骑行在20KM的速度时刹车5次控制器外壳已经很烫了,因此长时间使用必定会造成功率管损坏。一般的做法是选用比较好的功率管,并在启动该功能时限时使用,就是在刹车后5-8秒内即不再有电制动,避免在长距离下坡时损坏功率管。
有关电动车无刷电机控制器的大概介绍到此告一段落,由于本人才疏学浅,一定有许多不对的地方,希望广大读者能够斧正。