细说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,依法炮制。

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

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

相关文章

3D开发工具HOOPS为BIM应用提供支持:复杂大模型实现Web端轻量化!

在数字化转型的浪潮中&#xff0c;Tech Soft 3D以其HOOPS SDK工具包&#xff0c;为软件开发人员提供了强大的支持。这一工具包不仅支持Windows、Linux、OSX和移动平台等多样化的操作系统&#xff0c;还使得开发人员能够构建出庞大而复杂的建筑和BIM应用程序。HOOPS SDK的多格式…

26.2 Django简介

1. Python三大主流框架 根据当前的信息和流行度, Python的三大框架可以归纳为Django, Flask和FastAPI, 以下是对它们的清晰分点表示和归纳:* 1. Django: 一个高级的Python Web框架, 以快速开发和实用简洁的设计出名.它遵循MVC设计模式(但更倾向于MTV模式), 并提供了许多内置的…

让全栈AI的旗帜猎猎作响:“逆行者”华为云

如果有人问&#xff0c;AI大模型行业&#xff0c;最近的风向是什么&#xff1f;相信很多人都会说&#xff0c;是“内卷”。 近段时间&#xff0c;“降价”成了大模型的第一关键词。各大云服务商争相加入AI降价潮&#xff0c;甚至有公司模型降价达到了97%的惊人幅度。加上厂商抢…

数据库精选题(三)(SQL语言精选题)(按语句类型分类)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 创建语句 创建表 创建视图 创建索引…

汽车销售系统

摘 要 在现代社会&#xff0c;电脑是企业运作和管理必不可少的工具。我们过去用手记下卖出的商品的年代已一去不复返了。在我国&#xff0c;汽车销售行业的竞争日趋激烈的情况下&#xff0c;如何提高企业的管理水平&#xff0c;提高企业的工作效率&#xff0c;提高企业的服务质…

(vue3)基于vite+vue3+element-plus项目创建

(vue3)基于vitevue3element-plus项目创建 vue.js官方中文文档&#xff1a;https://cn.vuejs.org/guide/quick-start.html vite官方中文文档&#xff1a;https://cn.vitejs.dev/guide/ element-plus官网&#xff1a;https://element-plus.org/zh-CN/guide/installation.html 第…

经典机器学习方法(7)—— 卷积神经网络CNN

参考&#xff1a;《动手学深度学习》第六章 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类针对图像数据设计的神经网络&#xff0c;它充分利用了图像数据的特点&#xff0c;具有适合图像特征提取的归纳偏置&#xff0c;因而在图像相…

show/hide信号演示

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>gint delete_event(GtkWidget *window, GdkEvent *event, gpointer data) {gtk_widget_hide(window);return TRU…

SpringBoot + Vue 实现 AES 加密和 AES 工具类总结

目录 一、加密知识回顾 AES加密模式 二、Java 自定义 AES 工具类 三、SpringBoot 实现 AES 加密登陆 controller 层 server 层 四、Vue 实现 AES 加密登陆 五、前端AES工具类 六、实现结果 一、加密知识回顾 密钥是AES算法实现加密和解密的根本。对称加密算法之所以…

基于MATLAB仿真LFM线性调频信号

基于MATLAB仿真LFM线性调频信号 目录 前言 一、LFM信号简介 二、LFM信号基本原理 三、LFM信号仿真 四、代码 总结 前言 仿真中的接收信号&#xff0c;有时为了简单会直接用一个正弦波代替&#xff0c;但实际中接收到的信号极少是点频信号&#xff0c;一般都是PSK信号、OF…

MySQL事务、数据库的存储引擎

目录 1. 事务的概念 1.1事务的 ACID 2. 存储引擎 2.1 存储引擎 2.2 常用存储引擎 3.MyISAM 3.1 MyISAM 表支持 3 种不同的存储格式​编辑 3.2 适用的生产场景 4. InnoDB 4.1 InnoDB特点 4.2 适用生产场景分析 5. MyISAM 和 InnoDB 的区别 6. 命令操作 7. 死锁 7.…

计算机系统基础实训八—ProxyLab实验

实验目的与要求 1、让学生应用套接字接口实现网络编程&#xff1b; 2、让学生理解Web服务器开发的相关知识&#xff1b; 3、让学生应用并发编程技术进行并发服务器的开发&#xff1b; 实验原理与内容 Web代理是一种在Web浏览器和终端服务器之间充当中介角色的程序。在Web代…

堆排序的实现原理

一、什么是堆排序&#xff1f; 堆排序就是将待排序元素以一种特定树的结构组合在一起&#xff0c;这种结构被称为堆。 堆又分为大根堆和小根堆&#xff0c;所谓大根堆即为所有的父节点均大于子节点&#xff0c;但兄弟节点之间却没有什么严格的限制&#xff0c;小根堆恰恰相反&a…

高通安卓12-在源码中查找应用的方法

1.通过搜索命令查找app 一般情况下&#xff0c;UI上看到的APP名称会在xml文件里面定义出来&#xff0c;如 搜索名字为WiGig的一个APP 执行命令 sgrep "WiGig" 2>&1|tee 1.log 将所有的搜索到的内容打印到log里面 Log里面会有一段内容 在它的前面是这段内…

Stable Diffusion部署教程,开启你的AI绘图之路

本文环境 系统&#xff1a;Ubuntu 20.04 64位 内存&#xff1a;32G 环境安装 2.1 安装GPU驱动 在英伟达官网根据显卡型号、操作系统、CUDA等查询驱动版本。官网查询链接https://www.nvidia.com/Download/index.aspx?langen-us 注意这里的CUDA版本&#xff0c;如未安装CUD…

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏&#xff0c;融合了日系RPG经典风格&#xff0c;玩家将控制主角进行未知场景的探索。除了经典地牢玩法外&#xff0c;游戏还添加了更多创意内容&#xff0c;如黑屏状态前的挑战性等&#xff0c;使得游戏更加富有挑战…

Vue78-缓存路由组件

一、需求 路由切走的时候&#xff0c;组件会被销毁&#xff0c;路由切回来&#xff0c;组件被挂载&#xff01; 需要&#xff1a;路由切走的时候&#xff0c;组件不会被销毁。 二、代码实现 若是不加include属性&#xff0c;则在<router-view>里面展示的路由&#xff0c…

高通安卓12-Input子系统

1.Input输入子系统架构 Input Driver(Input设备驱动层)->Input core(输入子系统核心层)->Event handler(事件处理层)->User space(用户空间) 2.getevent获取Input事件的用法 getevent 指令用于获取android系统中 input 输入事件&#xff0c;比如获取按键上报信息、获…

深入理解Python中的并发与异步的结合使用

​ 在上一篇文章中&#xff0c;我们讨论了异步编程中的性能优化技巧&#xff0c;并简单介绍了trio和curio库。今天&#xff0c;我们将深入探讨如何将并发编程与异步编程结合使用&#xff0c;并详细讲解如何利用trio和curio库优化异步编程中的性能。 文章目录 并发与异步编程的区…

【数据结构与算法】二叉树的性质 详解

在二叉树的第i层上至多有多少个结点。 在二叉树的第 i 层上至多有 2 i − 1 2^{i-1} 2i−1 个结点(i≥1)。 深度为 K的二叉树至多有多少个结点。 深度为 k 的二叉树上至多含 2 k − 1 2^k - 1 2k−1 个结点(k≥1)。 在一颗二叉树中, 其叶子结点数n0和度为二的结点数n2之间…