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

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

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:16
一、Cubemx工程配置
/ ^9 a) T: E( Z# ?' F1、时钟配置
( p/ c! O9 f7 f9 O4 I6 n. T/ d( L1 h$ g$ Y
H1_7SPQZ)PBXNZY4ZGSM~6O.png * I3 U2 R6 |' d
$ [5 ^! b4 D& m" o$ t. e& e
2、DAC设置7 G  m8 K  m7 _  y% ]$ C3 i
1 O. E( ^6 }, A. d
具体设置如下图所示:3 V# w$ w4 |" R, M9 q1 Z$ @
))6NTLWVSX`Q_F])CDLO91I.png 3 W" i) y! N4 {9 `: H8 K
- D/ p# |8 K" W+ b, A! N
3、ADC设置
3 p6 X3 z2 O1 u( c: I& J: K" e% O& Q
这里需要注意的一点是:Sampling Time(采样周期)设置越长采集到的电压越准,同时耗费的时间越长。可以根据需要选择自己需要的周期。
# s7 W# Q4 e+ D# O" `  R: H8 L( W
+ ^  k4 _* Q1 l# \具体设置如下图所示:) [) y! S7 E$ V3 n

# M: p; J' g' j( ?1 n: x; B( k 0CT7`KV9I1IT95H4RP]7ZPO.png
: f0 ^1 `- @! P# }# j
& K  w) P1 T! K! K二、实验7 T9 b& A7 w- D0 c5 {
1.ADC采集电压函数
- R( K9 }6 X# }6 i5 Q2 u: V5 `
需要注意的一点:打开ADC后不能立即读取,需要延时一段时间 ADC读取步骤: 1、打开ADC中断 2、延时一段时间 3、读取ADC值 4、停止ADC中断
, k' e) ?1 H$ p  x2 K/ F5 H( |代码如下(示例):2 k  x# I+ D) v# e% q- p& e+ `
3 ]% J1 J& I5 D+ h7 ^
  1. uint16_t Get_ADC_Value(ADC_HandleTypeDef hadc,uint8_t times)
    & B! _6 z$ o& P) K: n
  2. {' G1 s: h/ ]1 \3 J
  3.         if(times>=30)
    : A1 P; h$ h& s. \% R2 V
  4.         {, M9 m8 N$ {/ F; }
  5.                 return 0;( D. m) s- p* H; F/ Z6 m
  6.         }% F# h7 T2 _9 I1 y1 Z8 \$ U
  7.     uint16_t        adc_value_final=0;! k3 H: H  e5 b- U
  8.         uint32_t        adc_value=0;
    ) w& N+ D7 l; q$ [6 q; F
  9.           HAL_ADC_Start_IT(&hadc);   //打开ADC1
    0 o# i' G  X2 N
  10.         HAL_Delay(10);   //打开ADC后不能立即读取,需要延时一段时间; ~8 `$ Y* `0 ?! O% ^
  11.         for(int i=0;i<times;i++)
    " ^; U$ E4 s. c) ?; p% H
  12.         {
    2 j* Z2 N4 t4 E3 V1 x# ^! |
  13.                 adc_value += HAL_ADC_GetValue(&hadc);  ; h9 I0 ?. T8 \# H% @1 S0 ^) ^
  14.         }: y, q) m% i2 w
  15.         adc_value_final=(uint16_t)(adc_value/times);
    ; n* I  {7 [; r' V0 |8 X
  16.         HAL_ADC_Stop_IT(&hadc);  //关闭ADC1
    8 X: @: ]+ w8 Y% t
  17.         return adc_value_final;, H$ W' M. O, P2 H- g1 r: \
  18. }
    5 a* J8 u; w1 |! B

  19. - ]- N# c. n, m( O( K( Q; j
复制代码

# ~3 r( u- c% [# |2.主函数功能! \. q# ?+ w, ^) J
这里在主函数增加了按键扫描函数,按键1每按下一次DAC输出电压就增加0.1V,按键2每按下一次DAC输出电压就减少0.1V。另外还增加了串口printf函数,打印出DAC输出电压和ADC读取到的电压值。  w2 N- Q- e1 d& A$ a4 C0 D' e
3 c5 Z8 Q) T' ~1 w
代码如下(示例):
0 F' y, \+ W- v: x& r* y- w& G: L& E  B. u* Z
  1. key=KEYPRESS();    //按键扫描
    3 j. X1 n5 W; i0 s4 A8 k, \
  2.                 if(key==1)//按键1按下
    " P& S$ R8 V4 H! @! _
  3.                 {
    8 G) g3 I+ n% z
  4.                         if(temp<=3.2f)* ?# J7 o% l- D
  5.                         {  b- v4 G; s( [& N+ V4 g9 N
  6.                                 temp+=0.1f;
    ; l. X+ v. s3 Q% C/ b8 S8 P
  7.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  
    : U/ ]& M8 h/ ^: ]& i
  8.                                 printf("Set Voltage:%d=%.1fV\n",(uint32_t)(temp*4096/3.3f),temp);
    ' i, S: D- S7 A5 F# ~: l3 E2 M, ~
  9.                         }                $ M  Q' j1 a+ e8 u7 O9 f
  10.                         adc_value=Get_ADC_Value(hadc1,10);
    5 a( m7 e# Y5 d& `  s" q# a
  11.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  
    $ V* Y! b. G7 Q9 m4 B% @( `
  12.                                 ) I  o# O# G* r5 b) V  x3 i6 P8 n
  13.                 }
    / f1 `) L/ @# i* z: A
  14.                 if(key==2)//按键2按下! Q! g' Q7 [% n9 B! z
  15.                 {1 s, p& s, F+ h7 B  E5 b( T
  16.                         if(temp>=0.1f)
    + t/ f& A  r' [% N; {
  17.                         {: s5 G: @, b. z; Z+ \
  18.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  % I3 e) C$ P: u7 f
  19.                                 printf("Set Voltage:%.1f\n",temp);; s$ W/ l2 O" Y( ]4 N( ~- _# Z# P
  20.                         }                " z! ]7 G% w& \+ y) b1 ]
  21.                         adc_value=Get_ADC_Value(hadc1,10);
    ; ~" O2 v! g4 Y" f7 r1 C& h- W2 C
  22.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  
      \* c8 w) U8 W; J3 Q; e0 z9 |6 {
  23.                         ) |$ g2 J1 i3 v0 x* O
  24.                 }        
复制代码
$ Q" c: W! |: s/ b  G
最终可以在串口看到正确的实验现象,如下图:+ x6 R( Z2 E! q5 `2 s# m9 P( U

& N6 I1 H* X% R A8UX1J)FM[)SKDQAGCRFUCA.png
7 l/ k7 D, ^9 m! w8 v! }1 h
" b4 G% g9 b9 H( ?7 O: @% X: y三、内部温度传感器实验' o  ]; Q/ z. t" |% Q5 w1 K
1.参数设置
8 c9 \! c. U+ ]
注意:不要忘记打开ADC3的通道中断
* e$ g3 W( `6 F5 S& C8 {& c5 {; E* e) @& W7 ~" `& ^8 z
AT5D~V~D%8@BE1~MVGSSRC5.png
5 D( M# U" Y2 X5 i8 _& K8 p7 e, u. B, X* x' {  N& j' ~
2.函数功能实现
4 U9 T0 g8 s; O' @首先要进行ADC校准以及要打开ADC通道。0 T- ?& w1 y/ N- q1 a) H
代码如下(示例):! W% w  _: v8 ]! s4 I2 S, D) M  g, z
! `4 M8 Z9 M- N1 M
  1.   /* USER CODE BEGIN 2 */
    9 E- }2 V9 g, d

  2. 7 U5 Q+ j6 ^; Z8 X
  3. //校准ADC9 a* @/ I/ |% y1 B9 ~. s
  4. HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);  //打开ADC3! L; F$ o- G0 y9 @- \# @
  5. HAL_ADC_Start(&hadc3);  
    $ ]$ @5 K( G8 Z; {) T
  6. /* USER CODE END 2 */
    ! N  I8 p# j+ P8 \! t2 m' z7 ]
  7.                         
    7 s; _3 ~! K- R
  8. }   
复制代码
" u/ \1 l3 D. y$ w+ F
  
% f( H( K" a" e其次进行AD采集以及开始运用公式进行转换。( Q# W* r( N4 r5 ~
代码如下(示例):
4 w. ]  ?% O' U( {$ }7 m, G1 d1 _* z# p5 ?
  1. HAL_ADC_Start(&hadc3);2 M* d9 P$ u. e
  2. adc_v = HAL_ADC_GetValue(&hadc3);
    1 y3 Z: v& R. q9 X7 P8 r+ S% U
  3. adcx = (110.0-30.0)/(*(unsigned short*)(0x1FF1E840) - *(unsigned short*)(0x1FF1E820));+ G4 I. i1 _5 ~. O+ h1 C+ d
  4. temp = adcx*(adc_v - *(unsigned short*)(0x1FF1E820))+30;
    / m6 D& l, U8 e+ |- P5 X0 s
  5. //temp为最终的温度值
复制代码

4 M# W" Z8 ^4 ^& n5 I+ z  d" K, I! M1 K! O' s: [: j, t: U3 \) d
最终温度测试结果如下:" i  v% M3 H: t. q
C98{G{3XL`0BH94~N6D(6.png ! O, _9 i, H  k7 Y) Y0 _

! g' }$ r+ j; [9 K/ v! E
1 O/ m/ E$ i) J! _9 L+ f% k/ ^9 i4 ?/ H
% w3 |% d, [; N

2 [. v% J- |# \/ y% P- N' P# A* p  ?6 `" a( P' w

! K7 u0 _4 v+ X0 f2 S* ~5 H, r" D" r+ J2 c3 `
- T8 D+ Z6 J- s! R6 ~( @; V

% A9 [/ Q5 D" c7 {: m; m6 p, @; s2 Z& {7 E; R& e$ e, Y

: D5 F4 D0 K: h' H; C8 R& ?; k; L) E; c6 b4 x9 |1 s. Q

$ A2 B  w$ Q; f7 V8 F) o# D# d, o/ g7 T5 I( ]
- y1 X4 |; {) Y, \8 Z
9 }7 r' B8 e! R" E, ]4 u* v
收藏 评论0 发布时间:2022-3-8 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

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