• STM32定时器初始化完成后修改频率问题


    出现问题

    1. 问题代码:
    void timer_PWM_init(TIM_TypeDef *TIMx, uint32_t tim_ch)
    {
        LL_TIM_InitTypeDef TIM_InitStruct = {0};
    
        timer_clk_irq_config(TIMx, 0);
    
        TIM_InitStruct.Prescaler = 71;
        TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
        TIM_InitStruct.Autoreload = 999;
        TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
        LL_TIM_Init(TIMx, &TIM_InitStruct);
    
        LL_TIM_DisableARRPreload(TIMx);
        LL_TIM_OC_EnablePreload(TIMx, tim_ch);
        TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
        TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
        TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
        TIM_OC_InitStruct.CompareValue = 500;
        TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
    		
    		
        LL_TIM_OC_Init(TIMx, tim_ch, &TIM_OC_InitStruct);
    
        LL_TIM_OC_DisableFast(TIMx, tim_ch);
        LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_RESET);
        LL_TIM_DisableMasterSlaveMode(TIMx);
    
        timer_io_init();
    }
    
    void timer_PWM_freq_set(TIM_TypeDef *TIMx, uint32_t tim_ch, uint16_t freq)
    {
    	LL_TIM_DisableCounter(TIMx);
    	LL_TIM_SetPrescaler(TIMx, 7200-1);	// 10KHz
    	LL_TIM_SetAutoReload(TIMx, (uint16_t)((10000/freq))-1);
    }
    
    1. 问题现象:

    调用:timer_PWM_freq_set(TIM3, LL_TIM_CHANNEL_CH4, 1000)
    PWM没问题,1KHz,占空比50%
    但是,调用:timer_PWM_freq_set(TIM3,LL_TIM_CHANNEL_CH4,100)
    出问题了,PWM一直是高定平。

    问题解决

    1. 问题分析:

    因为初始化PWM的频率为1K,计数周期为500,占空比为50%
    但是在后面修改频率后并未修改计数周期,也就是频率为100HZ,计数周期还是500,计数周期大于频率了,于是就出现一直高电平的现象。(个人分析的,不知正确与否,应该是这样的。。。。)

    1. 解决方法:

    修改频率的同时也要修改计数周期,要保证计数周期小于频率,不然占空比比周期还长,自然就一直高定平或者低电平了

    1. 代码修改:
    /**
      * @brief  设置PWM输出频率
      * @param  fre取值范围(1-10000)Hz
      * @retval 设置完成频率之后不启动定时器
      */
    void timer_PWM_freq_set(TIM_TypeDef *TIMx, uint32_t tim_ch, uint16_t freq)
    {
    	LL_TIM_DisableCounter(TIMx);
    	LL_TIM_SetPrescaler(TIMx, 7200-1);	// 10KHz
    	LL_TIM_SetAutoReload(TIMx, (uint16_t)((10000/freq))-1);
    	LL_TIM_OC_SetCompareCH4(TIMx, (uint16_t)((10000/freq)/2))
    }
    
  • 相关阅读:
    项目Alpha冲刺——总结
    项目Alpha冲刺——集合
    项目Alpha冲刺 10
    项目Alpha冲刺 9
    项目Alpha冲刺 8
    项目Alpha冲刺 7
    Beta冲刺(2/7)——2019.5.23
    Beta冲刺(1/7)——2019.5.22
    项目Beta冲刺(团队) —— 凡事预则立
    Alpha 事后诸葛亮(团队)
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018378.html
Copyright © 2020-2023  润新知