51
单片机产生PWM方波
//
利用定时器产生频率为
#include<reg52.h>
//头文件
1KHz,占空比为 7:3
的
PWM
方波
sbit output=P1^1; //输出端
unsigned char num=1; //辅助计时
void Init(void) //初始化½数
{
TMOD=0x01;
TH0=(65536-n)/256; //(65536-n)为定时器初值
TL0=(65536-n)%256;
EA=1;
ET0=1;
TR0=1;
}
main()
{
Init();
while(1)
{
if(num<=8)output=1;
else output=0;
}
}
//½占空比为 7:3
void Timer_0(void) interrupt 1
//中断½数
{
TH0=(65536-n)/256;
//(65536-n)为定时器初值
TL0=(65536-n)%256;
num++;
if(num>10)num=1;
}
½用定时器程序——示波器检测
实验次数
1
2
3
4
5
定时器初值(65536-n)
65536-100
65536-90
65536-85
65536-86
65536-87
频率(Hz)
880
963
1014
1008
998
占空比(%)
70.2
70.2
70.7
70.0
68.0
频率相对误差(%)
12
3.7
1.4
0.8
0.2
//
利用延时½数产生频率为
1KHz,占空比为 7:3
的
PWM
方波
#include<reg52.h> //头文件
晶振为
12M
sbit output=P1^1; //输出端
void Delay10Us_12M(unsigned int n)
{
while(n--);
}
main()
{
while(1)
{
output=1;
Delay10Us_12M(a); //a
为延时参数
output=0;
Delay10Us_12M(b); //b
为延时参数
}
}
½用延时½数程序——示波器检测
实验次数
1
2
3
4
5
6
延时参数(a,b)
70,30
71,30
73,30
74,31
76,32
76,31
频率(Hz)
1068
1058
1038
1019
992
1001
占空比(%)
69.2
69.6
70.2
69.9
69.0
70.0
频率相对误差(%)
6.8
5.8
3.8
1.9
0.8
0.1
总结:
定时器理论初值为
(65536-100) 中断一次的时间为 100Us,
时,
而执行一条语句时间为 1~4Us,这样会½ T 变大,f 减小,误差较大;
第二种方法,需要事先调试写出较准确的延时½数,以备随时调用,
½对于不同的晶振,不同的单片机,无法通用;综上,产生一定频率
和占空比的 PWM 方波,建议½用定时器实现,½必须用示波器检测,
以减小误差。
2012.09.17.½½½½
评论