1,STM32cnbemx:
打开TIM2,将通道1设为Input Capture direct mode (直接输入捕获),将通道2设为Input Capture indirect mode (间接输入捕获),预分频器为80-1,开启全局中断;
通道1用于测量频率,结合通道2可以算出占空比;
(注意:通道一:应设置为Rising Edge(上升沿),通道二为Falling Edge(下降沿),否则结果错误!!)
再开启一个用于产生PWM波的通道,频率自定义;
2,工程代码:
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//=======================开启输入捕获
//======================================================PWM波初始化
HAL_TIM_PWM_Start_IT(&htim16,TIM_CHANNEL_1);
HAL_TIM_SET_COMPARE(&htim16,TIM_CHANNEL_1,9999);(这里是80-1加10000-1--->100Hz)
unsigned int ic_val;
unsigned int frq;
float ic_duty;
float duty;
//输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)/===================================/确定是定时器2
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//==================确定是通道一触发的
{
ic_val=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//直接
ic_duty=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);//间接
__HAL_TIM_SetCounter(&htim2,0);//================================置零
frq=1000000/ic_val;//==================================(80*10^6)/(80-1)=1*10^6;
duty=ic_duty*100/ic_val;//=================================占空比计算,乘100是化为百分百(间接除以直接)
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//===================重新打开两个通道
}
}
}
3,硬件上,将TIM2的通道一接到TIM16的通道一