您的位置:首页 > 其它

PWM在51单片机的使用和分析

2018-01-08 20:04 232 查看
1.什么是PWM?

PWM在百度的解释是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

我对百度的解释比较认同,但是由于我是实用派,还是觉得有些复杂,不是很好理解。众所周知,我们国家的交流电是50HZ,代表着一秒内有50次的变化——从低电平到高电平、高电平到低电平,周而复始。而直流电却是单一的高电平。我就简单的认为PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。

2.怎么编写PWM程序?

上文我简单的给PWM下了一个定义——PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。那么我们现在就只需要分析交流电的波形是怎么样的,然后通过编程让单片机发出类似交流电的波形并控制每个波形的宽度就行了。

首先交流电的波形是没有方向的,所以这一点我们是不可能做到的,毕竟正负极摆在这里,我们能做到的是和交流电一样的频率。交流电一秒钟的频率是50HZ,也就是在一秒内变化50次,那我们同样让直流电变化50次,并控制变化的时间不就达到了和交流电一样的频率。

理清楚了思路,我们就可以开始编程了。

#include<reg52.h>

/*
实验 STC89C52
PWM波的使用与分析
2018-1-8
*/
//宏定义
#define uchar unsigned char
#define uint unsigned int

//定义IO口
sbit led = P1^0;

//定义变量
uchar num = 50;
bit bz = 1;

//函数声明
void init();    //定时器0 初始化

void main()
{
init();     //调用初始化函数
while(1)
{
}
}

void init(void)
{
TMOD = 0x11;     //设置定时器的工作模式
EA = 1;     //开总中断

//开定时器0
TH0 = (65535-500)/256;  //装初值
TL0 = (65535-500)%256;
ET0 = 1;    //开定时器0中断
TR0 = 1;    //启动定时器0

//开定时器1
TH1 = (65535-45872)/256;    //装初值
TL1 = (65535-45872)%256;
ET1 = 1;    //开定时器1中断
TR1 = 1;    //启动定时器1
}

void T0_time(void)  interrupt 1
{
static uchar t0_cnt=0;
TH0=(65535-500)/256;   //0.5ms
TL0=(65536-500)%256;
t0_cnt++;
if(t0_cnt < num)    //当小于临界值时 灯灭
{
led = 1;

}
if(t0_cnt > num)    //当高于临界值时 灯亮
{
led = 0;
}
if(t0_cnt > 40)     //当亮了一个周期以后 复位
{
t0_cnt = 0;
}

}

void T1_time(void)  interrupt 3
{
static uchar t1_cnt=0;
TH1=(65535-45872)/256;     //50ms
TL1=(65536-45872)%256;
t1_cnt++;
if(t1_cnt == 5)
{
t1_cnt = 0;

if(bz == 1)
{
num--;
}
if(bz == 0)
{
num++;
}
if(num == 0)
{
bz = 0;
}
if(num == 41)
{
bz = 1;
}
}

}


本段程序,我使用了两个定时器,定时器0定时0.5毫秒用来控制直流电在一秒内变化的周期,定时器1定时50毫秒用来控制直流电在每一个周期内高电平占用周期的时间,也即是控制脉宽。

通过计算,1秒内产生50次变化,即20毫秒产生一个变化,定时器0每0.5毫秒产生一次中断,产生中断达到40次时刚好一个周期结束。而脉宽我用定时器1来调节,通过改变临界值num的值,让高电平在一个周期内的时间做出不同的变化。

3.PWM的使用和分析

由于条件有限,不能用示波器来测量单片机发出的直流电的频率是多少,但是我相信即使有错误,误差也不会很大,产生误差的原因大致与晶振的频率有关。

虽然没有测得频率是多少,但我还是用万用表测量了它的电压,测得电压用0V慢慢的升到了4.5V。外在表现为LED灯呈现了呼吸灯的效果,从暗到亮,从亮到暗。

通过本次实验可以知道,PWM可以改变电压的大小,从而可以用这电压控制一个元件的目的。

程序下载地址 http://download.csdn.net/download/m0_37277616/10195051

新人发博客 ——有什么解释
823d
的不对的地方请多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机 pwm