pwm控制的基本原理_单片机PWM控制基本原理详解~

d104770c932f1e7ed361b268a3e7674f.png

PWM是Pulse Width Modulation的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果。这是个什么概念呢?我们一步步来介绍。首先从它的名字来看,脉冲宽度调制,就是改变脉冲宽度来实现不同的效果。我们先来看三组不同的脉冲信号,如图所示。257e87ffdcdf05eb5a36644aae7ce62a.png图 10-1 PWM 波形这是一个周期是 10ms,即频率是 100Hz 的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是 PWM 的本质。在这里大家要记住一个概念,叫做“占空比”。占空比是指高电平的时间占整个周期的比例。比如第一部分波形的占空比是 40%,第二部分波形占空比是 60%,第三部分波形占空比是 80%,这就是 PWM 的解释。那为何它能对模拟电路进行控制呢?大家想一想,我们数字电路里,只有 0 和 1 两种状态,比如我们第 2 章学会的点亮 LED 小灯那个程序,当我们写一个 LED = 0;小灯就会长亮,当我们写一个 LED = 1;小灯就会灭掉。当我们让小灯亮和灭间隔运行的时候,小灯是闪烁。如果我们把这个间隔不断的减小,减小到我们的肉眼分辨不出来,也就是 100Hz 以上的频率,这个时候小灯表现出来的现象就是既保持亮的状态,但亮度又没有 LED = 0;时的亮度高。那我们不断改变时间参数,让 LED = 0;的时间大于或者小于 LED = 1;的时间,会发现亮度都不一样,这就是模拟电路的感觉了,不再是纯粹的 0 和 1,还有亮度不断变化。大家会发现,如果我们用 100Hz 的信号,如图 10-1 所示,假如高电平熄灭小灯,低电平点亮小灯的话,第一部分波形熄灭 4ms,点亮 6ms,亮度最高,第二部分熄灭 6ms,点亮 4ms,亮度次之,第三部分熄灭 8ms,点亮 2ms,亮度最低。那么用程序验证一下我们的理论,我们用定时器T0 定时改变 P0.0 的输出来实现 PWM,与纯定时不同的是,这里我们每周期内都要重载两次定时器初值,即用两个不同的初值来控制高低电平的不同持续时间。为了使亮度的变化更加明显,程序中使用的占空比差距更大。#includesbit PWMOUT = P0^0;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned char HighRH = 0; //高电平重载值的高字节unsigned char HighRL = 0; //高电平重载值的低字节unsigned char LowRH = 0; //低电平重载值的高字节unsigned char LowRL = 0; //低电平重载值的低字节void ConfigPWM(unsigned int fr, unsigned char dc);void ClosePWM();void main(){unsigned int i;EA = 1; //开总中断ENLED = 0; //使能独立 LEDADDR3 = 1;ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;while (1){ConfigPWM(100, 10); //频率 100Hz,占空比 10%for (i=0; i40000; i++);ClosePWM();ConfigPWM(100, 40); //频率 100Hz,占空比 40%for (i=0; i40000; i++);ClosePWM();ConfigPWM(100, 90); //频率 100Hz,占空比 90%for (i=0; i40000; i++);ClosePWM(); //关闭 PWM,相当于占空比 100%for (i=0; i40000; i++);}}/* 配置并启动 PWM,fr-频率,dc-占空比 */void ConfigPWM(unsigned int fr, unsigned char dc){unsigned int high, low;unsigned long tmp;tmp = (11059200/12) / fr; //计算一个周期所需的计数值high = (tmp*dc) / 100; //计算高电平所需的计数值low = tmp - high; //计算低电平所需的计数值high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节LowRL = (unsigned char)low;TMOD &= 0xF0; //清零 T0 的控制位TMOD |= 0x01; //配置 T0 为模式 1TH0 = HighRH; //加载 T0 重载值TL0 = HighRL;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0PWMOUT = 1; //输出高电平}/* 关闭 PWM */void ClosePWM(){TR0 = 0; //停止定时器ET0 = 0; //禁止中断PWMOUT = 1; //输出高电平}/* T0 中断服务函数,产生 PWM 输出 */void InterruptTimer0() interrupt 1{if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{ //当前输出为低电平时,装载高电平值并输出高电平TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}}需要提醒大家的是,由于标准 51 单片机中没有专门的 PWM 模块,所以我们用定时器加中断的方式来产生 PWM,而现在有很多的单片机都会集成硬件的 PWM 模块,这种情况下需要我们做的就仅仅是计算一下周期计数值和占空比计数值然后配置到相关的 SFR 中即可,既使程序得到了简化又确保了 PWM 的输出品质(因为消除了中断延时的影响)。大家编译下载程序后,会发现小灯从最亮到灭一共 4 个亮度等级。如果我们让亮度等级更多,并且让亮度等级连续起来,会产生一个小灯渐变的效果,与呼吸有点类似,所以我们习惯上称之为呼吸灯,程序代码如下,这个程序用了 2 个定时器 2 个中断,这是我们第一次这样用,大家可以学习一下。我们来试试这个程序,试完了大家一定要能自己把程序写出来,切记。#includesbit PWMOUT = P0^0;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned long PeriodCnt = 0; //PWM 周期计数值unsigned char HighRH = 0; //高电平重载值的高字节unsigned char HighRL = 0; //高电平重载值的低字节unsigned char LowRH = 0; //低电平重载值的高字节unsigned char LowRL = 0; //低电平重载值的低字节unsigned char T1RH = 0; //T1 重载值的高字节unsigned char T1RL = 0; //T1 重载值的低字节void ConfigTimer1(unsigned int ms);void ConfigPWM(unsigned int fr, unsigned char dc);void main(){EA = 1; //开总中断ENLED = 0; //使能独立 LEDADDR3 = 1;ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;ConfigPWM(100, 10); //配置并启动 PWMConfigTimer1(50); //用 T1 定时调整占空比while (1);}/* 配置并启动 T1,ms-定时时间 */void ConfigTimer1(unsigned int ms){unsigned long tmp; //临时变量tmp = 11059200 / 12; //定时器计数频率tmp = (tmp * ms) / 1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时器重载值tmp = tmp + 12; //补偿中断响应延时造成的误差T1RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节T1RL = (unsigned char)tmp;TMOD &= 0x0F; //清零 T1 的控制位TMOD |= 0x10; //配置 T1 为模式 1TH1 = T1RH; //加载 T1 重载值TL1 = T1RL;ET1 = 1; //使能 T1 中断TR1 = 1; //启动 T1}/* 配置并启动 PWM,fr-频率,dc-占空比 */void ConfigPWM(unsigned int fr, unsigned char dc){unsigned int high, low;PeriodCnt = (11059200/12) / fr; //计算一个周期所需的计数值high = (PeriodCnt*dc) / 100; //计算高电平所需的计数值low = PeriodCnt - high; //计算低电平所需的计数值high = 65536 - high + 12; //计算高电平的定时器重载值并补偿中断延时low = 65536 - low + 12; //计算低电平的定时器重载值并补偿中断延时HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节LowRL = (unsigned char)low;TMOD &= 0xF0; //清零 T0 的控制位TMOD |= 0x01; //配置 T0 为模式 1TH0 = HighRH; //加载 T0 重载值TL0 = HighRL;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0PWMOUT = 1; //输出高电平}/* 占空比调整函数,频率不变只调整占空比 */void AdjustDutyCycle(unsigned char dc){unsigned int high, low;high = (PeriodCnt*dc) / 100; //计算高电平所需的计数值low = PeriodCnt - high; //计算低电平所需的计数值high = 65536 - high + 12; //计算高电平的定时器重载值并补偿中断延时low = 65536 - low + 12; //计算低电平的定时器重载值并补偿中断延时HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节LowRL = (unsigned char)low;}/* T0 中断服务函数,产生 PWM 输出 */void InterruptTimer0() interrupt 1{if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{ //当前输出为低电平时,装载高电平值并输出高电平TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}}/* T1 中断服务函数,定时动态调整占空比 */void InterruptTimer1() interrupt 3{static bit dir = 0;static unsigned char index = 0;unsigned char code table[13] = { //占空比调整表5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95};TH1 = T1RH; //重新加载 T1 重载值TL1 = T1RL;AdjustDutyCycle(table[index]); //调整 PWM 的占空比if (dir == 0){ //逐步增大占空比index++;if (index >= 12){dir = 1;}}else{ //逐步减小占空比index--;if (index == 0){dir = 0;}}}呼吸灯效果做出来后,利用这个基本原理,其它各种效果的灯光闪烁都应该可以做出来,大家看到的 KTV 里边那绚丽的灯光闪烁,其实就是采用的 PWM 技术控制的。2e6a7583c6eb3d15d07bfe1e50044864.png

1.零基础让普通MCU跑人工智能!法国AI创企开发无监督学习软件系统

2.反对人工智能的九条意见!

3.看直播赢好礼丨各路大咖为您解读《疫情当下,物联网与嵌入式系统的思考》

4.STM32系统中的2种数据掉电保护方法!

5.如何学会所有的编程语言?

6.VSCode和SourceInsight,到底哪个看源码爽?

02624b8f8fd2f21300581afd9a5e2f07.gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关上Deepfake的潘多拉魔盒,RealAI推出深度伪造视频检测工具

诞生之初,Deepfake是一项有趣的图像处理技术,仅仅带来搞笑和娱乐视频,但殊不知,潘多拉魔盒就此被打开,催生出色情黑产、恶搞政客“操纵”民意,Deepfake正逐步进化为一种新型“病毒”,人类伦理道…

谷歌地图的全球森林监察系统,揭秘中国雾霾的惊天秘密!

来源:老牛时评谷歌公司最近推出的全新交互式地图——“全球森林监察”它可以实时显示全球森林的覆盖情况。该幅地图的数据来源有多个,其中包括了NASA的森林面积覆盖率的分析数据。于是我们选取了中国及中国周边的部分,看完后的感受只能是比悲…

qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件

一、前言这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式…

web.xml文件头出错

原先将web.xml文件头设置为如下格式 <?xml version"1.0" encoding"UTF-8"?><web-app version"3.1" xmlns"http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:sche…

Nature子刊超越诺贝尔经典理论:神经科学研究路漫漫...

科学家正在观察一台用于记录小鼠脑细胞活动的双光子显微镜。图片来源&#xff1a;艾伦研究所来源&#xff1a;中国生物技术网 北京时间12月17日&#xff0c;发表在《Nature Neuroscience》上一项针对小鼠视觉系统中近6万个神经元活动的新研究显示&#xff0c;要想了解大脑如何计…

偏见与人类大脑结构有关

来源&#xff1a;科技日报偏见是如何产生的&#xff1f;据英国《自然神经科学》16日发表的一项脑科学研究发现&#xff0c;内侧前额叶皮质后部&#xff08;pMFC&#xff09;会促进人类产生确认偏误。具体而言&#xff0c;对于那些不会让自己更加相信已有观念的意见&#xff0c;…

PLECS软件学习使用(一)简单的RLC电路搭建

PLECS软件学习使用&#xff08;一&#xff09;简单的RLC电路搭建 1相关操作总结&#xff1a; 旋转&#xff1a;CtrlR 翻转&#xff1a;CtrlF 从连线中引出线&#xff1a;Ctrl鼠标左键 设置元件参数&#xff1a;双击元件&#xff0c;进行设置&#xff0c;若要显示参数&#xff0…

《自然》公布年度十大杰出论文

来源&#xff1a;科技日报 英国《自然》杂志网站日前公布了2019年十大杰出论文&#xff0c;接近室温的超导体、精确编辑基因技术、海王星新卫星等纷纷入选。其中&#xff0c;中国研究占到两席&#xff0c;分别是来自复旦大学的亨廷顿舞蹈症新疗法&#xff0c;与中科院上海有机化…

中国电子信息工程科技发展十大趋势(2019)发布

来源&#xff1a;新浪科技17日&#xff0c;中国工程院信息与电子学部、中国信息与电子工程科技发展战略研究中心在中国工程院召开发布会&#xff0c;发布“中国电子信息工程科技发展十大趋势&#xff08;2019&#xff09;”。中国工程院副院长陈左宁院士表示&#xff0c;中国工…

Android junit单元测试

1.首先要把下面配置好&#xff08;注释的地方 Android studio 无需配置&#xff09;&#xff0c;targetPackage项目的包名 2.创建Android项目会自动生成test包&#xff0c;只能在test包下使用junit测试 3.在方法的前面加上Test就可以使用junit了 4.解释一下&#xff1a; assert…

21世纪20年代改变世界的十大趋势

来源&#xff1a;美国银行美国银行发布了新报告“21世纪20年代改变世界的十大趋势”。全球化高峰&#xff1a;世界范围内劳力、货物和资本自由流动将终结。在这种趋势下&#xff0c;赢家是本地市场和实物资产&#xff0c;而输家则是全球市场。衰退&#xff1a;更多的FMS投资者认…

多个if用什么设计模式_抽丝剥茧——单例设计模式

单例设计模式兄弟们好&#xff0c;今天是最后一个设计模式了&#xff0c;也是我们最熟悉的单例设计模式&#xff0c;可以说这个设计模式是我们最先接触到的设计模式了。想当年学习JavaSE的时候&#xff0c;老师聊到一个「饿汉式和懒汉式」&#xff0c;我还纠结了半天&#xff0…

计算机密码行业专题研究:网络安全最大弹性领域

来源&#xff1a;未来智库报告摘要&#xff1a;1、传统市场:政策驱动&#xff0c;预计传统密码增长中枢提升至30%密码是网络安全刚需&#xff0c;密码法2020年1月1日实施。政策驱动客户下沉&#xff0c;行业中期增速从10%提升至30%。2、新兴市场:物联网安全的基石&#xff0c;未…

人工智能军事对抗技术发展趋势

来源&#xff1a;战略前沿技术人工智能军事对抗技术人工智能&#xff08;AI&#xff09;作为新一代科技革命的典型代表性技术&#xff0c;目前已在世界各国的工业、金融、娱乐和公共安全等领域广泛应用&#xff0c;而其在军事领域的应用也正在快速发展。随着人工智能技术与军事…

java语言计算器怎么写_求助,一个计算器的括号功能怎么写啊。

求助&#xff0c;一个计算器的括号功能怎么写啊。import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;public class computer1 extends JFrame implements ActionListener{Double r1,r2,total,c1,c2;int i,j,j110,j27,c;JButton[] Bu…

windows打开的winform当前焦点 是否是hwnd_推介几款 windows 下非常好用的工具

在下工具控一枚&#xff0c;平时会留意收集各种各样给我们生活生产带来便捷的工具&#xff0c;毕竟人生苦短&#xff1b;下面主要介绍一些我在 Windows 系统上发现的一些好用的工具&#xff0c;并且会一笔带过主要优点特点&#xff0c;具体详细用法可以搜一下&#xff0c;相关帖…

借力5G,云VR将推动VR产业迎“第二春”

来源&#xff1a;VR每日必看在近期举办的第八届全球物联网峰会上&#xff0c;作为中国电信5G商用产品的集约运营单位&#xff0c;号百控股在会展区域设置了天翼云VR产品专区&#xff0c;演示了韩国LG U独家授权内容&#xff0c;以及自制VR视频&#xff0c;引入关注。VR云化将实…

Linq的优点以及注意事项

转载于:https://www.cnblogs.com/hubbert123/p/6429926.html

低调!中国北斗核心卫星部署完成,开启“全球时代”!超越GPS指日可待

来源&#xff1a;科技杂谈、百度物联网智库 整理发布导 读2019年12月16日15时22分&#xff0c;我国在西昌卫星发射中心用长征三号乙运载火箭&#xff08;及配套远征一号上面级&#xff09;&#xff0c;以“一箭双星”的方式成功将第52、53颗北斗导航卫星发射升空。至此&#x…

数字孪生白皮书(2019)

▲ 赛迪工业互联网首席研究员袁晓庆博士发布报告来源&#xff1a;赛迪智库以下是白皮书主要内容的PPT&#xff1a;&#xff08;点击放大观看&#xff09;123456789101112131415161718192021222324252627282930未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&…