-1

我目前正在使用飞思卡尔的 9S12,我真的需要一些帮助才能了解如何正确编写 ISR。特别是,我报告了一个练习的文本,他们要求我测量两个方波之间的相位差(在微控制器的输入端)。

总线时钟为 16 MHz,我必须使用系统的定时器模块,它提供了一个自由运行的计数器(TCNT @ 16 位)。计数器必须以 500 kHz 的频率工作,这是通过从总线时钟开始设置预分频器 5 来实现的。这两个信号具有相同的频率,即给定 (25 Hz),但无论如何都需要对其进行测量。

我必须使用 INTERRUPT 过程,使用正确的寄存器(实际上没有必要使用手册中完全相同的寄存器,我可以使用我想要的任何名称,而不是我必须注释代码的每一行)和变量。

我解决问题的方法非常理论化,但我需要 C 代码。

为了解决这个问题,我必须使用 INPUT CAPTURE MODE 来测量信号 1 的上升沿和信号 2 的上升沿之间的 TCNT(TICKS)计数单位的差异。我的疑问特别关于我必须使用的变量、类型(LOCAL、GLOBAL、UNSIGNED、LONG (?))、如何正确更新 ISR 中的值以及是否应该考虑计数器的溢出和相应的溢出它们产生的中断。

我陷入了这个问题,我希望有人可以帮助我提供一些代码示例,特别是对于我必须使用的变量以及如何编写实际的 ISR。谢谢大家!

4

2 回答 2

2

将以下内容视为伪代码;您可以通过数据表来确定如何配置和访问定时器捕获单元 - 我不熟悉具体部分

一般来说,给定定时器计数器是 16 位的:

volatile static uint16_t phase_count = 0 ;
volatile static uint16_t mean_period_count = 0 ; 

int phasePercent()
{
    (phase_count * 100) / mean_period_count ;
}

int frequencyHz()
{
    500000 / mean_period_count ;
}

void TimerCounterISR( void )
{
    static uint16_t count1 = 0 ;
    static uint16_t count2 = 0 ;
    static uint16_t period1 = 0 ;
    static uint16_t period2 = 0 ;

    uint16_t now = getCaptureCount() ;

    if( isSignal1Edge() )
    {
        period1 = now - count1 ;
        count1 = now ;
    }
    else if( isSignal2Edge() )
    {
        period2 = now - count2 ;
        count2 = now ;

        phase_count = period2 - period1 ;
    }

    mean_period_count = (period1 + period2) >> 1 ;
}

该方法假设一个递增计数器并要求计数器重新加载运行完整的 16 位范围 0 到 0xFFFF - 否则模 2 16算法将不起作用,并且解决方案将更加复杂。对于递减计数器,交换周期计算中的操作数。

注意返回值 fromphasePercent()frequencyHz()直到两个相位都经过一个完整的上升沿到上升沿周期后才会有效。如果这是一个问题,您可以添加一个边沿计数并在每个信号上看到两次上升沿后进行验证。

于 2018-08-22T22:23:37.567 回答
1

这是您整理 S12 技术部件的方式:

  • 使用适当的预分频器设置 ECT 定时器。你似乎已经覆盖了这部分?在 500kHz 时,每个计时器滴答声为 2us,您需要 65536 个计时器滴答声来覆盖最坏的情况。使用预分频器,一个完整的 TCNT 周期将为 131 毫秒。如果〜25Hz是最坏的情况,那么大约是40ms,所以在这种情况下应该没问题。

  • 选择一个与所用引脚相对应的定时器通道 TC。该通道需要配置为输入捕捉,在上升沿/下降沿触发。将 TCNT 的当前值作为初始值存储到uint16_t时间计数器变量中。

  • 在向量表等中注册 ISR,这是编写 ISR 的常用内容。

  • 中断时,读取 TCn 通道寄存器的值。计数器变量和存储值之间的差异给出了定时器周期的周期时间。将此乘以 1/500kHz,即可得到周期时间。在 ISR 中始终读取 TC 而不是 TCNT,因为前者不会受到中断延迟和代码执行开销的影响。使用 TCn 中的值更新您的计数器变量。

  • 通过这样的设计,确保有一些外部方法可以从输入中滤除尖峰和 EMI:RC 滤波器或类似的。

于 2018-08-23T07:07:04.070 回答