细说MCU输出两路PWM波形及改变占空比的实现方法

目录

一、硬件及工程 

二、建立工程

三、代码修改

四、下载运行

五、改变PWM波形占空比

1、定义两个全局变量

2、启动定时器

3、重写TIM3中断回调函数

六、下载并运行


一、硬件及工程 

        文章依赖的硬件及工程配置参考本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112

二、建立工程

        通过PB4输出配置一个通道TIM3_CH1、通过PB5输出配置一个通道TIM3_CH2。用示波器进行观察PB4和PB5引脚的输出信号波形。

        在NUCLEO-G474RE板上,PB4通过CN9端子的第6引脚引出,PB5通过CN9端子的第5引脚引出。

        外部时钟、Serial Wire;

         配置定时器:在TIM3的模式(Mode)配置界面,将时钟源设置为Internal Clock;选择PWM Generation CH1和选择PWM Generation CH2。然后,将预分频因子(Prescaler)和计数器周期(Counter Period)分别设置为999和8499(这两个参数从0开始计数),计数模式(Counter Mode)设置为升模式(Up),并使能自动重载(auto-reload preload)。

        预分频因子决定着两次计数之间的时间间隔,这里设置的1000(999+1),是将时钟脉冲分频1000倍。假如时钟频率为170 MHz,则分频1000倍后就是170 kHz。

        将计数周期设置为8499,也就是计数到8499后,重新从0开始计。在计数频率170 kHz之下,计数器的周期为(1/170×10³)×8500≈50(ms),对应的频率为20 Hz。在PWM Generation Channel 1的参数配置中,选择PWM mode 1,脉冲数(Pulse)设置为2125(该参数从1开始),通道极性设置为High。通道极性参数用于指定在Pulse个计数期间,输出的是高电平还是低电平。这里脉冲数Pulse决定着占空比,这里设为2125,是计数器周期的1/4,所以占空比刚好为25%。

        在PWM Generation Channel 2的参数配置中,选择PWM mode 1,脉冲数(Pulse)设置为4250(该参数从1开始),通道极性设置为High。通道极性参数用于指定在Pulse个计数期间,输出的是高电平还是低电平。

        使能TIM3的全局中断。将其抢占式优先级设为1,响应优先级设为0。将System tick timer的抢占式优先级设为最高(0级)。

        将系统时钟(SYSCLK)频率配置为170 MHz。

三、代码修改

        硬件配置完成后,编译、自动生成代码。 

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */

四、下载运行

        通道2为PB5输出的波形,通道1还是PB4输出的波形。PB5输出波形脉冲宽度为25 ms,周期50 ms,占空比刚好为50%。

五、改变PWM波形占空比

         上面例子中,所输出的PWM波形占空比是固定的,要想改变占空比,就需要调整PWM产生通道(PWM Generation Channel)参数中的脉冲数(Pulse)这一参数。不过,在固件库中,没有专门的函数可以改变这个参数。实际上,这个参数对应的是TIM3的捕捉/比较寄存器CCRx(x=1~4),脉冲数即该寄存器的值。因为TIM3有四个通道,所以它有四个CCR寄存器:TIM3_CCR1、TIM3_CCR2、TIM3_CCR3和TIM3_CCR4,分别对应TIM3_CH1、TIM3_CH2、TIM3_CH3和TIM3_CH4四个PWM输出通道的脉冲数(Pulse)。

        在代码中给这些寄存器赋值,以给TIM3_CCR1赋值为例,可以直接采用下面的语句:

TIM3->CCR1 =PwmValCH1;

        在这条语句中,PwmValCH1为一变量,是将要设定的TIM3_CH1的脉冲数的值。TIM3在STM32CubeIDE中已经被声明为一个指针型结构体,指向TIM3寄存器的基地址,所以可直接用“→”访问其成员变量CCR1。       

         建立工程时,与固定占空比的最大区别是,不配置PWM Generation Channel的参数。

1、定义两个全局变量

        为了达到可变占空比的效果,可以在main.c中定义两个全局变量,放到注释对中: 

/* USER CODE BEGIN PV */
uint16_t PwmValCH1 = 0;
uint16_t PwmValCH2 = 8500;
/* USER CODE END PV */

2、启动定时器

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */

3、重写TIM3中断回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	PwmValCH1 = PwmValCH1 +500;
	PwmValCH2 = PwmValCH2 -500;
	if(PwmValCH1 >= 8500)
		PwmValCH1 = 500;
	if(PwmValCH2 <= 500)
		PwmValCH2 = 8500;
	TIM3 ->CCR1 = PwmValCH1;
	TIM3 ->CCR2 = PwmValCH2;
}
/* USER CODE END 4 */

六、下载并运行

        从图中可以看出,通道2的占空比有逐步减小趋势,通道1的占空比在逐步增加。 

         输出更多的路PWM,依法炮制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第六十七天 | 字符串接龙、有向图的完全可达性、岛屿的周长

字符串接龙 文字讲解&#xff1a;110. 字符串接龙 | 代码随想录 解题思路 本题只需要求出最短路径的长度就可以了&#xff08;想到广搜&#xff09;&#xff0c;不用找出具体路径。 所以这道题要解决两个问题&#xff1a; 图中的线是如何连在一起的起点和终点的最短路径长…

java之url任意跳转漏洞

1 漏洞介绍 URLRedirect url重定向漏洞也称url任意跳转漏洞&#xff0c;网站信任了用户的输入导致恶意攻击&#xff0c;url重定向主要用来钓鱼&#xff0c;比如url跳转中最常见的跳转在登陆口&#xff0c;支付口&#xff0c;也就是一旦登陆将会跳转任意自己构造的网站&#xf…

【Pandas驯化-11】一文搞懂Pandas中的分组函数groupby与qcut、fillna使用

【Pandas驯化-11】一文搞懂Pandas中的分组函数groupby与qcut、fillna使用 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

蓝桥杯 经典算法题 合并排序数组

题目&#xff1a; 题解&#xff1a; leetcode上也有这道题一模一样。和归并排序的小过程基本一模一样&#xff0c;只不过因为题目要求只能将arr2中元素合并到arr1中&#xff0c;一种可行的方法是按元素从大到小&#xff0c;顺序从每个序列尾部开始操作&#xff0c;第一填的位置…

杀疯了!PerfXCloud-AI大模型夏日狂欢来袭,向基石用户赠送 ∞ 亿Token!

【澎峰科技重磅消息】 在全球范围内大模型正逐渐成为强大的创新驱动力。在这个充满激情的夏日&#xff0c;PerfXCloud为开发者和企业带来了前所未有的福利&#xff1a; 1. 零成本亲密、深度体验大模型&#xff0c;提供大量示范案例。 2. 向基石用户赠送∞亿Token的激励计划。…

终于找到了免费的云服务器

今天朋友推荐了一个免费的云服务器&#xff1a;“阿贝云” 我最喜欢的是它的"免费虚拟主机"“免费云服务器”&#xff0c;省了我好多钱&#xff0c;我的使用感受是用起来经济实惠省心&#xff0c;不要钱的东西谁不喜欢呢&#xff0c;对于普通开发者来说&#xff0c;…

程序猿大战Python——面向对象——继承基础

定义类的几种语法 目标&#xff1a;了解定义类的标准语法。 我们知道&#xff0c;可以使用class关键字定义类。 在类的使用中&#xff0c;定义方式有三种&#xff1a; &#xff08;1&#xff09;【类名】 &#xff08;2&#xff09;【类名()】 &#xff08;3&#xff09;【…

ubuntu 20.04 访问csdn报错 Secure connection failed 解决

问题原因&#xff1a; 我一边更新源 sudo apt update & apt upgrade一边在看csdn&#xff0c;估计是这个导致的. 所以我直接把华为源换成了阿里源。 sudo apt update & apt upgrade再更新一次&#xff0c;解决。

探索语言模型的智能飞跃:预训练损失与突现能力的新视角

在人工智能的辉煌编年史中&#xff0c;语言模型&#xff08;LMs&#xff09;的崛起标志着自然语言处理领域的一个巨大飞跃。随着技术的进步&#xff0c;这些模型不仅在规模上日益庞大&#xff0c;更在性能上不断刷新着人们的认知边界。它们在问答、翻译、文本摘要等任务上展现出…

1996-2023年各省农林牧渔总产值及农业、林业、牧业、渔业总产值数据(无缺失)

1996-2023年各省农林牧渔总产值及农业、林业、牧业、渔业总产值数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、指标&#xff1a;农林牧渔总产值、农业总产值、林业总产值、牧业总产值、渔业总产值 3、来源&#xff1a;国家统计局、各省年鉴 4、范…

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要&#xff1a; 随着信息化技术的飞速发展&#xff0c;智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序&#xff0c;该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…

深入了解 AndroidX ConstraintLayout 中的 Barrier

androidx.constraintlayout.widget.Barrier&#xff08;简称Barrier&#xff09;是 ConstraintLayout 2.0 中引入的一个新特性&#xff0c;它可以极大地简化复杂布局的实现。本文将详细介绍Barrier 的概念、使用方法以及在实际开发中的应用场景。 什么是 Barrier&#xff1f; …

Web渗透-SSRF服务端请求伪造

SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;是一种由攻击者利用漏洞服务器发送恶意请求的攻击方式。SSRF漏洞通常出现在服务器端的web应用中&#xff0c;应用允许用户提供的输入被服务器用来发起请求&#xff0c;而没有对输入进行充…

SCIE与SCI期刊的区别

在学术出版领域&#xff0c;SCI&#xff08;Science Citation Index&#xff09;和SCIE&#xff08;Science Citation Index Expanded&#xff09;是两个关键的索引数据库&#xff0c;它们对科研人员在选择发表论文的期刊时起着至关重要的作用。虽然这两个术语经常被交替使用&a…

04_FFmpeg常用API及内存模型

【说明】课程学习地址&#xff1a;https://ke.qq.com/course/468797 FFmpeg内存模型 FFmpeg内存模型 int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);问题(数据的申请和释放): …

五十五、openlayers官网示例Loading Spinner解析——给地图添加loading效果,瓦片图层加载时等待效果

官网demo地址&#xff1a; Loading Spinner 这篇介绍了一个非常简单的loading效果 利用地图的loadstart和loadend事件&#xff0c;动态的添加和删除class名。 map.on("loadstart", function () {map.getTargetElement().classList.add("spinner");});map…

【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、Python简介1.1 历史背景1.2 设计哲学1.3 语言特性1.4 应用场景1.5 为什么选择Python 二、Python语言基础2.1 注释规则2.1.1 单行注释2.1.2 多行注释2.1.3 文件编码声明注释 2.2 代码缩进2.3 编码规范2.3.1 命名规范…

汉诺塔问题-递归

面试题 08.06. 汉诺塔问题 - 力扣&#xff08;LeetCode&#xff09; 递归问题&#xff0c;一定相信调用的这个函数传参进去能解决好问题&#xff0c;就是不用展开具体的递归图&#xff1b; class Solution { public:void hanota(vector<int>& A, vector<int>&…

中石化加油卡有什么用?

对于有车一族来说&#xff0c;有一张加油卡真的可以省下不少钱 但是像我们这种没车的人&#xff0c;即使得到加油卡也毫无用武之地 久而久之&#xff0c;难免会造成卡过期的情况出现 还好&#xff0c;前两天把我手上堆积了好久的加油卡在收卡云上卖出去了&#xff0c;99折真…