江苏信息职业技术学院 周 芸
多路PWM信号产生方案设计
江苏信息职业技术学院 周 芸
在装载机控制系统的设计中,必须对装载机动臂、铲斗的运动进行控制,包括动臂的上升、下降和铲斗的装载、卸载。在单片机控制下的装载机利用电液比例控制来实现对动臂、铲斗的运动控制,系统最终的被控对象是比例电磁阀(共4个)。因此,装载机控制系统需要产生4路PWM(脉冲宽度调制)信号,用来驱动各对应比例电磁阀,分别实现对动臂上升、下降和铲斗装载、卸载的控制。通过调节PWM输出波形的占空比还可以改变动臂和铲斗的运动速度。
1.80C196KB单片机内部HSO简介。某装载机控制系统的设计基于80C196KB单片机,其内部的高速输出器(HSO)功能强大,可以为系统产生多路PWM信号。通过软件编程控制HSO通道的输出,就可以得到所需要的PWM波形。
HSO可以按程序设定的时间触发某一事件,CPU的使用开销很小,故速度很高。允许被触发的事件包括启动A/D转换,复位定时器2,设置4个软件定时器标志和接通多达6根输出线(HSO.0~HSO.5)等。其中,HSO CAM阵列是HSO的核心部分,它由8个23位的寄存器组成,每个寄存器的7位用于存放事件输出命令,其余16位用于存放事件触发的时间。在程序中把命令和预定触发时间写入CAM阵列,就相当于设定了某一事件。每一个状态周期,来自定时器(作为HSO的时间基准)的时间与CAM中一个预定的时间进行比较。比较结果相符,说明触发某一事件的时间已到,就读出CAM中的这一项内容,并产生该事件的触发信号,同时清除该项数据内容。
2.利用HSO中断来产生连续的PWM信号。HSO同一时刻最多可以挂号8个事件,且当事件被触发时允许发生中断。HSO可以产生2种中断,分别对应不同的中断向量:HSO执行中断(2006H),产生于执行HSO命令而使HSO的6个输出脚(HSO.0~HSO.5)中任何一个工作时;软件定时器中断(200AH),产生于执行其他HSO命令时,包括4个软件定时器命令、T2复位命令和A/D转换启动命令。
对HSO编程可以按预定的时间产生中断,即所谓的软件定时器。HSO允许有4个软件定时器同时工作,预定时间一到,HSO就对软件定时器标志置1,使软件定时器中断。因此,在同一时间窗口(8个状态周期)内发生多重软件定时器中断是可能的。
每产生一路PWM信号需要在CAM中设置3个事件,一个正跳变、一个负跳变和一个脉冲周期正跳变。前两个事件只负责HSO某个输出脚输出高、低电平的状态,不需要产生中断;但CAM阵列中的所有事件一经触发就立即清除,所以要连续产生PWM波形必须在第三个周期事件发生后重新设置上述3个事件,因此第3个事件的触发应允许中断,并在其中断服务子程序中完成重置任务。只要在设置完第3个周期事件后开中断,通过周期性的中断就可以在HSO输出脚产生一系列连续的PWM波形。此外,还可以利用软件定时器中断,软件定时器的定时时间值即为PWM信号的周期。在软件定时器中断服务子程序中设置两个事件——一个正跳变和一个负跳变,也可以达到相同的输出效果。
采用上述方法产生PWM信号时,选定时器1作为HSO的时间基准。在12 MHz晶振下,定时器1的每一个计数值代表1.33 μs,最大计数数值为216-1=65 535,相当于87 ms,所以能够产生PWM波形的频率范围为11~375 kHz。实际需要的PWM频率为几百赫兹,在这个范围内是可实现的。
该装载机控制系统共要求产生4路PWM信号,需占用4个HSO通道,每个通道都用上面的方法产生相互独立的PWM信号。这对CPU而言相当于增加了4个中断源,并且执行每一路PWM波形输出时会产生频繁的中断,这在很大程度上会降低CPU的工作效率,甚至影响到CPU执行其他监控子程序和其他一些操作;另外,前面提及的HSO同一时刻最多可以挂号8个事件,而实现1路PWM信号输出就需要3个事件,显然不可能实现4路PWM信号的同时输出。虽然在实际应用中4路同时输出的情况不会出现,但不得不考虑4路PWM信号交替产生过程中可能存在的CAM寄存器组不够用的情况,这就影响到正常的PWM信号输出,降低了系统控制的可靠性。
为此,可以利用80C196KB单片机的新增功能——CAM锁定:即在HSO命令寄存器中增加CAM锁定(LOCK)位D7,当把一条命令写入HSO CAM中时,若同时设置CAM锁定位为1,可以使该命令保持在CAM中,否则产生一次HSO触发的事件就会把CAM中相应命令清除掉。
利用CAM锁定功能可以周期性地产生PWM波形,而不需要频繁的HSO中断,大大减小了CPU的使用开销,减轻了CPU的负担。
CAM锁定功能必须靠设置IOC2.6=1来选通。为了从CAM中清除被锁定的事件,可以向CAM清除位IOC2.7写入1,这将清除CAM寄存器组的全部内容。这里没有办法单独清除1项被锁定的命令。
3.基于CAM锁定功能的多路PWM产生方案。利用HSO复位定时器2(T2)的命令,用T2作为HSO的时间基准,T2CLK为T2的时钟源,可以产生周期性的事件,事件发生周期由用户选定。程序中设置好T2的复位时间,并安排PWM波形正跳变这一事件发生于T2复位的时刻,而负跳变这一事件发生于T2复位前的某个时刻(该事件决定了PWM的占空比),将这两个事件和T2复位事件都锁定在CAM中,则一路PWM信号将周期性地产生,其重复周期就是T2的复位周期。
由于要以T2为HSO的时间基准,但HSO的时间分辨率为8个状态周期[12 MHz晶振时为(1/6 MHz)×8=1.33 μs],所以限制了T2的最高时钟频率也必须为每8个状态周期一次,即T2的时钟源输入至少为CLKOUT的8分频输出。此外,T2实质是一个采用外部时钟的16位计数器,由于外部时钟的正跳沿和负跳沿处T2都会计数,所以要想每8个状态周期T2计数值增1,时钟输入周期必须为16个状态周期(即至少为16分频)。
PWM信号的周期TPWM=T2计数值(M)×8个状态周期(1.33μs)。其中 T2的计数值M决定了PWM波形的分辨位数A(M=2A-1)。当要求产生的PWM信号的周期为2 ms时,M=1 508,A=10。这一点说明该方案完全可以产生所要求的PWM信号。
4.如果懒得抄原题,也可以根据需要将原题裁剪下来粘贴到错题本上,但不宜太多,以免日积月累错题本显得太厚重;
实际要求的4路PWM信号是相互独立,互不影响的,所以当请求产生某一路PWM信号时,必须向CAM写入3个事件的锁定命令;当请求产生多路PWM信号时,考虑到4路PWM信号的频率相同,所以那几路可以共用一个T2复位事件,随后请求的几路PWM只要再各自追加2个事件就可以了。事实上,实际运行时最多有2路PWM会同时输出:一路控制动臂的运动,另一路控制铲斗的装载或卸载,故同一时刻关于PWM的锁定命令最多占用5个CAM寄存器。这一点说明本方案实现多路PWM信号输出也是可行的。
但这种方案也存在问题——无法单独清除1项被锁定的命令。例如当要停止某一路PWM输出时,应该清除对应的CAM中被锁定的项,这时必须通过设置IOC2.7=1来实现,同时也把整个CAM内容全部清除掉了,因此所有要继续执行的命令必须重新设置,包括那些未锁定的命令。
4.方案缺点。对于上面讨论的CAM清除问题,显然在冲洗和重新装入CAM命令的过程中,可能会漏掉执行某些命令,所以必须考虑已装载的CAM命令的备份、记忆问题,因此没有足够的软件开销是很难解决这些问题的。同时也使得改变PWM信号输出这一软件控制过程变得复杂化且易出错。
从单片机资源的占用来看,基于HSO的多路PWM信号产生方案使用4个独立的HSO通道,执行PWM信号输出功能,仅实现单一地对动臂、铲斗的控制。这部分功能其实只是整个控制系统的一小部分,但其在软、硬件方面都占用较多的资源。此外,这种方案很大程度上限制了HSO在其他功能上的应用,没有充分发挥HSO独特而强大的功能,更不利于进一步扩展系统的监控任务。因此,可以考虑用硬件来实现多路PWM信号输出的设计方案。
1. M66240简介。M66240是一种可编程的PWM发生器,它内部包含有一个16位的预分频器和一个PWM计数器,可以实现4通道PWM信号产生的独立控制。
M66240有3种PWM输出模式,其中模式0和2通过对M66240编程实现周期性PWM信号,而模式1下必须依据外部触发信号来产生非周期性PWM信号。所以只有模式0和2满足要求。下面介绍这2种模式。
模式0:PWM计数器既可以用作16位,也可用作8位,区别仅在于PWM波形的分辨精度不同。该模式下一个PWM波形固定包含(2A-1)(A=8,16)个计数脉冲,设置PWM波形高电平持续时间的计数值M,就可以得到周期性输出的设定占空比的PWM波形。
模式2:PWM波形的产生原理同模式0,不过需要同时设置高电平持续时间的计数值 M和低电平持续时间的计数值N,才可以得到周期性输出的PWM波形。
可以看到在这种模式下,允许产生周期较大的PWM波形,并且PWM的周期和占空比调节更加自由,可以灵活产生各种PWM波形。
2.方案实现。采用M66240产生PWM信号时,把单片机时钟输出CLKOUT引脚的2分频时钟信号作为它的外部时钟源。例如单片机系统使用12 MHz晶振,则M66240的基准工作频率f(XIN)= 6 MHz。在该基准工作频率下,计算2种模式下PWM的周期,计算结果见表1。
表 1 2种模式下PWM的周期
这里要求的PWM周期是“ms”级的,一般取为1~2 ms,所以模式0(A=8)或模式2都可以。
模式0时,设置PWM计数器为8位,由T(μs)= [(L+1)/ f(XIN)] ×(28-1)可得T=2 ms时,预分频器计数值L=46;虽然每个PWM包含了12 000个外部时钟脉冲,但PWM的分辨率也只有8位。
模式2时,为提高PWM的分辨率,取定L=0,由T(μs)=[(L+1)/f(XIN)]×(M+N)可得T=2 ms时,M+N=12 000,这时PWM的分辨位数可以达到13位。再根据PWM的占空比可以分别确定M,N的值。一旦要改变PWM占空比,需要同时修改M,N两个计数值。
3. M66240与单片机的接口设计。将M66240当做单片机系统的一个外部I/O设备来用,CPU只作为它的一个软件伺服系统,通过软件指令独立设置各个通道的PWM信号周期、占空比,该芯片就会自动产生PWM信号,而不再受CPU控制(除非要改变PWM波形的特性)。M66240与单片机的接口电路如图1所示。
硬件电路设计中,3-8译码器74LS138的输出Y3作为M66240的片选信号;单片机的写信号WR控制其写控制端,实现单片机对M66240的写入操作;同时设置P1.4这路I/O口线作为它的命令/数据选通信号;它的8位数据口则直接与单片机的数据总线接口;由单片机系统向M66240提供时钟信号,即将时钟输出信号CLKOUT用作其外部时钟源,作为系统的时钟基准;4路PWM输出就是对动臂、铲斗的控制信号。
4.软件设计。主要是对M66240的编程。要控制M66240的不同通道产生PWM波形,只要设置各通道对应的预分频器计数值和PWM计数器的计数值即可,可通过向M66240写入不同的命令或数据来实现。单片机控制M66240输出的软件流程如图2所示。
对M66240的编程一共要用到3种操作命令:Command1,设定PWM输出模式和各路的外部触发输入,同时设置高电平宽度的输出极性。Command2,在一个字节的基础上,向各通道的预分频器和PWM计数器中指定的16位寄存器写数据。从第二字节开始的后续字节作为数据值被写入预分频器和PWM计数器。Command3,用于启动和中止PWM计数器的工作。
从对上述几种方案的分析可以看到,HSO中断的最大缺点是频繁的中断导致CPU执行效率降低;CAM锁定的最大缺点是软件编程复杂,需要较多的软件资源;采用专用PWM发生器芯片的缺点则是耗用一定的硬件资源,成本较高。
事实上,这几种方案在不同的场合需求下也是各有长处的:HSO中断适用于产生单路PWM信号,且要求PWM信号的频率在输出允许范围内;CAM锁定适用于在单片机控制功能单一,而要求产生多路同周期PWM信号的场合,且这多路PWM信号的输出有一定规律(如要求2~3路同时输出等),从而可尽量减少软件编程的复杂度;专用PWM发生器适用于单片机控制功能复杂,而又要求产生多路PWM信号的场合,直接利用硬件电路来产生PWM信号,不仅实时性好、输出可靠、准确,而且占用CPU资源少,提高了CPU的执行效率。