AVR电源管理_睡眠模式范例_第1页
AVR电源管理_睡眠模式范例_第2页
AVR电源管理_睡眠模式范例_第3页
AVR电源管理_睡眠模式范例_第4页
AVR电源管理_睡眠模式范例_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* *      AVR  电源管理_睡眠模式范例         * */ /* 本程序简单的示范了如何令AVR ATMEGA16进入睡眠状态及唤醒 电源管理及睡眠模式的介绍 进入最低耗电的掉电模式 关闭各种模块 外部中断唤醒  M16掉电模式的耗电情况(看门狗关闭),时钟为内部RC 1MHz      0.9uAVcc=5.0V &

2、#160;手册的图表约为1.1uA      0.3uAVcc=3.3V  手册的图表约为0.4uA      /测量的数字万用表是FLUKE 15B,分辨率0.1uA 这个程序需要MCU进入休眠状态,为实现最低功耗,JTAG接口会被关闭,只能通过LED的变化来观察程序的运行。 这个实验里面,用STK500(AVRISP) ISP下载线来烧录更方便。 熔丝位设置  1 关断BOD功能 BODEN=1  2 

3、如果用ISP方式烧录,就可以完全关闭JTAG口了  OCEEN=1,JTAGEN=1   熔丝位状态显示框,显示芯片的各个熔丝位的详细状况,AVR的熔丝位打勾表示0,表示启用该选项;取消表示1,表示不启用该选项。*/ #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <avr/delay.h> /时钟定为内部RC 1MHz,F_CPU=1000000

4、 也可以采用其他时钟 #include <avr/sleep.h> /* sleep.h里面定义的常数,对应各种睡眠模式 #define SLEEP_MODE_IDLE         0 空闲模式 #define SLEEP_MODE_ADC          _BV(SM0) ADC 噪声抑制模式 #define SLEEP_MOD

5、E_PWR_DOWN     _BV(SM1) 掉电模式 #define SLEEP_MODE_PWR_SAVE     (_BV(SM0) | _BV(SM1) 省电模式 #define SLEEP_MODE_STANDBY      (_BV(SM1) | _BV(SM2) Standby 模式 #define SLEEP_MODE_EXT_STANDB

6、Y  (_BV(SM0) | _BV(SM1) | _BV(SM2) 扩展Standby模式 函数 void set_sleep_mode (uint8_t mode); 设定睡眠模式 void sleep_mode (void); 进入睡眠状态 */ /管脚定义 #define LED 0   /PB0 驱动LED,低电平有效 #define KEY_INT0 0   /按键, 

7、60; 低电平有效 #define KEY_INT1 0   /按键,   低电平有效 #define KEY_INT2 0   /按键,   低电平有效 void delay_10ms(unsigned int t) /* 由于内部函数_delay_ms() 最高延时较短   262.144mS1MHz / 32.768ms8MHz / 16.384ms1

8、6MHz 故编写了这条函数,实现更长的延时,并能令程序能适应各种时钟频率 */ while(t-) _delay_ms(10); int main(void) unsigned char i;     /上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻     PORTA=0xFF; /不用的管脚使能内部上拉电阻。     PORTB=0xFF;     PORTC=0xFF;

9、    PORTD=0xFF;     DDRB|=(1<<LED); /PB0设为输出高电平,灯灭        /*     端口引脚     进入休眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。     最重要的是避免驱动电阻性负载。     在休眠模式下I/O&

10、#160;时钟clkI/O 和ADC 时钟clkADC 都被停止了,输入缓冲器也禁止了,从而保证输入电路不会消耗电流。     在某些情况下输入逻辑是使能的,用来检测唤醒条件。用于此功能的具体引脚请参见“ 数字输入使能和休眠模式” 。      如果输入缓冲器是使能的,此时输入不能悬空,信号电平也不应该接近VCC/2,否则输入缓冲器会消耗额外的电流。       IO作输出(DDR=1)时,维持状

11、态不变    */ /* 看门狗定时器(上电默认是关闭的) 如果系统无需利用看门狗,这个模块也可以关闭。 若使能,则在任何休眠模式下都持续工作,从而消耗电流。 在深层次的睡眠模式下,这个电流将占总电流的很大比重。 假设看门狗定时器使能了,关闭程式如下 1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“ 2. 在紧接的4 个时钟周期之内对WDE 写"0” */ WDTCR=(1<<WDTOE)|(1<<WDE); WDTCR=

12、(0<<WDE); /或使用wdt.h里面的wdt_disable()函数    /*    模数转换器(上电默认是关闭的)    使能时, ADC在睡眠模式下继续工作。    为了降低功耗,在进入睡眠模式之前需要禁止ADC。    重新启动后的第一次转换为扩展的转换。    假设模数转换器使能了,关闭程式如下      */     ADCSRA=(0<<ADEN);&#

13、160;     /*     模拟比较器(上电默认是打开的,需要手工关闭)     在空闲模式时,如果没有使用模拟比较器,可以将其关闭。在ADC 噪声抑制模式下也是如此。     在其他睡眠模式模拟比较器是自动关闭的。     如果模拟比较器使用了内部电压基准源,则不论在什么睡眠模式下都需要关闭它。否则内部电压基准源将一直使能。  关闭程式如下   */

14、ACSR=(1<<ACD); /* 掉电检测BOD (由熔丝位BODEN控制) 如果系统没有利用掉电检测器BOD,这个模块也可以关闭。 如果熔丝位BODEN 被编程,从而使能了BOD 功能,它将在各种休眠模式下继续工作。 在深层次的休眠模式下,这个电流将占总电流的很大比重。 设置熔丝位BODEN=1 关断BOD功能 */ /* 片内基准电压 使用BOD、模拟比较器和ADC 时可能需要内部电压基准源。 若这些模块都禁止了,则基准源也可以禁止。 重新使能后用户必须等待基准源稳定之后才可以使用它。 如果基准源在休眠过程中是使能的,其输出立

15、即可以使用。 当BOD、模拟比较器和ADC都禁止了,则基准源也自动禁止了。 */ /* JTAG 接口与片上调试系统 如果通过熔丝位OCDEN使能了片上调试系统,当芯片进入掉电或省电模式时主时钟保持运行。 在休眠模式中这个电流占总电流的很大比重。 下面有三种替代方法: 1 不编程OCDEN     2 不编程JTAGEN     3 置位MCUCSR 的JTD 当JTAG 接口使能而JTAG TAP 控制器没有进行数据交换时,引脚TDO

16、 将悬空。 如果与TDO 引脚连接的硬件电路没有上拉电阻,功耗将增加。 器件的引脚TDI 包含一个上拉电阻,因此在扫描链中无需为下一个芯片的TDO 引脚设置上拉电阻。 通过置位MCUCSR寄存器的JTD 或不对JTAG 熔丝位编程可以禁止JTAG 接口。 JTD: 禁止JTAG 接口(MCU控制与状态寄存器MCUCSR Bit7) 此位为0 时,如果JTAGEN熔丝位被编程则JTAG 接口使能。 如果这位为1, JTAG接口禁止。 为了避免无意的禁止或使能JTAG接

17、口,必须通过一个时间序列来改变JTD 位。 应用软件必须在四个时钟周期内将期望的数值两次写入JTD。 如果JTAG 接口没有与其他JTAG电路连接, JTD应该置位。这样做的原因是为了避免JTAG接口TDO引脚的静态电流。 在软件中关闭JTAG接口的方法      */ MCUCSR=(1<<JTD); MCUCSR=(1<<JTD); /* 掉电模式 当SM2.0 为010 时, SLEEP 指令将使MCU 进入掉电模式。 在此模式下,外部

18、晶体停振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。 只有外部可以运行中断例程了。然后返回到SLEEP 的下一条指令。 */ /MCUCSR|=(0<<ISC0)|(0<<ISC1)|(0<<ISC2); /INT2 的下降沿激活中断(默认的,这句话可以不写) GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);  /使能外部中断INT2 sei(); /使能全局中断 while(1) for (i=0;i<5;i+) 

19、0;/LED闪动10次后进入掉电模式的睡眠状态复位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或外部中断INT2 可以使MCU 脱离掉电模式。 这个睡眠模式停止了所有的时钟,只有异步模块可以继续工作。 当使用外部电平中断方式将MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。 从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。 唤醒周期与由熔丝位CKSEL 定义的复位周期是一样的。 如果在睡眠过程中发生了复位,则MCU 唤醒后从中断向量开始执行 使能的中

20、断可以将进入睡眠模式的MCU 唤醒, 经过启动时间,外加4个时钟周期后,MCU就 delay_10ms(30); PORTB&=(1<<LED);   /点亮LED delay_10ms(30); PORTB|=(1<<LED); /熄灭LED set_sleep_mode(SLEEP_MODE_PWR_DOWN); /设定为掉电模式 sleep_mode(); /进入睡眠状态 /* 也可以自行编写 MCUCR=(0<<SM2)|(1<<SM1)|(0<<SM0);  

21、;  /设定为掉电模式 asm volatile(“sleep” : : ); /进入睡眠状态 */ SIGNAL(SIG_INTERRUPT0)  /外部中断2服务程序 唤醒源 PORTB&=(1<<LED);   /点亮LED delay_10ms(50); PORTB|=(1<<LED); /熄灭LED delay_10ms(10); /*LED长亮5秒钟,熄灭1秒钟后,退出中断服务程序,然后返回到SLEEP 的下一条指令*/ SIGNA

22、L(SIG_INTERRUPT1)  /外部中断2服务程序 唤醒源 PORTB&=(1<<LED);   /点亮LED delay_10ms(50); PORTB|=(1<<LED); /熄灭LED delay_10ms(10); /*LED长亮5秒钟,熄灭1秒钟后,退出中断服务程序,然后返回到SLEEP 的下一条指令*/ SIGNAL(SIG_INTERRUPT2)  /外部中断2服务程序 唤醒源 PORTB&=(1<<LED); 

23、  /点亮LED delay_10ms(50); PORTB|=(1<<LED); /熄灭LED delay_10ms(10); /*LED长亮5秒钟,熄灭1秒钟后,退出中断服务程序,然后返回到SLEEP 的下一条指令*/ /*    程序运行效果      万用表打到直流电流的最小档位(uA分辨率),接到开关的两头      烧录后要把STK500拔出,否则无法测得正确的电流数据。    &#

24、160; 上电后LED闪动10次后进入掉电模式的睡眠状态  此时可断开开关  看看万用表的读数  然后接通开关      按下 INT2按键,将会发现LED长亮5秒钟,熄灭1秒钟后,退回主程序,LED闪动10次后进入掉电模式的睡眠状态      如果按下复位按键,马上复位。  */ /* 电源管理及睡眠模式 睡眠模式可以使应用程序关闭MCU中没有使用的模块,从而降低功耗。 AVR 具有不同的睡眠模式,允许用户根据自己的应用要求

25、实施剪裁。 进入睡眠模式的条件是置位寄存器MCUCR的SE,然后执行SLEEP 指令。 具体哪一种模式( 空闲模式、ADC 噪声抑制模式、掉电模式、省电模式、Standby 模式和扩展Standby模式) 由MCUCR 的SM2、SM1 和SM0 决定。 使能的中断可以将进入睡眠模式的MCU 唤醒。 经过启动时间,外加4个时钟周期后,MCU就可以运行中断例程了。然后返回到SLEEP 的下一条指令。 唤醒时不会改变寄存器文件和SRAM的内容。 如果在睡眠过程中发生了复位,则MCU 唤醒后从中断向量开始执行 需要了解AVR芯片内部不同的时钟系统及其分布,在选择合适的睡眠模式时非常有用。 MCU控制寄存器MCUCR  MCU控制寄存器包含了电源管理的控制位。    Bits 7, 5, 4  SM2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论