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


8

如果有的话,在微控制器中实现高度时间紧迫的功能的哲学或方法是什么?

我正在从事一个涉及输出变化频率的精确方波波形的项目。我已经使用计时器和中断功能完成了此操作。但是,即使正确地实现了这一点,我也必须针对中断服务程序中所花费的时钟周期数来校准偏移量。我想如果同时运行另一个这样的波形会干扰这种精度(例如,需要在同一时间更改频率)。每个具有微控制器的关键时间功能似乎都是浪费的。

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

是否有一个设计过程或方法来限制或给出可达到的精度公差?还是有人对我在哪里可以找到更多相关信息有任何指示或建议?


需要精确RTC的事物通常确实具有专用芯片或具有自身电源和晶体的子功能,以便跟踪设备关闭时的时间。时间是一个巨大的麻烦。
pjc50

停止使用这种可怕的体系结构(或正确使用它)-硬件计时器不应该依赖于服务ISR所花费的时间-只要“及时”完成重新加载就没有关系。
Spehro Pefhany

什么微控制器?这样可以提供质量更好的答案。
StainlessSteelRat

@SpehroPefhany我必须说,我对此没有经验。我在使用方波时遇到的麻烦是,我希望频率能够(能够)在每个输出跃迁上改变(对于2个不同的方波,它们将处于异步间隔,甚至可能重合)。方波只是我想到的一个较大问题的一小部分。在波形生成中,您将如何实现多个以上的任意模拟波形?会牺牲一个共同的“采样率”吗?
午夜

@StainlessSteelRat我故意没有指定特定的微控制器,因为我觉得这个问题很广泛。对我来说,它似乎可以应用于大型计算机到微控制器的处理器体系结构。在某种程度上,我想知道在实现多个对时间敏感的功能时,是否有任何资源可用于学习进行良好的设计/限制错误。
午夜

Answers:


10

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

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

还有一些方法可以通过以未知的间隔进行轮询来节省时间。您拥有硬件来保持计数,每当您更新时钟时,都将根据经过的滴答声总数进行更新。只要该例程足够频繁地运行,以使使用的计数器不会在两次运行之间换行,就不会浪费时间。


抱歉! 我的问题应该更广泛一些。方波只是我想到的时间紧迫的应用程序的一个特定示例。使用您提到的PWM生成器方法,是否能够(如果需要)在每个方波转换时更新频率?如果您必须对两个异步方波执行此操作怎么办?那十点呢?我想知道是否有任何通用的设计方法来处理此类问题。您提到的有关定期中断和轮询以更新时钟的方法肯定会减少一些麻烦。
午夜

1
@mid:大多数微控制器可以在PWM周期开始时中断。有些具有双缓冲寄存器,因此您可以在一个周期内更新参数,然后使它们在下一个周期开始时生效。一些微控制器可以通过DMA馈入PWM。我曾经用它来使硬件自动抖动。
Olin Lathrop'3

3

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

在此基础上,您可以执行许多功能,这些功能以中期时序执行,其精度与控制器的时钟源一样。

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

因此,底线是:对于具有高速或接近零抖动要求的任何事物,硬件支持都是必不可少的。大多数微控制器中都包含许多硬件外设,例如UARTs&c,而微控制器越强大,成本越高,通常内置的支持硬件就越多。如果您的µC无法提供所需的硬件,则确实必须考虑使用外部专用硬件来完成该任务。


了解抖动是关键-您可以拥有多个硬件计时器,并且它们都将独立跟踪,但是如果它们同时触发了一个中断,那么并不是所有的计时器都能一次得到服务。
pjc50 '16

2

利用硬件可以做的很多,尤其是对于时间紧迫的功能。所有微控制器都具有专门为计数和计时事件而创建的计时器/计数器。

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

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

良好的设计始终平衡硬件,软件和内存。这适用于所有微处理器,尤其是微控制器。最多使用一个或低效使用一个,您的产品将很差。随着硅密度的增加,微控制器的硬件中包含了越来越多的功能。但是更多功能意味着更多期望。双重板载内存,您将添加一些使用它的功能。

所有ISR都有开销,这取决于ISR使用的寄存器。如果与维护ISR以获取时间紧迫的功能相比,保存机器状态的延迟很重要,则您的设计可能无法扩展。因此,使用硬件的答案已达成共识。

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

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

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

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

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

如果您在hh:mm:ss中实现一个实时时钟,那么关闭50ms无关紧要。没有人会检测到错误。这当然不是实时操作问题。

至于必须同时发生的事件。一定要吗 如果必须,则硬件设计必须照顾好它。否则,必须进行一些软件折衷。如果一次不能设置两位,请设置一位。下一条指令设置另一个。RISC处理器的精度为一个时钟周期。我认为那已经足够了。


0

对于方波,您应该使用与XTAL一起使用PLL的PWM外设,并使用某种计数器来知道何时循环(用于设置频率)。每个数据表都会告诉您如何执行此操作:)

为了节省时间,是的,除非使用汇编程序和作者操作码,否则您将需要RTC来使其准确接近,以便您手动知道任何exec路径中每条指令的确切执行时间。这也可能会为尝试和真实的“ goto被认为是有害的”陈述提供新的启示。


3
您对软件RTC的评论仅适用于最不小心实施的解决方案。一种明智而可靠的方法是使用硬件计时器每1毫秒(或10毫秒)产生一次中断。在服务例程中,有一个静态计数器变量,该变量然后对最多1000(或100)次的中断进行计数。当达到全部计数时,请重置计数器,然后增加秒计数器。每隔60秒,您将把秒计数器变量重置为零,并增加分钟计数器变量。如果需要,可以将此扩展到几个月和几年。
Michael Karas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.