写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.8 TIM—PWM输出实验,讲解TIM 定时与PWM输出的STM32CubeMX配置和程序设计方法
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1
目录
4.8 TIM—PWM输出实验
4.8.1. 实验任务
- TIM定时作用:参考官方例程HAL_10_TIM_BASE,实现流水灯。
- TIM PWM输出:产生PWM波(频率固定、占空比可调),实现呼吸灯
- TIM PWM输出:可调频率/占空比的PWM波
4.8.2. TIM原理解析
定时器(Timer)最基本的功能就是定时,可以延伸到测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。
STM32G4 的定时器功能十分强大,共有10个定时器:
表1 定时器类型
查看STM32G431RB数据手册(资料包芯片手册中),可获得各个定时器通道的引脚分布,如
可以汇总为表2:
STM32G431的通用 TIMx定时器功能特点包括:
16 /32 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4)
计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
中央对齐模式(向上/向下计数):计数器从0开始计数到最大值,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
定时时间计算
基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0 至 65535。
CNT表示当前计数值,ARR是自动重载的最大计数值。PSC是分频系数,对定时器时钟AB1或AB2进行分频,得到当前计数器的频率。)
首先设置预分频器寄存器TIMx_PSC (简写成PSC),得到分频后的频率,频率的倒数就是周期时长。如,定时器时钟fCK_PSC =80MKz、(PSC+1)设为(7999+1),这样fCK_CNT /(PSC+1)分频后的频率值就为10kHz,每一个周期时长也就是0.1ms。
fCK_CNT = fCK_PSC/(PSC+1) // fCK_PSC为定时器时钟频率,来自APB1或者APB2。
再把把(ARR+1)设为(9999+1)。这样我们得到的定时时长就是1s。
Tout(定时时间)=(ARR+1)(PSC+1)/ fCK_PSC
PWM波输出
PWM 输出就是产生一个周期的方波信号,频率、占空比(高电平占总周期的比值)是它的关键参数。
如下图,假定定时器工作在向上计数PWM模式,且当 CNT(当前计数值)<CCRx(比较寄存器) 时,输出 0,当 CNT>=CCRx 时输出 1。实际上配置CCRx、ARR的数值,就控制PWM波的输出脉宽了。
STM32G431 定时器可以用来产生 PWM 输出,其中高级定时器 TIM1 可以输出 4 路。而通用定时器(TIM2、TIM3、TIM4)也可同时产生多达 4 路的 PWM 输出。
通常单片机GPIO口只能输出高电平和低电平,可以利用PWM波,通过改变PWM方波的占空比,从而获得不同的模拟电压值。如,100%对应5v,0%对应0v,50%对应2.5v。
因此,利用PWM波,可以实现呼吸灯(电压值变化,导致LED亮度强弱变化)、电机调速(电压值变化,导致电机速度变化)等。
4.8.3. TIM定时作用
定时器(Timer)最基本的功能就是定时,这里以官方例程HAL_10_TIM_BASE为例,阐述TIM定时作用的设计方法,实现流水灯。
定时器的定时设计方法:
参数配置:PSC、ARR,开启定时中断。可采用STM32CubeMX或者程序设计来实现。
main.c中调用TIM初始化语句、开启定时中断HAL_TIM_Base_Start_IT(&htim1)。
编写中断回调函数HAL_TIM_PeriodElapsedCallback,实现功能要求。
1. 初始化配置(STM32CubeMX)
定时器的参数配置,可以首先使用STM32CubeMX进行初步设置。还可以在程序设计时,进行二次修改。
以TIM3为例,配置出1HZ的频率,也就是1s发生一次溢出中断。
80MHZ经过PSC分频,80MHZ/(7999+1) ,得到10KHZ的时钟频率(周期0.0001s)。ARR设为10K-1,则计数10K次,产生溢出中断,即实现1s的计时 。
STM32CubeMX配置,如下图: