This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123AH6PM:频率变化时的宽定时器 PWM 毛刺脉冲

Guru**** 1788580 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/565355/tm4c123ah6pm-wide-timer-pwm-glitch-when-frequency-changing

器件型号:TM4C123AH6PM

大家好、  

我有一个关于 配置为宽定时器的引脚 PWM 输出问题的问题。 我已使用计时器进行 PWM 输出、配置似乎正常、当没有频率发生变化时、工作正常(频率根据 ADC 上接收到的2-200Hz 的一些模拟输入发生变化)。 但我注意到、当以非常低的值(2-15Hz)更改频率时、有时我的输出会在一段时间内完全变为低电平、然后进行更新以为 PWM 提供新的频率输出。 这是  系统检测到频率请求更改时使用的代码片段:  

ulPeriod = SysCtlClockGet ()/input_AnalogVals.dPotFreqPWM;//计算新的周期
dutyclePWM2 =(无符号长整型)(ulPeriod-1)* dPWMDutyDivider;
TimerUpdateMode (WTIMER 5_base、timer_A、timer_up_load_timer_timer_timer_timer_up_timer_timer_timeout;TimerUpdateMode)| TimerUpdateTimerLoad_timeout_timer_timer_timer_timer_timer_timer_timer_timer_timer_timer_timer_timer_tim
Timer_A、ulPeriod-1);
uint32_t ui32_dutyCyclePWM2=(uint32_t) dutyCyclePWM2;
TimerMatchSet (WTIMER 5_base、timer_A、 ui32_dutyCyclPWM2); 

下面是我配置此输出的代码:  

SysCtlPeripheralEnable (SYSCTL_Periph_WTIMER 5);
GPIOPinConfigure (GPIO_PD6_WT5CCP0);
GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_6);
ulPeriod = SysCtlClockGet ()/2;/200Hz 默认
dutyCyclPWM2 =(无符号长整型)(ulPeriod-1)*(1-(5.0/100.0));
TimerConfigure (WTIMER 5_BASE、(TIMER_CFG_SPLIT_PAY|TIMER_CFG_A_PWM));
TimerUpdateMode (WTIMER 5_BASE、TIMER_A、 Timer_up_load_timeout | timer_up_match_timeout);
TimerLoadSet (WTIMER 5_base、timer_A、ulPeriod-1);
TimerMatchSet (WTIMER 5_base、 Timer_A、dutyCyclPWM2);
TimerEnable (WTIMER 5_base、timer_A); 

我假定此行"TimerUpdateMode"控制计时器在计数先前匹配之前不更新加载值、但有时这似乎不是真的。

你怎么看、我出了什么问题?

提前感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Djedjica

    请注意、超时时加载值意味着加载的值不应超过超时边界。 确保定时器发生翻转、然后加载新值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashara 先生、您好!
    好的、我认为我知道您的意思、因此当我增加频率负载值时、它的值会低于上一个频率负载值、因此在这一点上、我应该以某种方式等待计时器计数到0、而不是加载新的 val。 但是、我如何实时识别计时器何时翻转?
    注意:现在、我要刷新主循环中1kHz 时的计时器值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Djedjica

    我认为您应该使用超时中断状态来查找翻转点、而不是读取当前计时器计数器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是我对具有中断的 WTIME5的配置

    SysCtlPeripheralEnable (SYSCTL_Periph_WTIMER 5);
    GPIOPinConfigure (GPIO_PD6_WT5CCP0);
    GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_6);
    ulPeriod = SysCtlClockGet ()/2;
    dutyCyclePWM2 =(无符号长整型)(ulPeriod-1)*(1-(5.0/100.0));
    TimerConfigure (WTIMER 5_base、(TIMER_CFG_SPLIT_PAY|TIMER_CFG_A_PWM));
    TimerLoadSet (WTIMER 5_base、TIMER_A、 ulPeriod-1);
    TimerMatchSet (WTIMER 5_base、timer_A、dutyCyclPWM2);
    TimerIntRegister (WTIMER 5_base、 Timer_A、updatefreq);
    TimerIntEnable (WTIMER 5_base、TIMER_TINA_TIMEOUT);
    IntEnable (INT_WTIMER 5A);
    TimerEnable (WTIMER 5_base、TIMER_A); 

    还在启动文件中添加了中断、但从未发生中断。 我假定在频率发生变化时进行匹配更新并在中断中加载。 这是可以的、还是我遇到了问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Djedjica

    在 PWM 模式下、与匹配事件相对应的是中断寄存器中的 TIMER_DMA_CAPEVENT_A 状态位。 一旦匹配事件发生、您就有一定的时间在超时发生之前更新加载和匹配值。