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.

[参考译文] RTOS/TM4C123GH6PM:PWM 输入信号的时间测量

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/650053/rtos-tm4c123gh6pm-time-measurement-of-pwm-input-signal

器件型号:TM4C123GH6PM
主题中讨论的其他器件:冲击

工具/软件:TI-RTOS

你(们)好

我只是为了捕捉 PWM 输入信号的上升沿和下降沿之间的时间差(1KHz 频率)。

我正在使用具有 CCP 模式的定时器0来捕获外部时钟事件。 我的处理程序正在被对外部时钟的上升沿和下降沿进行调用、但当我使用 TimerValueGet (WTIMEER0_BASE、TIMER_A)读取处理程序上的计时器值时、我会得到不适当的值。

定时器 A 的值4294967295

Timer A 值4294978345

三、会议的报告

如何捕获两个边沿的时间差、定时器配置是否有问题。

请找到我的以下配置序列。

SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0);
GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_4);
GPIOPinConfigure (GPIO_PC4_WT0CCP0);
GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);


TimerConfigure (WTIMER 0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME);
TimerControlEvent (WTIMER 0_BASE、TIMER_A、TIMER_EVENT_BLE_ARTS);
TimerIntEnable (WTIMER 0_BASE、TIMER_CAP_EVENT);

System_printf ("clock %u\n"SysCtlClockGet ());


TimerLoadSet (WTIMER 0_BASE、TIMER_A、SysCtlClockGet ());  

TimerIntRegister (WTIMER 0_BASE、TIMER_A、Wtimer0IntHandler);

TimerEnable (WTIMER 0_BASE、TIMER_A);

     我的处理程序是

无效
Wtimer0IntHandler (空)

// unsigned int data = GPIOPinRead (GPIO_PORTC_BASE、GPIO_PIN_4);
// System_printf ("data %d\n",data);

//
//清除计时器中断。
//
无符号超长时间= TimerValueGet (WTIMER 0_BASE、TIMER_A);


System_printf ("定时器 A 值%u\n"timera);
// System_flush();

TimerIntClear (WTIMER 0_BASE、TIMER_CAP_EVENT);

//
//更新显示屏上的中断状态。
//
IntMasterDisable();

// GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_4、0);
//数据=!!!GPIOPinRead (GPIO_PORTC_BASE、GPIO_PIN_4);
// System_printf ("data %d\n",data);

/* if (data!= 0)

GPIO_WRITE (Board_LED0、Board_LED_ON);

其他

GPIO_WRITE (Board_LED0、Board_LED_OFF);

*

IntMasterEnable();

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

    正如本文(多次)所述-不会有两个计时器-一个配置为"仅捕获上升沿"-第二个配置为"仅捕获下降沿" 、"速度、易用性和增强"您的编程工作?     这种双定时器的使用完全符合 KISS 要求-尝试在单个定时器中实现此结果会极大地增加所需的时间/工作量-这种"需要"(更难实现单个定时器)(当然)从未解释过、也从未说明过!

    和-在尝试测量"非常短暂/窄的 PWM 脉冲"时、您的"单个计时器"将如何"有效"?     这是一个"交易断路器"-是不是吗?    双定时器解决方案完全解决了这一难题-(仍然)无疑是赢家!   

    我可以找到您的代码行、该代码行读取"定时器边沿之一"、但通过 UART 发送该结果-再也不会"搜索(剩余/其他)"信号边沿!  

    在 kiss 下操作的两种计时器方法显然是您的"最佳/最安全且唯一的"选择!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gowtham、
    GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD)在下面的行中不需要。

    GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_4);
    GPIOPinConfigure (GPIO_PC4_WT0CCP0);
    GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);

    您发布的代码是否添加了 System_flush()注释或取消注释。 请注意,如果未注释 System_flush()行,它将在 CCS 控制台上打印,这将影响实时操作。 如果您没有系统清除,则字符将停留在内部缓冲区中,可以通过 Tools->ROV 查看。

    CB1使用两个计时器模块为您提供非常可靠的解决方案。 当输入信号频率增加到输入的高电平阶段小于中断延迟时间加上执行 TimerValueGet 的时间时、由于 CPU 能够读取内部捕获的时间值之前、单定时器解决方案将失败 ISR、当前时间寄存器已被下一个边沿覆盖。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的认可/同意、感谢 Charles -感谢您。    同样、海报的"需求"增加了复杂性、但从未/曾经是如此-根据他们的要求进行展示!

    可能需要注意的是、"中断"单次计时器尝试的不仅仅是信号频率-实际上是"减小的占空比"-甚至是相对"低频"的 PWM 信号输入-如果占空比最小-也会导致产生不必要的"过度写入" 很好的描述和细节

    海报应该被告知"完成使命"-第一个也是唯一的!    以后-如果任何人(真正的)关心-一个可以优化-运转他们的开发车轮。   (但这是在我们交付后-并且已经支付!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、最后我获得了输出、但我无法从 wtimer 0获取溢出中断(超时)、而且我无法禁用处理程序中的中断。 TI RTOS 中是否使用计时器0? 我将代码片段保留在下面。



    无效
    Wtimer0IntHandler (空)

    IntFlag = true;
    IntMasterDisable();

    Tvalue[(count++%大小)]= TimerValueGet (WTIMER 0_BASE、timer_A);
    HWREG ((unsigned int) WTIME0_BASE + 0x50)= 0;
    TimerIntClear (WTIMER 0_BASE、TIMER_CAP_EVENT);
    IntMasterEnable();



    int OverFlowTask()

    System_printf ("Hello world\n");
    返回0;



    void initWtimerCcp (void)

    SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0);
    GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_4);
    GPIOPinConfigure (GPIO_PC4_WT0CCP0);
    GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);

    //配置 WTimer0
    TimerConfigure (WTIMER 0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP);
    TimerControlEvent (WTIMER 0_BASE、TIMER_A、TIMER_EVENT_BLE_ARTS);
    TimerIntEnable (WTIMER 0_BASE、TIMER_CAP_EVENT);

    TimerLoadSet (WTIMER 0_BASE、TIMER_A、-1);
    TimerPrescaleSet (WTIMER 0_BASE、TIMER_A、0);


    TimerIntRegister (WTIMER 0_BASE、TIMER_A、Wtimer0IntHandler);

    TimerEnable (WTIMER 0_BASE、TIMER_A);






    /*
    *==== main ====
    *
    int main (空)

    //GPIO_WRITE (Board_LED0、Board_LED_OFF);
    //GPIO_WRITE (Board_LED1、Board_LED_OFF);
    //GPIO_WRITE (Board_LED2、Board_LED_OFF);


    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();

    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);

    initWtimerCcp();

    BIOS_start();

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

    尽管您已将"这解决了我的问题"状态授予供应商的 Charles 和我自己发布、但您仍继续"锁定"(已证明 是"一个计时   器") 问题攻击方法。

    仍然- 没有关于 "为何您"锁定"这  种方法的解释、这种方法要困难得多、而且性能限制要多!    只是因为有些事情,“可以做 ”, 并不表示“应该做!”    (当资源 充足 时- 当替代的"方式"添加时、"巨大且不必要的时间和精力..."

    "两定时器方法"(再次说明)的实施更加容易 - 不受"非常小的占空比"(  超出了"一定时器方法"的能力)的挑战-并 可为  您自己 和您的"无电论坛助手 crüe 带来(无穷无尽)的"磨损"!    (是查尔斯-带着"罢工"标志吗?)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    基于 TI-RTOS cfg 文件、编译将选择可用于 OS 周期生成的第一个计时器(通常为 TIMER0)。 但是、如果用户通过使用 timer_create 或 timer_constructAPI 专门使用 TIMER0、那么构建过程将查找下一个可用的计时器模块、例如 Timer1。 这里、我们使用内核管理和理解的计时器。

    在您使用 TivaWare 调用 TIMER0的情况下。 您混合使用了 TI-RTOS 和 TivaWare。 这可能会导致问题、因为内核不知道 TIMER0正由用户应用程序直接使用。 所有时序操作都将被打乱。如果您尝试插入中断并使用 driverlib 的 interrupt.c 而不是 Hwi_create (或构造),则向量表将被打乱。 这可能会导致异常。

    话虽如此、在 TivaWare 中将您的定时器更改为 Timer1、或使用 TI-RTOS 的 API 来创建所需的定时器。 如果您想使用 TivaWare 了解计时器模块的工作原理、我建议您还尝试在非 TI-RTOS 环境中创建 TIMER0程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    愿记录显示,“本记者”正在设置“非 RTOS”-非 MCU -计时器,记录因继续追求过于复杂和“久经考验的占空比限制”(因此比得低/注定要低)的方法而损失的“天数”。