配置
- 电路原理图
频率信号发生器
从上图我们可以看到频率发生器分别连接了 PA15 和 PB4,通过在CubeMX中点击引脚可查看到,可以得知这两个引脚可用作以下定时器的输入捕获:
- PA15 ----> TIM2_CH1
- PB4 ----> TIM3_CH1
程序编写
例1:使用频率发生器产生频率,然PA15和PB4输入捕获
注:最好不要与扫描按键的定时器相同,否则按键会失效
分别配置TIM2_CH1 和 TIM3_CH1,如下:
都为直接捕获,捕获上升沿,开启定时器中断
- 初始化
在 main.c 中开启输入捕获定时器
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
- 编写输入捕获中断回调函数
在 interrupt.c 中重新定义输入捕获的中断回调函数
unsigned int ccrl_val1 = 0, ccrl_val2 = 0;
unsigned int frq1 = 0, frq2 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
ccrl_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim,0);//计时器清零
frq1 = (80000000/80)/ccrl_val1;//频率
HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);
}
if (htim->Instance == TIM3)
{
ccrl_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim,0);//计时器清零
frq2 = (80000000/80)/ccrl_val2;//频率
HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);
}
}
例2:用PA16输出PWM波, PA15 捕获频率和占空比
PA16的配置看之前的PWM,下面主要配置 PA15
- 初始化
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
- 编写中断回调函数
uint32_t ccrl_val11 = 0,ccrl_val12 = 0;
float duty1 = 0;
uint32_t frq1 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
ccrl_val11 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //上升沿
ccrl_val12 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //下降沿
if(ccrl_val11 != 0)
{
__HAL_TIM_SetCounter(htim,0);
duty1 = ((float)ccrl_val12/ccrl_val11)*100; //占空比
frq1 = (80000000/80)/ccrl_val11; //频率
}
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_2);
}
}