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

基于STM32F1提高ADC精度经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-17 16:49
前言
5 P4 y3 [" E9 t( o* j  P) f由于STM32F1ADC的精度最高位12位,在一些精度要求高的场景明显不足,因此需要提高ADC的精度,这里采用过采样发来提高ADC精度; B3 R+ [6 M2 `& t8 j8 p3 E3 G
  z. a1 L2 N9 c  }5 T! D  o  U
; _  _) {+ P* q9 j3 R
一、软件实现部分
7 z( d1 y4 z$ v. u我是基于正点原子战舰V3的板子来实现的,主要就是对输入信号设置好相应的采样率,满住奈奎斯特的至少两倍原则。然后根据要提高多少位精度对多少个ADC采集数据进行相加,然后进行移位来确定精度(不是简单的取平均)。2 a3 l& q' P. B9 h! |( G3 [! ~
下面展示一些 内联代码片。% C# E" H9 b) v1 I& D+ k

( x! j$ C2 }, m% {4 a. S

" H8 N; w) D. G) ~& P
  1. // A code block
    , R. ^; m! `- A$ R% l( R
  2. /*ADC_OVSR:过采样率,取值2,4,8,16,32,64,128,256*/
    " L8 M+ |0 W/ R: h5 b
  3. #define ADC_OVSR        256
    ; W& a# F9 T: b7 ^- P( c) `; R

  4. 7 }% [' ^& B6 W
  5. /*ADC_shif:ADC结果右移,0~8/: ?) H+ E5 ^7 T9 [
  6. #define ADC_shift  4
    % u* u0 T. G) B* O$ f2 l! f' u
复制代码
  1. //在freemodbus下我只能实现15位精度,因为他的保持寄存器是u16的,还不知道怎么改底层函数& D- W: O: J  o# u8 _
  2. void adc_20bit_value(void)
    / s0 N+ D1 b! w) R1 @2 U
  3. {0 T  G9 V, q, V/ z' A
  4.         static u32 adc_buff=0,adc_sum = 0;3 q$ D3 |5 i, h  h3 W
  5.         static float adc_volt=0;! W1 Q: r0 S; A) z: c2 W0 N, n$ x/ e/ j
  6.                 if(adc_500ms_flag == 1)
      p, H' `  d5 `3 M; k$ d1 ]
  7.                 {4 c; s5 N' A: z# y" L8 U- T
  8.                         adc_500ms_flag=0;
    2 a' e, n3 ?, G% d3 L# C6 V8 M
  9.                         printf("\r\n The current AD value = %d \r\n", ADCConvertedValue);( h+ }% Y7 _+ n& I2 F$ }
  10.                         printf("The acurate AD value = %d \r\n", ADC_ACCURATE_DAT);* i: c& A8 }+ ^2 w
  11.                         printf("The acurate AD value = %.8f \r\n", adc_volt);
    # H. K  z# o" ], t
  12.                 }
      o* t3 C5 `3 i$ o. D! d! z$ t
  13.                 - a9 x) V+ Z9 y* w6 d4 {3 U) R
  14.                 if(adc_10ms_flag == 1) //¹ý²ÉÑùµÃµ½16λadcÖµ
    " t! J8 d2 ]* D1 h
  15.                 {
    - X' O: i4 Z1 Z. {5 D  b0 O
  16.                         adc_10ms_flag = 0;! C' z9 F  G$ Q0 j9 H% K2 [4 ]
  17.                         ) @3 D& @/ z! Q
  18.                         for(adc_buff=1;adc_buff<=ADC_OVSR;adc_buff++); b% G* l& u: U7 h
  19.                         {
    - ?. u4 y0 H% b# B% l# |8 ~
  20.                                 adc_sum = adc_sum+ADCConvertedValue;
    $ F7 a" Q* y4 v, m
  21.                                 if(adc_buff==ADC_OVSR)
    , [* _7 z5 ?: O6 W+ X
  22.                                 {" t8 \# a, ~" {1 P' O
  23.                                         ADC_ACCURATE_DAT = adc_sum>>ADC_shift;! A) ]4 b8 I+ M& [
  24.                                         adc_sum = 0;) @# @& y* i' Q( K# ]% w- S9 d3 s
  25.                                 }
    * _8 x( |$ X; F
  26.                         }- X9 H) _7 Z* i( I2 M
  27.                         adc_volt= (float)ADC_ACCURATE_DAT/1048576*3.3;9 [8 f( w8 ~9 W
  28.                 }
    % x. a# y  E' Y& l8 w
  29.           , G: A/ G/ S5 |
  30. }
    . ]/ u1 ?8 l0 d7 s" C% b7 P8 q/ d1 V
  31. + T$ s" B7 ~' G+ ^$ s
复制代码
" h" Q- k4 l# ~" m; M7 ?5 @! M
( h! z! i, W# k# k4 f9 d* N: v8 a) I
————————————————
) V% g  ^3 l  T& n8 S2 _+ b版权声明:qq_446371125 c% p( J  ^( m! m, E
如有侵权请联系删除; e" @* c) S" B

! O  d! t/ Y: a9 K+ ?4 L; H- S+ c5 W3 J2 O
收藏 评论0 发布时间:2023-5-17 16:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

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