1. CubeMX引脚配置
这里使用的是PA6,切记要打开中断

2. Cube MX时钟配置

3. 回调函数编写
//TIM单通道采集PWM频率+占空比
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint8_t capture_cnt = 1; //电平计数
if(htim->Instance == TIM13)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
if(capture_end_flag == 0)
{
//第一个上升沿
if(capture_cnt == 1)
{
capture_cnt = 2;
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
__HAL_TIM_SetCounter(htim, 0);
high_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
}
//第一个下降沿
else if(capture_cnt == 2)
{
capture_cnt = 3;
low_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
}
//第二个上升沿
else if(capture_cnt == 3)
{
capture_cnt = 1;
high_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
freq = (float)80000000 / TIMER_CLOCK / (high_val + 1);
duty = (float)low_val / (high_val + 1) * 100;
capture_end_flag = 1;
}
}
}
}
}
4. 初始化函数
TIM_HandleTypeDef htim13;
void MX_TIM13_Init(void)
{
/* USER CODE BEGIN TIM13_Init 0 */
/* USER CODE END TIM13_Init 0 */
TIM_IC_InitTypeDef sConfigIC = {0};
/* USER CODE BEGIN TIM13_Init 1 */
/* USER CODE END TIM13_Init 1 */
htim13.Instance = TIM13;
htim13.Init.Prescaler = TIMER_CLOCK - 1;
htim13.Init.CounterMode = TIM_COUNTERMODE_UP;
htim13.Init.Period = 65535;
htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim13) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_IC_Init(&htim13) != HAL_OK)
{
Error_Handler();
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim13, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM13_Init 2 */
/* USER CODE END TIM13_Init 2 */
}
5. 开启一个周期任务,用于计算
void pwm_capture_task(void* param)
{
MX_TIM13_Init();
HAL_TIM_IC_Start_IT(&htim13, TIM_CHANNEL_1);
while (1)
{
rt_thread_mdelay(500);
if(capture_end_flag == 1)
{
capture_end_flag = 0;
}
}
}

5856

被折叠的 条评论
为什么被折叠?



