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.

[参考译文] CCS/TM4C123GH6PM:定时器频率问题

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/675903/ccs-tm4c123gh6pm-issue-on-timers-frequency

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

你(们)好

我需要生成两个用于驱动器件的信号、一个频率为25Hz、另一个频率为1.4MHz。 我已经使用下面的代码进行了测试、但即使将负载设置为1.4Mhz、我也只能实现645kHz、我是否有问题?
我还可以注意到、在某些频率下、占空比毫无理由地变化、因为我将其保持在50%。 我正在尝试弄清楚数据表和 Tiva 外设库上发生了什么、但由于我是 Tiva C 的初学者、因此非常感谢您的帮助。

提前感谢

伊斯拉

#include 
#include 
#include "inc/tm4c123gh6m.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"



{invoid (main)
uint32_t ui32Period;

//SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
ui32Period =(SysCtlClockGet ()/25)/2;
TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period -1);
IntEnable (INT_TIMER0A);
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
//IntMasterEnable();
TimerEnable (TIMER0_BASE、TIMER_A);

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);
TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICRACASE);
ui32Period =(SysCtlClockGet ()/10)/2;
TimerLoadSet (TIMER2_base、timer_A、ui32Period -1);
IntEnable (INT_TIMER2A);
TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT);
//IntMasterEnable();
TimerEnable (TIMER2_base、TIMER_A);


SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE);
ui32Period =(SysCtlClockGet ()/1400000)/2;
TimerLoadSet (Timer1_base、timer_A、ui32Period -1);
IntEnable (INT_TIMER1A);
TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);
IntMasterEnable();
TimerEnable (Timer1_base、timer_A);


while (1)
{
}
}

空 Timer0IntHandler (空)
{
//清除计时器中断
TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

//读取 GPIO 引脚和的当前状态
//写回相反的状态
IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2))
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
}
其他
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、4);
}
}

空 Timer1IntHandler (空)
{
//清除计时器中断
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);

//读取 GPIO 引脚和的当前状态
//写回相反的状态
IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_1))
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0);
}
其他
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、2);
}
}

空 Timer2IntHandler (空)
{
//清除计时器中断
TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);

//读取 GPIO 引脚和的当前状态
//写回相反的状态
IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_3))
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、0);
}
其他
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、8);
}
}

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

    您好、以色列、
    如果要生成周期性 PWM、则需要在 PWM 模式下使用 GPTM 模块或使用 PWM 模块。 使用 GPTM 控制 PWM 周期的方式不精确。 较高优先级的中断可以优先于较低优先级的中断。 此外、当您在 ISR 中花费的时间比下一个中断到达的时间长时、它将影响您的占空比。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "占空比"会发生变化、因为执行 ISR 所需的频率与所需频率之间的关系过长。

    尝试输出比较或 PWM 外设以实现高频输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了海报"Danny's "的有效建议之外-我是否可以建议您使用"kiss"?

    在我看来、" 让您的关键/关键 PWM 输出受制许多变量-这两个变量 都使之复杂化-并起到"屏蔽您的诊断"-和 纠正的作用!

    不是启动3次单独的 PWM 尝试-是否仅尝试一次 PWM、而不是"速度、易用性、增强"?   而与 其他影响和/或限制隔离-不受"假神"的约束?

    正如另一位代表所说的那样-通过使用一个配置(正确)为 PWM 模式的独立定时器(A 或 B)、您应该能够轻松地在您选择的(最高)频率下创建 PWM。   

    "外设驱动程序库-用户指南"详尽详细信息(通过定时器部分)、并且"一定要证明它具有启发性!"   并漏掉/避免"多余"-您的当前代码(失败)揭示了这一点...

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

    亲爱的大家、我尝试了 CB1_MOBILE 建议的一些更简单的方法、而 PWM 建议的方法也是其他人的善意建议。 我现在获得了1.4MHz 信号(谢谢)、但我无法生成25Hz 信号、 它达到1.4kHz、您能不能查看我的(再次失败)代码吗?

    unsigned long ulPeriod;
    unsigned long u2Period;
    
    SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);//对于80MHz
    
    SYSCTL_PWMClockSet (SYSCTL_PWMDIV_1);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);
    ulPeriod = SysCtlClockGet ()/1400000;
    u2Period = SysCtlClockGet ()/ 25;//
    
    GPIOPinConfigure (GPIO_PF1_M1PWM5);
    GPIOPinConfigure (GPIO_PF2_M1PWM6);
    
    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    
    PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenConfigure (PWM1_base、PWM_GEN_3、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    
    PWMGenPeriodSet (PWM1_base、PWM_GEN_2、ulPeriod);
    PWMGenPeriodSet (PWM1_base、PWM_GEN_3、u2Period);
    
    PWMPulseWidthSet (PWM1_base、PWM_OUT_5、ulPeriod/2);
    PWMPulseWidthSet (PWM1_base、PWM_OUT_6、u2Period/2);
    
    PWMGenEnable (PWM1_base、PWM_GEN_2);
    PWMGenEnable (PWM1_base、PWM_GEN_3);
    
    PWMOutputState (PWM1_base、PWM_OUT_5_BIT |PWM_OUT_6_BIT、true);
    
    while (1)
    {
    
    } 

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

    您是否按照过去的指示查看 了"PWMGenPeriodSet()中包含的"强制要求(ulPeriod)"?    这是否证明存在(非常)可能的可疑情况?

    现在不是我的愿望,“为你做你的工作”-但我将在这里“暗示”你使用 “PWM 发生器”...  "赠送-但(有时)带走!"   

      您没有对 PWM 输出频率的"1000:1"差异(有点不寻常)进行评论、即使您的分频器也是如此、"没有表现出这样的关系!   (即1.4M 和25!)

    这是 关键/关键注意事项-不是吗?   (抱歉)不应该错过!)   您(现在)是否看到您的问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您为什么要解决您已经解决的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    什么... (已经)问题已解决?   海报注明:"仅达到645 kHz!"   

    远远没有解决-(有些)会说...   ("更正确的指导"解决方案-显示在上方...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为回答错误。 我觉得有点愚蠢,我没有注意到这一点,但非常感谢他的指导
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没有人"想要"这样的"感觉"-你肯定足够聪明地发现这种(不寻常的)事件(1000:1比率) 、这种情况应该注意-不应该吗?

    您需要"更好地关注所有线索"-这一点根本不是(低智慧)-较差的认知更好地描述。    (在这里也是第二次来了。)

    幸运的是、即使(禁止)这里的"kiss"非常有助于这项工作!   (额外关注-艾滋病/提高认识)

    感谢您的验证-但您尚未 "把握" 1000:1比率的原因-并且(有人)在这里-(仍然)认为-这将有助于您理解/增强您的能力...

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

    明天早些时候向西飞-(因此我不可能在这里)-为了减少沮丧- 现在就来了...  (另一个)线索。

    您可能会说 、"尝试输入"- 不仅仅是这 种情况(尤其是)"一包"( 是的、"填充") -可能 (合理的)保留?   对于"额外积分"- 1000:1 "频率比"(正如您之前报告的那样)从何处产生?

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

    这个论坛是否深入到了“Bronx Sci”的神圣大厅... "额外的信用额度"(现在)将为"过度流动!"   遗憾...

    裂开千禧一代员工提供 "0xD400" 作为进一步的线索...  (担心她的努力可能会被认可...)