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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。, f$ |: h" B. Y6 c$ B$ M, O' U( c
低功耗实现有2个地方:/ l! s$ P1 u( |+ G
1,MCU本身的低功耗;5 @" w7 v" s' b& e. y8 X
2,DRF169H的低功耗;
8 Q% ~  L* f7 h# F- CAHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。  L) T$ B7 g- B" ]: j- N
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。, g& a4 C8 z' h: a7 f! o' S
下面来分别简述下这2个方面的实现方法:
7 p$ r6 ?1 ~0 m8 T1 y- \4 D1 R" [2 E' R6 u
1,MCU本身的低功耗
& g' I1 }3 X  v" _$ c  f3 C" H/ Z8 sSTM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便8 Q: v+ T) l" D# A& U  V
stm32g0xx_hal_pwr_ex.c
8 v' t* T( J/ ^! Q; Ostm32g0xx_hal_pwr.c4 q7 ^5 a/ W  V' t; d  ]

0 ?+ f$ `; I; \: P3 V具体的实现方法:
9 I, _2 W7 ^5 |0 O3 R1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H  ^6 k, y8 Y+ k( T- w. ?4 l8 v& j. N
2,设定RTC中断时间,设定MCU进入低功耗8 \- D9 M+ k& M  ]
3,RTC中断唤醒MCU休眠1 Z; \9 i+ p2 Z) j
4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)
/ H; e9 ?5 \0 O# k4 ?$ z( W, x5,测量一次温湿度数据
/ A" r2 Q4 a; R; [1 Y: N6 d6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒1 Q) ]. M! y/ y: y6 L  Z* i
7,发送温湿度数据
1 w& f, k/ t3 A" x1 ^8,重复以上1-71 n* |6 t4 u4 g+ m. H

5 v8 ]4 f1 S6 q# b. i0 A1 p/ w
  1.                 // --Enter Low Power Model  -- //
    7 S; ~$ I( M2 _9 c8 \" a9 k
  2.                 LED2_OFF();5 L: z( K$ m7 y3 I6 w4 H" t5 @
  3.                 drf1609h_enterLowPower();
    6 P. r% J( H8 d% Q6 X3 a- `
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----! k, J& b* ]$ N7 Y/ v6 |6 v
  2.                 //--Set wake up time = 0xA017 = 20S ----
    # n4 P( J8 z  X1 z9 ~3 \1 K* j
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);" |) {5 o. E( \0 p; ^) w' N
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
    8 e! L) Y3 X! t# f7 u5 ]) u  z
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);. Z% k$ {5 o; \7 `7 O
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();
    0 L/ a$ t# t! n7 h
  2. MX_GPIO_Init();( C  Q& b# Q# w
  3. MX_DMA_Init();
    6 i- f7 J0 B! S+ N& o
  4. MX_USART1_UART_Init();
    ' ]% Q5 ]. S. I% z4 K5 m
  5. . b, ]" G; @, q/ w* O( z* G
  6. LED2_ON();
复制代码
  1. //-------------------, N6 m$ J! D( E  q& l9 t
  2. read_AHT10_once();
复制代码
  1. //--------------------
    ( D  e7 K; R' e
  2. drf1609h_outLowPower();
    * A% J6 ^/ X% P  M
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----; x; ?7 I! s* f0 m. T. S
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
    ; f0 h9 g. O! o4 \8 b
  3. HAL_Delay(5);</div>
复制代码
. q. }+ G2 C2 I# D$ L5 ^
2,DRF169H的低功耗实现: U4 r+ u- h' q
2.1,进入低功耗7 X. b* q0 Y) V; Y8 `
DRF1609H只有工作在End Device节点下才有低功耗功能;) [9 A3 ~) X& V8 s7 A
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
7 s9 O9 F  ^' `8 c5 `3 G- U$ Z5 R
  1. drf1609h_enterLowPower();
    % G7 a! @3 s& d9 r' r
  2. HAL_Delay(5);1 o, I) s0 s( t, i4 \/ T" U
复制代码

* u% q) A% k0 b. o8 h具体可以参考DRF1609H的说明书4 a! P5 d+ D! A; M1 o# ^. m
2 m* O' t. U. o8 E, s  n
20200213154402218.jpg

2 |$ H# j( @+ e) {9 }6 A2 K8 v* w
20200213153434699.jpg
- [# q5 K0 |) G% w* C2 B  s" V
20200213153446292.jpg

. c% r' l: Y5 X# `- u4 J
20200213153456791.jpg

3 `# b" q+ b( k/ x
2020021315350837.jpg
4 S7 ?: n: Y* {0 X. m1 \

, R. D  X; K4 |- r4 D' S' h+ R" I' G7 K8 \
2.2,退出低功耗/ ]$ r. B( n; {& f" T0 v, j
退出是模拟下拉Function按键5MS实现
& n' N6 `8 C7 v/ L7 _. ]
  1. drf1609h_outLowPower();
    $ k5 i9 J7 D9 }" I* k% ?* a$ V4 u
  2. HAL_Delay(5);
复制代码
  1. //-----------------------! @4 V8 F. L6 s3 S9 [3 A
  2. void drf1609h_outLowPower(void)
    ; F  A! s  P: @$ l
  3. {
    2 x$ v& ?0 S# t4 [
  4.         set_outLowPowerPin_outPut();2 h- V$ ]7 n8 e8 F" b6 ~
  5.         HAL_Delay(1);
    9 N) p7 Q1 h% @4 t1 c7 L3 ^
  6. ! h2 d: r8 o* R8 H
  7.         set_outLowPowerPin_out_1();! `5 z& k8 m% Q$ c
  8.         HAL_Delay(1);
    3 p9 V+ j* N0 S+ t8 A6 U

  9. ) |; x: Q* T7 L1 `% M6 M( @
  10.         set_outLowPowerPin_out_0();
    9 U9 a% y4 j2 `$ C" [
  11.         HAL_Delay(5);" n1 o% o( M& U* O% C/ n3 T* ?

  12. 4 A  p# s! I, J2 Q5 g3 d
  13.         set_outLowPowerPin_out_1();% K* H& X3 F: L
  14.         HAL_Delay(1);0 P( E. f0 Z& G% K7 y

  15. * j& H5 G1 M  y
  16.         set_outLowPowerPin_input();. Y% U1 ?8 {+ c2 W# A
  17. }
复制代码
$ `+ |5 z! T2 m1 G- T" G, h
2.3,退出低功耗以后的数据传输9 l' L5 p4 v: u6 q
DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。1 G6 ~7 C/ q: }2 `# r4 y7 V. n
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。) Y# v* `. J2 [9 L1 _
点对点发送的官方描述是这样的:* M- u$ K' `6 R& r: _7 T' r
4 _4 m) \  p. S. H& |6 @

2 t; Z6 O/ b  G- q
20200213154415740.jpg
1 x" ~/ ^) o6 B8 n9 E8 Y+ i2 o3 M- @

- D9 d5 \1 C6 |7 y* _' d" n代码实现为:0 y3 D, ~' t( H9 T
: {% Y3 P: p  G& @6 Q: F7 v7 o) O
  1. //--Send out the AHT10 Data as point-to-point transfer model -----! @3 g/ U: t- ~6 b
  2. set_lowpowerSendOutData();3 ^7 [+ R% L4 j5 U1 P4 }% g& R% q
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
    7 K! h% G) z& d# k( u0 B  M# {
  4. HAL_Delay(5);
复制代码
  1. //----------------------2 a$ E2 y$ c  s  J& F" C
  2. void  set_lowpowerSendOutData(void)
    ' j. [' V5 U! q4 a+ E/ a
  3. {# C: ~) Z+ W/ ?& j
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];8 U# ^8 |* g9 s2 J# y& M" _
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];- F4 M( L- H7 x0 o( k# o# C
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];" c: l% Q0 _: g# e6 Z( l2 H3 Y+ o
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];
    : |9 w# M2 m1 p' Z
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码

5 f. ^* q- G' i: K. O- x- K3 W" V7 ?  I; r, T) K5 B
$ k. Z+ L, h* t" p% ?
; v. Q: A3 V) I+ L4 [
20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版