脉冲宽度调制波可以直接通过低通滤波器进行解调。
实现数字脉冲宽度调制器的基本思想如图2所示。
图2 数字脉冲宽度调制器的构成
图2中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。
5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。
循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。
在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。
奇偶序列的产生方法是将计数器的最后一位作为比较数据的最低位,在一个计数周期内,前半个周期计数器输出最低位为0,其他高位逐次增大,则产生的数据即为偶数序列;后半个周期输出最低位为1,其余高位依次减小,产生的数据为依次减小的偶序列。
具体电路如图3所示。
图3 数字PWM实现电路
一般情况下,调节脉冲宽度信号的脉宽有两种方法,一种方法是采用模拟电路中的调制方法,另一种是脉冲计数法。
对于一般电机控制,由于滤波频率较低、滤波精度要求高和滤波电路的参数不易调整地原因,采用第一种方法在控制电压变化时滤波的实现存在较大的困难。
因此,本例主要介绍单片机控制实现的脉冲计数法。
1.2选择外部技术芯片
计数器既可以采用专用的计数器芯片,也可以利用51单片机自带的内部计数器。
如果测控系统的控制量少,而且对体积和重量的要求比较高,可以采用单片机内部的定时器。
但是由于一般51单片机的时钟最大只能取24MHz,单指令周期为0.5μs,计数频率为106Hz,对于区别类似于频率为2999Hz(计数应为666.889)和3000Hz(计数应为666.87)的输出时无法做到的,随意有些情况就必须使用外部计数器。
本例选用Intel公司的定时/计数芯片8254作为外部计数器。
8254是8253的改进型,操作方式及引脚于8253完全相同,它的改进主要反映在两方面:
·8254的计数频率更高,最高可达8MHz,而8254-2更高可达10MHz;
·8254比8253多1个读回命令。
由于使用了外部计数芯片,单片机只需向计数芯片的寄存器中发送控制脉宽的计算值,计数器就能自动地根据计数值调节电平的高低变化,从而模拟PWM信号输出。
·与Intel公司及大部分公司的微处理器接口兼容;
·可以处理最高8MHz的输入时钟;
·具有6种可编程计数器模式;
·具有3个独立的16位计数器;
·具有状态读回命令;
·具有二进制或BCD两种计数方式;
·可用于实现实时时钟、事件计数、方波产生、复杂波形产生和复杂电压控制等;
·+5V供电。
1.3硬件选择
本例的硬件电路主要由单片机和外部计数芯片构成,接口电路和外围电路的实现都较为简单。
单片机是本例的核心器件之一,用于控制外部计数芯片实现PWM信号输出。
本例选用Atmel公司的AT89C52作为单片机芯片,它完全能够满足要求,而且极为常用,价格便宜,易于获取。
另一主要功能器件就是外部计数器,本例选用Intel公司的专用定时/计数芯片8254。
图4 8254引脚图
其引脚功能如下:
·D7~D0(1~8引脚):
双向三态数据线,应用时和系统数据总线相连;
·CLK0(9引脚):
计数器0时钟输入引脚;
·OUT0(10引脚):
计数器0输出引脚;
·GATE0(11引脚):
计数器0门输入引脚;
·GND(12引脚):
接地引脚;
·OUT1(13引脚):
计数器1输出引脚;
·GATE1(14引脚):
计数器1门输入引脚;
·CLK1(15引脚):
计数器1时钟输入引脚;
·GATE2(16引脚):
计数器2门输入引脚;
·OUT2(17引脚):
计数器2输出引脚;
·CLK2(18引脚):
计数器2时钟输入引脚;
·A0、A1(19、20引脚):
地址线,选择进行读写操作的三个计数器或者控制字寄存器,正常情况和系统地址线相连接;
·/CS(21引脚):
片选引脚,低电平有效的输入引脚。
·/RD(22引脚):
读控制引脚,低电平有效的输入引脚。
·/WR(23引脚):
写控制引脚,低电平有效的输入引脚。
·VCC(24引脚):
电源脚,+5V供电。
2.硬件设计
本设计选用可编程定时器/计数器8254-2,其最高计数频率可达10MHz;充分利用8254-2的3个定时器/计数器,采取频率的分频输出,并且不需要外部的信号源输入,硬件电路简化;通过软件的处理可以实现连续(1Hz~3kHz)PWM波的输出。
本设计中将要输出的PWM波分为3段,分别由8254-2中的3个定时/计数器输出,门控由P2.2、P2.3、P2.4分别加以控制。
在1~20Hz的输出时,采用定时器0,计数频率为104Hz,最大计数为104,最小计数为500符合要求,21~200Hz的输出中,采用定时器1,计数频率为105Hz,最大计数为4762,最小计数为500;在201Hz~3kHz的输出中,采有定时器2,计数频率为107Hz,最大计数为49751,满足二进制计数的范围,最小计数为3333。
这些计数值可由单片机89C51[2]送给8254-2的数据输入端,通过除法运算来得到这些计数值,由除法运算得到商。
所得到的商去程序指令占用的时间即为所需要的计数值。
采用8254-2的3个定时器的输出经过1个或门作为CD4046锁相环的输入,同时经过1个非门进入89C51的INT1口,申请下降沿中断;CD4046锁相环输出所需的PWM。
3.电路原理图及说明
本例将实现3路PWM信号输出,定时/计数芯片8254具有3个独立的计数器,只需要选择一片就可以满足要求。
硬件电路设计部分主要由单片机控制部分电路,定时/计数芯片8254电路以及单片机与定时/计数芯片8254的接口电路组成。
单片机控制部分电路原理图如图5所示。
图5 单片机控制部分电路原理图
图中所示,单片机部分采用Atmel公司的AT89C52(U1),工作时钟为11.0592MHz,P0.0~P0.7口与计数芯片8254的数据口D0~D7相连,8254的片选信号线连接在单片机的P2.0口,P2.1、P2.2与8354的地址线A1、A0相连,8254的读、写控制脚分别连接在单片机的P3.7(读)、P3.6(写)口。
定时/计数芯片8254电路原理图如图6所示。
图6 定时/计数芯片8254电路原理图
定时/计数芯片8354(U2)由3个计数器输出3路独立的PWM信号,分别为PWM_1、PWM_2和PWM_3,3个计数器的输入时钟均为1MHz,晶振Y2提供的1MHz时钟CLK,他们的门控制输入均接高电平,确保信号连续输出。
4.软件设计
4.1设计流程图
单片机实现3路PWM信号输出的流程图如图6所示。
结束
图6 单片机实现3路PWM信号输出的流程图
单片机对计数芯片8254的控制主要通过对其内部的控制字和计数寄存器的操作来实现的。
4.28254的内部控制字和计数寄存器
8254内部有3个独立的计数器,每个计数器都对应于一个计数寄存器,另外还有一个控制字寄存器,通过它可以实现对3个寄存器的配置。
A0、A1是8254的寄存器地址,单片机通过对A0、A1地选择。
来确定是对计数寄存器还是控制字寄存器操作,具体如表1所示。
表1A0、A对寄存器的选择
A0
A1
寄存器
0
0
计数器0
0
1
计数器1
1
0
计数器2
1
1
控制器
由于单片机的P2.0和8254的低电平有效的片选脚/CS相连,P2.1和P2.2分别和A0和A1A相连,因此8254内部各寄存器的地址分配如表2所示。
表28254内部各寄存器的地址分配
寄存器
地址
计数器0
0x0000H
计数器1
0x0200H
计数器2
0x0400H
控制字
0x0600H
控制字寄存器的作用是用于选择每个寄存器的工作方式,其具体内容如表3所示。
表38254控制字寄存器的内容
D7
D6
D5
D4
D3
D2
D1
D0
SC1
SC0
RW1
RW0
M2
M1
M0
BCD
各控制位功能如下:
SC1、SC0:
选择计数器或读回命令,其设置如表4所示。
表4SC0、SC1设置
SC1
SC0
寄存器
0
0
选择计数器0
0
1
选择计数器1
1
0
选择计数器2
1
1
读回命令
RW1、RW0:
读/写方式控制位,其设置如表5所示。
表5RW0、RW1设置
RW1
RW0
寄存器
0
0
计数锁存命令
0
1
只读/写低位字节
0
0
只读/写高位字节
0
1
先读/写低位字节,后读/写高位字节
M2、M1、M0:
模式选择位,其设置如表6所示。
表6模式设置
M2
M1
M0
模式
0
0
0
模式0
0
0
1
模式1
x
1
0
模式2
x
1
1
模式3
1
0
0
模式4
1
0
1
模式5
本例中各计数器均设置为模式0,在此模式下,输出在写完控制字寄存器后为低电平,并一直保持到计数器计数到0时变为高电平,然后一直保持高电平知道新的计数开始或者对控制字寄存器重设置模式0。
BCD:
此位为0设置计数器为16位二进制计数器;BCD位为1时设置计数器为BCD码计数器。
4.3中断处理过程
当89C51检测到有INT1中断时,进入中断处理程序中,首先检测30H和31H中的内容是否大于20;若不大于20,则门控为P2.2,选中8254-2,选择计数器0、方式3、16位二进计数,送上次计算出来的这次所需要的计数值给8254-2,将104送入32H、33H中作为除法运算中的被除数,而30H、31H的内容作为除法运算中的除数,调用除法运算子程序将所得的商送入32H、33H,余数放在35H、36H中。
比较余数是否大于除数的一半,若大于除数的一半则所得的商加1,否则商不变放在32H、33H中。
假设程序指令所占用的时间为X/200(其中X为中断程序中单指令周期的个数),将32H、33H中的内容减去X/200,即为下次所要送入8254-2的计数值,放在35H、36H中,返回中断;若大于20,则门控为P2.3,选中8254-2,选择计数器1、方式3,送上次计算出来的这次所需的计数值给8254-2,将105送入32H、33H、34H中作为除法运算中的被除数,而30H、31H中的内容作为除法运算中的除数,调用除法运算子程序,将所得的商送入32H、33H中,余数放在35H、36H中。
比较余数是否大于除数的一半,若大于除的一半则所得的商加1,否则商不变。
假设程序指令所占用的时间为X/20,将32H、33H中的内容减去X/20即为下次所要送入8254-2的计数值,放在35H、36H中,返回中断,若大于200,则门控为P2.4,选中8254-2,选择计数器2、方式3、二进制计数,送上次计算出来的这次所需的计数值给8254-2,将107送入32H、33H、34H中作为除法运算中的被除数,而30H、31H中的内容作为除法运算中的除数,调用除法运算子程序,将所得的商送入32H、33H中,余数放在35H、36H.比较余数是否大于除数的一半,若大于除数的一半则所得的商加1,否则商不变入在32H、33H中。
假设程序指令令所占用的时间为X*5,将32H、33H中的内容减去5X,即为下次所要送入8254-2的计数值,放在35H、36H中,返回中断。
结论
采用89C52控制PWM分段,8254-2步进式输出1Hz~3kHz的PWM,可以通过软件编程的方法提高分辨率。
在有些特殊场合只靠单片机内部的定时器或模拟电路无法精确输出1Hz~3kHz,单步为1Hz的PWM波形时,此设计就显出其明显的优越性,而且它占用的CPU时间短。
此设计的结构简单、成本低、可靠性好、抗干扰能力强,可在控制和测量中得到应用。
致谢
衷心感谢我的指导教师余大庆,本毕业设计是在他的悉心关怀和精心指导下完成的。
经过不断的搜索努力以及余大庆老师的耐心指导和热情帮助,本设计已经基本完成。
在这段时间里,余老师严谨的治学态度和热忱的工作作风令我十分钦佩,他的指导使我受益非浅。
同时本院508实验室的开放也为我的设计提供了实习场地。
在此对余老师表示深深的感谢。
感谢赵然、胡辉等同学,他们在我的本科学习期间,给了我很多的帮助和支持,在毕业设计方面也提出了非常多的宝贵意见。
通过这次毕业设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学四年的学习成果。
虽然在这次设计中对于知识的运用和衔接还不熟练。
但是我将在以后的工作和学习中继续努力、不断完善。
参考文献:
[1]孙韩方,许爱卿.单片机原理及应用[M].北京:
航空航天大学出版社,1996:
40—60.
[2]B.A.Arwick.MicromputerIinterfacing.Prenticve-Hall,Inc.1980:
77—200.
[3]李超青.单片机原理与接口技术[M].北京:
航空航天大学出版社,2000:
58—60.
[4]ChenWenren.AcollectionofsubprogramofMCS-51seriesMicro-controller.Beijing:
TsinghuaUniversityPublishingCompany,1993:
101—125.
[5]霍孟友,王爱群.单片机原理与应用[M].北京:
机械工业出版社,2000:
67—79.
[6]李全利,迟荣强.单片机原理及接口技术[M].北京:
高等教育出版社,2004:
128—139.
[7]何立民.单片机应用系统设计[M].北京:
航空航天大学出版社,1991:
171—178.
[8]沈庆阳,郭庭吉.8051单片机实践及应用[M].北京:
清华大学出版社,2002:
78—82.
[9]杨镇江.流行单片机使用子程序及应用实例[M].西安:
科技大学出版社,2002:
12—130.
[10]张迎新.微型计算机原理及应用接口技术[M].北京:
国防工业出版社,2002:
88—92.
[11]SantaClara,Microprocessorandperipheralhandbook,IntelCorporation,1988:
58—65.
[12]朱定华.单片机原理及接口技术试验[M].北京:
清华大学出版社,2000:
44—56.
[13]陈光东.单片机微型计算机原理和接口技术[M].武汉:
华中理工大学出版社,1999:
88—96.
[14]A.S.SedrsandK.C.Smith,MicroelectronicCircuits.4thed.OxfordUniversitypress,Inc,1998:
87—95.
[15]ZhangYigang,PengXiyuan,TanXiaojun,Etal.ApplicationaSingle-chipnddesignofMCS-51single-chipcomputer,Haerbin:
HaerbinIndustryUniversityPublishingCompany,2001:
234—248.
附录
1.程序说明
基于8254产生PWM信号的程序主要包括三方面内容:
一是定义8253寄存器的地址,二是控制字的写入,三是数据的写入。
具体代码如下:
#ifndef_PWM_H//防止PWM.h被重复引用
#define_PWM_H
#include//引用标准库的头文件
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineCOUNT0XBYTE[0x0000]//8254计数器0寄存器地址
#defineCOUNT1XBYTE[0x0200]//8254计数器1寄存器地址
#defineCOUNT2XBYTE[0x0400]//8254计数器2寄存器地址
#defineCOMWORDXBYTE[0x0600]//8254控制字寄存器地址
#endif//以上为引用头文件。
//以下为引用的源程序。
#include"PWM.h"
unsignedintm,n;
unsignedintsum=0,p=0,q=0;
unsignedcharhang,lie,num=0,cishu=0;
uintflag=0,a=0,b=0,xx,yy;
unsignedcharcodetable[]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90};
voiddelay(uintt)//延时涵数
{
uinti;
while(t--)
{
for(i=0;i<125;i++);
}
}
voidbutton()
{
P2=0x0f;
if(P2==0x0e)hang=0;
if(P2==0x0d)hang=1;
if(P2==0x0b)hang=2;
if(P2==0x07)hang=3;
delay(80);
P2=0x0f0;
if(P2==0x0e0)lie=0;
if(P2==0x0d0)lie=1;
if(P2==0x0b0)lie=2;
if(P2==0x70)lie=3;
delay(80);
num=(hang)*4+lie;
if(num==-5)num=0;
if(hang!
=0&&lie!
=0&&num<10)//大于10的键值的键要用在别处,所以不能加进去,特别注意~~
{
cishu++;
if(cishu==5)
{
cishu=4;
sum=sum%1000;
}
sum=sum*10+num;
if(xx!
=sum)
{
SBUF=table[sum/1000];
SBUF=table[sum/100%10];
SBUF=table[sum/10%10];
SBUF=table[sum%10];
xx=sum;
}
hang=0;
lie=0;
}
if(num==10)//确定频率
{b=sum;
m=(65536-1000/sum*1000/3)/256;
n=(65536-1000/sum*1000/3)%256;
}
if(num==11)//确定占空比
{
p=((sum%100)*1000/b*1000/3/100-150)%256;
q=((sum%100)*1000/b*1000/