一、原理部分

1、脉宽调制(PWM)基本原理

控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。

简单来说,就是通过调节一个周期内高电平的占比来实现对电压的控制,如上图,第一个脉冲为50%高电平、50%低电平,占空比为50%,第二个25%高电平、75%低电平,占空比为25%。

2、 PWM的实现

一般使用定时器,实现的流程为:

①编写定时器初始化函数,初始化定时器,设置定时器的THx、TLx的初始值

②编写中断服务函数,函数参数可以为占空比,在这个函数中实现PWM脉冲信号的周期设置与信号发生

定时器的设置可以观看我上一节的定时器原理及其应用。下面通过一个实际案例了解一下PWM的应用

二、程序案例

例子:通过按键S7实现对L1指示灯的4级控制,占空比分别为10%、50%、90%、0%

#include "reg52.h"sbit L1=P0^0;//定义引脚
sbit S7=P3^0;/*****************************************************************
*@Function:  SelectHC573    //
*@Description: 锁存器选择,这里只用到LED相关的锁存器    //
*@Input:无 //
*@Output:无 //
*@Return:无  //
*@Others:无  //
/*****************************************************************/
void SelectHC573()
{P2=P2&0x1f|0x80;
}unsigned char count=0;
unsigned char PWM_duty=0;/*****************************************************************
*@Function:InitTimer0  //
*@Description: 定时器0初始化 //
*@Input:无 //
*@Output: 无//
*@Return: 无 //
*@Others: 无 //
/*****************************************************************/
void InitTimer0()
{TMOD=0x01;//设置定时器模式 16位不可重装载模式TH0=(65536-100)/256;//设置定时器初始计数值,为100usTL0=(65536-100)%256;ET0=1;//使能定时器0中断EA=1;//使能总中断
}/*****************************************************************
*@Function: ServiceTimer0     //
*@Description: 定时器中断服务函数    //
*@Input:无 //
*@Output:无 //
*@Return:无  //
*@Others: 无 //
/*****************************************************************/
void ServiceTimer0() interrupt 1
{TH0=(65535-100)/256;//重新设置定时器初始值TL0=(65535-100)%256;count++;//计数变量加1// if(count<=PWM_duty)
//  {
//      L1=0;
//  }else if(count<100)
//  {
//      L1=0;
//  }else if(count==100)
//  {
//      count=0;
//  }if(count==PWM_duty)//如果等于设置的占空比(100份占比多少份){L1=1;//将L1灯开启}else if(count==100)//计数变量如果等于100,即100个100us后,为一个周期{L1=0;//关闭L1灯count=0;//计数变量置0,重新计数}
}/*****************************************************************
*@Function: DelayK     //
*@Description:用于按键延时     //
*@Input:无 //
*@Output:无 //
*@Return:无  //
*@Others:无  //
/*****************************************************************/
void DelayK(unsigned char t)
{while(t--);
}unsigned char stat=0;//设置状态变量/*****************************************************************
*@Function:  ScanKeys    //
*@Description: 按键扫描S7    //
*@Input:无 //
*@Output:无 //
*@Return: 无 //
*@Others:无  //
/*****************************************************************/
void ScanKeys()
{if(S7==0)//若S7按下{DelayK(100);if(S7==0){switch(stat)//switch实现S7四个状态,占空比分别为10%、50%、90%、0,实现对L1的亮度控制{case 0:L1=0;TR0=1;PWM_duty=10;stat=1;break;case 1:L1=0;TR0=1;PWM_duty=50;stat=2;break;case 2:L1=0;TR0=1;PWM_duty=90;stat=3;break;case 3:L1=1;TR0=0;stat=0;break;}while(S7==0);}}
}void main()
{SelectHC573();L1=1;InitTimer0();while(1){ScanKeys();}
}

感谢大家的观看

欢迎大家提出问题并指正~

[蓝桥杯单片机]学习笔记——PWM脉宽调制信号的发生与控制相关推荐

  1. 【蓝桥杯-单片机学习笔记(六)】矩阵键盘控制数码管显示0~F

    一.要求 在CT107D单片机训练平台上,首先将J5处的跳线帽接到1~2引脚,使按键S4~S19组成4*4的矩阵键盘.在扫描按键的过程中,发现有按键触发信号后,待按键松开后,数码管显示相应的数字.按键 ...

  2. 蓝桥杯单片机学习7——PWM脉宽调制控制LED的亮度

    上期我们学习了定时器的相关内容,这次我们来学习PWM脉宽调制 什么是PWM PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  3. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

    一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...

  4. 【蓝桥杯-单片机学习笔记(十七)】24C02原理及其读写操作

    一.24C02 24C02是一个2K Bit的串行EEPROM存储器,内部含有256个字节.在24C02里面有一个8字节的页写缓冲器.24C02支持I2C总线协议.I2C是一种双向.两线串行通信接口, ...

  5. 【蓝桥杯-单片机学习笔记(十五)】NE555频率测量

    一.要求 在CT107D平台上测量NE555产生方波的频率值并显示在数码管上.频率数据显示用5位数码管,单位是Hz,数码管最左边显示"F".改变滑动变阻器Rb3可以改变频率大小. ...

  6. 【蓝桥杯-单片机学习笔记(三)】共阳数码管的静态显示

    一.要求 在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复. 二.数码管 1.七段数码管 七段数码管,其实内部由8个发光二极管构 ...

  7. 【蓝桥杯——单片机学习笔记】十二.LCD1602(STC15F2K60S2)

    一.原理图及引脚说明 可由Rb1电位器控制LCD的对比度 编号 引脚名 引脚说明 编号 引脚名 引脚说明 1 VSS 电源地 9 D2 Data I/O 2 VDD 电源正极 10 D3 Data I ...

  8. 【蓝桥杯-单片机学习笔记(十四)】DS1302

    一.DS1302介绍 1.功能介绍 DS1302包括时钟/日历寄存器和31字节(8位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口,实时时钟/日历提供包括秒.分.时.日期.月份和年份信息.闰年可 ...

  9. 【蓝桥杯-单片机学习笔记(十二)】工厂灯光控制系统

    一.要求 在CT107D单片机综合训练平台上,设计程序,实现实时显示开机系统运行时间和按键控制灯光. 1.设计系统初始化函数,关闭蜂鸣器和继电器等无关设备. 2.设计设备检测函数,首先检测LED灯,从 ...

最新文章

  1. C运算符的优先级和结合律 图片类型展示!
  2. Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像
  3. Android开发之Serializable 和 Parcelable的区别(源代码分享)
  4. ext.net TreePanel单击取值
  5. jdbc驱动jar_Javagt; 连接数据库时,JDBC和Mybatis的区别
  6. jdba怎么连接mysql_一、JAVA通过JDBC连接mysql数据库(连接)
  7. 从尿检取中段谈数据库压测
  8. was如何使用gzip_一文详解前端Node原生模块zlib,开启gzip压缩让页面响应速度更快...
  9. centos镜像 from_Docker 基于 CentOS 基础镜像开发环境的搭建与部署
  10. LOIC网站压力测试工具
  11. 一文讲清前端应该理解的分辨率/逻辑分辨率/物理分辨率
  12. 硬件接口之S/PDIF
  13. Js Switch语句
  14. 好人?坏人?做真实的人
  15. PTA n个分数相加
  16. 老瓶装新酒 - C#调用WM手机发送短信(源码)
  17. 陀螺年度好文回顾|Staking 时代两大流派,屌丝和贵族谁将胜出?
  18. 如何将Android应用发布到Google Play(Android Market)官方市场
  19. hbase连接数据库
  20. 【软件测试基础理论知识】2.软件缺陷、软件缺陷与Bug的区别、PIE模型

热门文章

  1. STM32输出1-500KHz任意整数频率脉冲,代码时间空间优化实现误差最小频率输出。
  2. 长江后浪推前浪,不学SpringBoot就会被拍到沙滩上
  3. oracle选择列时重命名列,oracle修改列的属性,给列重命名
  4. CentOS7 Minimal版本的简单配置和软件安装记录
  5. FAF世链区块链大会|启元社社长徐道彬: 创新价值成为区块链真正的牵引力
  6. 两张图片告诉你 载波聚合为4G加速的原因
  7. DA14580BLE接收流程分析
  8. 一文解释清楚Google BBR拥塞控制算法原理
  9. 华为手机崩溃后自动重启
  10. R语言评价分类器性能