找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4228|回复: 16
打印 上一主题 下一主题
收起左侧

关于单片机低功耗无法唤醒的求助

[复制链接]
跳转到指定楼层
楼主
60黑币
本帖最后由 一夜暴富 于 2021-8-30 15:43 编辑

目前低功耗方案:电池3.7V单独给单片机供电,单片机再控制引脚给①电池3.7V升压12V电路②12V降5V电路使能,从来给12V负载和5V传感器工作目前遇到的问题:希望通过旋钮和按钮唤醒,但旋钮的唤醒非常玄学,大部分情况下都不行,偶尔又可以,按钮则时而灵时而不灵
两个控制电路如下:

旋钮按钮电路如下:
控制单片机进入低功耗代码如下:

触发外部中断出低功耗代码如下:


其中16,17是使能脚。XA XB是旋钮引脚,P36是按钮引脚
判断有没有结束低功耗是靠屏幕有没有亮起
大部分情况下屏幕都无法亮起
或许还需要补充什么?
希望各位不啬赐教

最佳答案

查看完整内容

1,不要在中断函数中设定或者使用Delay()长时间延时,没有办法的情况下才会在中断中使用,如果可以的话,中断函数尽可能的短 2,在PCON=0x02;之后至少要加四个 _nop_ (); 不知道为什么,官方叫这么做,你就这么做,错不了 3,进入掉电之前,你要用的唤醒中断都要先设定 4,中断唤醒之后,程序会执行PCON=0x02;之后的代码,由于没有看到完整的代码,不知道你程序是怎么跑的,这STC唤醒压根就不是什么高深技术或者商业机密,大可上传代码文件,你 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-8-30 15:20 | 只看该作者
1,不要在中断函数中设定或者使用Delay()长时间延时,没有办法的情况下才会在中断中使用,如果可以的话,中断函数尽可能的短
2,在PCON=0x02;之后至少要加四个        _nop_  (); 不知道为什么,官方叫这么做,你就这么做,错不了
3,进入掉电之前,你要用的唤醒中断都要先设定
4,中断唤醒之后,程序会执行PCON=0x02;之后的代码,由于没有看到完整的代码,不知道你程序是怎么跑的,这STC唤醒压根就不是什么高深技术或者商业机密,大可上传代码文件,你截个图,没头没尾的
5,一定要P00=0;P01=0.....吗?难道不成P0=0x00吗?
6,听说现在STC15可以仿真,你可以搞个仿真电路,也许论坛有人会玩,反正我只对开发板感兴趣
回复

使用道具 举报

板凳
ID:887186 发表于 2021-8-30 16:44 | 只看该作者
补充一下:5V的使能引脚关闭后
5V的电压每次都不同
当5V的降压使能引脚关闭后,最后停在了2V,就可以正常唤醒
如果5V的降压使能引脚关闭后只有0.3V了,就不能正常唤醒了
回复

使用道具 举报

地板
ID:887186 发表于 2021-8-30 18:54 | 只看该作者
本帖最后由 一夜暴富 于 2021-8-30 19:00 编辑
Y_G_G 发表于 2021-8-30 16:44
1,不要在中断函数中设定或者使用Delay()长时间延时,没有办法的情况下才会在中断中使用,如果可以的话,中断函 ...

谢谢大佬的指导,不知道大佬能否推荐一些低功耗的DC-DC 12v降压5V的芯片
回复

使用道具 举报

5#
ID:401564 发表于 2021-8-30 22:10 | 只看该作者
一夜暴富 发表于 2021-8-30 18:54
谢谢大佬的指导,不知道大佬能否推荐一些低功耗的DC-DC 12v降压5V的芯片

为什么对5V的DC-DC如此执着呢?这5V你要输出多大的电流?带马达吗?
如果只是单片机和传感器供电,直接一个HT7350不就行了吗?
如果是要大电流,3.7直接升压5V效率不是更高的吗?3.7升12V的效率如果是90%,12降到5V又是90%的效率,那么整个电路的效率就是80%左右了.........
回复

使用道具 举报

6#
ID:569384 发表于 2021-8-31 08:56 | 只看该作者
只要配置和电路没问题那就是程序的问题,另外中断里竟然调用delay(),不能啊!oled_wr_byte()也不要放外部中断里面吧,不要问为什么,我也不懂!
回复

使用道具 举报

7#
ID:887186 发表于 2021-8-31 10:02 | 只看该作者
Y_G_G 发表于 2021-8-30 22:10
为什么对5V的DC-DC如此执着呢?这5V你要输出多大的电流?带马达吗?
如果只是单片机和传感器供电,直接一个H ...

恩,就是DC-DC比较好使能控制,所以一直想用DC-DC
但如果LDO本身的工作电流就很低的话,我也是倾向于用LDO更方便的。
还想请教一下,那我是选择12V降5V的LDO合适,还是3.7V升5V的升压电路 ,这两个哪个功耗会更低一些?
回复

使用道具 举报

8#
ID:956872 发表于 2021-8-31 18:10 | 只看该作者
Y_G_G 发表于 2021-8-30 16:44
1,不要在中断函数中设定或者使用Delay()长时间延时,没有办法的情况下才会在中断中使用,如果可以的话,中断函 ...

外部中断里按键需要消抖吗及松手等待吗
回复

使用道具 举报

9#
ID:401564 发表于 2021-8-31 20:50 | 只看该作者
一夜暴富 发表于 2021-8-31 10:02
恩,就是DC-DC比较好使能控制,所以一直想用DC-DC
但如果LDO本身的工作电流就很低的话,我也是倾向于用L ...

我的回答已经说了你想要的知道的知识点了
回复

使用道具 举报

10#
ID:401564 发表于 2021-8-31 20:54 | 只看该作者
PEB188 发表于 2021-8-31 18:10
外部中断里按键需要消抖吗及松手等待吗

去抖动是肯定要的
如果程序没有什么其它任务,肯定是直接在中断中放一个延时省事了
如果有多重任务的话,肯定是不能在中断中有长延时,比如有数码管显示的时候,只要是在中断中有延时,哪怕只有1mS,人眼也能感觉到数码管闪了一下
如果在中断中有等待松开的话,就更不用说了,数码直接就是长亮一位或者长暗
回复

使用道具 举报

11#
ID:887186 发表于 2021-9-1 10:38 | 只看该作者
Y_G_G 发表于 2021-8-31 20:50
我的回答已经说了你想要的知道的知识点了

好的,谢谢~还有最后一个问题
为什么我给lm2596使能脚高电平,让它停止工作
理应VOUT应该0V左右,但每次关闭后的电压都不同,从0.050V~2V左右都有
这是为什么呢,电路就是上面的电路
回复

使用道具 举报

12#
ID:401564 发表于 2021-9-1 11:30 | 只看该作者
一夜暴富 发表于 2021-9-1 10:38
好的,谢谢~还有最后一个问题
为什么我给lm2596使能脚高电平,让它停止工作
理应VOUT应该0V左右,但每 ...

这个不好说,要结合实际情况的
你看一下数据手册有没有说明的
如果数据手册没有说明,理论上输出就应该是0V,你就要看一下你硬件电路了
回复

使用道具 举报

13#
ID:887186 发表于 2021-9-3 19:34 | 只看该作者
Y_G_G 发表于 2021-9-1 11:30
这个不好说,要结合实际情况的
你看一下数据手册有没有说明的
如果数据手册没有说明,理论上输出就应该是 ...

不知道大佬能否再帮我解答一下
我是在唤醒中断里写了唤醒后单片机该做什么
而不是写在
PCON = 0x02;
                _nop_;
                _nop_;
                _nop_;
                _nop_;
的后面。
请问这样是可以的吗
回复

使用道具 举报

14#
ID:401564 发表于 2021-9-3 23:04 | 只看该作者
一夜暴富 发表于 2021-9-3 19:34
不知道大佬能否再帮我解答一下
我是在唤醒中断里写了唤醒后单片机该做什么
而不是写在

看不到完整程序和电路,不知道你要做什么
这个是我一个蓝牙耳机的,长按或者双击唤醒的,按键和其它函数,你可以先不管,你大概看一下唤醒的流程就可以了
void main(void)
{
        Mcu_Rst();          //单片机复位
        Mcu_Awaken(); //单片机唤醒操作
        Stc8g_Adc_int();//stc8gadc初始化
        Tap6130_Start();  //耳放启动
//———————————————————————————————————————————————————————————————————          
        while(1)
        {                         
         if((USB==1)||(ON==1)) Battry_Voltage_Disp(ADC_VCC);        //电池电压处理
         if((USB==0)&&(ON==1))        Key_Disp();                                         //按键处理                 
         if((TWO_PRE==1)||(LONG_PRE==1))
                {                                       
                        ON=!ON;                                                                                //长按/双击有效
                        TWO_PRE=0;
                        LONG_PRE=0;
                        Mcu_Up=0;                                                                                //清除按键唤醒标志位
                        if(ON==1)                                                                          
                          {                                                       
                                        Delay_ms(300);                                                                //延时一定时间开机,没有为什么,就是达到某个效果而已,可有可无
                                        Tap6130_Start();                                                         //如果是按键开机,就启动耳放和蓝牙
                                        Stc8g_Adc_int();                                                        //stc8gadc初始化                        
                                }                               
                }
                else if(ONE_PRE==1)
                                {
                                   ONE_PRE=0;                                                                  //单击有效
                                   Mcu_Up=0;
                                   if(ON==1)Play();                                                                         //播放/暂停/接听/挂断                                  
                                }                          
                        else if((USB==0)&&(ON==0)&&(Mcu_Up==0))                //UBS在插着,就不关机
                                        {                               
                                                Delay_ms(300);                                                                //延时0.3秒关机
                                                Mcu_Sleep();                                                                //单片机进入掉电模式
                                                PCON=0x02;                                                                        //进入掉电模式
                                                _nop_();                               
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                Mcu_Awaken();                                                                  //单片机唤醒
                                                if(USB==1)Stc8g_Adc_int();                                        //如果USB高电平,就表示是USB播放,stc8gadc初始化               
                                        }                                                               
        }                          
//———————————————————————————————————————————————————————————————————                                       
}

回复

使用道具 举报

15#
ID:887186 发表于 2021-9-5 14:59 | 只看该作者
Y_G_G 发表于 2021-9-3 23:04
看不到完整程序和电路,不知道你要做什么
这个是我一个蓝牙耳机的,长按或者双击唤醒的,按键和其它函数,你 ...

好的,谢谢!
回复

使用道具 举报

16#
ID:975054 发表于 2022-12-8 00:54 | 只看该作者
今天刚好碰到这个现象,单按键P32脚INT0开始一直可以唤醒,后来改了些代码就不行了,正想研究一下,原来代码就有长按1秒(开/关大灯) / 2秒(掉电全关待机)的软延时代码...... 后来还加了个循环好像就唤不醒了,明天继续,呵呵!好玩! 谢谢!

评分

参与人数 1黑币 +20 收起 理由
admin + 20

查看全部评分

回复

使用道具 举报

17#
ID:1114775 发表于 2024-3-30 14:43 | 只看该作者
Y_G_G 发表于 2021-8-30 15:20
1,不要在中断函数中设定或者使用Delay()长时间延时,没有办法的情况下才会在中断中使用,如果可以的话,中断函 ...

大哥请问下仿真的时候掉电后无法通过外部中断1唤醒是什么情况呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表