如何为我的项目提出对微控制器的要求清单?然后如何找到合适的微控制器?


20

我一直在Arduino MEGA2560上进行eBike控制项目。该程序运行3个PID控制回路,一个电池容量控制回路(基于查找表的插值),速度计(基于簧片开关的采样)以及LCD屏幕以显示信息。它的输入是3个模拟信号:电池电压,电流和用户油门输入以及数字输入:速度计(簧片开关)开/关信号。当前,所有这些都以“长”算法运行,Arduino设法每秒完成10个循环。由于TFT LCD屏幕需要大量计算能力,因此我正在考虑将其替换为字母数字屏幕。

输出包括发往电动机控制器的模拟节气门信号,LCD屏幕以及可能需要模拟信号的其他一些设备。因此,虽然我目前正在使用带有RC低通滤波器的Arduino PWM输出,但ADC转换器至关重要,而DAC将非常有用。同样,在不中断处理器的情况下读取数字和模拟信号的能力也将很高。

我希望以此为基础来生产消费类产品,因此我想使用其他微控制器从头开始构建自己的平台,该微控制器可以每秒至少提供100个样本(是Arduino的10倍)。另外,为了避免浮点数,我的计算使用了长变量,因此使用的数字大于16位,因此我假设使用32位MCU是个好主意。而且,能够进行浮点计算的MCU可能会很有趣,可以简化代码中的数学运算。

最后,我不确定如何开始寻找能够满足这些要求并允许从Arduino环境快速过渡的MCU。任何有关如何找到此类MCU的指南将不胜感激!


1
我并不一定要成为推荐的部分,而只是一个方法或平台或有关如何找到所需平台的任何指南。
艾略特W

5
这比您先前的问题要好得多,但是它仍然非常广泛,并且您的要求中的某些要点还不清楚。例如,“不中断处理器”是什么意思?我猜您也不是真的想要轮询I / O。您还需要更好地处理每组样本需要完成多少计算。
戴夫·特威德

1
您应该考虑使用整数数学。这是正确的事情。
Scott Seidman


4
长或短的整数数学比浮点数快得多;并且比处理器“本机”位深度长的整数数学运算也将变慢。因此32位的声音听起来是个好主意,也许是“ DSP”类型的设备之一。
pjc50

Answers:


18

(这是一个通用指南。我怀疑您也可以从代码优化中受益,但这超出了本网站的范围。)

步骤1:粗略调整大小,预算,供应商

选择以下之一:

  • 计算机(Raspberry Pi,Beagleboard,PC104板,Intel Edison等)。引导通用操作系统并具有大量处理能力。更加昂贵且耗电。$ 10- $ 100。

  • 大型MCU。ARM Cortex-A / PIC32 / dsPIC / AVR32 / TI C系列DSP等。强大的计算能力,可选OS。〜$ 5。

  • 小型MCU。Cortex-M / PIC16。没有足够的空间容纳真正的OS,可能只是一个轻量级的任务计划程序。〜$ 2。

  • 微型MCU。仅在您关心最后每微安功耗的应用中才真正使用。〜$ 1或更少。

您还应该在此阶段考虑您喜欢和不喜欢的供应商和工具链。看一下在线调试设备和IDE的成本。

步骤2:最小外设

您需要USB之类的东西吗?PCI?HDMI?SATA?异常快速的ADC或DAC?尽管USB相当广泛,但几乎所有“小型”或“微型”类别都没有这些类别。

步骤3:原型

挑选满足上述条件的东西,如有必要,随机开始,找出可行的方法以及所需的空间/处理能力。您已经完成了其中一些操作。用C编写应该使大部分逻辑具有可移植性。

一旦有了原型,您就可以对自己说:“我需要这样一个,但要有更多的X”,然后由它来指导您的决定。

步骤4:缩小

通常,从CPU系列中最大(最多的Flash和RAM)成员开始,编写应用程序的v1,然后再选择一个更小,更便宜的组件即可,这比较容易。您还可以花时间在使软件适合较少资源的艺术上。值得做什么取决于您将要制造多少个单元。


14
步骤0:工具链(固件开发环境)。 查找可以为您工作的开发环境。这就是赢或输的地方。即使您拥有完美匹配的硅片,但是(由于某种原因)您无法使固件开发环境正常工作,您的项目也将无法启动。(恰当的例子:Arduino IDE已经使您基于Arduino的原型成为
现实

8
将Cortex-M归类为“小型MCU”,将PIC32 / AVR32归类为“大型MCU”似乎有些不幸。我个人还没有使用过PIC32 / AVR32,但是从快速浏览规格范围的角度来看,我想它们应该都放在同一支架中。(有些Cortex-M MCU运行于200MHz以上,具有许多兆字节的闪存和超过一半兆字节的RAM)
Aleksi Torhamo

13

不错的项目。这里有一些提示,但是很难对每个项目进行概括。

从计算需求开始

这将告诉您所需的内核以及MCU的一般性能。我建议您从此开始,因为与外围设备不同,它显然无法使用外部组件进行扩展。

首先,似乎您在循环中使用了带有大整数的繁重数学运算。因此,正如您所建议的那样,此处32位将很有用,因此ARM是理想的选择。至于操作频率:目前,您使用的是Arduino MEGA2560(我假设运行频率为16MHz),您可以进行10次循环/秒。如果要达到100个循环/秒,则Cortex-M3 / M4的频率应在100MHz或更高(粗略估计)范围内。请注意,Cortex-M4F具有浮点单元。

我们已经缩小了选择范围。

内存需求

这很容易:为原型选择具有其最大RAM /闪存范围的MCU。一旦您验证了原型,现在就知道您的确切要求,然后从具有足够RAM /闪存的相同范围切换到MCU。

请注意,我认为您的应用程序不需要大量的内存。

现在,外围设备

您绝对需要一些ADC。我们正在寻找的所有MCU系列都有一些,因此这不是一个有用的标准。数字输入/输出都不是,除非您需要大量的输入/输出(这似乎不是您的情况)。

您似乎需要一个DAC。但是,这实际上是您不容易找到的,并且会缩小候选人的范围。因此,我们不会满足该要求,而将继续使用PWM和低通(实际上可以接受)。

除了LCD(此后),您没有提及任何通信接口。无论如何,如果需要,所有的MCU都有I2C / SPI / UART /...。

液晶屏

这很棘手,因为有很多不同的解决方案对MCU提出了完全不同的要求。但不要根据MCU选择LCD。选择产品所需的LCD,然后选择可以有效驱动产品的MCU。

  • 如果您要使用字符LCD:那么MCU的最简单,最少的限制就是通过某个串行接口(通常是SPI)与之对话。这样,它就不会使用太多的PIN,可以使用更小/更便宜的MCU,而且速度也不是问题。
  • 如果您需要图形TFT LCD:如果是小型LCD LCD,则串行链接仍然合适。但是,对于320x200或更大的尺寸,如果您想拥有一个不错的图形界面,您将开始希望与并行界面进行通信。在这种情况下,您可以使用一些GPIO(但是这会给MCU带来更多的负载,因为您必须稍微碰一下控制线),或者选择具有专用LCD接口的MCU(通常与LCD接口相同)。外部存储器接口)。这最后一个对MCU选择施加了很大的约束,但是您没有其他强大的约束,因此...

现在,您选择

请访问ST Micro / NXP / Atmel网站并使用其MCU选择工具。您还将花费大量时间阅读数据表。慢慢来 它没有浪费。即使您没有将其专门用于此项目,您在这里学到的任何内容也可能会有用。

此时,您还需要查看实际需要的PIN数量,并检查所选MCU候选者的复用方案,以验证您可以使用所需的所有PIN功能。因为很明显,您将需要采用满足您要求的最少引脚数的MCU(出于成本/ PCB占用空间的原因)。

在Mouser / Digikey上检查价格/可用性。但是您在这里不需要特别昂贵的东西。大概5欧元左右。

关于LCD控制的最后一件事

LCD的更新似乎是您主循环的一部分。不应该这样 尤其是如果您每秒循环100次,那将毫无用处。使控制循环计算所有内容并在每次迭代中调整电动机命令,但只需更新值以显示在内存中的某个位置即可。然后,当没有其他事情要做时,让另一个低优先级的循环向用户显示此信息。

是的,理想情况下,它需要一些任务切换和其他工作。实际上,是一个真正的OS(查找FreeRTOS,Coocox OS,Nuttx等……非常小,它们在Cortex-M上大量使用,并提供所需的多任务机制)。


非常感谢您的全面答复!我注意到ARM Cortex MCU均在3.3V电压下运行。我的油门信号需要在1至5V之间缩放。我猜想如果我想使用ARM控制器,我将不得不找到一种提高电压的方法,因为它将从MCU限制为3.3V?
Eliott W

是。油门信号是模拟输出,对吗?在这种情况下,您可以使用运算放大器进行放大。
暗淡

我不确定我是否同意要求“真实操作系统”的最后一句话。我想这取决于您需要多少现成的解决方案。如果您想要一些可以放下业务逻辑并开始组合单元的东西,是的,成熟的OS(请注意,这不一定意味着像Windows甚至Linux之类的东西!)肯定有用。
CVn

1
@MichaelKjörling当然,我的意思甚至不是Linux之类的东西。但是,例如FreeRTOS,Coocox OS或Nutt​​x。这些是我认为真正的操作系统,尽管很小。我写这封信是因为,确实,在裸机上执行此操作将花费更多时间,调试起来很痛苦,而且灵活性较差。而且Arduino环境(尽管我在这方面还不是专家)似乎并未提供任务处理机制(因此,我不认为它是真正的 OS)。
暗淡

1
啊。好吧,那我误读了“真实”部分。只是为了使偶尔在这里结束的外来者受益,您可能需要考虑在回答中阐明这一部分。
CVn

4

请注意,这是一个广泛的主题,可以使用多种(主观)方法正确回答。

同样,stackexchange格式也不适合设计问题解决方案。例如,很少有人会为您设计硬件。而是您提出硬件设计并提出有关问题。

那个...

从您无法更改的处理器功能开始。例如速度和内存(如果适用)的大小。研究是否需要中断以及中断处理的复杂程度。

如果您需要外围设备支持(例如ADC或DAC),情况会更加复杂。这些功能应该内置在处理器中还是应该在处理器外部。价格,准确性,甚至噪音是决定的因素。

如果要支持外部外围设备,请考虑必要的串行通信类型。外部硬件可能需要SPI,I2C或其他类型的UART。如果数据速率很高,则最好找到具有与其串行通信端口关联的DMA功能的处理器。

最后,如果这是嵌入式处理器应用程序(通常意味着专用于任务的处理器),请考虑将需求分为几个组,并为每个组分配一个处理器。例如,GUI显示处理器可能不需要ADC功能。实践证明,这种客观解决问题的方法在软件中是成功的,并且随着处理器价格的下降,也可以应用于硬件。

在现实世界中,这种方法是迭代的。也就是说,许多项目从一个处理器开始,并在发生硬件和/或软件问题或项目范围更改时换出不同的处理器。


与编译器相比,您可以更好地判断期望的数字类型。我会避免使用浮点数的通用方法。例如,在不同的平台上,浮动结果可能不一样!我将使用整数算术,并根据您的需求量身定制解决方案。
st2000 16-10-21

3

我没有看到任何人提及工具成本。我的公司选择了TI CC2541,发现它只能用$ 4k的IAR编译器进行编译,这绝对是业余爱好者的首选。也是程序员。它可以是20美元或更多。便宜的工具现在似乎更普遍了,所以也许这很快就会成为过去。

另外,如果您自己进行重排,则TQFP之类的软件包比BGA更容易。根据个人经验,大型BGA很难实现。


2

如果该产品对价格比较敏感,并且您有不错的开发资金,则可以购买一堆评估板,并在每个评估板上进行概要分析,以得出想法。如果您的代码是用可移植的C语言编写的,那应该很简单。除了micro之外,您还需要评估具有演示版本的工具链,然后再花掉诸如IAR或Keil之类的成熟IDE的成本。在某些情况下,无需硬件即可直接在IDE上配置瓶颈代码。

如果您严格限制开发成本,则可能必须妥协才能找到对于开发设置而言并不会花费太多的东西。

例如,ST的ARM Cortex M7评估板带有彩色显示屏,价格不到$ 100。它具有带DSP功能的FPU,因此您可以轻松进行任何讨论-可能以100kHZ而非100Hz运行PID回路。除非优先显示,否则这可能是矫kill过正。

如果您想要的是没有FPU的便宜处理器,那么您可能希望将PID代码以其最终形式进行分析。确保包括所有缩放比例,线性化和校准因子,因为它们会增加处理时间。

通常,外围设备以及相关的中间件质量和可用性(以及许可条款)将极大地影响您的选择。如果您需要BT或Wifi或USB主机模式以及FAT文件存储在拇指驱动器或快速SD接口上,这些都是重要因素。一些芯片具有板载LCD控制器和数字转换器控制器,可以允许使用相对便宜的TFT面板。不要忽略有时高昂的许可费用。

如果您对所需的程序存储器,处理速度和外围设备(包括FPU)有所了解,则可以在分配器上进行参数搜索,然后再深入研究数据表。太过局限的事情可能是-通孔封装,内部DAC,内部以太网PHY,FPU。这些都不是必需的,它们可能会过早地限制您的选择。

祝你好运,要正确地完成这项工作需要很多工作。以我的经验,将新产品与新产品的价格过分接近是一种错误的经济做法,因为客户将不可避免地要求获得您未曾预料到的东西,并且您希望有一些备用能力来提供这些产品而无需重新开始。另一方面,如果产品太贵,您将无法以足够的利润销售足够的利润来维持业务。


1

您可以开始查看多种不同的平台,例如Arduino,PIC微控制器,FPGA等。我过去与Arduinos一起工作过,它的ADC端口能够达到74kS / s。每秒100个样本非常慢,我想知道您是怎么发现的?另一方面,您想问自己是否需要任何类型的接口,例如SPI,CAN,I2C或UART。它们都有自己的好处,您需要考虑是否要与一个或多个奴隶交谈。最后但可能最重要的一步是猜测您将需要使用微控制器上的多少个引脚。

“在不中断处理器的情况下读取模数信号的能力将是巨大的。” 我可以大胆地猜测,您不想处理将使数据流通并可能减慢数据处理速度的外部或内部缓冲区。那正确吗?如果是这样,那将是您要做的更多编程工作,但处理器通常能够处理每秒100个样本的速度。由您决定时钟,采样率和其他参数。

另外,如果要连续采样数据并在引发标志时执行其他任务,请考虑程序中的中断。


2
我认为您已经错过了重点。他有一个基于Arduino的原型。采样并不慢。控制回路很慢。他在Arduino上使用浮点计算了三个PID控制器,因此它们在南极冬季比糖蜜要慢。因此,采样不是问题。代码效率低下。
JRE

你是对的。
拉皮

是的,问题是,尽管我的循环是长运算而不是浮点运算,但要进行的计算却很多,以致于Arduino每个循环采样一次,我的采样率非常小(目前每秒20个采样) 。
Eliott W
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.