嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

2024-03-31 02:04

本文主要是介绍嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记03:G4时钟结构

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记04:从零开始创建工程模板并开始点灯

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记05:Systick滴答定时器

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记06:按键输入

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记07:ADC模数转换

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记08:LCD液晶屏

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记09:EEPROM

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记10:USART串口通讯

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记11:数字电位器MCP4017

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记14:PWM捕获

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记16:蓝桥杯编程手册

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记17:第十四届省赛真题



前言

上节课讲解了PWM捕获,这节课讲解一下PWM的输出,也就是用STM32进行编程,让在特定的管脚上产生PWM信号,这个信号的占空比频率是可调节的。

我们知道开发板上有两个排针:

这些排针上对应的是相应的管脚,其中PA1-7都是可以用作PWM输出的(当然也可以用作捕获),不同管脚对应TIM的不同通道,只需要在CubeMX中配置引脚就可以看到对应的通道了。上一节我们PWM捕获也用到TIM,这里我们PWM输出的时候就不要用相同的TIM了,比方说上一届我们用的TIM2捕获,这节我们可以用其他的TIM输出如TIM16和TIM17,他们对应的是PA6和PA7管脚。我们本节以PA7为例。

一、基础知识

我们先了解一下PWM输出的基本原理。

PWM输出的本质也是定时器,只要开启TIM定时器,CNT计数器就开始++了,然后我们根据配置(一般还是1us)来计时。在捕获中我们一嘴带过了一下ARR,ARR是自动重装载寄存器,相当于计数的周期,计数到了周期之后会自动溢出重新计数。在捕获中我们是不需要溢出的,所以直接设置的最大值0xFFFFFFFF,但是在PWM输出里面我们是需要它溢出的,因为这样就可以通过ARR让CNT隔一段时间清零,实现了信号的周期变化。CNT每数到数就重新计数,比如ARR固定为1000,那么周期就是1000us,即1ms

除此之外还有一个CCRx比较寄存器,用于控制高电平的时间,当CNT计数到CCRx时,输出极性会翻转,这样我们就可以控制PWM的占空比了。其中的x对应不同的通道,比如CCR1就对应通道1,因为定时器有很多个通道,这样不同的通道就有不同的比较值可以设置。但是ARR是整个定时器都共用的。

比如我们可以设置(CNT<=CCRx)时,引脚输出1,(CNT>=CCRx)时,引脚输出0,这样通过调整CCRx就可以调节占空比了。至于这个谁是高电平谁是低电平我们是可以自己设置的。

二、产生一路PWM信号

1.CubeMX配置

我们用PA7,也就是定时器17的通道1来输出PWM,我们来看一下怎么配置。

先勾选PA7。

然后找TIM17,点Activated激活,并在通道1选择PWM输出模式。(不选择输出比较模式是因为这里PWM输出模式更为方便,可以直接调整周期和占空比)

PWM输出就不用选择中断了。然后开始配置Configuration。

Prescaler分频我们还是选择79Counter Mode依然是up向上计数模式,不用更改。

Counter Period就是我们的ARR寄存器,用来控制周期频率的。我们假设要生成的频率是1kHz,那么周期就是1ms,那么就需要1000个CNT,所以Counter Period我们设置成999。还有一个auto-reload preload是选择是否打开预装载,我们将其使能。其他的保持默认即可。

最下面的PWM输出通道1还需要更改一下,里面有一个选择PWM模式1还是模式2,这两个的区别就是,模式1代表CNT<CCR1的时候为活跃状态(在底下的CH Polarity可以设置活跃状态是high还是low,如果是high就代表高电平),模式2代表CNT<CCR1的时候为非活跃状态。所以我们推荐配置模式1,活跃状态是high,这样配合起来的效果就是:CNT<CCR1时为高电平,CNT>CCR1时为低电平

而这里的Pulse就是我们所说的CCRx寄存器,用于控制PWM的占空比(如果按照上面的设置,Pulse就是高电平的时间)。因为前面设置了周期是1000,那么如果这里设置200,就代表着20%的占空比。

所以我们总结一下要改的地方:先勾选一下激活,然后选择模式为PWM输出模式,然后预分频设置为79(每1us计数一次),然后设置Counter Period为999(周期为1000us),然后打开预装载,然后设置Pulse(高电平时间)

这样我们就配置好了,生成工程即可。

2.程序设计

配置完之后我们可以看一下TIM17的初始化代码,这里我们可以看到刚刚配置的周期和高电平时间都已经生成好了,分别用htim17.Init.PeriodsConfigOC.Pulse表示。

然后我们就可以进行程序设计了,先调用一下TIM17的初始化函数MX_TIM17_Init(),然后开启PWM输出:HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1)

我们编译下载到开发板就直接可以输出了。

当然我们也可以改变PWM的周期和占空比,直接用对应的寄存器改就行了(ARR、CCR1),比如:

TIM17->ARR = 499;//周期改为500us,频率为2kHz
TIM17->CCR1 = 250;//占空比为50%

因为是操作寄存器的,所以可以直接改,比较方便。

也可以设置一个变量,然后通过按键调占空比等等。

u16 cycle = 499;
u16 high_time = 250;
void PWM_Out_Process()
{TIM17->ARR = cycle;//周期为cycle+1=500us,频率为2kHzTIM17->CCR1 = high_time;//占空比为high_time/(cycle+1),即50%
}

三、产生二路PWM信号

这篇关于嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863143

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后