Keil C是基于标准C内核的第三方语言,利用它可以很方便高效地实现对C51系列单片机的高级编程。C51是目前使用最普遍的8位单片机,价格低廉。它与软件编程结合,可以比较方便地满足众多功能要求,甚至取代一些复杂的硬件电路,简化硬件设计,并提高系统的可靠性和降低成本。基于这个思想,本文提出了一种在 C51单片机上软件实现相对复杂的双极型PWM 的新方法。 1 PWM 控制原理 PWM(Pulse Width Modulation)即脉冲宽度调制,它通过控制信号去调制方波脉冲的宽度,从而获得控制的实现。 产生PWM 信号可以由硬件方法和软件方法实现。传统的硬件模拟方法是把调制信号和载波(一般是三角波)同时接入运算放大器的两个输入端作比较而得到。而软件的实现,特别是基于单片机的软件实现方法,主要是利用其内部提供的定时器,通过改变定时器的定时初值获得不同的脉冲持续时间,如果把系统的控制信号和定时器的定时初值线性对应起来,就可获得控制信号对脉宽调制的PWM 信号。所以这样线性的对应过程就成为这个实现过程的关键。控制信号的种类不同,采用不同的计算方法,又可以获得不同的PWM,见文献[3]。 2 在AT89C51中实现双极型PWM的方法 51系列单片机提供了非常丰富的资源,它除了拥有4个通用并口和1个串口外,还有外部中断和内部定时器等。而且,不同的型号还集成有不同的功能,比如 AT89C51就在片内集成了4 K 的ROM,这样存储空间可以满足一般的编程需要,而不必去构建程序存储器,既提高了工作效率和系统的稳定性,又降低了生产成本。 基于AT89C51单片机的PWM 软件实现的重要硬件支撑是该单片机内部的定时器。在AT89C51内实现PWM 的基本过程:首先选定脉冲的频率T,然后根据控制信号的变化范围,这里假设是(0~V),则可以求出t时刻通过控制信号V(t)的对应脉冲的正、负脉冲持续时间。这两个时间长度在单片机里是通过给定时器赋相应的初值而得,即定时器获得这样的定时初值后就在机器周期的同步下,从这个初值加1计数,定时器满时则产生相应时间长度的溢出中断,再利用这个中断所响应的服务程序去控制单片机某一引脚相应的正、负电平极性的持续时间。如果上述过程连续进行,就可在这个引脚获得宽度随控制信号V(t)大小变化的PWM方波信号。 AT89C51单片机每个机器周期由6个状态组成,每个状态又有两个时钟周期,这样一个机器周期就等于12个时钟周期,即机器频率为时钟频率的12分频。通过对工作模式寄存器TMOD的赋值操作,把定时器设为内部定时状态并选择不同的定时方式。然后假设PWM 的周期T小于定时器一次溢出时间,即T<2Nus,这里的N为定时器的位数。这样就可以得到脉宽(脉冲持续时间)twx定时初值Twx的关系: twx=(2N-Twx)×12/f us (1) 如果所用晶振为12 MHz,定时器为方式1,即为16位定时(这时定时有比较大的计数范围,用途更为广泛),这样上式变为: twx=(216 - Twx )us (2) 之后再根据功率器件的时间特性和工作的平均功率值,确定一个合适的PWM 信号周期T,很显然这个周期T就是由高电平脉宽twh和低电平脉宽twl组成,即: T=twh+ twl (3) 当调制PWM 脉宽的误差信号V(f)(这个信号一般是由传感器采集后经过相关处理后得到的误差信号)的变化范围是(0~V)或(-V~V)时,PWM脉宽与误差信号为线性关系(实际可能不是线性的,但一般可以忽略或者可以通过前级进行软件补偿),可以从单片机的1个引脚得到PWM 信号,具体的过程在相关文献已有叙述,见文献[4]。 然而,单片机一般是单极型的,它的逻辑0对应的实际电平是0 V,逻辑1对应的实际电平是+5 V。严格地说,在这种单片机上只能够输出单极型的PWM 信号。采用AT89C51结合软件编程实现双极型PWM 控制的设计思想是这样的:从AT89C51的一个引脚得到正的单极型PWM 信号输出,对另一个引脚做相应的设计和定义,让它承担对应的“负”极型PWM 信号的输出。即当调制PWM 脉宽的误差信号为正时,对应的PWM 就从AT89C51单片机的一个引脚输出;当误差信号为负时,对应的PWM 就从另外一个引脚输出,尽管这个输出信号的模拟电平也是正的,但它对应的是负值的误差信号所产生的PWM 输出,又是驱动负极型功率器件,和负极型PWM 功能一样,于是可以把它等效为负极型PWM;当误差信号为零时,相应的两个引脚都没有输出,然后再把这两个引脚接入PWM 功率驱动电路的输入端。通过对误差信号正负的判别,再利用AT89C51的两个引脚就实现了双极型的PWM。具体电路如图1所示。 ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164421437.jpg)
下面计算产生双极型PWM 所需的定时初值。实际上稳定工作时,只有一个引脚有输出,即一般两个引脚不会同时输出,所以可看作是两个相对独立的过程,可假设脉宽和误差信号的线性对应关系: ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164445531.jpg)
据此可求出定时初值与误差信号的关系: ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164530765.jpg)
由(1)式有 ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164550437.jpg)
把式(5)代入式(6)得: ![](http://www.zwmcu.com/Pics/Articles/2009-7-1316468281.jpg)
当晶振频率取12 MHz时,f=12。采用定时方式1,则可以得到即时的控制信号V(t)和定时初值在PWM 信号的一个周期内的关系: ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164627187.jpg)
因为V和V(t)通过对误差计算都可以得到,所以根据式(8)可以求出t时刻对应的PWM 一个周期高低脉宽的定时初值(注意这里的T的单位是us,频率f的单位为MHz)。 3 Keil C下的程序实现 Keil C是基于标准C的C51专用高级编程语言,它具备标准C的强大灵活的编程能力,同时又相对增加了对C51单片机硬件资源的直接操作,故在Keil C下对C51的程序设计几乎使人们可摆脱对C51底层寄存器等硬件的烦琐操作,编程效率显著提高,并且程序运行速度和所占空间和汇编差别不大。这里利用定时器T0的方式1,采用其时间溢出中断,中断号为1,具体程序流程如图2所示。 ![](http://www.zwmcu.com/Pics/Articles/2009-7-13164648312.jpg) 图2 PWM信号实现的软件流程
E -误差控制器;TH0-T0定时器高位;TL0-T0定时器低位;Twh、Twl-定时器初值 4 结语 单片机硬件发展很快,出现了16位、32位等多位机,但今后一段时期C51系列的8位机将仍占主流。通过适当的软件开发,可以挖掘其内在价值,这样既降低了生产成本,又锻炼了个人的软件开发能力。 |