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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
4 [' R: Q; T& V2 ~5 r) m% r低功耗实现有2个地方:
# c" G+ _7 K. H4 o9 L1,MCU本身的低功耗;( @7 G4 g1 j) s0 S9 E, @; h
2,DRF169H的低功耗;
5 w6 n' |8 i/ i  T0 IAHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。* Z9 a  Q' A( e3 G2 P6 \9 E* g
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
" t8 d! |+ I( }2 l下面来分别简述下这2个方面的实现方法:$ a3 q* ^5 J1 V& ^

$ K+ \! L2 A* ?& B5 ?+ ^7 N' O1,MCU本身的低功耗4 \- j3 z- i& w+ v/ j
STM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便4 e/ x7 B2 e3 C3 P# I
stm32g0xx_hal_pwr_ex.c9 m# l, _" c; E8 t; K. R* T
stm32g0xx_hal_pwr.c
+ b$ B& f/ o0 s' c
7 L: _$ ~% O3 v% U2 d& J具体的实现方法:/ d9 N  v0 f9 A) L1 E
1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H
: f1 O. M7 }( u2,设定RTC中断时间,设定MCU进入低功耗. g( V* w  Z8 C' E
3,RTC中断唤醒MCU休眠
) O; B( i2 ^! R. {8 I/ O4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)9 w+ C% W6 \6 J# `3 {& `* m
5,测量一次温湿度数据
3 e! q8 ~, n- x; T$ h- T1 a0 F" Y6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒& @, N/ g! L+ }7 [( o- S- m$ [
7,发送温湿度数据
+ H3 M0 H( W; }; t8,重复以上1-7
+ J3 A3 i( Q2 v
; l" L5 ^3 x6 `
  1.                 // --Enter Low Power Model  -- //" u. R. ^8 V! x* s* P
  2.                 LED2_OFF();
      h' e# l2 V3 A( C) b
  3.                 drf1609h_enterLowPower();7 Q# h* U) F' _1 `  h# y$ V( H
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----
    + i7 e- U2 h! p! c3 Y- ?0 i5 L% g
  2.                 //--Set wake up time = 0xA017 = 20S ----
      G, ?3 ~+ P) w5 X! k/ ?
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
    / B% |4 N  H! j% E
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);" z9 N2 j' D+ L6 X4 g6 u& `
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    / O/ R5 n7 q. @3 G0 i* e
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();
    ) J2 u. P% F& ?/ _
  2. MX_GPIO_Init();# Y6 k# s: x' s  \  L
  3. MX_DMA_Init();
    ( v1 a6 C1 I! \; S0 ^
  4. MX_USART1_UART_Init();
    , o7 g  T% }1 h7 Y1 c

  5. ' v6 \# l+ l( O; b
  6. LED2_ON();
复制代码
  1. //-------------------; E9 U# D/ N: l# x
  2. read_AHT10_once();
复制代码
  1. //--------------------
    ) O- d* K: X; v, h0 M
  2. drf1609h_outLowPower();4 N6 N, u- n6 i% x! B# E2 \7 w
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
    9 N; C* I8 n" H9 a: n0 `7 J% c7 E
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);% ~' P1 ?* Z, y$ j7 I4 A
  3. HAL_Delay(5);</div>
复制代码
* m* n3 m* f/ A1 T6 {- ]
2,DRF169H的低功耗实现
% k# [: C# A& _0 R9 q" }2.1,进入低功耗9 _8 A$ R( H, O8 T, I$ R( ^
DRF1609H只有工作在End Device节点下才有低功耗功能;6 S6 U4 A/ R* [* Z
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
0 ?/ v: K- L  W, R! b2 }: b
  1. drf1609h_enterLowPower();; s' W6 K6 N0 e
  2. HAL_Delay(5);! J: O$ B7 K* O6 b# X0 o; a
复制代码
' G! y. W: H, x9 v4 }( @! l0 O$ N
具体可以参考DRF1609H的说明书
. T% I- A- V/ t) t8 G2 {8 b2 U
) u1 A1 @1 e- e3 s- [$ |8 X
20200213154402218.jpg

# Y# e6 X5 [' u
20200213153434699.jpg

3 L/ @& `& U9 ]1 z
20200213153446292.jpg

. G. s8 c: r5 G
20200213153456791.jpg
# ?' D9 e; G/ |, Z1 m- H1 ?8 E
2020021315350837.jpg

; g) h& a" F% p- i+ k; [6 R1 y( l  e1 Z3 V1 r8 Z) U) U

- z0 [9 R' u0 L7 w' r) b' Z. p9 @2.2,退出低功耗
4 c1 z8 I, r: S! J( O2 X+ Y退出是模拟下拉Function按键5MS实现
6 s( e8 C, o' Y* t. E2 i( z
  1. drf1609h_outLowPower();1 E% {8 [4 `: k2 w! K# P4 |8 f8 T! T
  2. HAL_Delay(5);
复制代码
  1. //-----------------------8 n2 V" y8 R& B& J2 C  d$ @
  2. void drf1609h_outLowPower(void)) D9 _+ z) J8 r# S1 H  J$ o* G
  3. {
    4 |$ U% C+ B7 y; d# i. [" f1 g
  4.         set_outLowPowerPin_outPut();4 ]" H7 P6 r2 {0 z
  5.         HAL_Delay(1);
    ; b; X" g' ]6 n: B3 ~: l. z
  6. # K8 V% f$ B! y: z) S4 i' X8 G1 S/ c+ R
  7.         set_outLowPowerPin_out_1();
    . `, ]3 I  s& |- L0 b
  8.         HAL_Delay(1);- D) @' i9 l2 Q0 T, [1 _8 R2 P5 d
  9. : a' J2 ]( J3 G
  10.         set_outLowPowerPin_out_0();% W( E3 m5 ]7 c4 d' p% u. l0 [- l0 D0 r8 G
  11.         HAL_Delay(5);4 W" x8 e. u: @  q: \: t

  12. * b( \2 ~( {3 s  w% ~, }2 ?
  13.         set_outLowPowerPin_out_1();$ |) A' H0 a" {& c2 q2 {, l
  14.         HAL_Delay(1);
    ' W) p2 \2 G) J+ w* d1 {

  15. " u1 D# h8 |: w
  16.         set_outLowPowerPin_input();* m5 X0 y& d" A- t. G
  17. }
复制代码

8 R1 ~* ?  Q% D5 ~2.3,退出低功耗以后的数据传输
2 }  s5 i7 r4 ~" z; z# k! z& H0 }DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。* T( S1 [& u3 I' o
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。4 e! _, j, \( d3 F/ s% y& Q) w
点对点发送的官方描述是这样的:. T! D( }6 b4 _  ^# v

8 U  G7 F& n$ ?& A  e( r& v

* j9 f2 W7 ]8 [! c$ ~! q
20200213154415740.jpg
1 H% U+ ]! P5 m1 p* ]0 {0 _

6 R3 H# {4 j% |1 S$ C代码实现为:8 S" ?% F" v) C: ]2 p

8 n; g- k( [4 `# ?& J: z
  1. //--Send out the AHT10 Data as point-to-point transfer model -----; E/ ~0 h) y" n+ K; r- M
  2. set_lowpowerSendOutData();
    ) G! |  t& a. w1 x2 R
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);2 e# S  c: F7 p! z
  4. HAL_Delay(5);
复制代码
  1. //----------------------/ H$ A6 k* S7 B- O
  2. void  set_lowpowerSendOutData(void)# m% B, z; n7 E  s+ k; P
  3. {: l; D: s4 W$ k
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];
    ' y+ k5 f5 o: v6 h
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];8 S% w; t4 I+ z* B9 |' U- N
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];
    ) ^% K. B8 }9 r5 n2 z( P
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];) R+ n4 s, k1 j' b3 M
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码
+ g% }0 h( \, T* z& F

; l( ~$ g+ A* K& o9 k& E  ~6 A+ f' f  x6 j. [6 \; d$ l0 L
3 w! g5 R& W) M4 |  g
20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版