51单片机PWM的控制

来源:本站
导读:目前正在解读《51单片机PWM的控制》的相关信息,《51单片机PWM的控制》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《51单片机PWM的控制》的详细说明。

一、PWM

Pulse Width Modulation脉冲宽度调制,简称PWM。

PWM(脉冲宽度调制)对模拟信号电平进行数字编码的方法,计算机只能输出0或5V的数字电压值而不能输出模拟电压,而我们如果想获得一个模拟电压值,则需通过使用高分辨率计数器,改变方波的占空比来对一个模拟信号的电平进行编码。

仍输出数字信号,因为满幅值的直流供电只有5V(1)和0V(0)两种。电压是以一种连接(1)或断开(0)的重复脉冲序列被夹到模拟负载上去的,连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,只要带宽足够,可以输出任意不大于最大电压值的模拟电压。

输出电压=(接通时间/脉冲时间)*最大

51单片机PWM的控制

二、51单片机的Timer

作者用的单片机是STC89C52,其内部有3个16位Timer,分别为T/C0,T/C1,T/C2,通过配置相关寄存器即可实现Timer的功能控制。

控制PWM需要用到定时器来生成不同占空比的波形,采用定时器中断的方式。

相关寄存器:

1.IE寄存器

位名称功能0EX0外部中断0的中断允许位1ET0Timer0的溢出中断允许位2EX1外部中断1的中断允许位3ET1Timer1的溢出中断允许位4ES串行口中断允许位5ET2Timer6--7EA中断允许总控制位

2. TCON寄存器

位名称功能0IT0外部中断0的触发方式选择位。功能和IE1类似1IE0外部中断0的中断请求标志位。功能和IE1类似2IT1外部中断1的触发方式选择位。当IT1=1时,为下降沿触发方式,也就是从高到低的跳变会触发外部中断1。当IT1=0时,为低电平触发,也就是单片机检测到该引脚电平为低时,会触发外部中断13IE1外部中断1的中断请求标志位。当IE1=1的时候,表示外部中断1被触发,正在请求单片机处理中断事件。当单片机相应中断,处理中断事件时,该位由单片机自动清零4TR0启动定时器/计数器0启动位,功能和TR1类似5TF0定时器/计数器T0溢出中断请求标志位。功能和TF1类似.6TR1启动定时器/计数器1启动位,TR=1启动计时,TR=0停止计时7TF1定时器/计数器T1溢出中断请求标志位。当T1溢出时,该位自动置1。单片机响应相应中断时,系统自动清零TF1,也可以程序清零

3. TMOD寄存器

控制Timer0/1的工作方式

位名称功能0M0工作方式选择位1M1工作方式选择位2C/T计数器模式和定时器模式选择位,C/T=1时,为计数器模式,C/T=0时,为定时器模式。C为counter的缩写,T为timer的缩写,这样方便理解3GATET1(0)的启动源选择位,GATE=1时,用外部中断引脚INT1(INT0)上的高电平来启动T1(T0);GATE=0时,用TCON里的TR1(TR0)来启动T1(T0)。4M0相似于0位5M1相似于1位6C/T相似于2位7GATE相似于3位M1M0工作方式00方式0,由TH1(TH0)的8位和TL1(TL0)的低5位组成一个13位定时器。01方式1,由TH1(TH0)的8位和TL1(TL0)的8位组成一个16位定时器。10方式2,TL1(TL0)溢出后,TH1(TH0)的数值自动填充到TL1(TL0)。11方式3,仅适用于T0,T0分成两个8位计数器,T1停止计数。

4. Timer0/1计数寄存器

TL0

TL1

TH0

TH1

当定时开启后,TL0(TL1)自动跟随机器周期加一。当TL0(TL1)满了后,自动清零同时向TH0(TH1)进一位,不需要手动操作.

而当TL0(TL1)和TH0(TH1)都满了以后,此时如果定时中断和总中断都已经打开,那么就会发生溢出中断,同时这两个寄存器清零

三、运用PWM完成呼吸灯

1. 硬件电路

51单片机PWM的控制

2. 软件驱动

unsigned char PWM_COUNT; //计数

unsigned int HUXI_COUNT; //占空比更新时间

unsigned char PWM_VLAUE; //占空比比对值

bit direc_flag; //占空比更新方向

void timer0_init()

{

TMOD=0x02; //模式设置,00010000,定时器0,工作于模式2(M1=1,M0=0)

TH0=0x47; //定时器溢出值设置,每隔200us发起一次中断。

TL0=0X47;

TR0=1; //定时器0开始计时

ET0=1; //开定时器0中断

EA=1; //开总中断

PWM_COUNT =0;

}

void time0() interrupt 1

{

PWM_COUNT++;

HUXI_COUNT++;

if(PWM_COUNT == PWM_VLAUE) //判断是否到了点亮LED的时候

LED = 1; //点亮LED

if(PWM_COUNT == 10) //当前周期结束

{

LED = 0; //熄灭LED

PWM_COUNT = 0; //重新计时

}

if((HUXI_COUNT == 600) && (direc_flag == 0))

{ //占空比增加10%

HUXI_COUNT = 0;

PWM_VLAUE++;

if(PWM_VLAUE == 9) //占空比更改方向

direc_flag = 1;

}

if((HUXI_COUNT == 600) && (direc_flag == 1))

{ //占空比减少10%

HUXI_COUNT = 0;

PWM_VLAUE--;

if(PWM_VLAUE == 1) //占空比更改方向

direc_flag = 0;

}

}

void main()

{

HUXI_COUNT = 0;

PWM_COUNT = 0;

PWM_VLAUE = 5;

direc_flag = 0;

LED = 1; //默认LED熄灭

timer0_init(); //定时器0初始化

while(1);

}

提醒:《51单片机PWM的控制》最后刷新时间 2024-03-14 01:00:31,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《51单片机PWM的控制》该内容的真实性请自行鉴别。