使用微控制器实现多个时间关键功能的好方法?

电器工程 微控制器
2022-01-20 07:09:23

如果有的话,在微控制器中实现高度时间关键型功能的理念或方法是什么?

我正在从事一个涉及输出不同频率的精确方波波形的项目。我已经使用计时器和中断功能完成了这项工作。然而,即使要正确实现这一点,我也必须根据中断服务程序期间所采用的时钟周期数来校准偏移量。我想这种精度会受到另一个这样的波形同时运行的干扰(比如需要同时改变频率)。每个都有一个微控制器,对于每个这样的时间关键功能似乎很浪费。

再举一个例子,实现一个时钟(如 hh:mm:ss)函数。我无法想象每个高级微控制器/计算机都有一个专门的实时时钟芯片来跟踪时间。然而,我发现很难想象它是使用核心处理器准确测量的,它正忙于为大量同时以异步间隔出现的功能提供服务。我想时间计数会有偏移错误,这取决于正在运行的功能。

是否有设计过程或方法来包含或给予可达到的精度公差?或者有人对我在哪里可以找到有关此的更多信息有任何指示或建议吗?

4个回答

要输出精确的方波,请使用硬件。大多数微控制器都有内置的 PWM 发生器可以做到这一点。您以时钟周期为单位设置周期和准时,其余的由硬件完成。要将其更改为新频率,请将新周期写入周期寄存器,将周期的一半写入占空比寄存器。

至于由于处理器的其他负载而导致的实时时钟丢失时间,除非它写得非常糟糕,否则它不会那样工作。通常,硬件将用于创建一个几秒的周期性中断,并且固件从那里进一步划分。无论处理器有多忙,这都有效,因为中断会在需要时运行。只要中断例程占用总周期的一小部分,大部分处理器仍然应用于前台任务。

还有一些方法可以通过以未知的时间间隔进行轮询来保持时间。您让硬件保持计数,并且每当您有时间更新时钟时,您都会根据经过的滴答声总数对其进行更新。只要此例程运行得足够频繁,以使使用的任何计数器都不会在运行之间换行,就不会浪费时间。

这里的关键词是“硬件支持”。对于任何严重的事情,您都需要 µC 中的支持硬件。最常见的集成外设是定时器电路,它运行相对精确,不受其他 CPU 操作的干扰。

在此基础上,您可以使用与控制器时钟源一样精确的中期时序来执行许多功能。

但是:正如您可能已经体验过的那样,除了中期或长期精度之外,软件处理硬件事件(包括定时器溢出之类的事情)也总是涉及时序抖动。这是由事件发生时不同的可能执行状态引起的,这些状态会导致不同的延迟,直到对事件的实际响应发生。

因此,底线是:对于任何具有高速或接近零抖动要求的东西,硬件支持是必不可少的。许多硬件外围设备都包含在大多数 µC 中,例如 UART 和 c,并且 µC 越强大且成本越高,通常内置的支持硬件就越多。如果您的 µC 没有提供您需要的硬件,您确实必须考虑使用外部专用硬件来完成任务。

尽可能多地使用硬件,尤其是对于时间要求高的功能。所有微控制器都有专门为计数和计时事件而创建的定时器/计数器。

除此之外,这确实是一个非常广泛的问题。所以没有好的答案。

唯一真正的答案是经验。尝试它,分析它,强调它,修复它。您必须识别高使用率的代码区域。20% 的软件在 90% 的时间内运行,这意味着删除了每条指令,从而提高了性能。

好的设计总是平衡硬件、软件和内存。这适用于所有微处理器,尤其是微控制器。最大限度地使用一种或低效使用一种,您将得到一个糟糕的产品。随着硅密度的增加,越来越多的功能被包含在微控制器的硬件中。但是更多的功能意味着更多的期望。双板载内存,您将添加一些使用它的功能。

所有 ISR 都有开销,这取决于 ISR 使用的寄存器。如果保存机器状态的延迟与为高度时间关键功能的 ISR 服务相比显着,则您的设计可能无法扩展。因此,使用硬件的答案的普遍共识。

使用软件中断可以减少 ISR 机器状态膨胀。

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

当 Inc_Seconds() 的所有寄存器每 150 个周期仅使用一次时,它们必须被压入。

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

现在延迟命中仅每 150 个周期发生一次。

如果您在 hh:mm:ss 中实现实时时钟,那么它是否关闭 50ms 是否重要。没有人会发现错误。这当然不是实时操作问题。

至于必须同时发生的事件。他们必须吗?如果他们必须那么硬件设计必须照顾它。否则,必须发生一些软件妥协。如果您不能一次设置两位,则设置一位。下一条指令设置另一个。在 RISC 处理器上精确到一个时钟周期。我认为这已经足够好了。

对于方波,您应该使用与 XTAL 进行 PLL 的 PWM 外设,使用某种计数器来了解何时循环(用于设置频率)。每个数据表都会告诉你如何做到这一点:)

为了保持时间,是的,除非您使用汇编程序并编写操作码,否则您将需要一个 RTC 来准确地完成它,以便您手动知道任何执行路径中每条指令的确切执行时间。它可能还会对久经考验的真实“goto 被认为是有害的”声明提供新的启示。