蓝桥杯嵌入式(输入捕获测频率)
一.原理图
本文使用的是板子上自带的555发生器,对应的引脚为PA15和PB4
二.普通方式测频率
1.CubeMX的配置
主要为预分频系数为80,关系到后面频率的计算 ,本文设置的时钟频率为80Mhz,所以设置预分频系数为80。
记得开启中断。
2.代码的编写
变量的定义
float fre,duty;
uint32_t count_buf[3]={0};
uint8_t count;
主函数的编写
switch(count)
{
case 0:count++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
break;
case 3:
fre=1000000.00/(count_buf[0]+count_buf[1]);
duty=(float)count_buf[0]/(count_buf[0]+count_buf[1]);
count=0;
break;
}
中断函数的编写
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htime)
{
if(TIM2==htime->Instance)
{
switch(count)
{
case 1: count_buf[0]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(&htim2,0);
count++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
break;
case 2: count++;
count_buf[1]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1);
break;
}
}
}
3.双通道测频率法
1.CubeMX的配置
开启定时器3的通道1和通道2,前者设置为输入捕获直接模式,后者为间接模式
触发沿一个是上升沿触发,另一个下降沿触发
2.代码的编写
变量的定义
double fre,duty;
开启中断
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);//频率测量捕获定时器开启
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);//频率测量捕获定时器开启 间接通道
中断函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint16_t value1=0,value2=0;
if(htim->Instance==TIM3)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
value1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //直接
value2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //间接
__HAL_TIM_SetCounter(htim,0); //计数值清零
fre = (80000000/80)/value1; //计算频率
duty = (float)value2/value1 * 100; //计算占空比
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); //重新开启定时器通道
HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); //重新开启定时器通道
}
}
}
m0_68581441: 能不能测量10Khz非常精准
C2309695701: 学长您好,求一份工程文件,很感谢!!!
底格里斯河畔: 求一份工程文件! 串口那儿不理解