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.

[参考译文] TM4C123GH6PM:宽定时器不工作

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/696026/tm4c123gh6pm-wide-timer-not-working

器件型号:TM4C123GH6PM
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0);
SysCtlDelay(3);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
SysCtlDelay(3);
GPIOPinConfigure (GPIO_PC5_WT0CCP1);
GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_5);
TimerConfigure (WTIMER 0_BASE、TIMER_CFG_SPLIT_PAIRGE|TIMER_CFG_B_PWM);
TimerLoadSet (WTIMER 0_BASE、TIMER_B、PERIODE-1);
TimerMatchSet (WTIMER 0_BASE、TIMER_B、PERIODE-1);

HWREG (WTIMER 0_BASE +定时器_TBMR_TBMRSU)=1;

TimerEnable (WTIMER 0_BASE、TIMER_B);

uint32_t i = 1; 

我使用无线计时器来实现50Hz 以控制伺服。 此配置应配置端口 C 的引脚5以表示计时器值、但我在端口 C 的引脚5上获得恒定的3.3V 电压?

我出了什么问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在不深入代码的情况下,我看到您对 TimerLoadSet()和 TimerMatchSet()使用相同的值(Period-1)。 要生成小于100%的 PWM、匹配值应小于加载值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void ServoWrite (uint32_t valor){
    uint32_t i = 0;
    i =周期-((valor * 444)+ 80000);
    TimerMatchSet (WTIMER 0_BASE、TIMER_A、I);
    }
    
    int main (void){
    SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0);
    SysCtlDelay(3);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
    SysCtlDelay(3);
    GPIOPinConfigure (GPIO_PC5_WT0CCP1);
    GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_5);
    TimerConfigure (WTIMER 0_BASE、TIMER_CFG_SPLIT_PAIRGE|TIMER_CFG_B_PWM);
    TimerLoadSet (WTIMER 0_BASE、TIMER_B、PERIODE-1);
    TimerMatchSet (WTIMER 0_BASE、TIMER_B、PERIODE-1);
    
    HWREG (WTIMER 0_BASE +定时器_TBMR_TBMRSU)=1;
    
    TimerEnable (WTIMER 0_BASE、TIMER_B);
    
    uint32_t I = 1;
    
    while (1){
    
    SysCtlDelay (20000);
    for (i = 1;i < 30;i++)
    {
    ServoWrite (I);
    SysCtlDelay (26600);
    }
    SysCtlDelay (20000);
    对于(i = 30;i>1;i-)
    {
    ServoWrite(i);
    SysCtlDelay (26600);
    }
    
    }
    
    返回0;
    }
    

    我有一个 ServoWrite Funciton、用于更改 MatchSet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 ServoWrite 中、Timer_A 错误已修复、但仍提供恒定的3.3V 电压
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Enari、

    下面的代码是一个生成周期输出的非常简单的计时器示例。 它已经过测试、可以正常工作。 正如您从参数中看到的、这里的 PWM 占空比将为40%。

    在这种情况下、使用标准计时器(我们更喜欢仅在严格必要时使用宽计时器、因为并非该系列中的所有器件都具有这些计时器)、并且引脚映射到 TM4C129。

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOD)));
    SysCtlPeripheralDisable (SYSCTL_Periph_Timer1);
    SysCtlPeripheralReset (SYSCTL_Periph_Timer1);
    SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_Timer1)));
    GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_3);
    GPIOPinConfigure (GPIO_PD3_T1CCP1);
    TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM);
    TimerLoadSet (Timer1_base、timer_B、10000);
    TimerMatchSet (Timer1_base、timer_B、4000);
    TimerControlLevel (Timer1_base、timer_B、false);//只是一个使计时器 PWM 高电平有效的示例
    TimerEnable (Timer1_base、timer_B); 

    您可能希望将其用作分步参考、然后才添加伺服控制功能。

    此致

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @BrunoSaraiva 这个计时器不是宽计时器正确吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是使用PC5./cfs-file/__key/communityserver-discussions-components-files/908/Wtimer0_2D00_PWM.zip 的 Wtimer0示例