我知道中断延迟取决于中断发生时CPU正在做什么(arm中断延迟指南)。这种效应称为中断抖动。对于我的应用,我需要一个具有固定中断延迟(零中断抖动)的 MCU。延迟可以任意高,但抖动必须为零。你知道任何MCU吗?
如果没有任何零抖动 MCU,是否有办法以编程方式补偿延迟差异,在中断延迟低于最大值的情况下添加一些处理器周期?
我需要这样的 MCU 来测量两个事件之间的时间,精度高达 1 个周期。也许最好不要寻找专门的MCU,而是构建一个外部电路来测量时间?
我知道中断延迟取决于中断发生时CPU正在做什么(arm中断延迟指南)。这种效应称为中断抖动。对于我的应用,我需要一个具有固定中断延迟(零中断抖动)的 MCU。延迟可以任意高,但抖动必须为零。你知道任何MCU吗?
如果没有任何零抖动 MCU,是否有办法以编程方式补偿延迟差异,在中断延迟低于最大值的情况下添加一些处理器周期?
我需要这样的 MCU 来测量两个事件之间的时间,精度高达 1 个周期。也许最好不要寻找专门的MCU,而是构建一个外部电路来测量时间?
你从错误的方向接近这个。你不应该有一个规范说“我需要这样的 mcu 来测量两个事件之间的时间,精度高达 1 个周期”。您应该有一个说明精度为 +/- x (milli/micro/nano) seconds的规范。时间单位,而不是周期。根据我的经验,许多指令集都有固定数量的周期。然后您选择一个适合您的规格的系统时钟。
同样如评论中所述,如果您有一个输入捕获定时器外围设备(很可能),那么该外围设备将非常准确地触发。然后它会触发中断,该中断会在一段时间后执行。如果您有一个循环输入捕获定时器,那么您可以通过将其设置为“上一个触发点 + 延迟”来重置它,而不是“我的定时器在我达到 ISR + 延迟时的值”。
我相信一些更简单的 PIC 系列具有恒定的中断延迟。例如,古老的 PIC16F84 的延迟列为 3.25 Tcy(或 13 个时钟周期)。
除非您的中断请求与 MCU 时钟同步,否则会有额外的 +/-0.5 个时钟周期。
在您可能会问这个问题的情况下,通常答案是使用硬件,例如定时器捕获输入或定时器比较输出。
在 MCU 的黑暗时代(想想 i8049),我曾经能够通过变量跳转到 NOP 字段作为斜率 ADC 的一部分来纠正中断延迟变化,但这在 2021 年会有点疯狂,因为那里有这么多免费提供硬件。
一种方法是根本不使用中断来测量时间。某些处理器(例如 Microchip 的 SAMD 系列)具有事件系统,外围设备可以触发事件,从而导致其他硬件执行不同的操作。
考虑到您要测量为电容器充电所需的时间:
然后可以在没有时间压力的情况下执行中断例程,因为时间值保存在捕获寄存器中。这样,唯一的抖动将来自模拟比较器及其时钟的长度。最大时钟速度为 48Mhz,最终分辨率为 20ns,抖动约为 +-10ns。这也有一个优点,即 CPU 可以比定时器运行得慢,以节省电力。
使用时间离散处理器时总是会有抖动,只能减少它。
许多很多微控制器都具有“输入捕获”功能。
定时器以固定频率自由运行。当外部信号发生时,定时器值被复制到寄存器中,并引发中断。
无论中断延迟如何,中断处理程序都可以读取寄存器中的值并确定事件发生的精确时刻,直至计时器的频率。
许多链接的谷歌“输入捕获计时器”或“输入捕获中断”。