如何确定 MCU 时钟速度要求
How to determine MCU Clock speed requirements
概览:
我花了一段时间想如何表述这个问题。为了缩小范围,我想以“现实生活”示例应用程序的形式提供我的初始硬件要求。
我知道时钟速度可能是相对的,因为它是根据具体情况而定的。例如,您对特定速度的要求可能会受到 MCU 提供的片上外围设备的影响。例如,您可能花费 (n) 个周期为编码器服务 ISR,或者,您可以选择具有 QEI 输入的 MCU 为您完成(在某种程度上),这反过来可能会放宽您的要求?
我不是专家,而且还在学习,所以如果我使用了不正确的术语,或者完全误解了某些东西,请告诉我。我向你们保证;欢迎反馈!
示例应用程序:
这个应用比较简单。它可以被认为是一个非阻塞状态机,机器的每次“迭代”必须在 20 毫秒内完成。该机器的单次迭代有 4 个主要任务:
- 解码一个串行负载,由 32 个字节组成。长度固定为 32 字节,有效载荷是动态的,波特率为 115200bps(参见下面的任务 #2)
- 读取 4 个增量轴编码器信号,这些信号与 4 个直流电机耦合,每个电机一个编码器(参见下面的任务 #1)
- 确定4个限位开关的位置。 ISR 驱动,在每个开关的上升沿触发。
- 基于上述 3 类输入,MCU 将输出 4 个独立的 PWM 信号 @ 50Hz (20ms) 到电机控制器,用于其下一组动作。 (参见下面的任务 #3)
从 IO 的角度来看,我知道 MCU 正在读取 8 个数字信号(4 个正交编码器、4 个限位开关),并通过 UART 解码一个 32 字节的串行帧。
基于该数据,MCU 将向电机控制器输出 4 个独立的 PWM 信号,每个电机的脉冲宽度为 [1000usec -3200usec]。
题目:
总而言之,我正在努力思考如何将我的要求映射到 MCU 选择中,仅从速度的角度来看。
我很容易通过数据表说,这个芯片满足我的要求,因为它有 (n) 个 UARTS,(n) 个 ISR 输入引脚,(n) 个 PWM 输出等。但是我的项目太小了我总是假设处理器“足够快”。除了我直接的外设需求,我从来没有真正研究过实际的 MCU 速度,这对我来说是个问题。
为了解决这个问题,我试图了解根据给定应用程序的需要选择特定时钟速度的内容。或者,换句话说,这可能是错误的,但是如何量化该特定应用程序处理器的理论负载?
附加信息
任务 #1:编码器:
4 个电机中的每一个在系统中都有不同的任务,但无论如何,它们都是相同的 brand/model 电机,并且最大 RPM 为 230。我的假设是,如果在最坏的情况下,一个的电机以 230 RPM 的速度旋转,这意味着,在全正交分辨率下(通道 A/B 的计数 rising/falling),1000PPR 编码器每转将产生 4K 中断。因此,MCU 必须为这些中断提供服务,这可能会给系统造成瓶颈。例如,如果服务 ISR 需要 (n) 个时钟周期,并且对于 1 个电机的 1 转,我们期望 4K 中断,那就是……230(RPM) * 4K(ISR 每转)== 920,000 次中断每分钟?哎呀!然后我想你可以推断并再次说,在最坏的情况下,4 个电机中的每一个都以 230 RPM 的速度旋转,如果编码器是全分辨率,系统有可能不得不忍受 920K 的中断每个编码器每分钟。那么 920K * 4 个电机 == 每分钟 3,680,000 次中断?我 100% 确定我做错了什么,所以请随时纠正我。
任务 #2:串行解码
MCU 将需要一个专用的硬件串行端口来解码一个 32 字节的数据包,该数据包每 7 毫秒以不同的值重复一次。波特率将设置为 115200bps。
任务 #3:PWM 输出
根据任务 1 和 2 的信息,MCU 将写入 4 个独立的 PWM 输出。每个输出的脉冲将在 1000-3200usec 之间,频率为 50Hz。
您需要将实时关键部分与应用程序的其余部分分开。例如,如果您基于中断进行接收,则 UART 帧的实际接收在某种程度上是时间关键型的。但是协议解码根本不是关键,除非你希望在一定时间内做出回应。
Decode a serial payload, consisting of 32 bytes.
您可以使用中断填充缓冲区的老式方法来执行此操作,或者您可以寻找带有 DMA 的部件,这在当今相当普遍。 DMA 意味着您不必考虑一些烦人的、频率相对较低的 UART 中断来干扰其他任务。
Read 4 incremental shaft encoder signals
我没有使用过这样的编码器,所以我不知道它们对时间的要求有多高。如果您必须捕获每一个中断并且您的计算是正确的,那么每分钟 3,680,000 次中断仍然不错。 60*60/3680000 = 978us。所以大约每毫秒中断一次,这不是“硬实时”要求。如果这是您需要做的唯一时间紧迫的事情,那么任何 8MHz 的破旧 8 位 运行 都可以跟上。
Determine the position of 4 limit switches
你在这里没有提到计时,但我认为这是可以由低优先级循环计时器循环轮询的东西。
the MCU will output 4 separate PWM signals
没问题,只要选择一个具有像样的 PWM 硬件外设的。您应该只需要不时更新一些 PWM 占空比寄存器。
总的来说,这听起来并不那么实时。我用 icky 8 和 16 bitters 做过更糟糕的实时项目。然而,每次我这样做,我总是后悔没有选择更快的 MCU,因为随着 project/product 的进行,你总是想出要添加的东西。
听起来您的普通主流 Cortex M0+ 很适合这个项目。时钟频率约为 48MHz,您将拥有充足的 CPU 功率。 Cortex M4 或更大,如果你真的期望浮点数学(虽然我不太明白你为什么需要它)。
鉴于当前的组件危机,请谨慎选择品牌!尤其要远离 STM32,因为 ST 现在无法生产它们,您最终可能要等一年多才能拿到零件。
问题的答案是“经验”。但直觉上你的例子并不是特别费力——尽管有很多方法可以把它搞砸。我曾经在一个 200MHz C5502 DSP 上 运行 以接近 100% CPU 负载的项目工作。该应用程序现在在 72MHz Cortex-M3 上运行,只有 60% 具有附加功能并且 I/O 在原始实现中不存在..
您的申请已 I/O 绑定;根据数据速率(和关键中断速率),I/O 很少构成最高 CPU 负载,DMA、硬件 FIFO、输入捕获 timer/counters 和硬件 PWM 等可用于尽量减少 I/O 的影响。我不会详细讨论它; @Lundin 已经做到了。
另请注意,原始处理器速度对于数据或信号处理和数字运算很重要 - 但 I/O 通常需要的是确定性实时响应,而这很少只是 MHz 或 MIPS 的问题 -与从 500MHz 应用程序处理器 运行 Linux 获得 gua运行tee 相比,您将在几 MHz 下从 8 位 AVR 运行 获得更多确定性并且可能更快的响应 - 而且它不需要 30 秒即可启动!
概览:
我花了一段时间想如何表述这个问题。为了缩小范围,我想以“现实生活”示例应用程序的形式提供我的初始硬件要求。
我知道时钟速度可能是相对的,因为它是根据具体情况而定的。例如,您对特定速度的要求可能会受到 MCU 提供的片上外围设备的影响。例如,您可能花费 (n) 个周期为编码器服务 ISR,或者,您可以选择具有 QEI 输入的 MCU 为您完成(在某种程度上),这反过来可能会放宽您的要求?
我不是专家,而且还在学习,所以如果我使用了不正确的术语,或者完全误解了某些东西,请告诉我。我向你们保证;欢迎反馈!
示例应用程序:
这个应用比较简单。它可以被认为是一个非阻塞状态机,机器的每次“迭代”必须在 20 毫秒内完成。该机器的单次迭代有 4 个主要任务:
- 解码一个串行负载,由 32 个字节组成。长度固定为 32 字节,有效载荷是动态的,波特率为 115200bps(参见下面的任务 #2)
- 读取 4 个增量轴编码器信号,这些信号与 4 个直流电机耦合,每个电机一个编码器(参见下面的任务 #1)
- 确定4个限位开关的位置。 ISR 驱动,在每个开关的上升沿触发。
- 基于上述 3 类输入,MCU 将输出 4 个独立的 PWM 信号 @ 50Hz (20ms) 到电机控制器,用于其下一组动作。 (参见下面的任务 #3)
从 IO 的角度来看,我知道 MCU 正在读取 8 个数字信号(4 个正交编码器、4 个限位开关),并通过 UART 解码一个 32 字节的串行帧。
基于该数据,MCU 将向电机控制器输出 4 个独立的 PWM 信号,每个电机的脉冲宽度为 [1000usec -3200usec]。
题目:
总而言之,我正在努力思考如何将我的要求映射到 MCU 选择中,仅从速度的角度来看。
我很容易通过数据表说,这个芯片满足我的要求,因为它有 (n) 个 UARTS,(n) 个 ISR 输入引脚,(n) 个 PWM 输出等。但是我的项目太小了我总是假设处理器“足够快”。除了我直接的外设需求,我从来没有真正研究过实际的 MCU 速度,这对我来说是个问题。
为了解决这个问题,我试图了解根据给定应用程序的需要选择特定时钟速度的内容。或者,换句话说,这可能是错误的,但是如何量化该特定应用程序处理器的理论负载?
附加信息
任务 #1:编码器:
4 个电机中的每一个在系统中都有不同的任务,但无论如何,它们都是相同的 brand/model 电机,并且最大 RPM 为 230。我的假设是,如果在最坏的情况下,一个的电机以 230 RPM 的速度旋转,这意味着,在全正交分辨率下(通道 A/B 的计数 rising/falling),1000PPR 编码器每转将产生 4K 中断。因此,MCU 必须为这些中断提供服务,这可能会给系统造成瓶颈。例如,如果服务 ISR 需要 (n) 个时钟周期,并且对于 1 个电机的 1 转,我们期望 4K 中断,那就是……230(RPM) * 4K(ISR 每转)== 920,000 次中断每分钟?哎呀!然后我想你可以推断并再次说,在最坏的情况下,4 个电机中的每一个都以 230 RPM 的速度旋转,如果编码器是全分辨率,系统有可能不得不忍受 920K 的中断每个编码器每分钟。那么 920K * 4 个电机 == 每分钟 3,680,000 次中断?我 100% 确定我做错了什么,所以请随时纠正我。
任务 #2:串行解码
MCU 将需要一个专用的硬件串行端口来解码一个 32 字节的数据包,该数据包每 7 毫秒以不同的值重复一次。波特率将设置为 115200bps。
任务 #3:PWM 输出
根据任务 1 和 2 的信息,MCU 将写入 4 个独立的 PWM 输出。每个输出的脉冲将在 1000-3200usec 之间,频率为 50Hz。
您需要将实时关键部分与应用程序的其余部分分开。例如,如果您基于中断进行接收,则 UART 帧的实际接收在某种程度上是时间关键型的。但是协议解码根本不是关键,除非你希望在一定时间内做出回应。
Decode a serial payload, consisting of 32 bytes.
您可以使用中断填充缓冲区的老式方法来执行此操作,或者您可以寻找带有 DMA 的部件,这在当今相当普遍。 DMA 意味着您不必考虑一些烦人的、频率相对较低的 UART 中断来干扰其他任务。
Read 4 incremental shaft encoder signals
我没有使用过这样的编码器,所以我不知道它们对时间的要求有多高。如果您必须捕获每一个中断并且您的计算是正确的,那么每分钟 3,680,000 次中断仍然不错。 60*60/3680000 = 978us。所以大约每毫秒中断一次,这不是“硬实时”要求。如果这是您需要做的唯一时间紧迫的事情,那么任何 8MHz 的破旧 8 位 运行 都可以跟上。
Determine the position of 4 limit switches
你在这里没有提到计时,但我认为这是可以由低优先级循环计时器循环轮询的东西。
the MCU will output 4 separate PWM signals
没问题,只要选择一个具有像样的 PWM 硬件外设的。您应该只需要不时更新一些 PWM 占空比寄存器。
总的来说,这听起来并不那么实时。我用 icky 8 和 16 bitters 做过更糟糕的实时项目。然而,每次我这样做,我总是后悔没有选择更快的 MCU,因为随着 project/product 的进行,你总是想出要添加的东西。
听起来您的普通主流 Cortex M0+ 很适合这个项目。时钟频率约为 48MHz,您将拥有充足的 CPU 功率。 Cortex M4 或更大,如果你真的期望浮点数学(虽然我不太明白你为什么需要它)。
鉴于当前的组件危机,请谨慎选择品牌!尤其要远离 STM32,因为 ST 现在无法生产它们,您最终可能要等一年多才能拿到零件。
问题的答案是“经验”。但直觉上你的例子并不是特别费力——尽管有很多方法可以把它搞砸。我曾经在一个 200MHz C5502 DSP 上 运行 以接近 100% CPU 负载的项目工作。该应用程序现在在 72MHz Cortex-M3 上运行,只有 60% 具有附加功能并且 I/O 在原始实现中不存在..
您的申请已 I/O 绑定;根据数据速率(和关键中断速率),I/O 很少构成最高 CPU 负载,DMA、硬件 FIFO、输入捕获 timer/counters 和硬件 PWM 等可用于尽量减少 I/O 的影响。我不会详细讨论它; @Lundin 已经做到了。
另请注意,原始处理器速度对于数据或信号处理和数字运算很重要 - 但 I/O 通常需要的是确定性实时响应,而这很少只是 MHz 或 MIPS 的问题 -与从 500MHz 应用程序处理器 运行 Linux 获得 gua运行tee 相比,您将在几 MHz 下从 8 位 AVR 运行 获得更多确定性并且可能更快的响应 - 而且它不需要 30 秒即可启动!