任务分解为一个个模块后就可以动手实现该模块的功能。在单片机编程中根据逻辑软件可以分为硬件驱动层和应用层。硬件层主要驱动MCU的硬件,硬件驱动层分为MCU功能模块的驱动和外部原件的驱动。

    MCU模块的驱动是首先必须完成的,比如IO、定时器、UART、ADC、看门狗,完成这一部分需要对MCU比较熟悉。对MCU的架构要有比较清楚的理解,但是该部分的复用性非常强。任何时候都要相信你不是第一个吃螃蟹的人。所以有很多前人已经积累的资料借鉴性非常强。有时候硬件驱动层直接拿来用就行了。只需要基本浏览一遍,知道原理和调整的方法。如果第一次接触的MCU,在网络、论坛以及厂家提供的资料中会得到非常丰富的资料以及代码。将与本次项目相关的部分详细的研读后即可。

    学习一个新的MCU或者硬件是一件极其消耗时间的事情。为了快速完成工作,可以只关心与自己相关的外设或者寄存器的使用。一般厂家都会提供MCU的各个外设示例程序。这些程序因为是厂家专业工程师编写的,所以程序非常可靠,可以直接引用。甚至可以使用厂家的示例代码来验证硬件设计的准确性和可靠性。厂家示例程序的注释和可读性非常良好,甚至可以省去读datasheetde 时间,只需参照datasheetde读懂程序即可。参考厂家的示例代码是非常高效的终南捷径。

   完成MCU 外设驱动层以后,可以编写简单的应用验证硬件设计的正确性,比如控制一下每个IO驱动的LED、继电器功能是否正常。AD采样可以到正确信号。UART可以正确发送数据等。如果硬件功能完全正确,可以顺便编写硬件驱动程序。将硬件驱动封装为函数,可以通过调用该函数完成MCU 外设的操作。

    外部原件一般包括功率放大芯片、隔离芯片、存储芯片、电平转换芯片。功率放大芯片比较典型的就达灵顿管,比如可以使用达林顿管来驱动继电器或者LED。在控制逻辑当然是通过IO来操作的。只是达林顿管放大了MCU GPIO的驱动能力。单个的MCU IO典型的输出电流一般小于20mA。使用达灵顿管放大可以达到0.5A,而且电流可以在12V以上。

    隔离芯片典型就是光耦。光耦可以实现内部与外部电路的彻底隔离。隔离电压范围可以高达2kV。提高了系统安全性和健壮性。

     存储芯片可以存储设备的运行参数,使得系统参数的在重新上电后可以读取到使用者设置的参数。 

   电平转换芯片是为了增强系统的驱动能力或者实现CMOS与TTL电平的匹配。在74系列芯片中74HC245是比较典型产品。一般可以用于数码管或者LED的驱动,增强LED的亮度。或者实现TTL电平与CMOS电平的转化。

    根据原理图及硬件的设计我们可以编写外部元件的驱动。完成外部元件的驱动编写。比如完成LED、数码管的显示,外部存储芯片驱动的编写,键盘状态的读取等。将外设的驱动封装为函数,可以方便的调用。

    完成硬件驱动层级基本上就完成了硬件层程序,硬件层是为应用层提供支撑的。为应用层提供数据输入,并且执行应用层对硬件的操作。试业务层真正面向业务,脱离硬件的操作。

    实现对硬件驱动需要坚实的硬件知识。业务层就只需要业务流程知识就可以了,真正的工程师应该将精力聚集在业务层。业务层体现了工程师的专业水平,也是工程师在行业安身之本。

    任何系统都是三个部分组成----数据输入、数据处理、数据输出。根据业务流程设计数据比较方便。数据的设计关系到项目实现的难度降低,以及系统的可维护性提高。

    比如我们设计一个温度报警器,功能要求非常简单。检测某个排风系统的温度,当温度高于某个温度或者低于某个温度时,打开蜂鸣器报警。报警功能可以打开或者关闭。那么我们可以设计出以下数据。

   温度、报警使能开关、高温报警下限、低温报警上限。

    温度是输入的数据,需要系统从外部测量获取,一般通过热敏电阻、PT100等传感器获得。报警使能开关、高温报警下限、低温报警上限是设定的参数。是是否产生报警输出、以及是否报警的判断依据。属于数据处理的。 报警器打开或者关闭就是数据的输出。以上就是一个完整的系统。

   系统依赖运行的数据分为两种,测量数据和配置数据。测量数据是从外部测量获得,比如温度就是通过传感器获得。测量的数据分为两种---模拟量和数字量。像环境温度就是模拟量,原理上精度与系统AD的位数有关。数字量有时又称为开关量。测量的数据只有1、0(高电平、低电平)。键盘是比较常见的开关亮。外部输入的开关量状态一般称为开路和闭路。

    配置数据工程师是设计出,存储在存储芯片中,系统上电后读出存储的数据。作为设备处理数据的依据。因为配置数据需要断电以后不丢失,所以一般保存在flash中或者铁电存储其中,当设备上电读出该数据。在该数据更新后必须刷新存储器的数据。

    数据的处理是设备的核心,也是应用层任务的核心。因为有了硬件层驱动后,应用层基本就是数据的处理。每个任务可以处理一到两项数据的输入。并且更新数据的输出。

   比如对温度报警器应用层就是设定的“报警使能开关、高温报警下限、低温报警上限”更新输出(报警器的状态)。

   首先判断“报警使能开关”是否打开,如果“报警使能开关”关闭,关闭报警输出。此次任务结束。“报警使能开关”打开,使用测量的温度值进行处理。如果温度值高于“高温报警下限”,那么打开报警器,否则关闭。如果温度值低于于“低温报警上限”,那么打开报警器,否则关闭。最后更新报警器状态。

   现在的AD采用速度非常快,在实际应用中要考虑的问题比较多。如果我们只是简单按照采样的温度以及设定参数来决定报警器的打开和关闭。由于干扰的问题,系统又过于灵敏,可能会产生误报。这个问题在实际应用中非常主要,所以必须采用办法消除干扰的因素。

    在不增加硬件成本的情况下,在应用层增加软件的处理是非常可取的。最简单的办法就是增加判断的时间。比如我们可以10mS更新一次采样的温度值。当连续温度异常2S以上我再更新报警器的状态。在一定程度上增强了系统的可靠性。

    报警器的例子非常简单,但是也包括了硬件层与应用层。在下一节我们以一个实际的例子来分析任务的实现。总的办法是逐级拆分,分层完成。