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

news2024/11/25 22:44:16

目录

一、硬件及工程 

二、建立工程

三、代码修改

四、下载运行

五、改变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,依法炮制。

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

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

相关文章

win制作git局域网仓库,克隆

仓库目录制作成共享文件 共享目录\USER-20230725LO 然后win使用git克隆\USER-20230725LO\git\wbrj

天马学航——智慧教务系统(移动端)开发日志八

天马学航——智慧教务系统(移动端)开发日志八 日志摘要&#xff1a;完成了对用户主界面的优化&#xff0c;再次优化数据库缓存&#xff0c;使数据库读写分离 优化主界面 优化用户界面&#xff0c;使界面看起来更加亲切贴合 主要源码 build() {Row() {Column({space:30}) {Te…

【Java】已解决java.io.InterruptedIOException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.io.InterruptedIOException异常 在Java中&#xff0c;java.io.InterruptedIOException异常通常与I/O操作被中断有关。这种中断可能由多种因素引起&#xff0c;如线程被中…

发布微信小程序需要icp证吗?

微信小程序需要办理ICP许可证吗&#xff1f; 微信小程序需不需要办理ICP许可证&#xff0c;具体要看你的小程序类目是什么&#xff0c;还要看你的小程序具体是做什么的&#xff1f; 根据《互联网信息服务管理办法》 第四条 国家对经营性互联网信息服务实行许可制度&#xff1b…

超级干货 !数据平滑9大妙招(python版)_python指数平滑预测案例

大家好&#xff0c;对数据进行平滑处理的方法有很多种&#xff0c;具体的选择取决于数据的性质和处理的目的。如果你对Python感兴趣&#xff0c;想要学习pyhton&#xff0c;这里给大家分享一份**Python全套学习资料**&#xff0c;都是我自己学习时整理的&#xff0c;希望可以帮…

体验一下 Claude 3.5 Sonnet

体验一下 Claude 3.5 Sonnet 0. 引言1. Artifacts - 使用 Claude 的新方式2. 体验一下 Claude 3.5 Sonnet 0. 引言 2024年6月21日&#xff0c;Anthropic 推出 Claude 3.5 Sonnet&#xff0c;这是即将推出的 Claude 3.5 型号系列中的第一个版本。 Claude 3.5 Sonnet 提高了行业…

Nature | 解锁大脑运动控制机理!哈佛大学与DeepMind实现「AI大脑」控制虚拟老鼠

近日&#xff0c;哈佛大学的研究人员与谷歌DeepMind AI 实验室合作&#xff0c;开发出了一种虚拟大鼠模型&#xff0c;以研究大脑如何控制真实老鼠的运动。这个创新的模型准确地模拟了在真实大鼠身上观察到的神经活动&#xff0c;可以用于探讨大脑是如何控制动物的运动行为。 …

web系统数据库敏感数据处理

一、前言 web系统数据库中保存的公民信息不允许明文存储&#xff0c;比如手机号&#xff0c;身份证号&#xff0c;收货地址等。 二、处理方式 数据库中密文存储&#xff0c;web通过注解的方式对数据加解密处理&#xff0c;下面是处理方法 1、编写接口 public interface E…

借助AI营销类API,实现自动化的营销流程

借助AI营销类API&#xff0c;企业可以实现自动化的营销流程&#xff0c;提高效率和效果&#xff0c;并节省大量的时间和资源。这些API利用人工智能和机器学习的技术&#xff0c;能够自动化地执行各种营销任务和流程。首先&#xff0c;AI营销类API可以帮助企业实现自动化的市场调…

Linux【实操篇-文件权限和搜索查找类命令】

07 【实操篇-文件权限和搜索查找类命令】 1.文件权限类 1.1 权限管理的重要性 和 Windows 系统不同&#xff0c;Linux 系统为每个文件都添加了很多的属性&#xff0c;最大的作用就是维护数据的安全。举个简单的例子&#xff0c;在你的 Linux 系统中&#xff0c;和系统服务相…

外星人Alienware m18R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

【国际化I18n使用方法】vue2使用i18简单实现多语种切换,刷新保持,动态数据处理

效果图 使用流程 总结就是&#xff0c;安装好插件后&#xff0c;配置几个语言的js文件&#xff0c;每个词都要在每个js内写一遍对应的语言&#xff0c;然后通过切换js文件拿到对应的语言&#xff0c;实现翻译的效果。然后当前使用什么语言保存到本地&#xff0c;这样刷新就可以…

移动端+PC端应用模式的智慧城管综合执法办案平台源码,案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析

城市管理综合执法管理平台实现执法办案、业务全流程在线办理&#xff0c;依托移动端PC端的“两端”应用模式&#xff0c;保障能够通过信息化手段进行日常的执法办案工作&#xff0c;强化执法监督功能。提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能&a…

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一&#xff0c;每年影响数百万美国人&#xff0c;并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病&#xff0c;其中个体失去有效调节血液中葡萄糖水平的能力&#xff0c;并可能导致生活质量和预期寿命下降。。。。 …

Elasticsearch中的post_filter后置过滤器技术

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【单片机】MSP430G2553单片机 Could not find MSP-FET430UIF on specified COM port 解决方案

文章目录 MSP430G2553开发板基础知识解决办法如何实施解决办法4步骤一步骤二步骤三 MSP430G2553开发板基础知识 MSP430G2553开发板如下图&#xff0c;上半部分就是UIF程序下载调试区域的硬件。个人觉得MSP430G2553开发板的这个部分没有做好硬件设计&#xff0c;导致很多系统兼…

引擎霸屏推广9招带你驰骋市场战场-华媒舍

在现代市场竞争激烈的环境下&#xff0c;企业如何快速上车&#xff0c;脱颖而出&#xff0c;引擎霸屏推广成为了一种有效的市场推广手段。本文将为您介绍9招带您驰骋市场战场&#xff0c;让您的品牌广告在市场中快速传播。 一、选对渠道 选择合适的渠道是成功的关键。通过市场…

Unit redis-server.service could not be found.

我的报错如下Unit redis-server.service could not be found. 关键是刷新后台服务 sudo systemctl daemon-reload启动redis-server sudo systemctl start redis-server查看redis-Server服务状态 sudo systemctl status redis-server

【吉林大学Java程序设计】第10章:Java数据库编程技术(JDBC)

第10章&#xff1a;Java数据库编程技术&#xff08;JDBC&#xff09; 1. 数据库系统概述数据库系统SQL语言 2.JDBC概述JDBC APIJDBC Driver API 3.JDBC编程步骤示例1&#xff1a;MySQL数据库操作程序示例2&#xff1a;Java DB数据库操作程序 重点小结 1. 数据库系统概述 数据库…

Matlab只选取自己需要的数据画图

在Matlab作图的时候&#xff0c;经常会在同一个坐标系中作很多数据的图&#xff0c;如下图所示&#xff1a; 这就会导致不同数据所作的线会重叠在一起&#xff0c;不利于数据分析。如果只想对比几个数据的趋势&#xff0c;直接修改代码太过麻烦&#xff0c;可通过Matlab的绘图…