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

一、原理分析

        使用定时器输出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.mzph.cn/news/750421.shtml

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

相关文章

计算机网络——物理层(编码与调制)

计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…

4.如何通过组策略给所有电脑挂载共享文件路径?AD域控如何给所有加域的电脑挂载共享文件夹路径?

(1)如何将一个文件夹设置为共享文件? 步骤如下: 1.找到你想共享的文件夹。 2.右键单击该文件夹,选择“属性”选项。 3.在文件夹属性窗口中,切换到“共享”选项卡。 4.点击“共享此文件夹”复选框&…

智慧城市与数字孪生:共创未来城市的智慧生活

目录 一、智慧城市与数字孪生的概念与特点 二、智慧城市与数字孪生共创智慧生活的路径 1、城市规划与建设的智能化 2、城市管理与服务的智慧化 3、城市安全与应急管理的智能化 三、智慧城市与数字孪生面临的挑战与对策 四、智慧城市与数字孪生的发展趋势与展望 1、技术…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程: SQL注入…

安装python、pycharm,打好基础,准备飞起

python安装使用 安装python安装包 以下为自定义安装python安装包,无特殊要求可直接进行安装。 勾选Add Python 3.6 to PATH, 然后点击 Customize installation,进行自定义安装。 所有的都勾上,然后点击Next。 可选择自己需要…

(附数据集)基于lora参数微调Qwen1.8chat模型的实战教程

基于lora微调Qwen1.8chat的实战教程 日期:2024-3-16作者:小知运行环境:jupyterLab描述:基于lora参数微调Qwen1.8chat模型。 样例数据集 - qwen_chat.json(小份数据) - chat.json(中份数据&…

Day39:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

目录 SpringBoot-监控系统-Actuator SpringBoot-接口系统-Swagger 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等. 框架库:MyB…

hot100 -- 矩阵

👂 Peter Pan - kidult. - 单曲 - 网易云音乐 👂 Bibliothque(图书馆) - Jasing Rye - 单曲 - 网易云音乐 目录 🌼前言 🌼二分模板 🎂矩阵置零 AC 标记数组 AC 标记变量 🚩…

【JAVA】JAVA方法的学习和创造

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

【04】WebAPI

WebAPI 和标准库不同,WebAPI 是浏览器提供的一套 API,用于操作浏览器窗口和界面 WebAPI 中包含两个部分: BOM:Browser Object Model,浏览器模型,提供和浏览器相关的操作DOM:Document Object Model,文档模型,提供和页面相关的操作BOM BOM 提供了一系列的对象和函数,…

OpenCV 环境变量参考

返回:OpenCV系列文章目录(持续更新中......) 上一篇: OpenCV4.9.0配置选项参考 下一篇:OpenCV4.9.0配置选项参考 引言: OpenCV是一个广泛使用的图像和视频处理开源库,拥有丰富的图像算法和函…

51单片机-AT24C02(I2C总线)

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

一起学数据分析_2

写在前面:代码运行环境为jupyter,如果结果显示不出来的地方就加一个print()函数。 一、数据基本处理 缺失值处理: import numpy as np import pandas as pd#加载数据train.csv df pd.read_csv(train_chinese.csv) df.head()# 查看数据基本…

05.BOM对象

一、js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型, 定义了一套操作HTML文档的APIBOM 浏览器对象模型,定义了一套操作浏览器窗口的API 二、windo…

wsl ubuntu 安装cuda nvcc环境

wsl ubuntu 安装cuda环境: CUDA Toolkit 11.6 Downloads | NVIDIA DeveloperDownload CUDA Toolkit 11.6 for Linux and Windows operating systems.https://developer.nvidia.com/cuda-11-6-0-download-archive?target_osLinux&target_archx86_64&Distri…

Word粘贴时出现“运行时错误53,文件未找到:MathPage.WLL“的解决方案

在安装完MathType后,打开word复制粘贴时报错“运行时错误53,文件未找到:MathPage.WLL” 首先确定自己电脑的位数(这里默认32位) 右击MathType桌面图标,点击“打开文件所在位置”, 然后分别找到MathPage.W…

【原理图与PCB专题】使用Cadence如何在Layout时直接互换相同功能的PIN

在实际的项目中,比如有一些排阻、FPGA、ESD二极管引脚其实是可以互换的,但是如果没有使用PinGroup属性功能,对于大公司原理图设计与PCB Layout分开的情况,我们可能需要按以下步骤: 这个步骤中存在通知和等待过程,如果存在多次(如多个器件,或是修改后调整又觉得不合适)…

LeetCode 面试经典150题 121.买卖股票的最佳时机

题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…

npm下载慢换国内镜像地址

1 设置淘宝镜像地址 npm config set registry http://registry.npm.taobao.org 2 查看当前下载地址 npm config get registry 3 其它镜像地址列表: 1. 官方镜像:https://registry.npmjs.org/ 2. 淘宝镜像:https://registry.npm.taobao.o…