目录
一、原理
二、设置思路:
三、题目练习
一、原理
1.脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
2、配置PWM模块的功能,具体有:
①:设置PWM定时器周期,该参数决定PWM波形的频率。
②:设置PWM定时器比较值,该参数决定PWM波形的占空比。
3.简单来说,就是通过控制PWM的占空比duty(高电平所占时间)来实现所需的功能;(第七届比赛赛题)
![](https://img-blog.csdnimg.cn/07cec6c8114747f0aa1387a4ca37ee3b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWWhoLTYyMw==,size_20,color_FFFFFF,t_70,g_se,x_16)
二、设置思路:
计算出占空比在给定频率(1KHz)下的时间,通过引入count变量,以一个脉冲周期100次为例,60%占空比就是count++到60次高电平状态;当count=duty(占空比)时,执行操作;
对于多状态转换,使用状态机更好
三、题目练习
以b站小蜜蜂老师的题目为引例:![](https://img-blog.csdnimg.cn/de5a2b0de86645499d8fa1aecef88854.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWWhoLTYyMw==,size_20,color_FFFFFF,t_70,g_se,x_16)
#include "reg52.h"
sbit L1 = P0^0;
sbit S7 = P3^0;
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4: P2 = (P2 & 0x1f) | 0x80; break;
case 5: P2 = (P2 & 0x1f) | 0xa0; break;
case 6: P2 = (P2 & 0x1f) | 0xc0; break;
case 7: P2 = (P2 & 0x1f) | 0xe0; break;
}
}
unsigned char count=0;
unsigned char pwm_duty=0; //占空比设置为可变
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1;
}
void ServiceTimer() interrupt 1
{
TH0 = (65535 - 100) / 256; //10 ms = 10000us 定时中断100us,则100次中断达到一个周期
TL0 = (65535 - 100) % 256; // 将一个脉冲划分为100份,若占空比10%,则计数10次高电平后计数90次低电平后置零完成
count++;
if(count == pwm_duty)
{
L1 = 1 ;
}
else if(count == 100)
{
L1 = 0;
count = 0;
}
}
void Delay(unsigned char t)
{
while(t--);
}
unsigned char stat=0;
void ScanKey()
{
if(S7 == 0)
{
Delay(500);
if(S7 == 0)
{
//多状态时使用状态机的跳转
switch(stat)
{
case 0 : L1 = 0;
TR0 = 1;
pwm_duty = 10;
stat = 1;
break;
case 1 :
pwm_duty = 50;
stat = 2;
break;
case 2 :
pwm_duty = 90;
stat = 3;
break;
case 3 :
L1 = 1;
TR0 = 0;
stat=0;
break;
}
while (S7 == 0); //防止出现误判误操作
}
}
}
void main()
{
SelectHC573(4);
L1 = 1;
InitTimer0();
while(1)
{
ScanKey();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)