完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近在用mega16做一个电子门锁,电池供电需要低功耗,以前没有接触过这方面的,现在耗电方面做的非常不好,希望各位网友能点拨下。
我想法是先屏蔽了所有功能,只有上电后睡眠,使用的是Mega16的SLEEP_MODE_PWR_DOWN模式。 在睡眠前IO口初始化为:DDRA &= 0X00; PORTA &= 0X00; DDRB &= 0X00; PORTB &= 0X00; DDRC &= 0X00; PORTC &= 0X00; DDRD &= 0X00; PORTD &= 0X00; 外围电路上的东西都焊掉了,所有引脚相当于悬空了。这个配置是我尝试了几次后得的,这样配置在我的电路板上电流才最小。 然后我就进入mian中的while(1)...主函数如下: int main(void) { IO_Init();//能正常使用外设的IO配置 sei(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); while(1) { IO_Sleep();//就是上面提到的输入低电平的配置 sleep_enable(); sei(); sleep_cpu(); sleep_disable(); IO_Init(); //唤醒后再配置IO ErrSound();//控制蜂鸣器发声 } return(1); } 用上面的代码测了下,电流在1.7uA左右。可是这毕竟是测试下,功能还是要加上去了,所以第一步我就想开外部中断,因为门锁的刷卡和按键那部分电路是接在INT0 和 INT1外部中断上的,通信的方式是加了唤醒信号的韦根码。于是我就想先在SLEEP前把INT0和INT1配置为外部低电平中断(手册上写着的唤醒方式),然后再唤醒后再配置为边沿中断用于接收韦根码。 可是就在第一步就有问题,我在IO_Sleep后加了如下代码: DDRD |= 0x0c; PORTD |= 0x0c; MCUCR &= ~((1 << ISC01) | (1 << ISC00) | (1 << ISC11) | (1 << ISC10)); GICR |= (1 << INT0) | (1 << INT1); 好了,问题来了。电流立马串到了6mA。而且就算我不加改变外部中断的IO,也就是没有DDRD |= 0x0c; PORTD |= 0x0c;这两句电流也有4mA,这就搞不懂了,只是改变个内部的中断寄存器,为什么电流就变大了呢????? 后来我在while(1)里又加了句ErrSound()一个控制蜂鸣器发声的函数证明芯片也没有被唤醒。 再后面就不知道该怎么继续下去了,不知道哪位弄过的指点下,谢谢了 |
|
相关推荐
10个回答
|
|
首先得查明为什么“没有被唤醒”:检查下 ErrSound() 函数工作是否正常。如果不出声,那么可能是在睡眠模式、唤醒进入正常模式之间不停的转换,这样电流就上去了,同时被误认为没有被唤醒。
至于其原因或许和硬件也有关系……LZ晒晒 INT0 和 INT1 部分接口的电路? |
|
|
|
影响单片机功耗的因素:
(1) 时钟及其频率 —— 数字电路在状态(0或1)不改变的情况下,耗电非常少。耗电主要出现在状态改变的时候,因为这时门电路会进入放大状态。而且时钟频率越高,耗电越大。所以,在睡眠模式下,尽可能关闭不用的时钟。如有时钟必须开着,则尽量使用允许的最低频率。 (2) 外设 (Peripheral) —— 禁止所有不用的外设。 (3) IO 口 —— 主要是指悬空的输入口。这时,外界的干扰会使相应的端口电路频繁地变换状态(0或1)或干脆一直处于放大状态。所以,不用的IO口应设置成输出口;或设置成输入口,同时端口接地/电源。 (4) 模拟电路 —— 如果是自己设计的电路,要确保在不用(或无信号)的时候,电路处于关断状态。必要时可为这部分电路的电源加个电子开关。 |
|
|
|
我也想晒啊,可是电容按键和无线刷卡那部分电路不是我等小菜设计的,所以也没有电路图啦。我这里只是用别人做好的那个模块杜邦线连接过来的,我自己板子上有加下拉电阻1K。 |
|
|
|
也不是指不能唤醒,我的意思是如果蜂鸣器没有响,那么就是说明芯片一直在睡眠,那也就不应该有那么大的电流啊。 |
|
|
|
代码中 INT0 和 INT1 都是设置为低电平产生中断。如果接了下拉电阻,是不是表明常态下这两个端口是低电平,也就是一直有中断请求?LZ 查一下看看…… |
|
|
|
蜂鸣器没响的原因可以是硬件的问题,如线没接好或者蜂鸣器本身有故障;也可以是软件的问题,如函数ErrSound()工作不正常。 所以,首先要确定蜂鸣器相关的软硬件工作都正常。在这个前提下,才可根据LZ的代码下结论说芯片一直处于睡眠状态,因为 ErrSound 函数没有被执行,否则蜂鸣器应该响。 |
|
|
|
昨天有事去了,今天又来搞了下,确实如此,是那个中断上的下拉电阻上的电流,是我犯错了,我以为已经把所有的IO口上的上拉和下拉都去掉了。。当我把下拉去掉,并且把所有的IO口配置为DDR = 0x00, PORT = 0xff 后电流也就在1.7uA左右,并且外部中断也是开着的,能够中断唤醒。 而且没有焊掉那个下拉电阻导致了个更大的错误,中断中的逻辑是如果当前是刚刚被唤醒,那么要在判断中断IO电平被拉高了之后才会跳出中断。所以是我的程序一直在中断中等待电平拉高,所以才没有执行主程序中的ErrSound,看上去就像在休眠一样。 |
|
|
|
给各位赞一个。。哈哈
|
|
|
|
刚刚又试了下,在没有上下拉情况下,空闲的IO配置为DDRD = 0xff; PORT = 0x00; 电流是一样的,之前因为一些错误导致我认为这样的配置会更耗电,其实是一样的,但是如果能保证IO电平稳定可靠,空闲IO还是应该配置成输出。
|
|
|
|
我说的这样是指上面说的DDR = 0x00; PORT = 0x00; 希望不要误导各位。。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11787 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 15:18 , Processed in 1.002351 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号