概述:
我花了一段时间想如何提出这个问题。为了缩小范围,我想以“现实生活”示例应用程序的形式提供我最初的HW需求。
我知道时钟的速度可能是相对的,因为它是一个逐个案例的基础。例如,您对某一速度的要求可能会受到MCU提供的片上外设的影响。例如,您可能会花费(n)个周期为编码器服务ISR,或者,您可以选择一个具有QEI输入的MCU (在某种程度上)为您服务,这反过来可能会放松您的需求?
我不是专家,而且还在学习,所以如果我用了一个不正确的术语,或者完全误解了什么,请叫我出来。我向你保证,欢迎反馈!
示例应用程序:
这个应用程序相对简单。它可以被认为是一台非阻塞状态机,其中机器的每一次‘迭代’必须在20 as内完成。这台机器的一次迭代有4项主要任务:
从IO的角度来看,我知道MCU正在读取8个数字信号(4个正交编码器,4个限制开关),并在UART上解码32字节的串行帧。
基于这些数据,单片机将输出4个独立的PWM信号,每台电机脉宽为1000usec-3200usec。
问题:
说到底,我正试着思考如何将我的需求映射到MCU的选择中,仅仅从速度的角度来看。
我很容易在数据表中看到这个芯片,因为它有(n) UARTS,(n) ISR输入引脚,(n) PWM输出等等,所以这个芯片满足了我的要求。但是我的项目太小了,所以我总是认为处理器“足够快”。除了我的直接外设需要,我从来没有真正观察实际的单片机速度,这是一个问题,在我的一端。
为了解决这个问题,我试图了解根据给定应用程序的需要选择特定时钟速度的原因。或者,另一种说法,这可能是错误的,但是如何量化处理器对特定应用程序的理论负载?
更多信息
任务#1:编码器:
这4台电机在系统中都有不同的任务,但不管怎么说,它们都是相同的品牌/型号电机,最大RPM为230。我的假设是,如果在最坏的情况下,其中一台电机的转速为230 RPM,那将意味着,在完全正交分辨率(A/B通道的上升/下降数),1000 per编码器将产生每转4K的中断。因此,MCU将不得不为这些中断提供服务,这可能会给系统造成瓶颈。例如,如果需要(n)个时钟周期来服务ISR,而对于一个电机的1转,我们期望4K中断,那就是…。230(RPM) * 4K (ISR / rev) ==每分钟92万次中断?呀!然后我想你可以再一次推断,在最坏的情况下,4台发动机的转速都是230 RPM,如果编码器是全分辨率的话,系统必须每分钟承受每分钟920 K的中断。那么920 K*4电机==每分钟3,680,000次中断?我百分之百地肯定我做错了什么,所以请你,让我直截了当。
任务2:串行解码
单片机将需要一个专用的HW串口来解码一个32字节的数据包,它每7ms重复一次不同的值。波特率将被设置为115200bps。
任务3:脉宽调制输出
基于任务1和任务2的信息,单片机将写入4个独立的PWM输出。每个输出的脉冲将在1000-3200 each之间,频率为50 of。
发布于 2021-03-30 07:09:14
您需要将实时关键部分从应用程序的其余部分中分离出来。例如,如果您这样做是基于中断的,那么UART帧的实际接收就有点时间紧迫了。但是协议解码一点也不重要,除非期望您在一定时间内做出响应。
解码串行有效载荷,由32个字节组成。
您可以通过中断填充缓冲区来实现这一点,也可以使用DMA查找部件,这在当今相当常见。DMA意味着您不必考虑一些烦人的、相对较低频率的UART中断干扰其他任务。
读取4个增量轴编码器信号
我没有和这样的编码器合作过,所以我不知道他们的时间有多紧迫。如果你必须捕捉每一个中断,并且你的计算是正确的,那么每分钟3,680,000次中断仍然没有那么糟糕。60*60/3680000 =978 60。因此,大约每毫秒中断一次,这不是一个“硬实时”要求。如果这是你唯一需要做的时间紧迫的事情,那么任何8兆赫的寒酸都可以跟上。
确定4个限位开关的位置
这里没有提到定时,但我假设这是可以被低优先级循环计时器循环轮询的东西。
单片机将输出4个独立的脉宽调制信号
没问题,只要选择一个有一个像样的PWM硬件外设。你应该只需要不时地更新一些PWM占空比寄存器。
总的来说,这听起来并不是所有的实时关键。我做过更糟糕的实时项目,包括8块和16块。然而,每次我这样做,我总是后悔没有选择一个更快的单片机,因为你总是想要添加的东西,随着项目/产品的继续进行。
听起来你的平均主流皮质M0+将是这个项目的一个很好的候选人。在大约48兆赫的时钟,你将有足够的CPU功率。皮质M4或更大,如果你真的期望浮点数学(我不太明白为什么你会需要它)。
考虑到目前的组件危机,要小心你选择哪个品牌!特别是不要使用STM32,因为ST现在不能生产它们,你可能要等一年多才能得到零件。
发布于 2021-03-30 11:11:54
这个问题的答案是“经验”。但从直觉上看,你的例子并没有特别费钱--尽管你有很多方法可以把它搞砸。我曾经在一个200 CPU的C5502数字信号处理器上运行的一个项目,几乎100%的CPU负载。该应用程序现在运行在72 M3的Cortex-M3上,仅占60%,附加功能和I/O在最初的实现中没有出现。
您的应用程序是I/O绑定的;根据数据速率(和临界中断率),I/O很少构成最高的CPU负载,并且可以使用DMA、硬件FIFO、输入捕获定时器/计数器和硬件PWM等来最小化I/O的影响。我不打算详细讲了,伦丁已经说过了。
还请注意,原始处理器的速度对于数据或信号处理和数字处理非常重要--但是I/O通常需要的是确定性的实时响应,这很少是简单的MHz或MIPS问题--运行在几个MHz上的8位AVR的响应将比运行Linux的500 MHz应用程序处理器所能保证的更确定,甚至可能更快--而且它不会花30秒启动!
https://stackoverflow.com/questions/66861363
复制相似问题