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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 16:49
前言7 X3 }4 f5 p  K: M  P% ?, U( w
由于STM32F1ADC的精度最高位12位,在一些精度要求高的场景明显不足,因此需要提高ADC的精度,这里采用过采样发来提高ADC精度
* Z1 D6 r8 h# S9 T+ u$ I! Y  a6 m' e$ e3 F9 X$ P! l
: e+ {: b% w0 c4 A
一、软件实现部分
4 u+ n& F4 ]( V8 s我是基于正点原子战舰V3的板子来实现的,主要就是对输入信号设置好相应的采样率,满住奈奎斯特的至少两倍原则。然后根据要提高多少位精度对多少个ADC采集数据进行相加,然后进行移位来确定精度(不是简单的取平均)。: I. T8 p  y, M
下面展示一些 内联代码片。9 a* U7 I. ?$ V
# W6 k4 A3 M2 ^0 l( w+ @1 T
1 i/ n; _" H8 }# J
  1. // A code block$ ]! \3 D3 u; ?  @
  2. /*ADC_OVSR:过采样率,取值2,4,8,16,32,64,128,256*/3 H4 g/ |  ^- @. M; }$ i
  3. #define ADC_OVSR        2566 W3 {) D* i1 m/ |

  4. ( ]  t/ _( I, \
  5. /*ADC_shif:ADC结果右移,0~8/
    7 i* Z% s, ?) I, |8 q8 M  t: b  f% g
  6. #define ADC_shift  4
    ( u+ u6 h1 q  [- U- |- ^/ |5 |$ o
复制代码
  1. //在freemodbus下我只能实现15位精度,因为他的保持寄存器是u16的,还不知道怎么改底层函数
    ! R( ?* r) i, J4 [5 Y" l) s2 i
  2. void adc_20bit_value(void)  b! X" d1 @7 o* B0 W# T
  3. {
    3 b1 D/ c$ V9 J- V3 `, H+ z+ T6 O
  4.         static u32 adc_buff=0,adc_sum = 0;  N3 b! O- w( b' G1 Q" Y: w
  5.         static float adc_volt=0;
    + `' U# R# u0 Q0 M" u+ g1 s* @
  6.                 if(adc_500ms_flag == 1)
    ( ^/ G4 w; ?" R% q4 ]( B% F  k
  7.                 {! H4 E) v2 o" t0 v# }
  8.                         adc_500ms_flag=0;
    0 ~4 k0 \- m+ b: C
  9.                         printf("\r\n The current AD value = %d \r\n", ADCConvertedValue);
    0 I% S6 n! A% ?
  10.                         printf("The acurate AD value = %d \r\n", ADC_ACCURATE_DAT);
    / R2 R$ [8 }% [1 U: Y8 t4 L
  11.                         printf("The acurate AD value = %.8f \r\n", adc_volt);
    * R" a- i' Y. P. O7 O
  12.                 }4 g2 k* ^+ M, K0 ?( k$ e
  13.                 $ c  K2 j& V" [
  14.                 if(adc_10ms_flag == 1) //¹ý²ÉÑùµÃµ½16λadcÖµ5 ?' d6 ?/ J4 B3 ?. O6 {1 `( q
  15.                 {4 M$ y2 S+ r7 X2 Y3 g
  16.                         adc_10ms_flag = 0;
    * [# I$ @+ P+ t: g# c! |% O
  17.                         4 I8 K4 [/ r  x' m/ J5 t) f% v* ~6 A
  18.                         for(adc_buff=1;adc_buff<=ADC_OVSR;adc_buff++)  |# X+ y, I( t& W. D
  19.                         {! }: J1 ^* m6 h- D  ~8 Y3 ]3 H
  20.                                 adc_sum = adc_sum+ADCConvertedValue;" R# u% i$ R. K( Z" s
  21.                                 if(adc_buff==ADC_OVSR)
    ; l9 P' W9 X9 H
  22.                                 {5 n. A# G$ P+ d, n$ J( W
  23.                                         ADC_ACCURATE_DAT = adc_sum>>ADC_shift;* Y2 b9 u# g; j+ d5 [
  24.                                         adc_sum = 0;% r% U7 N9 W$ n
  25.                                 }
    5 s) y* U7 |9 ?! B8 {
  26.                         }/ ]  T. ]$ Q; R; y1 I/ k
  27.                         adc_volt= (float)ADC_ACCURATE_DAT/1048576*3.3;
    5 W/ _' @+ L$ p! c5 ]
  28.                 }
    ) I' _* B! b6 r1 x
  29.           
    ) t# d( L* Y. ^2 [5 I& R4 m
  30. }
    , s* t, Z1 R$ U8 H& m2 ?
  31. 8 V8 R+ N+ w6 L. y/ `
复制代码
; }8 l" ~: Z( [
! S  m3 M6 P: I0 T
————————————————
3 S5 g) E* D$ n% P版权声明:qq_44637112, N9 I4 |/ A1 @
如有侵权请联系删除
2 t1 D- N# \5 @. r2 Z/ ^/ G$ N' `1 C0 S
" Q' C$ Z' n) s$ b9 \' T' {+ E
收藏 评论0 发布时间:2023-5-17 16:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

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