定时器
1.定时器
定时器具有定时功能,核心是计数器,记录固定的数字。:从寄存器里面存储的数字开始,有规律的递
增或者递减的数数(固定的时间进行一次计数),当正向(+1)/反向(-1)计数达到相应的值时,就会触发中断或者翻转
定时器包括基础定时器、通用定时器和高级定时器三部分
基本定时器 定时功能
通用定时器 多具有多路独立通道,可用于输入捕获/输出比较(PWM)
高级定时器 多具备带死区控制的互补信号刹车输入等功能
注意函数的选择,是TIMx还是TIM 等等
2.基础定时器
1.知识补充
基础定时器主要由 具有固定频率和占空比的时钟信号经过预分频器之后将新的信号传到计数器,当计数器数到和ARR相等时,就完成了一次计数,触发中断/翻转重新开始
所以可以得到
周期是 T = ( P S C + 1 ) ( A R R + 1 ) / F t T=(PSC+1)(ARR+1)/F_t T=(PSC+1)(ARR+1)/Ft

用肉眼是很难观察计数的,并且速度很快,所以对基础定时器功能的检验,可以借助led的变化情况
可以设定,一周期led电平翻转一次。设定周期为1s 对应PSC ARR可以设置为(只要合理就行不固定)
P S C = 64000 − 1 PSC=64000-1 PSC=64000−1 A R R = 1000 − 1 ARR=1000-1 ARR=1000−1
2.实验操作
这里,我们借助TIM1的基础中断作用
!!\[在这里插入图片描述(https://i-blog.csdnimg.cn/direct/f3b9a1f294864f1397918c887520ceec.png)
选择内部时钟并调节好对应的数据

很重要的一点,需要在NVIC中把TIM1的使能打开

到代码部分:定时器工作函数+定时中断函数(包含电平翻转指令)
c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
}
//定义定时中断函数
c
HAL_TIM_Base_Start_IT(&htim1); //启动定时器
3.实验现象:
基础定时器
一个重要的补充/比较:因为基础功能(更新中断)是定时器内部的事件,不需要通过外部引脚输出任何信号。
而PWM/输出比较功能需要把定时器内部产生的波形信号,通过外部引脚输出出去
这张这区别决定TIM到底选择在那个引脚
3.通用定时器
这里我们讨论输出功能,做PWM输出实验
1.知识补充
和基础定时器不同的是,PWM输出方波还有一个特殊的占空比
占空比,就是一个周期内输出的方波中高电平占整个周期的百分比。
PWM具有两个模式:向上计数和向下计数(从0到max和从max到0)
在下图中,5是捕获/比较部分(公共的)6是输出比较

在5这一部分有一些寄存器,会写入一个初始的寄存器值记作 C R R 1 CRR1 CRR1,计数器( C N T CNT CNT)计数存储到寄存器中,当计数器计数和写入寄存器的值相同 C N T = C R R 1 CNT=CRR1 CNT=CRR1时,就发生中断/翻转

其中,CRR就是决定占空比的, C R R / ( A R R + 1 ) CRR/(ARR+1) CRR/(ARR+1)
由于PWM-1 向上计数的时候, C N T < A R R CNT<ARR CNT<ARR输出高电平 C N T > A R R CNT>ARR CNT>ARR是无效电平;
向下计数时 C N T < A R R CNT<ARR CNT<ARR输出低电平 C N T > A R R CNT>ARR CNT>ARR有效电平;
PWM-2 向上计数的时候, C N T < A R R CNT<ARR CNT<ARR输出低电平 C N T > A R R CNT>ARR CNT>ARR是有效电平;
向下计数时 C N T < A R R CNT<ARR CNT<ARR输出低电平 C N T > A R R CNT>ARR CNT>ARR有效电平
下面这张图是PWM 在模式2的向上/递增计数模式下的图像

2.实验操作
借助PWM输出方波,令led在一个周期内发生一次闪烁

c
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);//启动
3.实验现象:
pwm固定占空比输出
2)呼吸灯实验
由于当时间周期极小的时候,led的电压是 ( t 1 / T ) V (t_1/T)V (t1/T)V,t1是高电平的时间,所以可以通过不断改变高电平时间/占空比,来获得"呼吸灯"
2.实验操作
和基础定时器操作一样,只不过这次我们需要打开PWM输出模式,这里选择mode2(1/2都可以)
我这里PSC=64-1 CRR=99
代码部分:
c
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
uint8_t dir=1;
uint8_t val;
while (1)
{
if(dir==1)
val++;
if(dir==0)
val--;
if(val>=99)
dir=0;
if(val==0)
dir=1;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,val);
HAL_Delay(5);
}
3.实验现象:
呼吸灯9
示波器显示(选取了三个比较明显的状态)



4.高级定时器
死区时间
高级定时器会有互补输出,我们使用示波器来观察
1.知识补充
互补输出就是两个通道输出的波形是相反的,极性相反
死区时间:在相反的时候会有一段延迟,例如channel1由低变高,channel2就先延迟一段时间再由高变低
因为有输出H桥,所以死区时间十分重要
例如,正常情况下,当Q1 Q4/ Q2 Q3为高电平的时候就可以导通输出;如果没有死区时间,在电平翻转的瞬间Q1 Q2都是高电平,就会短路,损害器件

2.实验操作
1.system core---sys打开

2.选择PWM互补输出,在下面配置的时候特别注意BRK状态enable以及死区时间的设置



c
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
3.实验现象:
示波器显示


死区时间大概是20us,符合我们的配置