你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G031无线温湿度仪开源项目 -7,低功耗的实现

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
低功耗实现有2个地方:
1,MCU本身的低功耗;
2,DRF169H的低功耗;
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
下面来分别简述下这2个方面的实现方法:

1,MCU本身的低功耗
STM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便
stm32g0xx_hal_pwr_ex.c
stm32g0xx_hal_pwr.c

具体的实现方法:
1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H
2,设定RTC中断时间,设定MCU进入低功耗
3,RTC中断唤醒MCU休眠
4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)
5,测量一次温湿度数据
6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒
7,发送温湿度数据
8,重复以上1-7

  1.                 // --Enter Low Power Model  -- //
  2.                 LED2_OFF();
  3.                 drf1609h_enterLowPower();
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----
  2.                 //--Set wake up time = 0xA017 = 20S ----
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();
  2. MX_GPIO_Init();
  3. MX_DMA_Init();
  4. MX_USART1_UART_Init();

  5. LED2_ON();
复制代码
  1. //-------------------
  2. read_AHT10_once();
复制代码
  1. //--------------------
  2. drf1609h_outLowPower();
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
  3. HAL_Delay(5);</div>
复制代码

2,DRF169H的低功耗实现
2.1,进入低功耗
DRF1609H只有工作在End Device节点下才有低功耗功能;
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
  1. drf1609h_enterLowPower();
  2. HAL_Delay(5);
复制代码

具体可以参考DRF1609H的说明书

20200213154402218.jpg

20200213153434699.jpg

20200213153446292.jpg

20200213153456791.jpg

2020021315350837.jpg



2.2,退出低功耗
退出是模拟下拉Function按键5MS实现
  1. drf1609h_outLowPower();
  2. HAL_Delay(5);
复制代码
  1. //-----------------------
  2. void drf1609h_outLowPower(void)
  3. {
  4.         set_outLowPowerPin_outPut();
  5.         HAL_Delay(1);

  6.         set_outLowPowerPin_out_1();
  7.         HAL_Delay(1);

  8.         set_outLowPowerPin_out_0();
  9.         HAL_Delay(5);

  10.         set_outLowPowerPin_out_1();
  11.         HAL_Delay(1);

  12.         set_outLowPowerPin_input();
  13. }
复制代码

2.3,退出低功耗以后的数据传输
DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。
点对点发送的官方描述是这样的:


20200213154415740.jpg


代码实现为:

  1. //--Send out the AHT10 Data as point-to-point transfer model -----
  2. set_lowpowerSendOutData();
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
  4. HAL_Delay(5);
复制代码
  1. //----------------------
  2. void  set_lowpowerSendOutData(void)
  3. {
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码




20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版