STM32F407实现PWM捕获

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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值