STM32蓝桥杯嵌入式PWM输出

1,092 阅读4分钟

@TOC


前言

本篇文章将为大家讲解定时器的PWM输出,PWM可以说是一个比较重要的考点希望大家能够掌握。

一、原理图

这里我们可以看到原理图,从PA1到PA7都是定时器的PWM通道都可以用来输出PWM波。比赛的时候就会从这7个引脚当中挑选出一到两个引脚叫你输出对应波形的PWM波。 在这里插入图片描述

二、定时器输出PWM原理

STM32的定时器模块主要由计数器、时钟预分频器、自动重载寄存器(ARR)和比较寄存器(CCR)组成。其中,计数器是一个16位的寄存器,可以对外部时钟或内部时钟进行计数。时钟预分频器和ARR用于控制计数器的计数周期和PWM波的周期。CCR用于设定PWM波的高电平时间占比,也就是占空比。

具体的实现步骤如下:

1.配置时钟,使得定时器可以计数。

2.配置定时器的预分频器,选择计时时钟的分频系数,以实现所需的计时精度和波形周期。

3.配置自动重载寄存器(ARR),设置计时器计数周期的值,也就是PWM波的周期。

4.配置比较寄存器(CCR),根据所需的PWM占空比,设置CCR的值。CCR的值确定了PWM波的高电平时间,可以通过修改CCR的值来调整占空比。

5.配置输出模式,选择PWM输出通道以及极性等参数。

6.启动定时器,开始生成PWM波信号。

在输出PWM波信号时,STM32的定时器模块会定时地累加计数器的计数值,并将其与比较寄存器(CCR)中的值进行比较,当计数器的计数值小于CCR的值时,PWM波的输出端口输出高电平,否则输出低电平。通过调整CCR的值,可以实现PWM波的占空比调节。

三、cubemx的配置

讲了那么多原理我们来看看怎么在cubemx里面配置这些吧。 这里把预分频系数设置为79,因为我们设置的时钟主频为80MHZ,所以计数器就会1us增加一次。 将ARR设置为10000,上面讲原理的时候我们已经讲解到了ARR决定了PWM输出的频率和周期。 f = 时钟主频 / 预分频系数 / ARR 这里将ARR设置为了10000,PWM输出的频率就是100HZ。 在这里插入图片描述 这里我们可以提前设置好占空比,也就是使用cubemx配置CCR寄存器的值,这里设置为1000,1000/ARR这就是当前PWM输出的占空比了。 在这里插入图片描述

四、代码编写

首先需要开启对应的定时器PWM输出通道。

HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);

当想要改变PWM输出占空比的时候可以直接修改定时器CCR的值 下面的代码就是修改占空比为50%。 因为我们选择的是定时器16的通道1,所以需要操作的寄存器就是CCR1。

TIM16->CCR1 = 4999;

当然我们也可以改变PWM输出的频率 根据上面讲到的原理ARR寄存器决定了PWM输出的频率大小,那么我们这里就可以直接操作ARR寄存器来修改PWM的输出频率了。

TIM16->ARR = 4999;

五、波形查看

这里我使用逻辑分析仪查看输出的波形,当然你也可以使用示波器观察,但是我觉得逻辑分析仪用起来是非常简单的而且容易上手,所以这里就使用逻辑分析仪。 这里需要先安装逻辑分析仪的软件。 在这里插入图片描述 在这里插入图片描述 连接完成后开始采样: 在这里插入图片描述 这里我们可以清楚的看到各种数据,方便我们调试。

总结

我总结了一下省赛题,PWM的输出还是经常会考到的,很多人都惧怕PWM输出,但是这个点确并不难,掌握好这篇文章可以轻松解决PWM输出的问题。 后续我就会开始讲解省赛题了,大家尽情期待!因为文章也写的比较多了,专栏价格也会做出相应的调整,需要的小伙伴赶快入手吧。