蓝桥杯单片机快速开发笔记——PWM

news2024/10/7 7:34:44

一、原理分析

        使用定时器输出PWM(脉宽调制)信号是通过微控制器的定时器模块来生成一种周期性的脉冲信号,通过控制脉冲的高电平时间(占空比)来控制输出信号的平均功率。以下是生成PWM信号的基本原理概述:

  1. 定时器工作原理

    • 定时器是微控制器中的一个功能模块,用于产生精确的时间延时或周期性的计时功能。
    • 定时器通常由一个计数器和一个时钟源组成,计数器根据时钟源的脉冲信号进行计数,当计数器的值达到设定的初值时,产生中断或者触发特定的事件。
  2. PWM信号生成原理

    • 在生成PWM信号时,定时器被配置为工作在定时器/计数器模式,计数器从一个初始值开始计数,当计数器的值达到设定的比较值时,产生一个输出比较中断。
    • 通过调整比较值和定时器的初值,可以控制PWM信号的周期和占空比。PWM信号的周期由定时器的溢出周期决定,而占空比则由比较值和初值的关系决定。
  3. 控制占空比

    • 要控制PWM信号的占空比,可以通过调整比较值来实现。占空比定义为高电平时间与周期的比值,通过改变比较值的大小,可以改变高电平的持续时间,从而改变占空比。
    • 通过定时器中断服务函数中的逻辑,根据计数器的值和比较值的关系来控制输出信号的高低电平状态,实现PWM信号的输出。
  4. 应用领域

    • PWM信号广泛应用于电机控制、LED亮度调节、音频处理等领域,通过调节占空比可以实现对输出信号的精确控制。

二、思维导图

三、示例代码

    基于定时器0的PWM控制功能,通过按键S7来调节LED L1的亮度。

sbit s7 = P3^0;
sbit L1 = P0^0;

unsigned char count = 0;
unsigned char pwm = 0;
unsigned char stat = 0;


//初始化定时器0
void Init_timer0()
{
	TH0 = (65536 - 100) / 256;
	TL0 = (65536 - 100) % 256;
	TMOD = 0x01;
	ET0 = 1;
	EA = 1;
}

void service_timer0() interrupt 1
{
	TH0 = (65536 - 100) / 256;
	TL0 = (65536 - 100) % 256;
	
	count++;
	if(count == pwm)
	{
		L1 = 1;
	}
	else if (count >= 100)
	{
		L1 = 0;
		count = 0;
	}
}

void scan_key()
{
	
	if(s7 == 0)
	{
		delay_key(100);
		if(s7 == 0)
		{
				switch(stat)
			 {
				case 0:
					L1 = 0;
				  TR0 = 1;
					pwm = 10;
					stat = 1;
				break;
				
				case 1:
					pwm = 50;
					stat = 2;
				break;
				
				case 2:
					pwm = 90;
					stat = 3;
				break;
				
				case 3:
					L1 = 1;
					TR0 = 0;
					stat = 0;
				break;
			}
			while(s7 == 0);
		}
	}
}


void main()
{
    P2 = (P2 & 0x1f) | 0x80;
    L1 = 1;
    Init_timer0()
    while(1)
    {
        scan_key();
    }
}

        实现基于定时器0的PWM(脉宽调制)控制功能,通过按键S7来控制PWM的占空比。解释一下代码的主要功能和实现思路:

  1. 定义了一个位控制变量sbit,用于表示P3口的第0位引脚,对应按键S7;另外定义了一个位控制变量sbit,用于表示P0口的第0位引脚,对应LED L1。同时定义了三个全局变量countpwmstat,分别用于计数、存储PWM值和状态控制。

  2. Init_timer0()函数用于初始化定时器0,设置定时器初值为65536 - 100,工作模式为方式1(16位定时器),开启定时器0中断,并开启总中断。

  3. service_timer0()函数是定时器0的中断服务函数,每次定时器0溢出时会执行该函数。在函数中,重新设置定时器0的初值,然后根据计数值count和PWM值pwm控制LED L1的亮灭状态,实现PWM控制。

  4. scan_key()函数用于扫描按键S7的状态,并根据按键的按下情况和当前状态进行PWM占空比的调节。具体实现包括延时检测按键稳定按下、根据状态控制PWM值和LED L1的状态,并在按键释放后更新状态。

  5. main()函数中首先配置P2口的引脚,然后初始化定时器0,将LED L1初始设为亮,进入主循环中不断扫描按键状态并进行PWM控制。

四、特别注意!!!

        如果把上述代码中所有的 TH0 = (65536 - 100) / 256; TL0 = (65536 - 100) % 256; 换成 TH0 = (0 - 100) / 256; TL0 = (0 - 100) % 256; 后LED L1就会闪烁。

        

        当将定时器0的初值设置为(0 - 100)时,会导致LED L1闪烁的原因在于定时器0的初值为负数,这可能会导致定时器计数出现异常情况,从而影响了PWM控制的稳定性。可能的原因:

  1. 负数初值问题:在定时器0的工作中,初值的设定是为了控制定时器的计数范围和溢出周期。当初值为负数时,由于定时器寄存器是无符号的,负数会被解释为一个很大的正数,这可能导致定时器计数溢出的情况出现异常。

  2. 定时器计数异常:当定时器0的初值为负数时,定时器的计数范围可能会受到影响,导致计数溢出的时机不再稳定。这可能会导致PWM控制的频率和占空比出现异常变化,从而导致LED L1的闪烁现象。

建议保持定时器0的初值为正数,以确保定时器的正常计数和稳定工作。

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

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

相关文章

Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图

依赖 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>传入视频流获取图片byte /*** 获取视频截图** param frameNumber 视频的指定帧数* param …

01初识Python

一、Python 简介 二、为什么要学Python? 三、Python 安装 四、输出第一条指令 五、总结 一、Python 简介 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它具有简单易学的语法结构,被广泛应用于Web开发、数据科学、人工智能等领域。 Python具有丰富的库…

SQLiteC/C++接口详细介绍之sqlite3类(十三)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09;&#xff08;未发表&#xff09; 40.sqlite3…

VMware Fusion 13.5.1 OEM BIOS Version - 在 macOS 中运行 Windows 虚拟机的最佳方式

VMware Fusion 13.5.1 OEM BIOS Version VMware Fusion 13 原版 App 中集成 OEM BIOS 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13-oem/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 使用 VMware …

51单片机-AT24C02(I2C总线)

目录 一&#xff0c;介绍及元件工作原理 7.时序结构&#xff08;重要&#xff09; 8.i2C总线数据帧&#xff08;重要&#xff09; 二&#xff0c;应用 一&#xff0c;介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…

【ESP32 IDF】I2C的使用

文章目录 前言一、I2C驱动使用的步骤二、I2C的使用2.1 配置驱动程序2.2 安装驱动程序2.3 主机写入数据写入数据的过程接收数据的过程 总结 前言 ESP32是一款强大的微控制器&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;和嵌入式系统开发。它具备丰富的硬件接口&am…

前端Vue与uni-app中的九宫格、十二宫格和十五宫格菜单组件实现

在前端 Vue 开发中&#xff0c;我们经常会遇到需要开发九宫格、十二宫格和十五宫格菜单按钮的需求。这些菜单按钮通常用于展示不同的内容或功能&#xff0c;提供给用户快速访问和选择。 一、引言 在前端开发中&#xff0c;九宫格、十二宫格和十五宫格菜单按钮是一种常见的布局…

提升物流效率,快递平台实战总结与分享

随着电商行业的蓬勃发展&#xff0c;物流配送服务变得愈发重要。快递平台作为连接电商企业和消费者的桥梁&#xff0c;扮演着至关重要的角色。本篇博客将分享快递平台实战经验&#xff0c;总结关键要点&#xff0c;帮助物流从业者提升物流效率、优化服务质量。 ### 快递平台实…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

自动点击脚本

一个简单的自动点击脚本 配置文件张这样&#xff0c;需要的自己截图 excel配置文件 #!/usr/bin/python3# sys.path.append("C:\\Users\苏\\.vscode\\extensions\\ms-python.vscode-pylance-2023.10.50\\dist\\typeshed-fallback\\stubs\\PyAutoGUI") # print(sys.…

python入门(二)

python的安装很方便&#xff0c;我们这里就不再进行讲解&#xff0c;大家可以自己去搜索视频。下面分享一下Python的入门知识点。 执行命令的方式 在安装好python后&#xff0c;有两种方式可以执行命令&#xff1a; 命令行程序文件&#xff0c;后缀名为.py 对于命令行&…

Javaweb day17 day18 day19

mysql-DDL 数据库操作 写法 客户端工具 &#xff08;也可以使用idea&#xff09; 表 写法 约束 数据类型 案例 写法 表的查询修改删除 写法 删除

鲸鱼优化算法双馈风电机组一次调频三机九节点虚拟惯量下垂控制DFIG matlab/simulink

以频率偏差变化最小为优化目标&#xff0c;采用鲸鱼算法优化风电机组一次调频控制系数。 采用matlab.m文件与simulink.slx文件联合。 系统频率优化结果 鲸鱼算法 时域模型

[MTK6771] android13系统启用OMAPI 支持esim.me

OMAPI是啥&#xff1f;看看谷歌的解释&#xff1a; 说了一大堆懂的人不需要看&#xff0c;不懂的还是看不懂&#xff0c;我就是后者 总之说人话就是&#xff0c;像SIM卡&#xff0c;NFC这类模块需要用到这个东西&#xff0c;那么接着往下看 上层APP想要使用这个OMAPI供应商稳…

C语言-strtok(切片的使用)

strtok&#xff08;切片的使用&#xff09; 使用规则 使用的基本情况 strcpy 第二次调用的时候传的是空指针 所以打印出来的是 每一次调用函数都会把当前函数的地址记住 所以二次调用的时候 传的是null 连起始位置都不传了 只是传null 但是需要知道的是 当知道三段 你调用第…

Golang高效流控实践

流控对于构建高可靠弹性系统至关重要&#xff0c;本文介绍了Golang内置的流控组件&#xff0c;通过该组件就可以打造适合各种业务场景的流控系统。原文: Rate Limiting in Go: Controlling Traffic with Efficiency[1] Jon Cellier Unsplash 导言 流控(Rate limiting)是构建可扩…

element-plus怎么修改表单中的label字体颜色及大小

问题描述&#xff1a; 当我们在vue3中使用element-plus组件库提供的表单组件时&#xff0c;有时我们需要修改表单中label的字体颜色等属性&#xff0c;这是如果直接选中label的class进行修改是不起作用的&#xff0c;我们只需深度选择即可选中并进行修改。 比如&#xff1a; …

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

旋转花键的制造工艺

旋转花键的制造工艺是一门精细的技术&#xff0c;涉及多个步骤和精细的操作&#xff0c;以确保最终产品的质量和性能&#xff0c;下面简单介绍下旋转花键的制造工艺。 1、原材料准备&#xff1a;制造旋转花键的核心是选择合适的材料&#xff0c;根据花键的规格和性能要求&#…

lftp服务与http服务(包含scp服务)详解

目录 前言: 1.lftp服务 1.1lftp服务的介绍以及应用场景 1.2安装lftp服务 1.2进行配置 1.3实际操作 2.http服务 2.1http服务介绍以及应用场景 2.1安装httpd服务 2.2进行配置 2.3实际操作 3.scp服务 3.1scp服务的介绍以及应用场景 致谢: 前言: 在当今互联网…