MC9S08LL16 在水表气表中的设计应用
时间:12-02
来源:互联网
点击:
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。 在水表气表设计中, 如何降低功耗,是设计中的要点。
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。 在水表气表设计中, 如何降低功耗,是设计中的要点。
MC9S08LL16气表水 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)