单片机低功耗技术及应用
作者:山西大学计算机系清华大学访问学者 李月香 清华大学自动化系 袁 涛 木合塔尔
摘要:介绍单片机的低功耗设计技术特点及单片机应用系统中的低功耗设计要注意的几个问题,并列举了充分利用片内资源实现低功耗及C语言源程序。
关键词:单片机 低功耗 设计
随着集成电路技术和工艺的飞速发展,真正单片化的单片机已经成为主流产品。它的绝在部分资源都在单片机芯片内部;过去需要用外部扩展器件才能实现的功能,如ROM、RAM、A/D、D/A、数字量I/O、显示驱动等功能,现在在单片机内部就可以完成。单片机真正单片化,省去了大量的硬件开发调试工作,大大地提高了工作效率;系统先天的可靠性、抗干扰能力得到了显著的改善。经实验测试,实现同样功能的系统,采用单片方式比总线扩展方式具有更多的优点。系统不仅功能强、性能可靠、成本降低,而且进一步微型化和便携化。因此,使用电池作为系统的电源也越来越普遍。系统的最小电源消除和最大的电池寿命就成为主要的技术要求。例如1999年的多国仪器仪表展览会上,不止一家国外公司展出了使用电池的工业流量计,5~10年都不必更换电池和进行维护。所以低功耗单睡要同的应用有着非常广阔的天地。低功耗单片机应用符合现代电子终端产品的要求:便携、节能、可靠等。目前国际上先进的单片机生产厂商,如日本NEC、富士通、爱普森和美国TI等公司都采用了低功耗设计。笔者在一些应用中使用了日本NEC公司的78k0和78K0S系列的单片机,其休眠状态下的功耗电流可达到0.05~0.01μA。
1 单片机的低功耗设计技术
1.1 高集成度的完全单片化设计
将很多外围硬件集成到了CPU芯片中,增大硬件冗余。内部以低功耗、低电压的原则设计,这给单片机的低功耗设计提供了很强的支持。
1.2 内部电路可选择性工作
通过特殊功能寄存器选择使用不同的功能电路,即依靠软件选择其中不同的硬件;对于不使用的功能使其停止工作,以减少无效功耗。
1.3 宽电源电压范围
先进的单片机芯片工艺特别决定了单片机在很宽的电源电压范围内部能正常工作。例如,NEC公司的78K0和78K0S系列的单片机,可以在1.8V~5.5V电源电压范围内正常工作。单片机供电电压范围的放宽,可以进一步拓宽单片机的应用领域,尤其是便携式或掌上型仪器或装置,可以放心地使用电池作为电源,而不必关心电过程电压曲线是否平衡、是否会影响单片机正常工作,更不必因电池供电而专门增加稳压电路,从而可减少大约1/3的功率消耗。
1.4 具有高速和低速两套时钟
系统运行频率越高,电源功耗就会相应增大。为更好地降低功耗,内部集成了两套独立的时钟系统,高速的主时钟和32.768kHz的副时钟。也可在满足功能需要的情况下按一定比例降低CPU主时钟频率,以降低电源功耗。在不需要高速运行的情况下,可选用副时钟低速运行,进一步降低功耗。通过软件对特殊功能寄存器赋值可改变CPU的时钟频率,或进行主时钟和副时钟切换。
 
1.5 在线改变CPU的工作频率
可根据CPU处理任务的不同,在外部振荡器不变的情况下,通过程序改变处理器时钟控制寄存器PCC的值,在线改变CPU的频率。CPU在几种不同频率下工作的电源功耗比较如图1所示。
1.6 后备功能
后备功能是为了进一步降低系统功耗。CPU用主时钟时有HALT(待机)模式和STOP(休眠)模式,用副系统时钟时有副时钟运行模式和HALT模式。如表1所示。
表1 NEC单片机后备模式
时钟源 模 式 描 述
主系统时钟 HALT CPU时钟关闭,外围时钟工作
STOP 主时钟停振,除中断控制器外的其它外围电路停止工作
副时钟系统 副时钟运行 主时钟停振,CPU使用副时钟,钟表定时器工作,其它外围电路停止工作
HALT 主时钟停振,CPU时钟关闭,钟表定时器工作,其它外围电路停止工作
1.7 内部钟表定时器
NCE单片机内部提供了时钟定时器,每隔0.5s产生一次中断。在系统处于休眠状态时,仍可定时被唤醒。对于单片机只须间歇工作、但又需要实时计时功能的应用场合,提供了非常有效的节能方法。CPU在不工作时可进入STOP模式或HALT模式,进入低功耗的后备功能状态。当时钟中断到来时,CPU回到正常工作状态,进入时钟中断处理程序做时钟更新处理,然后再进入后备功能状态。
2 单片机应用系统中的低功耗设计主要注意的问题
(1)系统中单片机以外的其它电路器件尽可能选用静态功耗低的器件,如选用CMOS电路芯片。
(2)外部设备的选择也要尽可能支持低功耗设计。
(3)设计外部中断唤醒电路,使单片机在等待时可进入休眠模式或待机模式,需要时由外部中断信号唤醒。
(4)设计外部器件的电源控制电路,使外部器件或设备在不工作时关断供电,减少无效功耗。
(5)设计充分利用系统低功耗特点的软件。
3 在线改变CPU的时钟频率以降低功力量的C语言程序举例
CPU在不需要高速运行时,可设置在较低的时钟频率下工作,在运行过程中可根据需要在线改变CPU的时钟频率。下面是一个通过按键产生外部中断信号改变NCE单片机μPD780058的CPU时钟频率的程序,它使CPU在主、副时钟切换运行。通过I/O口P6的位0引脚连接1个LED小灯,每按下一次按键就使CPU的时钟频率改变。在主时钟和副时钟频率下工作时,用同样的软件延时程序控制小灯点亮的时间,以此观察CPU的运行速度。
程序清单:
//**************宏定义**************
#define PCCMODEM 0x00 //CPU时钟控制寄存器PCC
//定义为选主系统时钟
#define PCCMODES 0xf0 //CPU时钟控制寄存器PCC
//定义为选副系统时钟
#define PORT60 1 /P6口位0赋初值/
#define PORTM600 //P6口位0设为输出
#define INTM0M 0x00 //定义外部中断INTP1的
//中断触发沿为下降沿
//*****单片机内部功能使用的定义*****
#pragma sfr //使用特殊功能寄存器
#pragma HALT //使用HALT功能
#pragma interrupt INTP1 inter RB1 //使用中断功能
#pragma DI //使用关中断功能
#pragma EI //使用开中断功能
//*************变量定义*************
unsigned int b; //定义软件延时计数变量
char msflag; //定义主、副时钟切换标志
//**************主函数**************
void main()
{
PCC=PCCMODEM; //CPU用主系统时钟
P6.0=PORTM60; //P6口的位0赋初值
PM6.0=PORTM60; //P6口的位0为输出
INTM0=INTM0M; //INTP1下降沿触发
PMK1=0; //清除INTP1中断屏蔽
Msflag=0; //选用主副时钟的标志
EI(); //开中断
While(1)
{
if(msflag= =0) //时钟切换标志为0时
msflag=1; //标志变为1
else msflag=0; //否则标志变为0
P6.0=0; //点亮LED灯
b=0; //软件延时的计数值赋初值
while(b<=10000)
{
b++; //软件延时(注意系统时钟为)
//主时钟与副时钟延时
//时间的长短是不同的)
}
P6.0=1; //熄灭LED灯
HALT(); //进入HALT状态
}
}
//************中断服务函数************
void inter(void)
{
if(msflag= =0) //若时钟切换标志为0
PCC=PCCMODES; //CPU使用副时钟
Else //否则
PCC=PCCMODEM; //CPU使用主时钟
}
低功耗单片机的应用使电子产品、控制系统更符合当今时钟的要求,达到便携、低功耗和高可靠性。加之用高级语言(如C语言)对单片机进行开发的工具日臻完善。更为快速高效的开发应用提供了良好的条件和环境。低功耗的节能单片机应用系统将会带来很好的社会效益和经济效益。