×
单片机 > 单片机程序设计 > 详情

使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

发布时间:2020-05-30 发布时间:
|

STM32定时器具有PWM的输入捕获模式。


PWM输入捕获是定时器输入捕获的一个特例,单通道的输入捕获只能获取波形的频率,但是PWM输入捕获可以获取到频率和占空比,对应的高低电平宽度也就能获取到。 它的时序如下图所示:


 使用cubemx配置方法:


 就是使用TIM2的ch1和ch2来捕获一个pwm信号。


这里只测试了update event,我测试55khz使用该分频与计数值可以正常工作,不过第一次捕获的数据是随机数,需要丢弃。另外这里分频值我改成89的时候不太正常,捕获到的占空比出现错误,更改为0之后正常。这里需要注意的是F429的TIM2是在APB1下,时钟频率90Mhz。而TIM1/TIM8则是在APB2下。


 然后使能TIM2的中断


接下来添加代码:


main.c 中开启捕获中断


    /* USER CODE BEGIN 2 */

    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃

    /* USER CODE END 2 */    

 

  /* USER CODE BEGIN WHILE */

  while (1)

  {

 

    /* USER CODE END WHILE */

 

    /* USER CODE BEGIN 3 */

    if (tmp1 == 0)

    {

        duty = 0;

        freq = 0;

    }

    else

    {

        duty = tmp2 * 100.0f / tmp1 + 0.5f;

        freq = 90000000.0f / tmp1;

    }

    printf ("freq: %d Hztduty: %d %%rn", freq, duty);

    printf ("tmp1: %dt%drn", tmp1, tmp2);

    printf ("pos pulse= %lfrn", tmp1 * 1.111111111111111e-8);// 这个1.xe-8就是90M时钟分之一

    HAL_Delay(500);

  }

  /* USER CODE END 3 */

 然后添加TIM2的中断回调函数:


/* USER CODE BEGIN 1 */

 

uint32_t duty = 0;

uint32_t freq = 0;

 

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

    volatile static uint32_t tmp1 = 0, tmp2 = 0;

    

    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)

    {

        tmp1 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//周期

    }

    else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)

    {

        tmp2 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);//占空比

    }

    

    

}

/* USER CODE END 1 */

 这里计算出的duty和freq就是占空比和频率,下边加上0.5只是为了四舍五入,不需要的可以去掉。


这里的90000000就是定时器的时钟源,因为我使用的是F429的TIM2且分频值配置的为0, 所以用90000000来除以tmp1就得到频率,如果用其他定时器或者分频值的话需要更改这个90000000为实际的时钟源频率


 


这里有个问题是,当检测引脚上的PWM信号突然丢失的时候,程序不会将频率和占空比清零。可以添加一个计数值,main中累加,检测中断中清零,当累加到一定的值就表示外部没有pwm输入了,从而判断出外部中断的状态。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
采用AT89C2051的数字可调稳压电源单片机源程序