- 有开发板结构图,可知PA15和PB4
- 在CubeMx中进行配置
- 参数配置
- key_of_timer.h中代码
#ifndef __KEY_OF_TIMER_H #define __KEY_OF_TIMER_H #include "main.h" void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); //定时器中断处理函数声明 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); //定时器输入捕获回调函数 #endif
- key_of_timer.c中的代码
#include "key_of_timer.h" double frq_val1 = 0,frq_val2 = 0; uint16_t duty_val1 = 0,duty_val2 = 0; float duty1=0,duty2=0; uint16_t frq1 = 0,frq2 = 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { frq_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); duty_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //读取计时值 __HAL_TIM_SetCounter(htim,0); //将计数器的值设为0 duty1 = (duty_val1/frq_val1)*100; frq1=(80000000/80)/frq_val1; //根据捕获到的值来计算频率 HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); //开启通道1 HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); //开启通道2 } if(htim->Instance == TIM3) { frq_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); duty_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //读取计时值 __HAL_TIM_SetCounter(htim,0); //将计数器的值设为0 duty2 = (duty_val2/frq_val2)*100; frq2=(80000000/80)/frq_val2; //根据捕获到的值来计算频率 HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); } }
- main中的代码
#include "tim.h" #include "key_of_timer.h" extern uint16_t frq1,frq2; extern float duty1,duty2; char lcd_text[30]; uint8_t pa6_duty = 10; uint8_t pa7_duty = 10; int main(void) { //打开输入捕获的定时器 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2); while(1) { //按键测试代码: if(key[1].single_flag == 1) { pa6_duty += 10; if(pa6_duty >= 100) { pa6_duty = 10; } __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty); key[1].single_flag = 0; } if(key[2].single_flag == 1) { pa7_duty += 10; if(pa7_duty >= 100) { pa7_duty = 10; } __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty); key[2].single_flag = 0; } sprintf(lcd_text," frq1:%d ",frq1); LCD_DisplayStringLine(Line3,(uint8_t*)lcd_text); sprintf(lcd_text," frq2:%d ",frq2); LCD_DisplayStringLine(Line4,(uint8_t*)lcd_text); sprintf(lcd_text," duty1:%.2f ",duty1); LCD_DisplayStringLine(Line5,(uint8_t*)lcd_text); sprintf(lcd_text," duty2:%.2f ",duty2); LCD_DisplayStringLine(Line6,(uint8_t*)lcd_text); } }
07-18
500
02-23
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交