一、开发板资源介绍

定时器主要由时钟控制、时基单元、输入捕获和输出比较等部分组成。

时钟控制包含触发控制器、从模式控制器和编码器接口等,可以选择内部时钟(CK_INT:默认值)、外部时钟模式1(TIxFPx)、外部时钟模式2(ETR)和内部触发(ITRx)。

时基单元包含16位计数器CNT、预分频器PSC、自动重装载寄存器ARR和重复次数计数器RCR。计数器可以向上计数、向下计数或向上向下双向计数,计数器时钟由预分频器对多种时钟源分频得到,计数器初值来自自动重装载寄存器,重复次数计数器实现重复计数。

输入捕获包含输入滤波器和边沿检测器、预分频器和捕获/比较寄存器等,可以捕获计数器的值到捕获/比较寄存器,也可以测量PWM信号的周期和脉冲宽度

输出比较包含捕获/比较寄存器、死区发生器DTG和输出控制,可以输出单脉冲,也可以输出PWM信号。

TIM使用的GPIO引脚如下图所示。
在这里插入图片描述在这里插入图片描述

首先说明如下图所示本工程在时钟树里配置的HCLK是80Mhz
如果配置的不是80Mhz,下面计算过程中把80改成自己工程的HCLK值

在这里插入图片描述

二、输出PWM波

实现功能:(一般题目中测量PWM波要求使用PA6或PA7引脚,通道可自行选择,以下通道选取做个参考即可)

TIM1通过CH1N(PA7)输出200Hz占空比10%的矩形波
TIM3通过CH1(PA6)输出100Hz占空比10%的矩形波

1、选择引脚

在这里插入图片描述
配置完以下步骤后引脚就会变绿

2、配置参数


TIM3的CH1(PA6)

在这里插入图片描述在这里插入图片描述
配置解读:
1.PWM频率: Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz),arr 是计数器值,psc 是预分频值

如上图所示,预分频系数在Prescaler中设为79,频率被预先分频为80MHz/(79+1)=1Mhz

且我们选择的是向上计数模式,计数器CNT如下图,每次向上计数到ARR,计数器值arr在Counter Period中设为9999,即从0计数到9999,共10000。计数周期是10000,频率又被分为1Mhz/(9999+1)=100Hz。

并且由公式计算也可直接得PWM频率为80MHz/(79+1)/(9999+1)=100Hz
在这里插入图片描述

2.占空比: duty circle = TIM3->CCR1 / arr(单位:%)

PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

我们选择的是PWM模式1,且高电平有效,即当CNT<CCR1时,为高电平,产生的波形如下图所示。
在这里插入图片描述
在CubeMx中我们配置,CCR1的值在Pluse中设为1000,计数器值arr在Counter Period中设为9999。

那么占空比为1000/(9999+1)=10%

3.产生固定频率和固定占空比就在CubeMx中配置成自己想要的就可以了,如果程序中需要改变频率和占空比的话,在代码中修改CCR1可以修改占空比,修改arr可以修改频率。


TIM1的CH1N(PA7)

参数配置原理同上在这里插入图片描述在这里插入图片描述

3、通用函数

1.在main.c中用户添加代码区添加以下代码

//在main.c的初始化中调用
void TIM_Init(void)
{
	HAL_TIM_PWM_Start(&htim1,2);            /*启动TIM1_CHIN PWM*///因为是通道1的互补通道,所以这里写2
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);/* 启动TIM3_CH1 PWM */
}

2.最后在main.c初始化中调用TIM_Init()

实现PWM波输出代码部分非常简单。大家就可以用示波器观察以下PA6和PA7的频率和占空比是否正确了。

3.若想要根据条件改变PWM频率和占空比

使用下面两个函数

    __HAL_TIM_SET_AUTORELOAD(htim, arr);//设置自动重装值
    __HAL_TIM_SET_COMPARE(htim, Channel, cmp);//设置比较值 

比如设置TIM3的CH1频率为100Hz,占空比为20%。

//在while里调用
void TIM_Proc(void)
{
    __HAL_TIM_SET_AUTORELOAD(&htim3, 9999);
    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,2000);
}

最后在while中调用TIM_Proc();

如果想用开发板测量PWM波的频率和占空比,学习【蓝桥杯嵌入式组】HAL库STM32CubeMx学习笔记七:05-TIM(下)

在这里有一些学习资料建议,欢迎批评指正【蓝桥杯嵌入式组】HAL库STM32CubeMx学习笔记汇总:学习建议及资料

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐