[创新制造展示] 自制简易电子称(第四篇——低功耗设计)

[复制链接]
2272|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进入低功耗模式为主,其他模块也一同进入相应的睡眠模式,将系统在不承重的时候功耗最低。

并且可以配置睡眠状态下的唤醒方式——中断唤醒或者事件唤醒
本系统在低功耗下进入停机模式。
进入停机模式只需要两句话即可:

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

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

  14.    if(HSEStartUpStatus == SUCCESS)
  15.    {
  16.                  //使能 PLL
  17.                  RCC_PLLCmd(ENABLE);

  18.                  //等待 PLL 准备就绪
  19.                  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  20.                  {
  21.                  }

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

  24.                  //等待PLL被选择为系统时钟源
  25.                  while(RCC_GetSYSCLKSource() != 0x08)
  26.                  {
  27.                  }
  28.    }
  29.        
  30.         //启动CS1237
  31.         CS1237_Restart();
  32.        
  33.         //启动触摸屏
  34.         HMI_Unsleep_Mode();
  35.        
  36.         //显示OLED
  37.         OLED_Display_On();
  38.        
  39. }


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

实施思路


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

具体实现程序:
  1. //低功耗判断
  2.                 low_power_weight_1 = now_weight;
  3.                 if((low_power_weight_1 < 1) && ((low_power_weight_1-low_power_weight_2 < 1) || (low_power_weight_2-low_power_weight_1 < 1)))
  4.                 {
  5.                         low_power_num++;
  6.                         LED1_Twinkling(2);
  7.                         LED2_Twinkling(2);
  8.                         Delay_ms(1000);
  9.                 }
  10.                 else
  11.                 {
  12.                         low_power_num = 0;
  13.                         low_power_weight_2 = low_power_weight_1;
  14.                 }
  15.                
  16.                 //重量低于1g并且在x秒内没有变化,即开始进入低功耗
  17.                 if(low_power_num >= 50)
  18.                 {
  19.                         //计数清零,准备下一次的计数
  20.                         low_power_num = 0;
  21.                         //蜂鸣器首先响用来提示
  22.                         Beep_Warning(3,200);               
  23.                         //进入低功耗
  24.                         Low_Power_Mode();
  25.                 }


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xyz549040622 发表于 2018-7-27 08:47 | 显示全部楼层
赞一个,支持下!
土豆终结者 发表于 2018-7-27 10:00 | 显示全部楼层
持续关注,支持一下
小小电子爱好者 发表于 2018-7-27 12:09 | 显示全部楼层
持续关注   赞赞赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

20

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部