STM32HAL库定时器操作

本文以stm32f103c8t6为例

1.基本定时功能

配置时钟树

将APB1 Timer clocks设置为72MHz。

配置定时器

以定时器2为例,设置clock source为internal clock。

定时器的配置主要有两个:定时时间与是否重装定时器。定时频率= 定时器时钟/ (预分频+1)/(计数值+ 1 )Hz;定时时间= 1 / 定时频率s。最后选择NVIC Settings,使能TIM2 global interrupt。

代码编写

HAL_TIM_Base_Start_IT(&htim2); //定时器2使能
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
	if(htim-> Instance == htim2.Instance) {
	//中断执行代码
	}
}

2.PWM波输出

简介

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。

定时器配置

基本配置与上面基本定时功能的配置相同,然后使能PWM输出通道,PWM Generation CHx 正向、PWM Generation CHxN 反向、PWM Generation CHx CHxN 一对互补pwm 输出。

配置PWM波频率及占空比

以 PWM Generation CHx 为例,频率= 定时器时钟/ (Prescaler 预分频+ 1)/ (Counter Period 计数值+ 1)Hz;占空比= Pulse ( 对比值) / (C ounter Period 计数值)%

代码编写

// 使能timx的通道y,正向
HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_y);
// 使能timx的通道y1,反向
HAL_TIMEx_PWMN_Start(&htimx,TIM_CHANNEL_y1);
// 修改timx的通道y的pwm比较值为z,即修改占空比
__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_y, z);
// 修改timx的自动重装载值为y,即修改频率
__HAL_TIM_SET_AUTORELOAD(&htimx, y);

3.输入捕获

简介

输入捕获模式可以用来测量脉冲宽度或者测量频率。需要注意不是每个定时器都支持输入捕获功能,要想知道哪些定时器支持需要查看该芯片的参考手册。

定时器配置

基本配置与上面基本定时功能的配置相同,然后使能输入捕获通道。下面以测量一路pwm波频率与占空比来进行说明。

将定时器1的通道1使能为lnput Capture direct mode,将定时器1的通道2使能为lnput Capture indirect mode,设置时钟树主频为72MHz,定时器1的预分频值为71,通道1设置为上升沿捕获,通道2设置为下降沿捕获。

图片[1]-STM32HAL库定时器操作-睿冰小站

最后使能定时器1的中断并配置中断优先级。

代码编写

使能定时器1的通道1和2

HAL_TIM_IC_Start_IT (&htim1,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT (&htim1,TIM_CHANNEL_2);

编写中断回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_1 ){    //判断中断源
		Cap_val1 = HAL_TIM_ReadCapturedValue (&htim1 ,TIM_CHANNEL_1 );//读取两上升沿间的计数值
		Cap_val2 = HAL_TIM_ReadCapturedValue (&htim1 ,TIM_CHANNEL_2 );//读取一个上升沿到下一个下降沿间的计数值
		if(Cap_val1 != 0){
			Duty = (float )(Cap_val2+ 1)*100 / (Cap_val1 +1) ;    //计算pwm波的占空比
			Frequency = 72000000 / 72 / (float )(Cap_val1 +1) ;    //计算pwm波的频率
		}
	}
}

如果pwm的频率较低,当定时器溢出时,还未检测到上升沿,可以使用定时器溢出回调函数对溢出的计数值进行记录

HAL_TIM_Base_Start_IT(&htim1);  //定时器溢出中断使能
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
	if (htim->Instance == htim1.Instance) {
		//中断处理代码
	}
}

4.输出比较

简介

输出比较模式和PWM模式都可以用来输出PWM波,在功能上两者有相同之处,对于一个定时器这两种方式都可以做到四路输出PWM,每一路PWM占空比都可调,也有不同之处,输出比较模式可以方便的调节每一路PWM波的频率,可以输出四路频率不同,占空比不同的PWM。但是PWM模式如果想要调节PWM波的频率,那么就只能重新设置预分频系数或者自动重装载寄存器ARR,并且输出的四路PWM频率必定一致。

定时器配置

基本配置与上面基本定时功能的配置相同,然后使能输出比较通道。下面以同一定时器输出两路频率不等的方波来进行说明。

将定时器的通道1选择为Output Compare CH1,通道2选择为Output Compare CH2,设置时钟树主频为72MHz,定时器1的预分频值为71,计数值为65535,使能自动重装载,比较输出模式选择Toggle on match(比较翻转)。

图片[2]-STM32HAL库定时器操作-睿冰小站

最后使能定时器1中断并配置中断优先级,将GPIO的Maximum output speed配置为high(高速)。

代码编写

使能定时器1的通道1与通道2

HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_2);

编写中断回调函数

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM1){
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){	
			//__HAL_TIM_GetCounter(htim)函数获取目前比较值,__HAL_TIM_SET_COMPARE函数设置比较值,当比较值与计数值相等时,输出电平翻转		
			__HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_1,(__HAL_TIM_GetCounter(htim)+100));//5Khz
		}
		else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){
			__HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_2,(__HAL_TIM_GetCounter(htim)+500));	//1Khz		
		}
	}
}
© 版权声明
THE END
喜欢就支持以下吧
点赞15 分享
相关推荐