一、STM32定时器
(一)定时器基本原理
STM32定时器是用于时间测量、脉冲产生和PWM输出的重要组件。它们基于定时器/计数器模块,可以计数外部触发信号的脉冲数,也可以自主地产生脉冲信号。定时器的基本构成包括计数器、预分频器、自动重载寄存器和各种控制寄存器。
(二)定时器工作模式
STM32定时器有多种工作模式,包括单脉冲模式、定时器模式、输入捕获模式和PWM输出模式。
(三)定时器的分类及区别
STM32F103一共有8个定时器TIM1~TIM8。STM32的定时器分为基本定时器、通用定时器和高等定时器。这一次我们主要运用到的是通用定时器中TIM2、TIM3接口。
1.基本定时器(Basic Timer)
(1)基本定时器是STM32中最简单的定时器之一,通常用于生成精确的时间延迟或周期性事件触发。
(2)基本定时器包括TIM6、TIM7,具有一个16位的自动重载寄存器,一般不支持高级功能,如PWM输出或捕获功能。
2.通用定时器(General-Purpose Timer)
(1)通用定时器是STM32中功能最丰富的定时器之一,通常用于PWM输出、捕获和定时测量等应用。
(2)通用定时器包括TIM2、TIM3、TIM4、TIM5等,具有更多的比较通道和更多的功能选项。
3.高级定时器(Advanced Timer)
(1)高级定时器是STM32中功能最强大的定时器,具有更多的特性和选项,通常用于高级的定时和PWM控制应用。
(2)包括TIM1和TIM8,具有更多的比较通道、更高的分辨率和更多的高级功能,如死区控制和同步功能。
(四)通用定时器介绍
1.通用定时器基本功能
TIM2、TIM3、TIM4、TIM5为STM32的4个独立的16位通用定时器,具有定时、测量输入信号的脉冲长度(输入捕获)、输出所需波形(输出比较、产生PWM、单脉冲输出等)等功能。
这是通用定时器内部结构框图:
2.通用定时器工作模式
STM32F103系列微控制器的定时器功能十分强大,内部结构也比较复杂,STM32通用定时器TIMx(x=2,3,4,5)主要由时钟源、时钟单元、捕获和比较通道等构成,核心是可编程预分频驱动的16位自动装载计数器。
(1)时钟源
当定时器使用内部时钟时,定时器的时钟源统称为TIMxCLK。虽然在系统默认的配置中,TIMxCLK的时钟频率都是72MHz,但其时钟来源并不相同。
●定时器TIM2~TIM7挂接在APB1上;
●定时器TIM1和TIM8挂接在APB2上 ;
若外部晶振的频率为8MHz,则系统默认的时钟频率为72MHz
●APB1预分频器的分频系数设置为2,则PCLK1=36MHz;
●APB2预分频系数设置为1,则PCLK2=72MHz,TIM1和TIM8的时钟频率TIMxCLK=72MHz;
●Cortex系统时钟由AHB时钟(HCLK)8分频得到,即SysTick的频率为9MHz。
(2)预分频器PSC
通用定时器预分频器(Prescaler,通常简写为PSC)是用于将输入时钟信号分频的功能模块。在STM32F103系列微控制器中,通用定时器的预分频器通常是一个16位的寄存器,可以配置为将输入时钟信号分频为1到65536之间的任意值。通过合理配置预分频器的分频比,可以实现对定时器的精确控制和灵活应用。
预分频器通常由一个16位的计数器(TIMxCNT)组成,可以将输入时钟信号分频为任意的分频比。预分频器的分频比(即PSC的值)可以通过寄存器进行配置。
(3)计数器CNT
TIMxCNT是一个16位的寄存器,计数范围为1~65535,可以向上计数、向下计数或向下向上双向计数。
● 要得到想要的计数值,需要对输入时钟频率进行分频。
● 当计数值达到设定值时,便产生溢出事件,溢出时产生中断或DMA请求,然后再由自动装载寄存器进行重新加载或更新。
● 计数器溢出中断属于软件中断,执行相应的定时器中断服务程序。
(4)自动装载寄存器ARR
定时器的定时时间主要取决于定时周期和预分频因子,计算公式为:
定时时间=(ARR+1)×(预分频值PSC+1)/输入时钟频率
或者
T=(TIM_Period +1)*(TIM_Prescaler +1)/TIMxCLK
这里ARR+1是因为计数器都是从0开始计数的。
例如:使用通用定时器使得LED灯达到延时2s的亮灭。
假设系统时钟为72MHz,通用定时器时钟TIMxCLK为72MHz,设置如下:
预分频系数PSC=6000-1; ARR=4000-1;
则,定时时间=4000×36000/72000000=2s。
二、PWM
(一)PWM介绍
PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。
PWM(Pulse Width Modulation,脉宽调制)是一种用于产生模拟信号的技术,它通过改变脉冲的宽度来控制输出信号的平均功率或电压。PWM常用于控制电机速度、LED亮度调节、音频信号合成等应用中。
基本上,PWM的原理是通过周期性地改变脉冲信号的高电平时间(也称为占空比),来控制输出信号的特性。以下是PWM的基本原理:
1.信号周期(Period)
(1)PWM信号是周期性的,在一个完整的周期内,包含一个高电平时间和一个低电平时间。
(2)信号周期是PWM信号从一个周期的起始点到下一个周期的起始点的时间长度。
2.占空比(Duty Cycle)
(1)占空比是指PWM信号中高电平时间与一个周期的总时间之比(Tp/T),通常以百分比表示。
(2)占空比决定了输出信号的平均功率或电压,以及被控制设备的行为。占空比越高,平均功率或电压越大;占空比越低,平均功率或电压越小。
在占空比不同的情况下,PWM所输出的脉冲波形是不同的,如下图:
3.输出信号特性
(1)当PWM信号的高电平时间比例较高时,输出信号的平均功率或电压较高,控制设备通常处于工作状态。
(2)当PWM信号的高电平时间比例较低时,输出信号的平均功率或电压较低,控制设备通常处于关闭状态。
4.控制频率
(1)PWM信号的频率是指PWM信号的周期,通常以赫兹(Hz)表示。
(2)PWM信号的频率越高,输出信号的平均功率或电压越平滑,但系统开销也会增加。
(二)PWM基本原理
1.STM32的定时器除了TIM6和TIM7,其他定时器都可以用来产生PWM输出;
2.高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出;
3.通用定时器能同时产生多达4路的PWM输出;
4.STM32中每个定时器有4个输入通道:TIMx_CH1~TIMx_CH4;
5.每个通道对应1个捕获/比较寄存器TIMx_CRRx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到PWM信号;
6.脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
(三)PWM工作模式
1.在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出低电平;
2.在t1-t2时间段,定时器计数器TIMx_CNT值大于TIMx_CCRx值,输出高电平;
3.当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。
三、定时器/PWM控制LED灯
题目中需要用到STM32CubeMX创建文件,详细操作可以看上一条博客
(一)定时计数器控制LED灯
1.任务要求
使用STM32F103的 Tim2~Tim5 其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
2.keil编写程序
在STM32CubeMX创建好文件后生成keil,添加代码
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 30)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);
}
}
}
3.烧录效果
(二)定时器PWM控制LED灯
1.任务要求
采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。
2.keil编写程序
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal;
HAL_Delay(1);
}
HAL_Delay(200);