《电动车无刷电机控制器软件设计详解》由会员分享,可在线阅读,更多相关《电动车无刷电机控制器软件设计详解(33页珍藏版)》请在金锄头文库上搜索。
1、电动车无刷电机控制器软件设计详解作者 : 渊斌 原作发表在电子报 2007 年合订本 下册保留,转帖请注明出处本文以 MICROCHIP 公司所生产的 PIC16F72 为基 础说明软件编程方面所涉及的要点,此文所 涉及的源程序均以 PIC 的汇编语言为例。由 于软件不可避免需与硬件相结合,所以此文 可能出现硬件电路图或示意图。本文适合在 单片机编程方面有一定经验的读者,有些基 础知识恕不一一介绍。我们先列一下电动车 无刷马达控制器的基本要求:功能性要求: 1.电子换相 2.无级调速 3.刹车断电 4.附加功 能a限速b.1+1助力c.EBS柔性电磁刹车d. 定速巡航e其它功能(消除换相噪音,
2、倒车等) 安全性要求: 1 .限流驱动 2.过流保护 3.堵转 保护 3.电池欠压保护 4.节能和降低温升 5. 附加功能(防盗锁死,温升限制等)6.附加故障 检测功能从上面的要求来看,功能性要求和 安全性要求的前三项用专用的无刷马达驱 动芯片加上适当的外围电路均不难解决,代 表芯片是摩托罗拉的MC33035,早期的控制 器方案均用该集成块解决。但后来随着竞争 加剧,很多厂商都增加了不少附加功能,一 些附加功能用硬件来实现就比较困难,所以 使用单片机来做控制的控制器迅速取代了 硬件电路芯片。但是硬件控制和软件控制有 很大的区别,硬件控制的反应速度仅仅受限 于逻辑门的开关速度,而软件的运行则需要
3、 时间。要使软件跟得上电机控制的需求,就 必须要求软件在最短的时间能够正确处理 换相,电流限制等各种复杂动作,这就涉及 到一个对外部信号的采样频率,采样时机, 信号的部处理判断及处理结果的输出,还有 一些抗干扰措施等,这些都是软件设计中需 要再三仔细考虑的东西。PIC16F72是一款哈 佛结构,精简指令集的MCU,由于其数据 总线和指令总线分开,总共 35 条单字指令, 020M 的时钟速度,所以其运算速度和抗干 扰性能都非常出色, 2K 字长的 FLASH 程序 空间,22 个可用的 IO 口,同时又附加了 3 个定时/计数器,5 个 8 位 AD 口,1 个比较/ 捕捉/脉宽调制器,8 个
4、中断源,这些优异的 性能为电动车控制器控制提供了良好的硬 件环境和软件基础,一经推出就赢得众多设 计人员的热捧。那么如何使用 PIC16F72 来 设计一个电动车控制器呢?我们下面以目 前市面流行的硬件设计为基础,尽量通俗易 懂地介绍一下程序设计思路和注意点。要使 无刷电机转起来,并且听从驾驶者的调速、 刹车等基本指挥,最基本的要求就是要实现 硬件所能实现的电子换向和调速,刹车等功 能。实际上软件的整体设计也和硬件一样, 也是一个模块化堆砌的过程,问题在于模块 的合理化堆砌,使堆砌后形成的整体能够坚 固,协调、高效率运作。我们先说一说各种 模块功能的简单实现,然后再来讨论如何使 这些模块协调运
5、转。1.首先说说电子换相模 块我们知道,直流永磁电机在运转时需要一 对电刷和与线圈相对应的换向整流子来使 线圈中的电流方向根据磁场方向来不断改 变,从而转子持续向一个方向运转,我们称 这种电机为有刷电机,在电动车刚刚面世时 一般均使用这种电机,但有刷电机有一个致 命的缺陷,就是用作电刷的碳刷非常容易磨 损,换向整流子也非常容易被油污,碳刷碎 屑填满空隙而漏电,而且功率越大,这种毛 病越严重,导致有刷电机维护量和故障率急 剧上升,严重影响其推广,因此在较大功率 的场合,无刷电机应运而生。无刷电机,顾 名思义就是没有了电刷,不能自动换向,因 此要依靠传感器检测转子的位置、用电子开 关来改变线圈中电
6、流的方向,所以其控制器 要对转子永磁体位置进行精确检测,并用电 子开关切换不同绕组通电以获得持续向前 的动力。转子位置检测传感器有很多,比如 光传感器,磁感应传感器等,电子开关可以 用大功率三极管、功率型场效应管、IGBT等 制作,在目前的绝大多数电动车三相无刷电 机中均使用三个开关式的霍尔传感器检测 永磁体相对于定子线圈的位置,控制器跟据 三个霍尔传感器输出的六种不同信号输出 相应的控制信号驱动功率型场效应管(MOSFET )组成的电子开关向马达供电。 这就是所谓六步换相法。从电机原理可以看 出,这种电机是一种特殊的同步电机,因此 换相必须及时,否则会导致电机失步,从而 使电机噪音增大,效率
7、降低,严重的还会导 致控制器,电机烧毁。鉴于以上要求,我们 先必须测一下市面上普通的无刷马达在最 高转速时(考虑到顺风和下坡的情况 )的换向 情况,这个比较简单,用示波器测量之后得 到在最高速时每相霍尔传感器输出的频率 大概在 140HZ 左右,折合到换向的最小时 间,那么应该是 1.2mS 左右换相一次,根据 际的使用效果,软件的反应时间必须在 0.12mS 左右,也就是说在检测到换相信号 的改变并且输出换相驱动信号时的过程必 须在 0.10.2mS 之完成。另一个需要考虑的 是,电机驱动是一个大电流驱动,又是一个 电感性负载,控制器在运行时不可避免有干 扰引入,因此除了在硬件布局,布线上注
8、意 外,软件上也要做相应的抗干扰措施以避免 错误的换向动作。考虑到输入到单片机的换 相信号容易受干扰,加上线路上滤波电容的 影响,单片机程序在读取换相信号时应至少 连续读取 3 次,以 3 次信号完全一致时才采 用该值作为换相信号的真值,如果其中一次 不对,那么干脆就重新再读 3 次,这就是一 个有抗干扰措施的鉴相过程。取得换相信号 后,我们将其与上次读到的值做对比,如果 相同,则表示没有换相,如果不同,则要跟 据这个值去取得一个相对应的驱动信号,从 而驱动电子开关动作。这个过程可以使用逐 项比较法,查表法等来实现。鉴于查表法比 较快捷,一般使用查表法。其中需要考虑的 是,一旦获得的信号与所有
9、的六个信号都不 相同,可能表示电机中霍尔元件或者其连接 线路出现故障,此时我们应该让电机断电以 避免误操作。市面上有两种电机,即所谓的 120和 60霍尔信号,这个角度代表三个霍 尔器件输出的三相电信号其相位角相差的 角度,其实这里面的区别仅仅是电平的不一 样,在马达部的安装上,位置没什么不同, 只是中间一相的相位相反,所以仍然是六种 信号对应六种驱动,软件上将表稍作调整即 可。需要提一下的是,在 120的霍尔信号中, 不可能出现二进制 0B000 和 0B111 的编码, 所以在一定程度上避免了因霍尔零件故障 而导致的误操作。因为霍尔元件是开路输 出,高电平依靠电路上的上拉电阻提供,一 旦霍
10、尔零件断电,霍尔信号输出就是 0B111。 一旦霍尔零件短路,霍尔信号输出就是0B000,而60的霍尔信号在正常工作时这两 种信号均会出现,所以一定程度上影响了软 件判断故障的准确率。目前市面马达已经逐 渐舍弃 60相位的霍尔排列。编程提示:在 程序上,我们综合考虑单片机的处理速度, 采用定时中断去检测相位变化,中断周期采 用128|dS,中断源可使用TMR0,或者PWM 本身的 TMR2 中断。在同一个中断中,我们 还将安排其它更重要的工作,这个在后面的 电流控制中再说明。编程技巧:从硬件电路 图中我们看到,位置霍尔信号在 PORTC 口 的 RC4、RC5、RC6 三个口输入,以 120相
11、 位为例,如果直接读出来,对应十六进制值 是0X10-0X60,考虑到霍尔出错的可能,那 么对应的值是0X00-0X70,显然这个值对今 后的查表处理造成非常大的麻烦,我们不可 能去弄一个 0X70 这么大的表格而其中只放 仅仅 8 个元素,所以有必要考虑编程时的优 化,且看下面一个例程:读取相位值的例程: READHALL:SWAPF PORTC,W ;将 PORTC 的 高,低半字节交换后读至 WANDLW 0X07 ; 屏蔽掉不必要的位, MOVWF HALLTEMP ; 存人暂存器 SWAPF PORTC,W ;再次读 ANDLW 0X07SUBWF HALLTEMP,W ; 与旧值
12、比较 BTFSS STATUS,ZGOTO READHALL ;如 果与第一次读取的不一样,则从头再来SWAPF PORTC,W ; 第 三 次 读 ANDLW 0X07SUBWF HALLTEMP,W ;再次比较盯FSS STATUS,ZGOTO READHALL ;不一样则从头 再来RETURN ;三次读取值一致,返回。这个 程序中,最关键是 SWAPF PORTC,W 这 句,这句语句一方面读取了霍尔值,另一方 面与下句语句结合还将此值变为0-7的最小 值,这样使得我们后面的查表只需要8个空 间的元素。以上程序,也有人认为有可能会 导致程序陷入死循环,但不必担心,因为要 导致这个程序进入
13、死循环的信号频率必须 非常高,有兴趣的读者可计算一下。有了上 面的霍尔读取程序,我们下面的查表读取相 应驱动值就会变的比较方便,但查表也有很 多种,在 PIC16F72 中,查表可以用 RETLW 在程序空间查,也可以用专用的读取 FLASH 空间的指令去读,考虑到我们这个表格一共 只有8个元素,我们可以将器放在存寄存器 中,利用用FSR去读取表容。这样做有好处, 就是查表时不用去考虑查表偏移量造成程 序计数器溢出,另一方面是120和60可以 使用同一个表格而不用切换。这个表格,我 们可以放在寄存器空间不太方便使用的BANK1,在程序初始化时预先写入正确的换 向对应值。这个程序在时间上并不比其
14、它两 种查表法显得快多少,而且程序空间也不节 省,在这里只是作为一个方法示例,可以让 我们看到实现同一个功能可以走不同的路。 使 用 存 查 表 法 的 驱 动 值 获 取 例 程:;HALLSTART EQU 0XA1定义霍尔-驱动 表格的起始地址在 BANK1 的 0XA1 开始 处;HALL_DRIVER:;由霍尔值取得对应驱动值 的存查表例程 MOVF HALLTEMP,W ;取得 HALL的真值ADDLW HALLSTART ;加上表格 的起始地址 MOVWF FSR ;放到间接读存的 指针中。MOVF INDF,W ;读出驱动值 MOVWF PORTB ;不管返回值如何,先写入驱
15、动端口,SUBLW STOP_D ;与电机停止值相比 较,BTFSC STATUS,ZGOTO HALL_ERR ;如果 获得停止电机值,那么表示霍尔信号有问题 RETURN无级调速模块部分:由于使用直流电源,电 机的速度得依靠调节加在电机两端的电压 来调整,较简单的办法是使用 PWM 脉宽调 制来调节加到电机两端的电压。PWM的工 作周期根据电机的使用环境,采用64|dS, 折算成频率大约15.625KH z,频率太低了会 产生人耳能明显感觉到的高频噪声,电流也 不容易控制 ;太高了又增加电子开关的开关 损耗;PWM脉冲的宽度是调节加到电机两 端有效电压高低的手段,直接影响到电机的 输出功率
16、,我们可以根据手柄输出的电压决 定最终应该分配给电机多高的电压。手柄电 压检测比较简单,人对速度的感觉很迟钝, 所以手柄的检测不需要很频繁,这个 AD 检 测与电源电压 AD 等检测均不需要很快的速 度,所以每隔 10mS-50mS 轮番检测一次便 足够,AD的检测在定时中断中做,而结果 则放在中断外做,这样不会占用中断太多的 时间。编程提示:由于现在大多采用线性霍尔作为 手柄调节速度方案,优点是无触电,故障率 极低。缺点是在 5V 供电的情况下,电压只 能在 1.1V4.3V 的围变化,因此软件的处理 相对复杂一点。这只需要我们做一点简单的 运算,或者采用查表的方法,将这期间的 AD 数值转换成 PWM 占空比的值即可。虽 然讲是无级调速,实际上分 32 级时人已经 感觉不出速度的细微变化了。但是有一点, 根据手柄得出的 PWM 脉冲宽度不能直接用 来控制 PWM 占空比,需要在电流允许的情 况下才能让占空比达到设定值。程序中所用 关键控制寄存器及其作用:PR2 :决定PWM 的工作周期,也就是 PWM 的调制频率,工 作中其值不断地与