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

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

[复制链接]
STMCU小助手 发布时间:2021-11-11 22:00
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
' b3 I  D- l8 r5 z5 s9 M低功耗实现有2个地方:* S$ G1 j3 C0 k
1,MCU本身的低功耗;% C9 c% v& A/ n9 O: `( c
2,DRF169H的低功耗;$ x) U4 o. `+ e5 J0 o
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。
1 J! R# R* Q& r* ]$ z+ x1 @" B( J项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
" Q  @5 @& H5 K* p5 r9 }+ W0 o下面来分别简述下这2个方面的实现方法:- K# y. T! B' U& U7 X
% _8 {) \0 a5 H2 S, ]9 Y, H7 Z2 c
1,MCU本身的低功耗" c6 ?8 j3 j5 }6 M0 I7 U9 t# b
STM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便
! F! K4 h( b7 p! p  o0 vstm32g0xx_hal_pwr_ex.c
& T- o- p- d! I: H; Vstm32g0xx_hal_pwr.c. v, w- C2 v6 w2 P7 x+ K9 n

0 L4 O  R2 e5 A* N( t2 q具体的实现方法:
% E+ ]8 I! b- w, u  o' J0 M1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H. p5 X8 ^) B4 G2 e
2,设定RTC中断时间,设定MCU进入低功耗1 s' R6 S0 k. H! f+ q' h4 ?
3,RTC中断唤醒MCU休眠
. x2 {0 ?, _* ^; I; x4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)3 E4 ~2 @% b6 N7 o8 I1 Y0 N
5,测量一次温湿度数据
' y6 V  J9 v# u7 c; ?3 G5 j6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒1 Z0 V) r& B0 O2 Y1 B8 j( J
7,发送温湿度数据
1 X$ j/ K% y: M- o) i% J8,重复以上1-7$ j. V% P0 S9 T# j

* {4 e+ F+ B; g
  1.                 // --Enter Low Power Model  -- //, u2 w% ^9 Z3 k5 _- j' _% z* K8 Y" P9 i
  2.                 LED2_OFF();6 J; ^$ k" L! h9 t$ g2 H1 c
  3.                 drf1609h_enterLowPower();
    # b; ]" B3 G$ r) J
  4.                 HAL_Delay(5);
复制代码
  1.                 //--Set wake up time = 0x500B = 10S ----: u5 M2 m( L9 g% y2 y* S3 w" v7 {8 b
  2.                 //--Set wake up time = 0xA017 = 20S ----
    8 n9 U; Y* }; U* L
  3.                 HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);) o8 h& f' ?; H8 s9 _! T/ I, U
  4.                 HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
    6 A' S7 K8 X" i. V! @( H: H  W
  5.                 //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);% B0 H9 q# f. h& J8 \# e; Q( I" Z
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码
  1. SystemClock_Config();4 h6 p4 F/ Q3 O) }
  2. MX_GPIO_Init();
    . Q# C& p: ~8 ?' J* @" C
  3. MX_DMA_Init();  G% C; D7 X9 v" h8 {
  4. MX_USART1_UART_Init();! t4 R# j1 q, \0 D# Q
  5.   d& M6 B, U1 X2 o7 w" x& t8 m( t
  6. LED2_ON();
复制代码
  1. //-------------------' I5 P6 M! |% E" P  z9 ^
  2. read_AHT10_once();
复制代码
  1. //--------------------9 \' ~' g# P+ A: V% c' k6 G
  2. drf1609h_outLowPower();
    ' m% h- h& q6 \! D' h6 [) j
  3. HAL_Delay(5);
复制代码
  1. //--Send out the AHT10 Data as point-to-point transfer model -----+ M7 P0 X' P/ D0 d( n( ^3 x. {
  2. set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);' u' v) v3 V/ N/ l3 W! d  [
  3. HAL_Delay(5);</div>
复制代码

8 x; s% E* n% ]( N/ x( l4 E2,DRF169H的低功耗实现  z. {% r' Z. l; E
2.1,进入低功耗1 g' }! N0 ~  o" }' a" n( _
DRF1609H只有工作在End Device节点下才有低功耗功能;4 `5 Z- x! C+ p4 P
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
* D5 ~; {9 X: G2 J: h, v
  1. drf1609h_enterLowPower();
    1 c% f( R+ l- i4 S; X
  2. HAL_Delay(5);  h( ~$ Y5 c8 l' t
复制代码

& H* H" h; q0 v" n4 R& @0 t1 n具体可以参考DRF1609H的说明书* ~- [5 A/ z& i$ |

- t" Y, z" c' k
20200213154402218.jpg

$ ?" i' ?( D1 D7 ?
20200213153434699.jpg

8 k/ F& D% K6 w& j. y# t
20200213153446292.jpg
0 |( D, y* N- j
20200213153456791.jpg
0 C" p( s6 x% ]% M; m
2020021315350837.jpg

9 b/ F! \2 I! d
# J  n1 P# }* |/ q( s
8 a# F0 Q* V, ~! I5 U  I9 w) c2.2,退出低功耗/ x+ N* s7 _0 A" u
退出是模拟下拉Function按键5MS实现4 n; Y- ^: y: u3 k
  1. drf1609h_outLowPower();
    ' f+ h7 s" k1 s
  2. HAL_Delay(5);
复制代码
  1. //-----------------------: P( v( |. R0 H, p" w! _
  2. void drf1609h_outLowPower(void)
    6 q4 b1 s/ p: ?7 K6 g
  3. {
    9 f5 \8 B" J( r
  4.         set_outLowPowerPin_outPut();
    + B- E/ ~: D6 F: s3 R7 d
  5.         HAL_Delay(1);& G0 U7 s( G6 e) w/ A9 r

  6. $ ?+ _* l7 W0 U5 u
  7.         set_outLowPowerPin_out_1();9 [" V1 {4 B) b
  8.         HAL_Delay(1);, g5 ^# N  O( u" @3 K
  9. ; N* z6 @% V- }( D  G
  10.         set_outLowPowerPin_out_0();& L2 {0 N- W# J
  11.         HAL_Delay(5);3 T0 d, m( _$ b  D
  12. : ?" F/ S7 y% ^4 z
  13.         set_outLowPowerPin_out_1();
    " i3 y) y7 ~7 R9 k) k  p! ?/ X" V
  14.         HAL_Delay(1);, V/ k4 \* V7 D' @

  15. ( O( N& z+ ~! ?7 F
  16.         set_outLowPowerPin_input();
    - d$ G8 M, C  F+ u$ J
  17. }
复制代码

: H# m, ~. D; s( M' J3 |2.3,退出低功耗以后的数据传输9 m/ W& l4 W! ], }. k" f4 q
DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。- d7 `# ~8 x: V& w' Z4 l- E" X
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。
! `  K( E. G' A. {点对点发送的官方描述是这样的:
2 c+ R# c4 ]. |$ a: K+ T0 |, t( U/ I3 Q) a' ~' M
1 O- D# i( ^- Q6 a* _& X) p( ?
20200213154415740.jpg

- Q% y/ V' S+ l& C& l# U* w6 }' l
) Q2 G$ e, U& z! [1 r代码实现为:
0 e5 v3 z0 i! T$ a: x) [
2 t( a5 P, x5 B& T$ w
  1. //--Send out the AHT10 Data as point-to-point transfer model -----
    ' a0 m! e9 n2 L
  2. set_lowpowerSendOutData();
    ; L; k: c8 g  d& \! [
  3. HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);# f+ t8 F5 I! ?: h, \; j% }- w
  4. HAL_Delay(5);
复制代码
  1. //----------------------$ O5 K/ ?; q! j2 `& x
  2. void  set_lowpowerSendOutData(void)8 S0 m- z8 I- d! {
  3. {
    & [0 q6 w" T  B" Z' |- ~" g; W6 F, F
  4.         lowPowerSendOutData[4] = AHT10_OutData[0];
    6 ]8 N) M' d# r& K& g4 {
  5.         lowPowerSendOutData[5] = AHT10_OutData[1];
    * O5 v; O5 {  W' H) {
  6.         lowPowerSendOutData[6] = AHT10_OutData[2];4 B% O4 K- N8 `7 g2 \
  7.         lowPowerSendOutData[7] = AHT10_OutData[3];8 t. E5 D% z9 c4 y1 ^& v# q4 d3 u
  8. }
复制代码
  1. uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码

9 F1 k2 k) Y: x# I* ?; E
$ M7 z% x1 Q" |0 a. [; z8 K; ~4 z0 B9 N
: p  [& H9 W' \8 O  y! e8 G
20200213153420781.jpg
收藏 评论0 发布时间:2021-11-11 22:00

举报

0个回答

所属标签

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