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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。* p% i" Z, c$ W& V: ~- ?  i6 i
低功耗实现有2个地方:
+ f0 R1 f. t7 Q1,MCU本身的低功耗;) w0 Q; P+ c2 m$ K7 C- F  C' x! t
2,DRF169H的低功耗;- v) g1 w0 Y1 X: l  K
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。* F$ ?  k% w/ ]4 I7 }& g- ^
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。& }8 X+ {3 S  F" z. i
下面来分别简述下这2个方面的实现方法:
; A3 g6 p% B0 j# f1 N
9 m8 j7 S2 b, x6 D4 U; L8 `1,MCU本身的低功耗
9 z# ], j* A% ~2 N% q- r( vSTM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便9 v. e1 o6 R0 I) p- U* q# z
stm32g0xx_hal_pwr_ex.c* T: R$ ?4 r) b
stm32g0xx_hal_pwr.c
$ z/ B. Z* w5 H. a: r3 M" [7 |2 r
" V, {9 i2 \. D( t1 E具体的实现方法:
' S5 Q9 m; J6 }) d1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H0 J# V. k" P0 `; Q
2,设定RTC中断时间,设定MCU进入低功耗
/ j( X9 h2 q: K) ?* k3,RTC中断唤醒MCU休眠$ ]6 l) O6 ~2 s& h- ~0 r+ y5 r
4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)
& h' b: M+ V! _5,测量一次温湿度数据
4 F; D2 L8 G5 H+ v6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒
1 ^( I. I1 q! y7,发送温湿度数据
2 u5 L2 E, K! ~( r8,重复以上1-7
8 c8 P. U# j( c! F. |! _  q
5 K  o1 Z) u4 h, a# e
  1.                 // --Enter Low Power Model  -- //
    " _% }) @, F  t! `% Y% l* R4 z) N
  2.                 LED2_OFF();
    9 s. [3 o+ h, g9 `
  3.                 drf1609h_enterLowPower();
    " W  i  K  x7 @8 y+ @: L
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----; C- T4 e$ u& b4 p, ~8 M
  2.                 //--Set wake up time = 0xA017 = 20S ----
    , L: I4 ]6 n! h6 m( V  y5 ~& O8 L
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
    ' b/ k# W$ \! X* _
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);3 V& |: \! q. @9 |: K) M- S
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    0 g6 [% J0 u; C
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();
    4 d- J( `4 i' w4 K
  2. MX_GPIO_Init();6 J; a2 }" H+ t3 a2 Z7 {
  3. MX_DMA_Init();6 o8 x) A+ P1 x
  4. MX_USART1_UART_Init();0 ]: y% @: [& K/ x2 t
  5. 6 n2 i; x0 s7 C1 J
  6. LED2_ON();
复制代码
  1. //-------------------
    + H4 B! c" X8 n
  2. read_AHT10_once();
复制代码
  1. //--------------------/ w6 \& j2 [" m+ x, d' [
  2. drf1609h_outLowPower();
    5 j" S# q# N1 C, [
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----" v8 R  A  n+ X5 s1 z
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);  h7 l0 M# K" I1 P" I9 w
  3. HAL_Delay(5);</div>
复制代码
6 ?# d( m3 b5 {2 p( ~) X+ G2 b
2,DRF169H的低功耗实现0 \2 z2 x& K( w
2.1,进入低功耗
7 n8 b' D. Z5 R6 gDRF1609H只有工作在End Device节点下才有低功耗功能;$ t0 k- z' ^- S, O
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
  o" L3 ~- D+ A5 j
  1. drf1609h_enterLowPower();  g7 E$ [3 x8 J1 y; \
  2. HAL_Delay(5);
    3 O; r3 w& b% t7 O% K" e" h/ N/ k
复制代码

+ a5 I! J% J4 ^, s* y具体可以参考DRF1609H的说明书
, S) C  @) Y# u7 d9 f) Z
1 y" `9 s" D4 ]
20200213154402218.jpg
3 G0 t+ w6 T' @
20200213153434699.jpg
( u7 {) B" M$ @5 l' G, p
20200213153446292.jpg
1 e" F$ b0 C' d0 q1 Y
20200213153456791.jpg

% Z; G7 j; y# L' d9 m8 V0 V
2020021315350837.jpg
8 N1 g6 W/ F2 d0 E; M

/ t6 `/ u) O" D5 i
9 m( W$ f* Q  q( X1 c$ ]' I2.2,退出低功耗
# j" Z" w3 G+ }& w退出是模拟下拉Function按键5MS实现8 B% U. y, d" ~8 y
  1. drf1609h_outLowPower();4 V. U' P& Y, C! S0 K; S
  2. HAL_Delay(5);
复制代码
  1. //-----------------------  e! Q( e8 @# R9 ^5 c4 Y  o
  2. void drf1609h_outLowPower(void)' n! z/ `3 D, Q
  3. {
    2 r9 K0 Q+ P- V6 z
  4.         set_outLowPowerPin_outPut();$ |4 Q, Q/ d/ _0 T" A
  5.         HAL_Delay(1);
    ( ^. r' J9 f0 q: H4 ~  ^
  6. 5 [1 U- l' d$ W9 s& N
  7.         set_outLowPowerPin_out_1();
    , c- W! [8 g: B. Y3 o
  8.         HAL_Delay(1);2 n. x% X/ ]! {6 y: f
  9. 7 \7 W- [- S5 W2 g
  10.         set_outLowPowerPin_out_0();9 w0 T3 H& r. W
  11.         HAL_Delay(5);
    8 H2 V0 Z  ?* m7 k; ^7 a) M
  12. 5 E0 B1 t# m% z  e
  13.         set_outLowPowerPin_out_1();
    , H$ i$ W# ]! M* c+ e. [
  14.         HAL_Delay(1);
    6 |8 u* Z& P8 |) `; v- D7 l

  15. ) f4 i9 O$ p8 C+ j  ~) K
  16.         set_outLowPowerPin_input();
    ( u! B* \* B9 z; }
  17. }
复制代码
# D% b/ s/ g; d3 d7 t
2.3,退出低功耗以后的数据传输
$ v, ?' x. R$ L# pDRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。3 I" p& }3 |  |! L- i! Y" a5 Q
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。% V% c8 F. V% y! V1 |
点对点发送的官方描述是这样的:" ^* S6 E5 ~' O% I' @, ~# U+ J

6 K9 ~. {8 _/ A  s- V7 K& M- M

/ [, e+ |% B1 s, e
20200213154415740.jpg

" o1 H+ Z) F: W5 S
# Q" c4 k& h3 h6 w. r1 j代码实现为:
8 S5 E, L9 U7 r# b( \! }' V7 @! ~: F0 h2 X1 g( G2 V8 J& {2 `, a
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
    4 e8 M! d6 [. w, A: l2 f! E+ U
  2. set_lowpowerSendOutData();
    & o9 @% A# H$ r" l. v$ v
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
    8 C$ j6 u/ b# e" Y2 U" R% I
  4. HAL_Delay(5);
复制代码
  1. //----------------------, r  W9 i  [: h; l5 R
  2. void  set_lowpowerSendOutData(void)2 B1 `7 u+ R3 I- c! H$ n: H$ Y# ?# d0 P
  3. {
    * K3 k) f& l- `7 V3 l8 a. {; b
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];
    0 T. d$ w/ c' p+ ]) Z% d7 N
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];' t8 J2 U+ w4 b- [5 U
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];  K$ X  Q0 `7 Z, ]* W* k) M! p
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];
    . ^' J  J$ P, C) V
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码
; Z% m" u( w# t; i6 \8 s

  o% ~( m- I6 p' H' Y; E1 E4 r7 w! x# H
, j+ t. ~. T5 A( s7 ]/ f
20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

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