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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 16:49
前言
8 b2 G- T) Q4 N! b& s由于STM32F1ADC的精度最高位12位,在一些精度要求高的场景明显不足,因此需要提高ADC的精度,这里采用过采样发来提高ADC精度
8 I, C# I5 r( D4 ^+ Q
/ ~, X7 N; Z7 ~  V- d3 B; l% P
/ n7 H, o- j8 A0 y! N
一、软件实现部分
! x5 ^4 b, P/ q) F# ]& V/ `$ H4 ]我是基于正点原子战舰V3的板子来实现的,主要就是对输入信号设置好相应的采样率,满住奈奎斯特的至少两倍原则。然后根据要提高多少位精度对多少个ADC采集数据进行相加,然后进行移位来确定精度(不是简单的取平均)。
7 q( T- f# t4 i4 K2 l下面展示一些 内联代码片。
6 ~: ~9 E  q) N" K
+ ~& R# e0 d, N$ }; z  k
. G# ~+ M( U5 r1 A  z% `3 g  J9 F
  1. // A code block
    7 H* N# q9 m3 j1 ~+ I
  2. /*ADC_OVSR:过采样率,取值2,4,8,16,32,64,128,256*/6 V7 D$ p; i9 e' U2 H% K$ J, B
  3. #define ADC_OVSR        2565 d$ Q- o4 K+ X7 ~4 d, [
  4. , N. Y7 {0 z& V
  5. /*ADC_shif:ADC结果右移,0~8/
    7 R6 A, A" m* u+ f  t9 b
  6. #define ADC_shift  4
    , ~& o$ Q# P, I5 m
复制代码
  1. //在freemodbus下我只能实现15位精度,因为他的保持寄存器是u16的,还不知道怎么改底层函数
    6 l: K0 F. U4 d
  2. void adc_20bit_value(void)
    ' p8 [# c9 Z/ y. g3 y! [" I1 Z
  3. {6 O& d, G7 |3 y" Q
  4.         static u32 adc_buff=0,adc_sum = 0;
    0 @/ j) r6 N1 ]) r% C
  5.         static float adc_volt=0;
    . \/ q( ?; h! R" [2 I; U
  6.                 if(adc_500ms_flag == 1)
    , ~' \& J- F; t; c' ?$ W
  7.                 {$ \1 f3 y# a/ ]
  8.                         adc_500ms_flag=0;/ }# C% D" [- T. s9 X$ l
  9.                         printf("\r\n The current AD value = %d \r\n", ADCConvertedValue);
    5 B" P9 r; q: ~9 T$ _! Y2 N
  10.                         printf("The acurate AD value = %d \r\n", ADC_ACCURATE_DAT);
    # W& h0 @: E* l9 P, a% T
  11.                         printf("The acurate AD value = %.8f \r\n", adc_volt);& g- Z7 I% ~8 g  j# B# U7 E, X
  12.                 }
    ) F# j! {1 j0 K! e
  13.                
    ! E5 T1 X/ z9 h; u' T9 j
  14.                 if(adc_10ms_flag == 1) //¹ý²ÉÑùµÃµ½16λadcÖµ
    8 [$ \9 X8 c7 q0 q- E' L* _* A2 P
  15.                 {1 u$ x( c* L, b- j
  16.                         adc_10ms_flag = 0;
    # }: ~7 U/ I$ l0 N/ Y
  17.                         / g9 S; o* e& P$ P% n9 T
  18.                         for(adc_buff=1;adc_buff<=ADC_OVSR;adc_buff++)
    * p! T5 C* r# E8 B
  19.                         {& X( P# N/ H' e( ~: P) @* A8 V
  20.                                 adc_sum = adc_sum+ADCConvertedValue;6 r7 z3 U% j2 r) Z! c( a( @
  21.                                 if(adc_buff==ADC_OVSR)
    7 {7 [! B- N8 e8 h6 e: S: o
  22.                                 {( |0 ^4 w- F! v/ r8 @
  23.                                         ADC_ACCURATE_DAT = adc_sum>>ADC_shift;0 a9 D; y0 T/ o) U$ z$ i  m
  24.                                         adc_sum = 0;
    % M! N9 H3 A3 l
  25.                                 }# M5 L1 A1 Z  U) c, g6 c2 D
  26.                         }
    / \9 w+ Q( B/ Q+ ]0 ]0 W; q
  27.                         adc_volt= (float)ADC_ACCURATE_DAT/1048576*3.3;: ]. C. E! W4 z$ k7 M" T% H5 l/ r
  28.                 }6 e% ^0 s9 x' D& {
  29.           & ^% S5 A3 m# T6 L( a
  30. }
    ) L8 ~+ K3 _8 F7 {0 t2 g% [

  31. ! }; k. j6 T8 I$ |( x' s
复制代码

& ?2 U( I5 d; H; x, I, x

3 R2 T4 }( @  z7 X————————————————
% Z9 J. W' U$ ~7 s0 k版权声明:qq_44637112
6 b8 d& \; N1 p; {! E8 C如有侵权请联系删除
9 G) O  c/ ], Y
* ~" y* a) R' Z4 ?1 Y1 U, t
; J3 V8 F3 l( u+ C, s- h
收藏 评论0 发布时间:2023-5-17 16:49

举报

0个回答

所属标签

相似分享

官网相关资源

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