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.

[参考译文] TM4C129XNCZAD:较高值时的频率比较

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1287328/tm4c129xnczad-frequency-compare-at-higher-value

器件型号:TM4C129XNCZAD

尊敬的先生:

我们使用的是 TM4C129xCZAD 设计。  

在 我们的项目中、我们使用外部中断处理程序来检测频率为60kHz 的-ve 边沿触发脉冲。

上述快速频率脉冲是到控制器2 扩散引脚的输入。

我们比较 两个60kHz 脉冲、并通过计时器计算百分比误差、得出%误差为0。 它的工作正常

现在频率变为200kHz、当我们对其进行比较时、我们 得到%errror=0.00009或0.00019

是否存在这样的高频问题、因为 当我们使用100kHz 进行检查时 、它也可以正常工作。

我们检查了电压电平和振幅、结果也是可以的。

亲切的建议

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

void external_pulseIntHandler (void)
{
MAP_GPIOIntClear (GPIO_PORTM_BASE、GPIO_PIN_6);


PULSE_COUNT++;
if (pulse_count==1000)
{
EDGE_COUNT++;
c_Edge_count++;
PULSE_COUNT=0;


if (timer_start_flag==0)
{
MAP_TimerIntClear (TIMER6_BASE、TIMER_CAPB_MATCH);//清除计时器中断。

Timer6_start();
Timer_start_flag=1;
EDGE_COUNT=0;
c_Edge_count=0;
PULSE_COUNT=0;//观察后新添加


if ((Edge_count!=0)&&(Edge_count)===master_meter_pulse)&&(Edge_mode_flag=0)&&(TIMER_START_FLAG)
{
MAP_TimerDisable (TIMER6_BASE、TIMER_B);//禁用 Timer2
n_actual = fout_intCount*0xFFFF + 65535 - MAP_TimerValueGet (TIMER6_BASE、TIMER_B);//在 sacnner 脉冲结束时计数器 fout 脉冲
display_flag=1;
标记。 n_扫描器= 1;//已接收所有 Actual_Ready 脉冲
EDGE_COUNT=0;
c_Edge_count=0;
PULSE_COUNT=0;//观察后新添加
Timer_start_flag=0;
zero_flag=1;
标记。 Pulse_Received = 0;

空 Timer6_start (空)
{
MAP_TimerLoadSet (TIMER6_BASE、TIMER_B、0xFFFF);
MAP_TimerMatchSet (TIMER6_BASE、TIMER_B、0x0000);
MAP_TimerEnable (TIMER6_BASE、TIMER_B);//启用 FOUT 计数器
MAP_IntEnable (INT_TIMER6B);
FOUT_intCount=0;

n_must 为固定值  

ERROR_calc =(((N_must - N_actual)/N_actual)* 100)  

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

    您好!

     您可以推断300kHz 和400kHz 的误差百分比吗? 当您增加输入频率时、中断触发速度也会更快。 ISR 中需要处理很多代码。 当输入频率增加时、有可能在 ISR 对于最后一个中断完全存在之前产生一个中断。 我建议您将处理代码移至 ISR 之外。 使 ISR 尽可能短。  

      

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

    亲爱的查尔斯:

    我也觉得和你说的一样。 我已经尝试使 ISR 尽可能短、并且在代码外部进行处理时出现了不刷新%误差的问题、因为内容太快以至于%误差不会如此快速地刷新。

    关于300kHz 和400kHz、我们没有任何生成频率的源。  

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

    您好!

     我没有真正关注您的代码。 您似乎是在 GPIO 中断 ISR 中启动和停止计时器。 您能解释一下计时器的用途吗? 您为什么不在其自己的 ISR 上处理计时器中断?

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

    亲爱的查尔斯:

    实际上、我们使用了外部中断处理程序来接收外部脉冲、即200kHz 方波信号。

    在接收到第一个外部脉冲后,我们启动计时器进行测量,并 在接收到用户输入脉冲时停止计时器。

    我们使用这个时间并与已知时间进行比较来计算误差百分比。

    当输入脉冲高达100kHz 时,此操作工作正常。

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

    正在等待回复

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

    您好!

     正如我提到过的、从在200kHz 输入上检测到边沿到进入 ISR 将会有一定的延迟。 当您处于 ISR 中时、启动计时器模块也需要一些时间。 我还提到、由于中断速度太快、在您启动计时器时、将在您的200kHz 输入上检测到另一个边沿。 也许您应该在检测到200kHz 的第一个边沿后禁用外部中断、并让定时器计数直到检测到用户输入。  

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

    亲爱的查尔斯:

    我们的要求  外部中断的第一个边沿我们启动计时器、而第100或1000个边沿我们停止计时器。  

    我们还在进入外部中断处理程序时禁用主中断、并在退出处理程序时启用。

    正如您提到的"您应该在检测到200kHz 的第一个边沿后禁用外部中断、并让计时器计数、直到检测到用户输入。"  

    如果我们在第1个边沿之后禁用外部中断、那么怎么计算第100个或第1000个边沿呢?

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

    1) 1)进入 ISR 的时间(最后一个脉冲)和读取定时器的时间之间存在延迟。 这会引入恒定误差、取决于代码路径长度(指令数量)但与信号速度无关。 随着信号速度的加快、您测量的计时器值会变小;因此、这种恒定延迟误差在测量中占比越来越大。 使用这种方法无法真正消除此延迟、但一种非常简单的缓解方法是始终在 ISR 顶部读取计时器值、然后在稍后决定是否使用它。

    2)正如 Tsai 先生所说、你很有可能已经开始使 ISR 溢出、也就是说、运行 ISR 所花费的时间要比两个脉冲之间的时间长。 一个线索是,当移动到 main ()时,你说代码不运行(饥饿)。 一旦发生这种情况、您将(迟早)丢失脉冲。 一种解决方案是使用边沿计数模式下的(其他)计时器来对脉冲进行计数。 另一种方法是修改 ISR 代码。