|
大部分低成本的传感器都有需要转变成数字值的输出电压,这样微控制器就可测量并将其转化为二进制或 ASCII字节。如今的微控制器具备进行该过程所需的所有功能,略添一些软件,我们就可制成一个低成本系统,以易于阅读的格式读取传感器电压和输出的测量数据。如果方法正确,代码就可成为不同系统应用程序的基本功能构建块。
对于本文所概述的项目,笔者侧重于讨论软件设计和尽可能减轻微控制器工作负担的子程序,从而使其在传感器数据进入系统时可执行其它任务。器件选择如下: * Freescale的MPX5100硅压力传感器,它带有片上温度补偿、校准和信号调理功能;压力在0至14.5psi之间时,电压输出与压力成比例; * ADI公司的ADXL250,具备信号调理功能的±50g全集成双轴加速计,它的输出电压与压力(g)成正比; * ZiLOG ENCORE!微控制器,带有64K闪存程序存储器、4K静态储存器(SRAM)、8通道10位A/D转换器、通用输入输出(GPIO)管脚、串行端口等。 笔者喜欢构建能以不同方式控制整个系统的短程序或应用程序接口(API)。在主程序(列表1)中,可借助新函数调用为这个主循环添加其他函数;同时评估每个函数在最佳或最差状态下的运行时间。若仅向主循环增加函数调用,该主循环仍会保持清晰和容易遵循。缩减细节讨论,进入固件的下面几层。随后的程序流程是校验和设定位或标记,以及利用switch语句将您的系统引导至不同的操作模式。您可以开启一个标记,这样其他程序就会开始将传感器数据存储到缓冲器,或向switch语句传递口令以设置一个针对传感器输入的跟踪触发点。 在“do"语句以上的函数实现了系统初始化,并启动了压力传感器和加速计。“do"循环内的函数始终运行。在压力传感器和加速计的初始化API中,定时器控制何时启动新的传感器采样。在定时器初始化传感器子程序(ISR)中,传感器数据在缓冲器(如果激活)内实现阅读并存储,而其数值须经过告警设置点的校验。这样,告警标记也设在ISR之中,一个新采样即已启动。若转向不同的传感器流程,switch语句可控制应用程序所需的不同状态。align="LEFT" BORDER=0 >
定时器中断 为了实行多任务处理,需要激活并编译一个定时器中断程序,这将需要耗用一些系统 的MIPS来执行采样以及传感器API控制程序。例如列表2所示的这种定时器中断程序。 将信息导入函数之中 在设计一个函数时,导入您认为会有助于控制整个系统的一切信息。在上述压力传感器函数中,笔者导入了有助于控制系统的一些变量: 
列表1:主程序。 1. "Contin"--转换传感器输入信息并存储至缓冲器中; 2. "Buff_size_ps"--用于存储采样值的字的数量。 3. "Sample_time_ps"--对传感器采样的频度; 4. "Alarm_trip_ps"--传感器中断程序的采样值大于或等于某值时的告警标记。 请谨记将来您还可能会在其他方案中再度使用这些函数,所以应尽可能使这些函数具有灵活性。 福特F150增压器仪表改装实例 根据上述设计思想,笔者的一项有趣应用是改装福特F150超动力哈雷皮卡。福特为该车的增压器设置了压力传感点;而笔者想添置一个外型时尚的模拟压力表,以监控增压器的压力(见图3)。通过添加微控制器,笔者还能增加其他功能,如压力告警启动点(trip point)LED、峰值压力点随时间的变化显示、发声等。 本文小结

列表2:一种定时器中断程序。 除了这个有趣的例子,许多的应用程序可从以下罗列的编程方法中获益。在您从事硬件和软件设计时,这种秘诀可用于创建清晰、简短的代码段,便于在其他项目之中复用。 1.校验并测量子程序在最佳和最差状态下的执行时间; 2.保持“主”循环的明晰;在此级别上仅添加函数调用; 3.为函数提供完整标签,例如“Pressure_Sensor_process()”而非PS(); 4.设定变量的极限并对其进行校验; 5.对您的函数构造原型(prototype); 6.测试所有的“what if”状态。 作者:Steven Pope () |