zoukankan      html  css  js  c++  java
  • 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))
    }
    
  • 相关阅读:
    Linux排序命令sort笔记
    Linux排序命令sort笔记
    Linux文本截取命令cut​笔记
    排序和搜索
    栈和队列
    链表
    顺序表
    Linux编辑器|gedit|vi|vim编辑器
    Linux简介
    简单学习Git
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018378.html
Copyright © 2011-2022 走看看