[创新制造展示]

自制简易电子称(第四篇——低功耗设计)

[复制链接]
1675|3
手机看帖
扫描二维码
随时随地手机跟帖
Andrew55|  楼主 | 2018-7-26 20:46 | 显示全部楼层 |阅读模式
显示屏加上多个外部模块同时工作,电子称的功耗还是很大的。
但是不用担心,因为STM32提供了三种低功耗模式——睡眠、停机、待机

顺便说下32芯片的几种工作模式:

1、工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。

2、睡眠模式:只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。

3、停机模式:1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,但SRAM和寄存器不断电,此时只能依靠外部中断(EXTI)和RTC时钟才能唤醒。

4、待机模式:1.8V供电区域被时钟停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,SRAM和不属于待机电路的寄存器也被断电关闭,此时即使是外部中断(EXTI)也不能将其唤醒,只能通过复位(外部复位,看门狗复位)、唤醒引脚、RTC时钟来唤醒。

但是无论是在停止模式 还是待机模式下,RTC和IWDG及其时钟源不会被关闭。


以STM32进入低功耗模式为主,其他模块也一同进入相应的睡眠模式,将系统在不承重的时候功耗最低。
65915b59b99ce5d17.png
并且可以配置睡眠状态下的唤醒方式——中断唤醒或者事件唤醒
本系统在低功耗下进入停机模式。
进入停机模式只需要两句话即可:

低功耗的同时设置了中断唤醒方式,所以需要在按键中断中重新配置系统时钟(重要):
/*
** 系统从停止模式被唤醒时是使用HSI作为系统时钟的
   停机唤醒后配置系统时钟: 使能 HSE, PLL
   并且选择PLL作为系统时钟.
*/
void Restart_From_Low_Power(void)
{
        //启动并配置stm32
        ErrorStatus HSEStartUpStatus;
   //使能 HSE
   RCC_HSEConfig(RCC_HSE_ON);

   //等待 HSE 准备就绪
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if(HSEStartUpStatus == SUCCESS)
   {
                 //使能 PLL
                 RCC_PLLCmd(ENABLE);

                 //等待 PLL 准备就绪
                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                 {
                 }

                 //选择PLL作为系统时钟源
                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

                 //等待PLL被选择为系统时钟源
                 while(RCC_GetSYSCLKSource() != 0x08)
                 {
                 }
   }
       
        //启动CS1237
        CS1237_Restart();
       
        //启动触摸屏
        HMI_Unsleep_Mode();
       
        //显示OLED
        OLED_Display_On();
       
}


目标效果:当电子称没有进行称重的一段时间后,自动进入低功耗模式,并且可以利用按键一键唤醒。

实施思路
191565b59b8440e5c1.png

当系统处于静止并没有称量任何物品的时候,转换的重量为0g,选择小于1g作为低功耗的判断标志是为了防止微小抖动带来的误差。
采用LED闪烁来提示用户当前没有称量任何物品。LED会在系统判断上述条件满足时闪烁一次。
在中间任何时刻开始称重,系统会自动清零之前的计数标志,重新开始判断。
以系统主循环作为定时标志,可以节省一个定时器资源。实测主循环一次时间约为1.5秒,当LED闪烁50次,也就是75秒之后,系统会自动进入睡眠模式。
睡眠模式包括AD芯片的Power down模式,HMI触摸屏的睡眠模式,OLED屏幕的片选失能和STM32主控芯片的停止模式。
STM32处于停止模式的时候,系统关闭所有外设时钟,停止运转。此时内部电流最低可低至20uA

具体实现程序:
 //低功耗判断
                low_power_weight_1 = now_weight;
                if((low_power_weight_1 < 1) && ((low_power_weight_1-low_power_weight_2 < 1) || (low_power_weight_2-low_power_weight_1 < 1)))
                {
                        low_power_num++;
                        LED1_Twinkling(2);
                        LED2_Twinkling(2);
                        Delay_ms(1000);
                }
                else
                {
                        low_power_num = 0;
                        low_power_weight_2 = low_power_weight_1;
                }
               
                //重量低于1g并且在x秒内没有变化,即开始进入低功耗
                if(low_power_num >= 50)
                {
                        //计数清零,准备下一次的计数
                        low_power_num = 0;
                        //蜂鸣器首先响用来提示
                        Beep_Warning(3,200);               
                        //进入低功耗
                        Low_Power_Mode();
                }


最近考研复习时间真的很紧张啊。只能晚上抽时间写一下啦。


相关帖子

xyz549040622| | 2018-7-27 08:47 | 显示全部楼层
赞一个,支持下!

使用特权

评论回复
土豆终结者| | 2018-7-27 10:00 | 显示全部楼层
持续关注,支持一下

使用特权

评论回复
持续关注   赞赞赞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

20

帖子

4

粉丝