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

【经验分享】stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:16
一、Cubemx工程配置
& ~0 X2 v7 G8 M8 c% c. d- N1、时钟配置: L1 k" f7 z) j) N6 _' ~( V, m

. d; r$ ^3 r$ E! [2 y9 i( V7 t5 j H1_7SPQZ)PBXNZY4ZGSM~6O.png
/ k5 b) g/ Q" h4 H9 d7 o
1 s( Z; w: W+ u- D) |2、DAC设置
) b& l$ r/ `, H  G, ?
7 h& g( S; f; ?2 ~4 C/ B7 ?具体设置如下图所示:# a0 n/ K) D' G/ a" @  S
))6NTLWVSX`Q_F])CDLO91I.png ) z: c( o$ Z) g

8 t' g4 G- v& H, n( S# I1 B3、ADC设置. \) w; B- B/ F8 j

. i, x7 S$ X. O2 y$ _这里需要注意的一点是:Sampling Time(采样周期)设置越长采集到的电压越准,同时耗费的时间越长。可以根据需要选择自己需要的周期。
+ }6 Y" p4 l& X0 d( X) `3 j& T8 G+ h- ], }( f& @$ m! B
具体设置如下图所示:; F3 a9 X4 K9 D/ ?

. S! j% D9 @4 p 0CT7`KV9I1IT95H4RP]7ZPO.png
! u4 s! K# z, S
5 S9 b# d/ Q" P) o2 B* r1 }二、实验
" y6 u7 U0 {  R9 c; |1.ADC采集电压函数
! m  e) h8 ~' L; T
需要注意的一点:打开ADC后不能立即读取,需要延时一段时间 ADC读取步骤: 1、打开ADC中断 2、延时一段时间 3、读取ADC值 4、停止ADC中断! \% [1 X; N: @& V
代码如下(示例):" y6 n, v. P: |6 t+ O6 T$ {/ b" y- H
" b7 j3 }9 ]7 Y' ]- L$ Z; h
  1. uint16_t Get_ADC_Value(ADC_HandleTypeDef hadc,uint8_t times)
    9 j, y+ d: R6 @  [
  2. {8 R  s, b: U/ X* j, C/ {+ @
  3.         if(times>=30)
    - n  |9 O4 F; m. [6 |
  4.         {8 W+ u4 E3 f- e  L1 j
  5.                 return 0;3 y# X: q; a, `  R
  6.         }
    - O7 C6 R9 I( w" t+ ~. B
  7.     uint16_t        adc_value_final=0;
    + A+ e4 B/ d4 B, K
  8.         uint32_t        adc_value=0;9 |6 E0 w3 A# X4 |
  9.           HAL_ADC_Start_IT(&hadc);   //打开ADC1" N  S# m! b- A! z) n; J" J
  10.         HAL_Delay(10);   //打开ADC后不能立即读取,需要延时一段时间, v% j% y$ {' m- X, Z
  11.         for(int i=0;i<times;i++)
    , p, \" M; w6 L
  12.         {3 ?+ S  s& ~  }; P( e& F
  13.                 adc_value += HAL_ADC_GetValue(&hadc);  2 g/ l. i" n5 p$ q' n
  14.         }! y; t; K9 U" E" \
  15.         adc_value_final=(uint16_t)(adc_value/times);
    4 r- H$ W8 c- t1 Q
  16.         HAL_ADC_Stop_IT(&hadc);  //关闭ADC1
    / [9 `' V' T0 B' T! o! B& q) C
  17.         return adc_value_final;' h+ b* h! Q2 m3 f6 Y
  18. }
    % U$ Q4 g0 q' m( T
  19. & l; ^6 i$ D: ]6 t9 Z* I$ T. x0 ~
复制代码
& ?3 L. @: j: {1 W: \" Q1 n
2.主函数功能3 k+ C1 E% x% Y8 m! K& K
这里在主函数增加了按键扫描函数,按键1每按下一次DAC输出电压就增加0.1V,按键2每按下一次DAC输出电压就减少0.1V。另外还增加了串口printf函数,打印出DAC输出电压和ADC读取到的电压值。+ m& @- D! v+ |0 y! W

' F( u' p; z5 @8 i8 D$ ]: K代码如下(示例):
% a- c8 T6 B. W, e
: R- _0 A0 E5 Z' E1 Z
  1. key=KEYPRESS();    //按键扫描5 ]* g) F2 C# }- h9 f. L
  2.                 if(key==1)//按键1按下) v/ L5 l, }0 l5 b& Q: Y
  3.                 {
    * \' A# z' H9 T0 t% `% E( B0 Q1 X
  4.                         if(temp<=3.2f)
    # h9 J3 r$ ?+ Y
  5.                         {1 S" t2 B2 Y- \
  6.                                 temp+=0.1f;
    ! L. J* X: o  k% Y5 N
  7.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  9 r+ r$ ?0 M. j. h6 p2 p; L* ]/ j8 e
  8.                                 printf("Set Voltage:%d=%.1fV\n",(uint32_t)(temp*4096/3.3f),temp);) m( l* s1 z. U. F7 I/ W
  9.                         }                4 V0 o% }! r! S, S
  10.                         adc_value=Get_ADC_Value(hadc1,10);& S( X! p  s8 v/ f3 S! R
  11.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  & k: [* h2 h4 n4 C$ c, o
  12.                                 
    3 y! c! H, V8 T' U) U. D0 D
  13.                 }, t* Y. L5 a) e3 z9 K$ d
  14.                 if(key==2)//按键2按下7 [2 ~8 G: b. |0 N9 H
  15.                 {
    * f/ _+ G: j# [
  16.                         if(temp>=0.1f)" m- w0 h- f7 [& y
  17.                         {
    & f% L5 p) p7 z5 t$ Y6 h6 D' C9 }
  18.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  " ]  }) @- T0 {8 p7 u% `
  19.                                 printf("Set Voltage:%.1f\n",temp);
    4 A( _. D: A+ s' {
  20.                         }                8 D- [# u! A7 D2 U- b# C
  21.                         adc_value=Get_ADC_Value(hadc1,10);) R7 g$ Y2 ?  |
  22.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  
    % V$ l5 H0 z  q* }, m' |
  23.                         / G4 I8 V  Y$ g% R3 U' E) s! b
  24.                 }        
复制代码
+ [8 q8 R8 b- T! I+ e
最终可以在串口看到正确的实验现象,如下图:7 j8 e1 T  X% i$ d9 Q" W( u* m
9 ~2 E, ]2 ^3 q3 Z6 s2 Z
A8UX1J)FM[)SKDQAGCRFUCA.png 8 q6 p3 X2 P0 k0 L8 s

$ [# v+ S1 C, X5 \* ^; H. N三、内部温度传感器实验
; g1 I1 Z# a1 }9 A) E- [3 ~- E; F. H; O1.参数设置
4 c, S5 r3 D" @  E3 B
注意:不要忘记打开ADC3的通道中断
$ d: f( ]' S) S# |) S& x" f" ~& S5 J, @  P
AT5D~V~D%8@BE1~MVGSSRC5.png
! f% i  U! M- h4 s+ F& p$ k
4 i2 w$ x0 s9 d4 O4 A( l: k2.函数功能实现  B! O7 O2 \' I  N: K6 o1 O! J) _
首先要进行ADC校准以及要打开ADC通道。2 y; h0 w, W: i! F7 J
代码如下(示例):; I! E; S3 g- n: @6 U6 z8 r

; x+ V; S! k5 Y/ _3 U4 `
  1.   /* USER CODE BEGIN 2 */0 d4 v, t5 X9 J5 `2 v! D
  2. 2 V  o3 r1 W& v
  3. //校准ADC
    0 x1 [# F# i% E5 b" s' o
  4. HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);  //打开ADC3# B* q% J/ }( ]* j" P
  5. HAL_ADC_Start(&hadc3);  * O2 s. a2 j- T# Y7 G" ]8 e
  6. /* USER CODE END 2 */ 8 s, W9 H+ q6 K/ Y0 K
  7.                         # A9 }- b& I- C
  8. }   
复制代码

7 u# v, m" h/ i/ G4 g  1 U) m( N6 A- F; c. ~
其次进行AD采集以及开始运用公式进行转换。
4 s/ w' l+ r" t* ~代码如下(示例):
3 _* p4 ]/ E6 M7 O
" X& O/ V2 E1 y
  1. HAL_ADC_Start(&hadc3);
    $ k7 {# t1 K1 ^
  2. adc_v = HAL_ADC_GetValue(&hadc3);
    ) e# Y) ?* j; B6 ~0 `* i- ~
  3. adcx = (110.0-30.0)/(*(unsigned short*)(0x1FF1E840) - *(unsigned short*)(0x1FF1E820));- b( E5 U4 X5 i0 ?" _
  4. temp = adcx*(adc_v - *(unsigned short*)(0x1FF1E820))+30;% C9 G% C- l: J! j' A( V. J& s
  5. //temp为最终的温度值
复制代码

$ \8 o% [+ R5 K7 c" e$ Y( @" _; |$ b7 U3 q$ B
最终温度测试结果如下:
2 Y( A2 v' n+ Z) z2 M2 e1 ? C98{G{3XL`0BH94~N6D(6.png / y. l9 `; H; x" Y

; K4 a/ t1 O2 Z8 B/ d2 v$ l9 J3 D

* J' P' ?# t* E  |" Z4 o, k) q" M( @8 @1 D
& y2 p4 S; B/ u# A9 |1 ]
2 W) r; ~4 x* s' c' d+ F
6 _, I& G+ i; q9 K! C- j2 t8 B- ?
0 _2 _' u8 ^  R+ c/ T; i* g, C
6 R8 y5 D$ `, w
" R% C: U; e8 C: }3 i# r$ W' T) |
, e; V( [+ Z8 A& M( U8 B
7 Q: |8 E% \; p' F) y' T8 }- D
/ O, J4 M7 \3 l, p6 ~: |3 A6 A

: Y7 X1 F$ L. o$ }2 e
2 Z0 V: d/ q4 v8 D7 N5 e+ B7 U
& b* K8 S2 v3 O) B8 q3 v, T& k* I6 R. T7 I$ T
赞 收藏 评论0 发布时间:2022-3-8 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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