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.

[参考译文] TM4C129DNCPDT:TM4C129dncpdt 频率测量问题

Guru**** 2473260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/683073/tm4c129dncpdt-tm4c129dncpdt-frequency-measurement-problem

器件型号:TM4C129DNCPDT

您好!

我正在尝试测量频率。

范围:高达12MHz

我尝试了3种方法

固件会轮询输入 GPIO 引脚、对时钟进行计数、这种方法可以测量大约5~6 MHz 的频率输入。

将 GPIO 设置为中断、当频率超过2MHz 时、系统挂起。

使用 ccp 引脚和计时器对时钟进行计数、在100~2.1mHz 范围内良好

  当输入频率超过2.2mHz 时、计数器不工作。

    来自 TimerValueGet (TIMER3_base、TIMER_A)的返回值未出现故障。

  系统时钟为120MHz

  有人可以就此提供任何建议吗?

uint32_t elapsedHi-us、elapsedLoStart_us、elapsedLoEnd_us;
uint32_t nStopTime_us、nCycCount = 0;
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
等待(10);
GPIOPinConfigure (GPIO_PD4_T3CCP0);
GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_4);// PD4

TimerDisable (TIMER3_base、timer_A);
TimerConfigure (TIMER3_base、TIMER_CFG_SPLIT_PAGE|TIMER_CFG_A_CAP_COUNT);
TimerControlEvent (TIMER3_base、TIMER_A、TIMER_EVENT_POS_EDGE);
TimerLoadSet (TIMER3_base、TIMER_A、65000);
TimerMatchSet (TIMER3_base、TIMER_A、0);
TimerLoadSet (TIMER3_base、TIMER_A、65000);

ROM_IntMasterDisable();


SysTimeStamp* PTS=SysTimeStamp::GetPtr();
PTS->RESET();

PTS->GetTimeStamp (&elapsedHi-us,&elapsedLoStart_us);

TimerEnable (TIMER3_base、TIMER_A);

操作

  PTS->GetTimeStamp (&elapsedHi-us,&elapsedLoEnd_us);
} while ((elapsedLoEnd_us-elapsedLoStart_us)<10001);   // 10ms

nCycCount = TimerValueGet (TIMER3_base、timer_A);

nCycCount =(uint32_t) 65000 - nCCount;
TimerDisable (TIMER3_base、timer_A);

ROM_IntMasterEnable();
*freq =nCycCount*100;

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

    查看数据表、了解是否将计时器配置为在外部时钟源上计数。

    否则、您可能必须使用输入捕捉。 为了尽可能扩展、使用最高值预分频器-它会牺牲分辨率。

    将定时器配置为自由运行、顶部为0xFFFF。 在进程开始时将计数器归零、并等待设定的时间段通过。 然后读取输入捕捉计数器-您。 可以将其转换为其等效频率。

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

    在进行任何更改之前、我首先测量您的输入信号"在 MCU 的 CCP 引脚上"的到达。   (仅在该引脚处测量!)  

    您是否提供了一个良好的方波-无瞬态(边沿)信号尖峰-并且在 MCU 的"0V - 3V3"信号输入范围内?   (请确保较高(失败)频率对信号进行示波!)   (假设的)信号源和 MCU 之间的接地是否稳定可靠?  真的吗?

    您报告的"系统闲置"  是意外的、也是令人担忧的。   我不知道 "系统闲置"是否提供"众所周知"的含义-但我认为它不能证明它是明确的(可能的)或应该是明确的。

    有限的事实让我相信(有点)您的计时器 ISR "完成时间太长"-这会直接影响您 的"最高测量频率"。   两个"切换 LED"功能-放置在定时器 ISR 的"顶部和底部"-应该能够轻松测量 ISR 的持续时间。   (ISR 最应该是" 短而甜蜜"-在其他地方做"肮脏的工作"!)

    如果上面的指导证明(两者)测量良好且正确-我将选择您的定时器 的"边沿计数器模式" 并采用以下方法:

    • 禁用您选择的32位计时器 (我们将为该计时器添加标签1)
    • 订购、 "边沿计数模式"
    • 清除相应的定时器寄存器(定时器1)、"将此类外部信号到达/计数累计"
    • 采用第二 个32位定时器-这个被排序为"单次触发"模式。   第二个计时器将创建 计时器"1"信号捕获的"持续时间窗口"

    请注意、当处于定时器模式时、MCU 可能 (正确)响应 外部信号-"速度不会超过系统时钟的1/4。   (假设120MHz/4 = 30MHz -您的案例)

    现在、32位计数器-从零开始-可能会在1秒内达到42.94亿个计数。   合适的时基可能是秒的1/8 -这需要将值"536,870,912 "加载到计时器2 (单次触发)计时器中。

    完成、测试/测量并准备就绪"

    • 启用(同时启用)"单次触发"(定时器2)和"边沿计数"(定时器1)定时器。   两者都应"开始其流程-理想情况下是一致的"、但即使是(轻微)延迟也不会证明结果。
    • 在"单次触发"(计时器2)"到期"时立即(如果不是更早)禁用"边沿计数"(计时器1)。
    • 如果启用了"边沿计数计时器"(其累加寄存器清零)并配置为"递增计数"、则寄存器内容应反映输入信号频率的1/8。

    要"测试/验证"-在20MHz (安全、MCU 兼容)输入频率下-并且采用1/8秒输入信号、边沿计数门控-值2、500、000应该已经在边沿计数计时器中捕捉。  (定时器1)  

    请注意、这是一个"持续"重复过程-如果不需要1/8秒更新间隔、您可以   在显示结果之前通过平均四个或八个测量值来"提高测量精度"。

    过去在"显示场"中工作过-大多数观众应能够识别以1/8秒间隔(即1/4秒)的1/2更新显示。   (使用任何"预分频器"(被承认为"妥协解决方案")似乎没有价值 、不建议...)

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

    您好 CB1_MOBILE、  

    我使用函数发生器输出方波

    2.对于中断方法、我的 ISR 只执行 GPIOIntClear 和一个值++

    谢谢、

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

    谢谢谢谢先生。 (BTW -我知道(几个)分享您的姓名)

    请再次阅读-我处于"弱信号区"-并由多个部分组成-以便(某些内容)"通过"。 (可能)

    您的函数发生器-减去范围检查-可能会失真和/或生成边缘瞬变-对 MCU 有害。 范围检查很重要-并且"在您的最高频率下(目前发生故障的地方!)

    你提到 "你的 ISR 中包含的内容太少"-这是一个(不幸的)讽刺!  (同时证明我先前的"猜测"不正确。)

    MCU 手册和/或其他供应商的"docs"建议 ISR 必须"提前清除"-否则该过程可能无法完全完成!   而对于这么短的 ISR、您可能会"错误地清除-甚至无法清除"ISR -因为 " ISR 执行得太快!"   我不确定-但您可能会尝试在 ISR 清除和 ISR 退出之间添加"一些延迟"、以确定 "这是否可以解决-错误的 ISR 清除!"