在当今技术驱动的世界中,嵌入式系统无处不在。无论是联网的剃须刀还是复杂的汽车,嵌入式设备都是我们今天使用的大多数电子设备的核心。由一个或多个微处理器组成,嵌入式系统可以通过将复杂性卸载到软件来简化电子产品。随着嵌入式设备变得更大更复杂,印刷电路板(PCBs)也是如此。这些设备往往会发展成多个板并成为比最初预期更大的组装。
在本文中,我们将探讨由多个PCB组成的嵌入式系统的架构权衡和考虑因素。我们将讨论多PCB系统的好处、设计考虑因素和挑战。
虽然将设备保持在单个PCB上是理想选择(无论是简单性还是成本),但有时我们必须将设计分成两个甚至更多的PCB,以实现我们的设计目标。我们想要将产品分成多个板的一些原因包括:
出于这些(以及更多)原因,我们考虑设计一个由多个PCB组成的组装,但嵌入式固件方面的挑战并非没有复杂性。
现在我们已经确定了使用多个PCB(在适用的情况下)的理由,理解在架构嵌入式系统时的设计考虑因素很重要。无论是从硬件还是软件的角度来看,当我们把一切都放在单个板上时,我们不倾向于仔细权衡的细微差别。
首先我们应该考虑的是板与板之间的通信问题。每块板如何相互通信?每块板上有什么样的处理能力(如果有的话)?或许其中一块板是大脑,而其他的是传感器?当我们仔细选择传输协议,无论是I2C、SPI、UART、以太网等,我们还必须考虑传输线、信号完整性,最重要的是,通过板与板之间的连接器进行信号传输。对设计师来说,最糟糕的事情(相信我,我经历过)就是设计完整个系统并从制造商那里收到你的PCB,只为了意识到你漏掉了一个或两个时钟信号。我们也倾向于忘记在我们的板与板连接器上保留备用引脚,试图将每个引脚数量最大化。这真的可能最终对我们不利。设计时要考虑到多板项目,如Altium Designer中的多板组装功能,在PCB之间布线如此多的通信线时这是必须的。
我们还需要考虑如何分配电源,特别是如果我们将用我们的微处理器监控电源总线。我们希望能够访问“大脑”以便它能监控任何灾难性事件,但我们也需要考虑切换电源噪声、重负载的电源分配,以及我们的板与板连接器引脚是否能承受那种电力。
最后,虽然这与嵌入式系统的软件本身不直接相关,但机械设计也扮演着重要角色。按键、触摸屏和其他用户的物理接口仍然连接到微处理器,必须考虑在内。我们能否以这样的方式布线,以便微处理器可以访问它的输入?我们是否考虑了当我们从一块板传递到另一块板时高速数字输出的信号完整性?这些是我们在构建我们的嵌入式设备时必须考虑的事情。
我一次又一次在规模扩大的初创公司(甚至是大公司)中看到的最被低估的挑战之一,就是软件和硬件之间版本控制方案的困扰。管理软件发布与PCB修订版之间的关系已成为一个永无止境的战斗,这经常导致混淆、延迟,甚至产品失败。
例如,在我参与的一个初创公司中,PCB的轻微修改需要重新旋转,因此,需要更新固件(尽管很小)。由于版本控制不善,工程团队在旧版PCB上部署了新固件,导致意外的电源下降和偶尔的烟雾。幸运的是,我们在产品发货前发现了这个问题,但这绝对是连续几天的噩梦。
为了避免这些陷阱,建立一个坚固的版本控制方案并确保硬件和软件团队之间的清晰沟通至关重要。即使是一个简单的版本控制方案,如固件的Git哈希(或语义版本)以及硬件修订版的基本支持查找表,也足以开始。随着时间的推移,更复杂的机制,如在固件中检测硬件修订版(从而检查兼容性),也大大减少了混淆。
除了软件版本控制之外,思考代码的模块化也很重要。如果是意大利面条式的代码,更换一个带有新芯片或传感器的传感器板可能会变成一个重构的噩梦。模块化你的设备驱动程序并创建硬件抽象层,可以轻松地更换组件,这将在未来几年内发挥作用。随着嵌入式系统的复杂性随时间增长,这已经变得更加流行。
当我们思考嵌入式系统架构时,我们不总是需要考虑小型化。宇宙飞船和汽车是极其复杂的嵌入式系统,但智能手机也是如此。无论我们是在设计一个联网的勺子还是下一颗卫星,理解嵌入式系统架构的权衡对于设计多个PCB来说极其重要。我们在这篇文章中探讨了许多概念,但毫无疑问,在你的旅程中,你还会发现更多。