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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
% [8 d; o9 `8 k# D5 y8 q低功耗实现有2个地方:
1 y  r" @6 v0 s, S1,MCU本身的低功耗;' [# g5 A4 C, R4 h; C
2,DRF169H的低功耗;6 R+ _# `0 n% U5 v9 |
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。+ j  d8 r, n& r0 S
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
" u+ ?7 b6 O$ j7 t下面来分别简述下这2个方面的实现方法:9 N3 n0 R) A+ O! f. k

. G8 C& r0 }3 }8 x1,MCU本身的低功耗
- y; @1 Q' Z' b& M1 C( aSTM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便
; Z. ^* v0 B) [( m2 u0 c7 `stm32g0xx_hal_pwr_ex.c
2 x( C/ e; c- |: \3 X; B( g9 Qstm32g0xx_hal_pwr.c
9 @* c- P; q& f7 m6 E% [6 G" e& t, F6 d( W, C: ~) L
具体的实现方法:& g; h- t; a4 C4 y7 c' p
1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H
! q0 X- B" [5 q  o8 j2,设定RTC中断时间,设定MCU进入低功耗
, y" D0 k5 X8 T  e3,RTC中断唤醒MCU休眠
4 A# q" }/ W/ L" \3 y% H9 F) d4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)/ `# P- ^1 u( [
5,测量一次温湿度数据
$ _/ R2 k) u4 N6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒7 m6 @) `4 C  ~/ J* |, v3 r! x
7,发送温湿度数据% B4 G8 r3 N2 t( z+ Q
8,重复以上1-7
9 \2 D" m& ^+ X* K) K. u1 T' ?( t  ~8 s+ ~; K
  1.                 // --Enter Low Power Model  -- //
    2 J' Z. e5 \( I. W1 Y, K: e. P
  2.                 LED2_OFF();
    ) n) I" w3 n. O$ g: l" {5 _
  3.                 drf1609h_enterLowPower();! t( K! l  \% S
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----9 I8 M1 t3 s* W2 ?* e
  2.                 //--Set wake up time = 0xA017 = 20S ----
    2 u) ]/ |, z2 l9 d, O+ @
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
    % g9 M2 T* p+ C. p9 O) H* n- M
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
    8 {3 ^3 g/ U6 m7 S" c1 C
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    6 u$ g! r, F) f
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();
    ( `' ]5 q! W4 ]! A
  2. MX_GPIO_Init();  ^6 j& a- j' q
  3. MX_DMA_Init();
    & r" }2 v- q: {
  4. MX_USART1_UART_Init();8 y, A  ?. {& G  m
  5. / Y0 x9 @) S' L, }5 C  y
  6. LED2_ON();
复制代码
  1. //-------------------
    , v) R, d* o& ^% n' p+ O$ c0 O
  2. read_AHT10_once();
复制代码
  1. //--------------------
    * {/ w1 q# F7 \# A  m) g% x
  2. drf1609h_outLowPower();
    0 ^8 S$ F# ~1 D; m: x4 l0 ^
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
    & i7 N* _, D) J! @' K3 \7 T
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
    4 O1 s* Z( q3 u
  3. HAL_Delay(5);</div>
复制代码

; ]9 b# v$ E$ \- H( }2,DRF169H的低功耗实现! N3 G- l9 I7 x3 z# d
2.1,进入低功耗( a* b* P# q9 a. T
DRF1609H只有工作在End Device节点下才有低功耗功能;, G0 g) Y) `( h3 {
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS+ g8 H! C/ g7 X# Q/ f% y
  1. drf1609h_enterLowPower();
    # o. C; e6 s9 r/ _/ M$ H5 L' u2 g
  2. HAL_Delay(5);
    6 _) v& D# E0 n+ q
复制代码
# T: i- c% b, i: U9 O* G4 N. U
具体可以参考DRF1609H的说明书3 ^+ g( H" h& b
+ M, |8 g6 r3 [# G7 G
20200213154402218.jpg
1 Y! f% ?! s; [
20200213153434699.jpg

7 g  o8 r5 u# ]- N1 B! a# s) h; p
20200213153446292.jpg
- h0 `. D/ c0 v& j: }# L5 W/ B
20200213153456791.jpg

- G6 d) o3 v/ {4 u. ^
2020021315350837.jpg
1 r+ N- i6 W8 B; @

/ U: [6 I. N" B
, y) R4 M4 s6 |& j) g2.2,退出低功耗: p6 t% O: g" t: T6 s
退出是模拟下拉Function按键5MS实现5 @# v3 E) \+ _8 Z7 L
  1. drf1609h_outLowPower();
    ! ?  Y( M; a4 D2 L, J
  2. HAL_Delay(5);
复制代码
  1. //-----------------------: m4 u. u. ]4 v) K4 u% \
  2. void drf1609h_outLowPower(void)
    7 M! V+ I+ N0 O' S
  3. {
    2 h5 n) w( P' B' Y& h1 c
  4.         set_outLowPowerPin_outPut();, a; k- N1 q, t- ?2 Q+ n) P: s
  5.         HAL_Delay(1);5 C$ }) x7 D1 K8 N
  6. ; _' l; A1 a" V% h' S7 t5 a% h3 L
  7.         set_outLowPowerPin_out_1();
    " P+ K, N( }+ e/ Y: I! n# J; I
  8.         HAL_Delay(1);
    # L7 C3 Y4 G0 z

  9. ! v& \5 \. e2 O* J
  10.         set_outLowPowerPin_out_0();0 ]) T8 Z% R+ i3 {8 V' B
  11.         HAL_Delay(5);
    7 n. d+ z2 x  w) S- N9 z# D) P- }( u- u
  12. ) z. z# E& x2 |# {* r
  13.         set_outLowPowerPin_out_1();- H5 R  d9 x0 M+ r& a8 H8 N
  14.         HAL_Delay(1);
    - J& J% j( H3 G9 ~5 }7 W0 o9 E  B

  15. 1 `! n4 N# `0 b1 x$ H1 `, Y
  16.         set_outLowPowerPin_input();0 K" G- ~3 F4 u& r* [$ k/ W  p
  17. }
复制代码
" A( y) R1 b" ~: d. F
2.3,退出低功耗以后的数据传输" L( n8 r( @9 i' }
DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。
- ~. o. R; I3 |+ h3 y% `Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。5 O$ C6 y8 n1 f) k; f
点对点发送的官方描述是这样的:' B  h4 U$ }% @9 {5 ~& U
' f% a" U2 o1 z5 T3 y

% C" `1 U" \" e
20200213154415740.jpg
5 R/ F% x/ @0 D6 _) n
8 H! ]: X" C! b0 u2 }, F3 [) b. J
代码实现为:4 t+ u( u% p. Q" y1 `
/ F3 c, S+ O6 P+ s) c- k4 K
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
    : C8 A0 Y2 F; ~% z! v& q' V
  2. set_lowpowerSendOutData();
    * g3 w) ~1 `, ~( e
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);, h% X% ?5 |& h7 w, C4 {
  4. HAL_Delay(5);
复制代码
  1. //----------------------
    1 b1 i! [" `$ {, ~6 F
  2. void  set_lowpowerSendOutData(void)
    . v+ w" T3 B4 |: H5 g3 E) m
  3. {) r, \4 ?- B" P$ @, R! i9 p( D
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];
    7 w1 z$ L3 i# e
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];
    , n8 |7 c& G, z8 E" e1 s6 i3 K
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];. G3 R' h/ _/ ~. H7 k1 n; e' |
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];5 a. J- F7 i# ^8 B  B3 W( C7 v
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码

; Y' w* a0 V! Y8 {0 ^, U# |3 S6 I' u
9 A2 z7 b  q, I1 A9 ]! S
  v2 }& D4 W) m
20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

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