在众多便携式电子产品设计中,设计者常常要在降低功耗和完善功能做出之间艰难地抉择,为了降低功耗,常使MCU进入掉电模式,因此如何在任务到来时及时将其唤醒成为一个难题。AVR新推出的单片机,增加了WDT中断功能。WDT除了保证MCU意外死机复位功能外,还能在正常状态触发中断,唤醒掉电状态下的MCU,这为降低功耗提供了一种新的选择。
1 ATmega88单片机
ATmega88单片机是一款高性能、低功耗的8位AVR微处理器。3 V供电时,在未使能内部WDT的情况下,ATmega88的典型掉电电流小于0.5 μA;而且该单片机在1.8~5.5 V的电压范围内均能正常工作。ATmega88具有5种休眠模式,引脚电平变化和WDT溢出可引发中断及唤醒MCU。
1.1 几种休眠模式与功耗
ATmega88单片机具有5种休眠模式:空闲模式、ADC噪声抑制模式、掉电模式、省电模式和等待模式。其中,掉电模式典型功耗为1.8 V,0.5 μA。可见,掉电模式下MCU进入微功耗状态。为了实现最低功耗,最好使MCU长期处在掉电模式;任务到来时,自动唤醒执行任务,任务执行完成后再次进入掉电模式。而实现这一运行模式的关键是如何自动唤醒MCU。
1.2 WDT
WDT(Watch Dog Timer,监视计时器)由独立的128 kHz片内振荡器驱动。较其他单片机WDT溢出引起MCU复位功能外,ATmega88的WDT定时器溢出还可触发中断。ATmega88 WDT定时器逻辑图如图1所示。
WDT控制寄存器WDTCSR格式如下:
其中,WDIF为WDT超时中断标志;WDIE为WDT超时中断使能;WDCE为WDT修改使能;WDE为WDT使能;WDP[3∶0]为WDT定时器预分频器。当WDT使能时,WDP[3∶0]决定WDT的预分频器,通过设置WDT的预分频器可以调节WDT溢出时间间隔,如表1所列。
表1 WDT定时器溢出时间设置
图1 ATmega88 WDT定时器逻辑图
2 应用实践
设计一款实时温度测量存储装置,要求电池供电,连续工作一年以上。可以设定时间间隔从1 min到250 min自动测量记录温度。可以设定上下限超温报警和LED指示。温度计带232接口,可以将记录的数据上传到PC机,导入Excel,对数据分析备份。该温度计主要用来长期监测对温度变化敏感的场所,如食品仓库、养殖大棚等。原理框图如图2所示。
图2 温度计原理框图
2.1 任务分析
面对上述的设计任务,首先必须考虑功耗问题,温度传感器、实时时钟、存储器、RS232接口IC都必须选择低功耗IC;更重要的是,如何让单片机工作在最省电模式。对任务分析后,设计总流程如图3所示。上电系统初始化,执行既定任务,进入掉电模式;WDT定时唤醒MCU,返回循环体,再次执行任务,完成后又进入掉电模式。由于一次任务执行时间很短,总体上MCU处在掉电模式,从而实现微功耗。
图3 系统运行总流程
2.2 任务实现
总体方案确定后,在具体编程过程中,还需要注意很多细节;否则,单片机不能顺利唤醒,功耗也很难降低。
在进入掉电模式之前,需要恰当配置WDT:WDT使能,设定溢出时间,开WDT中断,开总中断。这样,当WDT定时器溢出时,唤醒MCU后首先进入WDT中断函数,然后返回到主循环体。WDT定时器溢出时间可以根据不同任务的实时性需要设置,从16 ms到8 s可选择。这里单次任务周期为1 min,WDT定时器设定为2 s,完全满足设计需要。WDT和休眠模式配置函数C程序如下(AVR GCC):
void wdt_and_sleep_mode_set (void) {
cli(); //关总中断
WDTCSR = _BV(WDCE) | _BV(WDE);
//允许修改WDT
//启动WDT,允许中断,定时2 s
WDTCSR = _BV(WDE) | _BV(WDIE) | _BV(WDP2)| _BV(WDP1) | _BV(WDP0);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//设置掉电模式
sei();//开全局中断使能
sleep_mode();//进入掉电模式
}
在执行以上函数后MCU进入掉电模式,2 s后,WDT溢出,唤醒MCU进入WDT中断函数。为了避免WDT复位,在中断函数中首先要置位WDIE,或者直接关闭WDT。WDT中断函数C程序如下:SIGNAL(SIG_WATCHDOG_TIMEOUT) {
WDTCSR = _BV(WDIE);//置位WDIE,避免WDT复位
//wdt_disable();//关闭WDT
}
中断返回将进入主循环体,执行既定的任务,完成任务后再次进入掉电模式。任务每次执行时间越短,功耗越接近掉电模式的功耗,这样设计的系统,很容易将功耗降低到10 μA以下。程序流程如图4所示。
图4 温度计程序流程
在进入掉电模式前,还要将系统中所有启用的功能模块(如ADC、SPI、TWI、UART)禁用,进一步降低功耗;当然,再次执行任务时,需要重新启用。还可以通过时钟功耗抑制寄存器PRR终止单独外设时钟的方法以降低功耗。例如,关闭ADC模块,可以向功耗抑制寄存器PRR中的PRADC位写“1”。
值得注意的是,在掉电模式下,要使端口引脚配置为最低功耗模式,必须避免引脚悬空和防止模拟输入电平接近VCC/2时消耗太多的电流。若引脚未被使用,则将引脚配置为输入,并使能内部上拉,给引脚一个确定的电平。
在启用UART数据通信模块时,特别注意的是: 在进入掉电模式前,一定要查询确认数据发送完成以后才能使MCU进入掉电模式,否则会出现通信错误。
结语
本文提出的基于WDT中断唤醒MCU的微功耗系统设计在温度测量记录仪中得到运用,实现1~250 min任意间隔定时自动测量存储,功耗达到10 μA以下,使用普通3 V钮扣电池供电,可以连续工作1年以上。