硬件:STM32G431
软件:Keil5 CUBEMX
实现方式:HAL库
1.定时器实现原理
1.1 定时器基本组成与原理
控制器会根据定时器频率,对计数器进行计数。有的时候我们不需要计数那么快,因此我们会有一个PSC进行分频。当CNT计数器达到ARR的时候,ARR就会产生一个更新事件,而更新事件包括了DMA输出和中断。
1.1.1相同时钟源,PSC不同下的计数快慢
1.2 从模式寄存器与触发源
你会发现时钟寄存器不只有计数功能,还有让计数器复位的功能,那既然是复位,就要有触发源,触发源我们可以在时钟树上面看到。
从图知道,从模式寄存器的触发源一共有这几种
1.2.1 ITR触发源
指的是控制器的触发源由其他定时器产生,每个寄存器的ITR触发都不相同,以STM32F103数据手册列举的定时器为例
TIM2定时器的ITR0触发源由TIM1产生,ITR1触发源由TIM8产生,以此类推。
1.2.2 ETR触发源
1.使用定时器的特殊引脚ETR引脚的信号作为时钟源
2.每个通用定时器都有一个ETR引脚,比如TIM3的时ETR引脚是PD2
3.ETR引脚信号经过极性选择,边缘检测,预分频器,输入滤波,得到信号ETRF
1.2.3 TI1FP1和TI1FP2触发源
这些指的是当边沿检测器捕获到上/下降沿时会像从模式器发送一个信号,这个也是本章要使用的触发源
1.3 PWMI模式
1.3.1 PWMI结构
2.CUBEMX配置
2.1 方法一——设置直接间接捕获
2.1.1 RCC时钟配置
2.1.2 定时器配置
注:不设置从模式寄存器也是可以的,但要自己在代码中自己清除CCR寄存器的数据。
有读者是直接看应用部分不知道为什么设置触发源为TI1FP1的,并想了解的话,请看本章的1.2 小节
开启中断
2.1.3 时钟树配置
2.1.4 工程配置
2.2 方法二——设置PWMI模式(推荐)
2.2.1 定时器配置
方法二其他设置都与方法一相同,只是定时器设置有点不同,因此其他部分都要参照方法一
不需要开中断和其他的复杂的操作,硬件自动执行,可在主函数直接使用
3 代码实现
3.1 方式一
main.c
while (1)
{
char text[20];
sprintf(text," PA15Duty :%.2f ",duty);
LCD_DisplayStringLine(Line3, (u8 *)text);
}
//回调函数
int crr1_R,crr1_F,crr2;
float duty;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
crr1_R=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
crr1_F=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
duty=((crr1_F*1.0)/(crr1_R*1.0));
}
3.2 方式二
main.c
double TIM3_GETPWMDutyCycle(void)
{
return TIM3->CCR2*1.0/TIM3->CCR1*1.0;
}
while (1)
{
char text[20];
sprintf(text," PB4Duty : %.2f ",TIM3_GETPWMDutyCycle());
LCD_DisplayStringLine(Line5, (u8 *)text);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}