电动车无刷电机控制器软件设计详解.docx
《电动车无刷电机控制器软件设计详解.docx》由会员分享,可在线阅读,更多相关《电动车无刷电机控制器软件设计详解.docx(36页珍藏版)》请在冰豆网上搜索。
电动车无刷电机控制器软件设计详解
仅供个人参考
电动车无刷电机控制器软件设计详解
作者:
谢渊斌原作发表在《电子报2007年
合订本》下册
版权保留,转帖请注明出处
本文以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:
SWAPFPORTC,W将;PORTC的高,低半字节交换后读至W
ANDLW0X07;屏蔽掉不必要的位,
MOVWFHALLTEMP存;人暂存器
SWAPFPORTC,W再;次读
ANDLW0X07
SUBWFHALLTEMP,W与;旧值比较
BTFSSSTATUS,Z
GOTOREADHALL如;果与第一次读取的不一
样,则从头再来
SWAPFPORTC,W第;三次读
ANDLW0X07
SUBWFHALLTEMP,W再;次比较
BTFSSSTATUS,Z
GOTOREADHALL不;一样则从头再来RETURN三;次读取值一致,返回。
不得用于商业用途
仅供个人参考
这个程序中,最关键
是SWAPFPORTC,W这句,这句语句一方面读取了霍尔值,另一方面与下句语句结合还将此值变为0-7的最小值,这样使得我们后面的查表只需要8个空间的元素。
以上程序,也有人认为有可能会导致程序陷入死循环,但不必担心,因为要导致这个程序进入死循环的信号频率必须非常高,有兴趣的读者可计算一下。
有了上面的霍尔读取程序,我们下面的查表读取相应驱动值就会变的比较方便,但查表也有很多种,在PIC16F72中,查表可以用RETLW在程序空间查,也可以用专用的读取
FLASH空间的指令去读,考虑到我们这个表格一共只有8个元素,我们可以将器放在内存寄存器中,利用用FSR去读取表内容。
这样做有好处,就是查表时不用去考虑查表偏
移量造成程序计数器溢出,另一方面是120°和60°可以使用同一个表格而不用切换。
这个表格,我们可以放在寄存器空间不太方便
使用的BANK1,在程序初始化时预先写入正确的换向对应值。
这个程序在时间上并不比
不得用于商业用途
仅供个人参考
其它两种查表法显得快多少,而且程序空间也不节省,在这里只是作为一个方法示例,可以让我们看到实现同一个功能可以走不同的路。
使用内存查表法的驱动值获取例程:
;
HALLSTARTEQU0XA1定;义霍尔-驱动表格的起始地址在BANK1的0XA1开始处
;
HALL_DRIVER:
;由霍尔值取得对应驱动值的
内存查表例程
MOVFHALLTEMP,W取;得HALL的真值
ADDLWHALLSTART加;上表格的起始地址
MOVWFFSR放;到间接读内存的指针中。
MOVFINDF,W;读出驱动值
MOVWFPORTB不;管返回值如何,先写入驱
动端口,
SUBLWSTOP_D与;电机停止值相比较,
BTFSCSTATUS,Z
GOTOHALL_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采样时机的掌握例程:
BCFPIR1,TMR2IF;6μS,TMR2中断CALLHENGLIU;恒流查表程序,利用这个程
序延时一段时间以便在合适的时间准确采样电流值。
BTFSCINTCON,INTF
GOTOINTB0;是否过流
MOVFAD_CHANNEL,W;AD检测部分,设置合适的AD通道,并且开启AD模块开始采样
MOVWFADCON0;
CALLTIME05;大于4.5μS采样时间
FOR16F886
BTFSCINTCON,INTF
GOTOINTB0;是否过流
BSFADCON0,GO开;始AD转换
CALLREAD_HALL利;用AD转换的间歇做别
的事
不得用于商业用途
仅供个人参考
LOOP_TMR2
BTFSCINTCON,INTF
GOTOINTB0;是否过流
BTFSCADCON0,GO
GOTOLOOP_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,应立即关断所有的驱动