wenbo2005.online

学习记录 / STM32

占空比的测量(间接捕获)

STM322025-01-25

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的通道一