蓝桥杯单片机快速开发笔记——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://xiahunao.cn/news/2869844.html

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

相关文章

PCB设计中的MARKER

今天在给板子布局的时候发现了一个这样的东西,名叫MARKER,查了一下这个东西分享一下: 目录 MARKER是什么样的? MARKER的用途: MARKER是必须的吗? MARKER是什么样的? 他在PCB中是这样的&…

力扣每日一题 矩阵中移动的最大次数 DP

Problem: 2684. 矩阵中移动的最大次数 复杂度 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution { public int maxMoves(int[][] grid){int n grid.length;int m grid[0].length;int[][] f new int[n][m]…

【Flink SQL】Flink SQL 基础概念(三):SQL 动态表 连续查询

《Flink SQL 基础概念》系列,共包含以下 5 篇文章: Flink SQL 基础概念(一):SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念(二):数据类型Flink SQL 基础概念&am…

EVENG环境安装及测试 1

文章目录 下载eve镜像导入镜像访问测试导入自定义镜像 下载eve镜像 下载地址 链接:https://pan.baidu.com/s/1NqGE34oE5qZ6TCugMymPDg 提取码:f4m1 导入镜像 安装vmware 虚拟机,文件->打开 选中上述镜像 输入虚拟机的名称和保存 路径&a…

pytorch CV入门 - 汇总

初次编辑:2024/2/14;最后编辑:2024/3/9 参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch 更多的内容可以参考本作者其他专栏: Pytorch基础:https…

DDR协议基础进阶(三)——(基本功能、初始化、MR寄存器)

DDR协议基础进阶(三)——(基本功能、初始化、MR寄存器) 一、DDR基本功能 DDR基本功能主要包括: 8-bit prefetch预取——8-bit,是指8位数据,即8倍芯片位宽的数据。由于DDR内部数据传输是32bit…

【python开发】并发编程(上)

并发编程(上) 一、进程和线程(一)多线程(二)多进程(三)GIL锁 二、多线程开发(一)t.start()(二)t.join()(三)t.…

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

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

第一章:模型从硬盘文件到显示器像素的全过程分析

模型从硬盘文件到显示器像素的全流程分析 引言一、硬盘中的模型文件(1)分离式模型文件(2)模型主文件2.1 顶点几何与索引数据构成模型表面2.2 通过材质或贴图为模型表面着色2.3 通过骨骼动画驱动模型 二、CPU中的模型数据三、GPU中…

【第七章】深度学习思维模式

前言 尽管我们的神经网络表现出令人印象深刻的性能,但这种性能在某种程度上是神秘的。网络中的权重和偏差是自动发现的。这意味着我们并没有立即能够解释网络如何实现其功能。我们能否找到某种方式来理解我们的网络是如何对手写数字进行分类的原则?而且…

高中数学:复杂函数图像的草图画法(较难)

一、三大基本函数图像 1、指数函数图像 2、对数函数图像 3、幂函数图像 二、案例 口诀:上加下减,左加右减 1、指数函数图像变化规律 2、带绝对值的函数图像 情况1:绝对值套住整个函数表达式 画法原则:x轴下方的图像&#xff0…

【计算机组成原理】处理机管理

目录 一、处理机分类 1. MPU 2. MCU 3. DSP 二、CPU的功能 1. 指令控制 2. 操作控制 3. 时间控制 4. 数据加工 三、CPU的组成 (一)控制器 1. 控制器的功能 (1)控制指令执行的顺序 ① 程序中规定的转移类型指令 ② …

Nacos与Eureka的使用与区别

Nacos与Eureka的使用与区别 单体架构:优点缺点 分布式架构需要考虑的问题:微服务企业需求 认识SpringCloud服务的拆分与远程调用微服务调用方式 Eureka提供者和消费者架构搭建Eureka服务注册服务发现 Ribbon负载均衡饥饿加载总结 Nacos注册中心Nacos安装…

前端React篇之React的生命周期有哪些?

目录 React的生命周期有哪些?挂载阶段(Mounting)更新阶段(Updating)卸载阶段(Unmounting)错误处理阶段(Error Handling) React常见的生命周期React主要生命周期 React的生…

【List集合】List接口源码解读一(ArrayList)

目录 前言 1. List接口的基本信息 2. ArrayList 2.1.ArrayList 的基本信息 2.2. ArrayList 的构造方法 2.2.1 ArrayList 的构造方法一 2.2.2 ArrayList 的构造方法二 2.2.3 ArrayList 的构造方法三 2.3 ArrayList 的扩容方式 总结 前言 Java 语言由于其跨平台、社区良…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发,可以将页面中的功能…

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial(网格 Lambert 材质) 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面,该材质非常易用,而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

24年上半年英语四六级报名时间25地汇总一览表

目前有25地公布了报名时间,大多集中在3月中下旬,具体时间以学校通知为准。 7个省份官宣 • 贵州(官方):3月18日12:00-3月29日16:00 • 黑龙江(官方):3月18日14:00-3月29日17:00 • 江西(官方):3月19日6:00-3月25日17:0…

05.BOM对象

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

deepseek-coder模型量化

1 简介 DeepSeek-Coder在多种编程语言和各种基准测试中取得了开源代码模型中最先进的性能。 为尝试在开发板进行部署,首先利用llama.cpp对其进行量化。 2 llama.cpp安装 git clone之后进入文件夹make即可,再将依赖补全pip install -r requirements.tx…