MC9S08LL16 在水表气表中的设计应用
发布时间:2010-10-12 19:43
发布者:techshare
MC9S08LL 系列是飞思卡尔最新推出的内置LCD 驱动,极低功耗的单片机。 非常适合于在水表气表中的设计应用。 本文介绍MC9S08LL16 在智能气表的设计应用。由于水表与气表的工作原理非常相似,本文也可适用于水表的设计。 MC908LL16的主要功能 MC908LL16 是Freescale 基于HCS08 核的8 位单片机。具有极低功耗,内置LCD 驱动及丰富的外围接口。LL16 的主要特性如下: · 低工作电压1.8V-3.6V · 最大总线频率10Mhz · 内置琐频环电路FLL · 16K FLASH程序空间 · 2K字节RAM · 2个16位定时器 · 实时时钟计数器 TOD · 8路12位A/D · 模拟比较器 · 内置LCD驱动,可配置为8*24 或4*28模式 · 1个外部中断和8个外部键盘中断KBI · 内部RC振荡器的看门狗 · 低电压检测电路LVI · 1个SPI,I2C,SCI MC9S08LL16的低功耗特性 在水表气表中的应用中, 都是电池供电, 所以低功耗是设计中首要考虑的因素。系统功耗由两部分组成: 单片机本身的功耗和外部电路的功耗。 由于外部电路的功耗基本上是固定的,因此选用低功耗的单片机至关重要。LL16是目前业界功耗最低的单片机之一。 单片机本身的功耗包括正常运行时的功耗和睡眠时的功耗。 在水表气表中的应用中,单片机大部分时间工作于睡眠状态, 因此睡眠时的电流至关重要, 睡眠时的功耗主要决定系统的平均功耗。下图为LL16各种模式下的电流参数表: 从表中看出, 睡眠3(STOP3 )模式的电流为 400nA, 睡眠2(STOP2 )模式的电流为 350nA。由于STOP2 与STOP3功耗相差不大,但是STOP2下可以保持工作的外设很少,并且从STOP2唤醒的条件严格得多,从STOP2唤醒后,程序也会从复位处重新执行,且所有寄存器设置会回到默认状态,在实际应用中没有STOP3模式方便, 因此建议采用STOP3模式。 在水表气表中的应用中, 进入睡眠时, LCD屏需要常亮, 外部32.768 kHz的晶振不能停振,因为TOD模块采用外部32.768 kHz的晶振作为时钟源实现软时钟。 把这些模块的功耗考虑进去, 那么进入睡眠状态时, LCD常亮, TOD模块工作(定时唤醒MCU),外部32.768 kHz的晶振工作, MCU本身的功耗仅为2uA左右。 另外有一个参数对系统功耗的影响也非常重要, 即从睡眠模式唤醒的时间。 唤醒时间越短越好, 因为唤醒的过程中, 功耗会比较大。 LL16从睡眠3(STOP3 )模式唤醒的时间非常短, 只有6uS, 大大低于业界的大部分同类产品。 下面将以LL16在预付费IC卡气表中的应用为例, 介绍各模块的使用。 IC卡气表的原理框图 下图为预付费IC 卡气表的原理框图: 电源电路 气表和水表采用电池供电,气表一般采用碱性电池或锂电池。 如果采用碱性电池,一般使用四节。 因此电池电压需经LDO降压到3V供给MCU。 由于IC卡工作电压有5V或3V的,如果采用工作电压为5V的IC卡, 电池电压需经另一LDO降压到5V供给IC卡。 在水表普遍采用锂电池供电, 锂电池电压可以不需需经LDO降压直接供给MCU,因为LL16工作电压范围为1.8V-3.6V. 晶振电路 LL16内部有琐频环电路(FLL)可以把MCU运行的总线频率倍频上去, 最高可以倍频到20Mhz。 同时LL16内部有RC振荡器, 校准后的精度可以达到±2%(±2%为全温度范围的最大误差。常温下该精度为±0.2%)。 由于在大部分设计中使用软时钟而省去外部的专用RTC芯片以节省时间成本, 所以选择外接32.768k的晶振,以保证时钟的精度。时钟模块的初始化程序如下: void ICS_init(void) { ICSC1 = 0x00; ICSC2 = 0x47; ICSSC_DRST_DRS=0; while((ICSSC & 0xC0) != 0x00) { } } EEPROM接口电路 由于在气表水表应用中,需要不断地保存信息,例如:时间,当前用气/水量,剩余用气/水量等。因此需要EEPROM来保存这些数据。LL16的FLASH可以自我擦写,可以用来模拟EEPROM. 需要注意的是LL16 FLASH的擦写次数有限,常温下为10万次. 如果需要更多的擦写次数, 需要外接EEPROM。下面以外接24LC64为例介绍它的接口应用, 硬件接口电路如下: 为了降低功耗, 24LC64的电源通过I/O口 PTB6控制。当需要读写24LC64时,PTB6输出高电平, 给24LC64供电,否则输出低电平, 关闭24LC64的电源。 IC卡接口电路 在气表应用中,根据存储介质的不同有CPU卡,IC卡,RF卡等。由于IC卡具有保密性强, 数据容量大,使用方便, 成本低等特点, 因此在预付费卡表普遍应用。 目前普遍采用的是SLE442。 这里以SLE4442为例,介绍IC卡如何与LL16进行接口及操作。SLE4442内置256字, 具有写保护和安全代码可编程等特点。 由于LL16工作在3V, 如果采用5V工作的SLE4442,需要电平转换。下图为LL16 与5V工作的SLE4442的接口电路图, 如果采用3V工作的SLE442卡, 则可省去电平转换电路。 PTA1,A2与数据线DATA相连, PTA0与时钟线CLK相连, PTC7与复位脚RST相连。 PTA3控制SLE4442的电源。 对SLE4442的操作主要包括读写SLE4442的主存储器, 保护区存储器和安全区存储器。 对SLE4442写操作之前,必须先进行安全认证。 如果连续三次认证失败, 则IC卡被作废, 再也无法使用。PTA5,A4用于插卡检测, 检测IC卡是否插入卡座。 可以采用定时查询的方式或中断方式。 下面以读主存储器起始地址为0x20的3个字节为例说明它的编程: /************* main function ************/ void main (void) { unsigned char buffer; //read main memory at address 0x20. 21, 22, and stored at buffer Read_4442_main_memory(0x20, 3, buffer); } // read main memory function void Read_4442_main_memory(unsigned char Address, unsigned char number, unsigned char *data) { unsigned char command; command[0] = 0x30; command = Address; send_SLE4442_Command(command); send_SLE4442_Data(number, data); } 电池电压检测 由于气表采用电池供电, 因此需对电池电压进行监测, 在电池耗尽之前, 报警提醒用户更换电池。 虽然LL16内部有掉电检测电路LVI, 但使能该模块将消耗较大的电流, 所以不宜采用。 可以利用LL16内部模拟比较器或A/D模块监测电池电压,A/D模块或内部模拟比较器会消耗一定的功耗, 为了降低功耗, 可以采用定时检测的方法, 因为电池电压是缓慢下降的。 在水表中, 如果采用锂电池直接供电, 这里介绍一种简便的方法用于电池电压检测:在LL16的内部集成一个1.17V的带隙基准电压,此带隙基准电压内部连接到ADC的输入通道AD27; 因此可以不需要任何外部电路,AD模块只需定时采样此基准电压,由此可换算出电池电压。 这种方法的好处是,不需要外部任何器件, 既节省成本又节省空间,而且可以获知当前准确的电池电压。它的原理如下: AD的参考电压设为VDD, VDD即为电池电压, 如果AD设为12bit模式 那么:带隙基准电压的AD值(AD27)=(1.17V / VDD) *4096 = (1.17V/ 电池电压) * 4096;所以: 电池电压= (4096 / 带隙基准电压的AD值(AD27)) * 1.17 (V) 电机驱动电路 在气表应用中,采用直流电机来开关阀门。 其驱动电路普遍采用H桥电路, 如下图。此电路成本低,可靠性高。 当PTC3,PTC4同时输出高电平或低电平时, 电机不工作。 当PTC3输出高,PTC4输出低时, 电机向一个方向转动。 当PTC3输出高, PTC4输出低时, 电机向反方向转动。 PTC2用作电机到位检测。 软时钟的实现 由于在气表水表应用中, 对时钟的要求并不是特别精确, 因此可以利用LL16的TOD模块方便地实现软时钟, 从而省去外部的实时时钟芯片, 降低系统成本。 TOD模块使用非常简单,下图为它的内部结构图: TOD的时钟源有三个, 即内倍的1 kHz RC振荡器, ICSIRCK时钟及外部晶振时钟。考虑到精度因素, 所以选用外部32.768k晶振作为时钟源。 TOD模块对时钟源进行计数,可产生1S或1/4S中断。 因此可利用这1秒钟一次的中断实现软时钟。 同时此中断把CPU从睡眠模式唤醒, 用来查询IC 卡座, 流量脉冲计数,以及电池电压检 测等。TOD的初始化如下: void TOD_init(void) { TODC = 0x11; TODC_TODEN =1; TODSC=0X08; } TOD的中断服务程序: void interrupt VectorNumber_Vtod RTC_ISR(void) { TODSC_SECF = 1; // clear 1s interrupt flag Clock_processing(); } TOD 的中断服务程序: void interrupt VectorNumber_Vtod RTC_ISR(void) { TODSC_SECF = 1; // clear 1s interrupt flag Clock_processing(); } LCD 驱动 LL16内部有LCD驱动模块, 可配置为24*8,或28*4。 LCD与I/O复用, 多余的段可设为普通I/O。注意,所有和LCD驱动复用的GPIO,在作为I/O功能使用时,其输出模式为开漏,需要外接上拉电阻。 LCD驱动是LL16的一大特色, 具有许多优越的性能。 · 低功耗, LCD模块仅消耗900nA的电流 · 可配置为24*8即8COM端驱动模式, 从而节省更多的I/O口 · COM 和SEGMENT可随意配置, 方便布线, 从而提高EMC性能。 · 具有频率可调的闪烁功能, MCU在睡眠模式仍然工作, 从而达到更省电的目的。 · 内置电荷泵, 产生LCD驱动所需的偏置电压 · 内置可调的稳压电压源, 此稳压电压源可作为LCD的输入电压, 通过内置电荷泵, 产生LCD驱动所需的偏置电压。 当电池电压降低时, 可保证LCD的对比度不受影响, 这一点对水表设计非常有用。 · LCD的输入电压有多个选择, 可支持3V或5V的LCD屏 LCD驱动模块的内部结构图如下: LCD 的外部电路非常简单,只需几个电容, 见下图。 如果采用四节干电池供电, 由于6V的电源电压经过LDO产生稳定的3V作为MCU的电源, 所以LCD的输入电源可选为VLL3=VDD。 LCD驱动模块的初始化如下: void LCD_init(void) { LCDRVC = 0x00; LCDSUPPLY = 0x85; LCDC1=0X00; LCDC0 = 0xA3; } 如果采用锂电池直接供给MCU, LCD的输入电源可选为来自于MCU内部的稳压电源,这样的好处是, 对比度不会因为电池电压的降低而受影响。 LCD驱动模块的初始化如下: void LCD_init(void) { LCDRVC = 0x80; LCDSUPPLY = 0x87; LCDC1=0X00; LCDC0 = 0xA3; } 流量脉冲检测: 目前普遍采用双干簧管进行流量检测,其缺点是没有霍尔传感器稳定。 但霍尔传感器功耗相对要大,成本要高。 随着成本的逐渐减低,将来霍尔传感器有取代双干簧管的趋势。 双干簧管把流量信号转换成脉冲信号, 因此利用I/O口可以很方便地检测流量脉冲信号。 为了降低功耗, 检测电路的电源通过IO口进行控制。 由于气/水表的流量脉冲信号之间的间隔比较长, 因此可以采用定时查询来计数脉冲个数, 也可以接到键盘中断口利用中断方式检测。 下图为接口电路图。其中:PTB7 用做断线检测。 PTC0,PTC1用做流量脉冲的检测。 蜂鸣器电路 蜂鸣器电路如下: 结束语 由于LL16具有超低功耗, 内置LCD驱动及丰富的外围接口, 性价比高等特点, 因此非常适合于在水表气表中的设计应用。在本参考设计中, 系统功耗在LCD常亮的状态下, 大约为4.5uA。 在水表气表设计中, 如何降低功耗,是设计中的要点。 |
网友评论