基于51单片机双极型PWM 的软件实现

发布者:jingyan最新更新时间:2012-11-27 来源: 21IC 关键字:51单片机  双极型PWM  C51系列 手机看文章 扫描二维码
随时随地手机看文章

    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所示。[page]
 
    下面计算产生双极型PWM 所需的定时初值。实际上稳定工作时,只有一个引脚有输出,即一般两个引脚不会同时输出,所以可看作是两个相对独立的过程,可假设脉宽和误差信号的线性对应关系:

据此可求出定时初值与误差信号的关系:
 
由(1)式有
 
把式(5)代入式(6)得:
 
    当晶振频率取12 MHz时,f=12。采用定时方式1,则可以得到即时的控制信号V(t)和定时初值在PWM 信号的一个周期内的关系:
 
    因为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所示。
 
图2 PWM信号实现的软件流程
E -误差控制器;TH0-T0定时器高位;TL0-T0定时器低位;Twh、Twl-定时器初值

4 结语
    单片机硬件发展很快,出现了16位、32位等多位机,但今后一段时期C51系列的8位机将仍占主流。通过适当的软件开发,可以挖掘其内在价值,这样既降低了生产成本,又锻炼了个人的软件开发能力。
参考文献:
[1] 李朝青.原理及接口技术[M].北京:北京航空航天大学出版社,1999.
[2] 孙传友.测控系统原理与设计[M].北京:北京航空航天大学出版社,2002.
[32 张运波.PWM 信号的软件实现方法[J].微型计算机信息,2002,8(10)

关键字:51单片机  双极型PWM  C51系列 引用地址:基于51单片机双极型PWM 的软件实现

上一篇:单片机测量频率的设计与实现
下一篇:12864点阵液晶显示模块与51单片机的接口及程序设计

推荐阅读最新更新时间:2024-03-16 13:14

51单片机C语言程序100例分析(3)串口
//实例49:用定时器T0的中断实现 渴望 主题曲的播放 #include reg51.h //包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7 unsigned int C; //储存定时器的定时常数 //以下是C调低音的音频宏定义 #define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 3
[单片机]
8051单片机特殊功能寄存器SFR基础详解
8051单片机共有21个专用寄存器,现把其中部分寄存器简单介绍如下: 程序计数器(PC—Program Counter)。在实训中,我们已经知道PC是一个16位的计数器,它的作用是控制程序的执行顺序。其内容为将要执行指令的地址,寻址范围达64KB。PC有自动加1功能,从而实现程序的顺序执行。PC没有地址,是不可寻址的,因此用户无法对它进行读写,但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。因地址不在SFR(专用寄存器)之内,一般不计作专用寄存器。 累加器(ACC—Accumulator)。累加器为8位寄存器,是最常用的专用寄存器,功能较多,地位重要。它既可用于存放操作数,也可用来存放运算的中间结果。MCS-
[单片机]
80<font color='red'>51单片机</font>特殊功能寄存器SFR基础详解
c51单片机编程要点总结
c51单片机编程要点总结 1、头文件:#include (我用的是 STC 89C54RD+) 2、预定义:sbit LED = P1^0// 定义 P1 口的 0 位为 LED 注:“P1^0”这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7 注2:sbit 用于定义 SFR(特殊功能寄存器)的位变量,上例中 LED 作为“全局变量”进行定义 注3:以下写法是错误的: sbit code table = {P1^0, P1^1, P1^2, P1^3};// 想用 table 指定不同的引脚,但这么做会报错 sbit table = {P1^0, P1^1, P1^2, P1^3}
[单片机]
51单片机入门教程(3)——数码管显示
一、LED数码管简介 LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成的器件。常见的LED数码管为“8”字型的,共计8段。每一段对应一个发光二极管。 数码管有共阳极和共阴极两种 共阴极: 数码管的发光二极管的阴极连在一起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮。 共阳极: 数码管的发光二极管的阳极连在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。 二、数码管静态显示 数码管静态显示就是无论多少位LED数码管,同时处于显示状态。 为了使数码管显示不同的符号或数字,只需要把某些段发光二极管点亮就可以了。 假设在共阴极的
[单片机]
<font color='red'>51单片机</font>入门教程(3)——数码管显示
51单片机C中.c文件和.h文件
1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明; 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。 2)h文件里应该有什么 常量,结构,类型定义,函数,变量申明。 3)h文件不应该有什么 变量定义, 函数定义。 4)extern问题 对于变量需要extern; 对于函数不需要因为函数的缺省状态是extern的.如果一个函数要改变为只在文件内可见,加static。 5)include包含问题 虽然申明和类型定义可以重复,不过推荐使用条件编译。 #ifndef _FILENAME_H, #define _F
[单片机]
51单片机-数码管静态显示
数码管,英文名称Segment Displays,是把多个发光二极管封装在一起,组成8字,或者米字形的器件。 如上图所示,分别为8字和米字形的数码管,还有一些异形的,暂时不考虑。 今天主要说8字形的数码管,这种数码管主要分两类:7段的和8段的;驱动方式分两种:共阴极 和 共阳极。根据连在一起的字符数量,还会分为1位的,2位的,3位的,4位的等等。 先说七段和八段的分别,这个很简单,从外表就能看出来。把8字分成一段一段的LED,刚好有7段,如果再加上右下角那个小点,就是8段。也就是说,一个完整的1位数码管由七个或者八个LED组成,想要显示1、2、3等等的字符,点亮相应的数码管组成该字符就行。那么如何点亮
[单片机]
<font color='red'>51单片机</font>-数码管静态显示
利用51单片机设计的交通灯汇编原程序
用的是51系列的 单片机 , 说一下,MARK标志位其关键作用, 需要的人自己想想, 下面是仿真图 LED 0 EQU P1 LED2 EQU P2 LED1 EQU P0 MARK BIT 00H MARK1 BIT 01H TIME EQU 30H;时间缓冲区 SHI EQU 31H ;时长数据缓冲区! KEY EQU P3.2 KEY1 EQU P3.3 CTH EQU (65536-50000)/256 CTL EQU (65536-50000) MOD 256 ORG 0000H JMP START ORG 0003H JMP INT_0 ORG 000BH JMP TIME0 ORG 0030H ST
[单片机]
利用<font color='red'>51单片机</font>设计的交通灯汇编原程序
基于AT89C51单片机的变频调速控制系统设计
  1.概述   在电气传动领域中,随着自关断器件技术水平的不断提高,脉宽调制技术(简称PWM技术)也日趋成熟。PMW交流变频调速以其高效率、高功率因数、输出波形好、结构简单等优点,在井下风机、水泵、造纸机等设备中得到了广泛的应用。将单片机应用于交流变频调速系统,可有效地避免传统调速方案中的一些缺点,达到了提高控制精度的目的 ,其特点:   (1)采用单片机可以使绝大多数控制逻辑通过软件实现,简化了电路。   (2)单片机具有更强的逻辑功能,运算速度快,精度高,有大容量的存储单元,可以实现较为复杂的控制。   (3)无零点漂移,控制精度高。   (4)可以提供人机界面,多机连网工作。   根据国内外有关变频调速的最新研
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved