在当今的电子世界中,运行实时操作系统(RTOS)的大型32位微控制器(MCU)和微处理器(MPU)越来越普遍。然而,处理复杂应用的单个大型MCU,可能会遇到与小型内务管理任务相关的CPU资源问题,这些任务并不复杂,但非常耗时。较小的器件,例如8位和16位MCU,可用于从32位器件卸载这些任务。
让我们来考虑一下以下这个示例:将32位MCU用于控制汽车的非安全功能,如娱乐系统、环境照明和空调。32位器件必须要能分配其资源来处理与这些功能相关的所有任务。一些示例包括多点测量机舱温度、打开/关闭空调系统、更新图形显示、处理用户输入、调整照明条件和播放音乐。即使对于大型32位器件,这也是很多工作。
但是,如果能将其中一些任务从32位器件卸载到仅负责处理其中一项或两项任务的子处理器,而在此过程中又几乎不需要监督,那么这些任务就更易于管理。这释放了主处理器上的CPU资源,从而降低了软件复杂性,同时提高了性能和执行时间。
该解决方案类似于MCU中外设的优势。外设是小型专用硬件模块,可以添加新功能,例如运算放大器或模数转换器(ADC),或者可以减少CPU必须为给定功能执行的工作量。在某些情况下,外设在初始化后可以独立于CPU运行。
例如,为了展示外设的优势,可以考虑脉宽调制(PWM)信号的生成。要在没有专用外设的情况下生成PWM,只需将I/O线设置为高电平,等待一定数量的周期,将其设置为低电平,再等待一段时间,然后重复。这会占用大量CPU周期,并且对于诸如RTOS之类的东西来说很难可靠地执行。相比之下,PWM外设可让CPU在执行其他任务的同时设置所需的波形参数。
本文提供的第一个示例显示了卸载CPU密集型任务的好处。在这种情况下,8位MCU用于创建I/O扩展器。I/O扩展器不是复杂的器件;然而,由于中断的频繁服务,它们使用了大量的CPU时间。通过使用专门的MCU来完成这项任务,较大的32位器件可以降低其I/O利用率和需要处理的中断数量。此外,I/O扩展器的功能集是在软件中设置的,因此可以针对应用进行定制和调整。
本文中的第二个示例展示了独立于内核的外设的性能,以创建独立于CPU运行的电压频率(V/F)转换器。本例中CPU的唯一功能是初始化外设并将调试消息打印到UART。在更大的系统中,当V/F在后台运行时,CPU可以执行另一个简单的任务。
使用8位MCU创建I/O扩展器的最大好处是灵活性。I/O扩展器ASIC的功能集已嵌入到该器件中,而MCU则可根据其执行的软件定义其行为。这种灵活性使基于MCU的版本能够适应最终应用的需求。
在内部,高级I/O扩展器在基于查找表的结构上运行。在读取或写入之前,会发送一个虚拟地址。该地址与MCU上的寄存器无关——它仅特定于查找表。这意味着可以透明地添加MCU硬件寄存器中所没有的功能。表格中的条目也可以很容易地重新排列以用于特定用途。这种结构的另一个好处是能够向查找表添加权限(图1)。例如,要创建一个只读寄存器,只需省略写查找表条目即可。
图1:高级I/O扩展器查找表中的条目可以针对特定用例轻松重新排列。
更复杂的结构也适用于非标准功能。“MEM OP”功能支持MCU将其当前的通用输入输出(GPIO)配置保存或加载到内存中。
MEM OP还可以将GPIO配置重置为编译时所设置的参数(图2)。
图2:MEM OP功能支持MCU将其当前的GPIO配置保存或加载到内存中。
或者,可以将MCU设置为在上电时加载保存的设置。如果启用,MCU会尝试加载配置0中的设置。如果配置校验和验证失败,则MCU将恢复为编译时间常数。如果不需要,可以在软件中禁用此功能。
基于MCU的解决方案,其优势在于极大的灵活性。与市场上的ASIC不同,可以将MCU配置为具有特定于所用应用的非标准功能。此应用是为通用PIC16F15244系列MCU所开发的。
有关此实现的更多信息或想要试用此例,请参阅源存储库中的README文件。其中还提供了带有Arduino的高级I/O扩展器的演示。GitHub上提供了源代码、文档和演示。
V/F转换器通过减少物料清单(BOM)和设计面积来改进传统的模拟解决方案。市场上的许多V/F转换器都需要外部电阻器和电容器才能运行,而MCU只需要通用的去耦和上拉元件(所有MCU都需要这些元件)即可运行(图3)。
图3:TC9400器件的应用原理图,突出显示10Hz至100kHz V/F转换器。
MCU不使用模拟技术进行数字化,而是使用独立于内核的外设和功能的组合。MCU使用带计算功能的内部模数转换器(ADCC)测量输入信号,然后对时钟信号进行分频以产生可变频率输出。在本例中,外设已设置为在初始化后独立于CPU运行。这意味着CPU可以用于最终应用中的其他任务。
基于MCU的方法有一个挑战是它的性能不如模拟解决方案。输出的分辨率本质上受ADCC的限制。名义上,ADCC是12位的,但根据程序的配置方式,ADCC以过采样的14位分辨率运行。同样,合成输出频率的片内数控振荡器(NCO)具有有限的分辨率,并且在其输出中可能存在抖动,具体取决于ADCC测量的值。
基于MCU的解决方案可分为三个不同的外设模块:模拟采样模块、输出振荡器模块和占空比发生器(图4)。
图4:三个模拟采样模块简化了基于MCU的解决方案。
模拟采样模块负责模数转换(图5)。为了在器件的频率限制下实现100kHz的输出,ADCC已配置为过采样,然后向下平均以获得14位结果。
图5:模拟采样模块的实现方式。
这种过采样的一个缺点是在结果中添加了额外的统计噪声。可以通过对过采样求平均值并添加滞后来补偿噪声。为了实现滞后,这里使用了ADCC的阈值中断功能。为简单起见,本文将仅介绍此示例如何使用阈值中断功能的细节。
当ADCC完成过采样平均值计算时,会将结果值与外设中的设定点寄存器进行比较。如果两者之差大于或小于设定阈值,则触发中断。CPU屏蔽这个中断并且不受影响,但是,此中断会触发直接存储器访问(DMA),将平均得到的过采样结果复制到ADCC的设定点寄存器,从而产生滞后。如果未超过阈值,则不会发生DMA复制,也就不会触发输出振荡器模块的DMA更新。
该解决方案的输出振荡器模块负责生成所需输出频率的时钟信号。该输出信号在内部连接到占空比发生器,进而将输出频率减半,但会产生50%的占空比输出。因此,输出振荡器模块以输出频率的两倍运行。
输出振荡器模块的核心是NCO(图6)。NCO外设通过在输入时钟的上升沿向累加器添加增量值来工作。累加器溢出用于获得外设的输出。
图6:输出振荡器模块负责生成所需输出频率的时钟信号。
在此示例中,NCO2已设置为在内部创建所需的输入时钟频率,从而从14位输入获得100kHz输出。之所以使用14位结果,是因为来自ADCC本身的12位结果不足以在没有外部时钟源的情况下生成100kHz输出。
如果改变NCO2的输出频率,或使用替代源,则输出频率将缩放到不同的输出范围。例如,如果NCO2降低到1.28MHz,则输出最大为10kHz。
该解决方案的占空比发生器模块负责创建50%的占空比输出(图7)。此功能是可选的,尽管占空比会在更大程度上变化,但NCO的输出可以直接使用。
图7:占空比发生器产生50%的占空比输出。
该发生器使用可配置逻辑单元(CLC)之一实现。CLC是类似于FPGA单个单元的分立可配置逻辑的小模块。CLC可用作分立逻辑门,例如AND-OR或OR-XOR。它们也可以配置为锁存器或触发器。在这个解决方案中,CLC被实现为带有复位功能的JK触发器。J和K保持在逻辑高电平。输出振荡器模块用作触发器的时钟。每个输入时钟脉冲都会导致输出切换,从而产生50%的占空比。值得注意的是,来自输出振荡器模块的频率抖动会影响占空比。
定时器6用作不稳定的“看门狗”定时器。如果输出没有产生边沿(上升沿或下降沿),则定时器将溢出而为CLC生成时钟脉冲。这控制了输出频率范围的低端。输出不会达到DC,而是以定时器频率的一半切换,从而获得6Hz输出。
此设计示例演示了使用硬件外设来创建通常必须使用外部IC创建的独立于内核的功能。这种配置的最大好处之一是外设操作是在软件中设置的,因此很容易适应最终应用。由于使用了大量外设,因此选择了PIC18-Q43系列MCU来实现该示例。
有关此示例的更多信息,可以参阅示例存储库中的README文档。示例存储库还包含频率电压转换器的实现,它可以在与电压频率转换器相同的器件上实现。源代码和文档可在GitHub上获得。
虽然高性能MCU和MPU仍然存在,但8位和16位MCU是执行小型专业任务的宝贵工具。这些任务不一定很复杂,但它们可能很耗时或时间紧迫。通过卸载任务,32位器件可以实现更简单的实现,从而提高可靠性、减少内存使用和降低功耗。
(原文刊登于EDN美国版,参考链接:Deploying task-specific microcontrollers simplifies complex designs,由Franklin Zhao编译。)
本文为《电子技术设计》2022年9月刊杂志文章,版权所有,禁止转载。免费杂志订阅申请点击这里。