打印
[STM32F1]

误差过大

[复制链接]
397|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2020-4-26 20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用F149进行AD采样时发现误差过大,我使用的是外部2500mV参考电平(可以确定这个电压是准的)。转换结果如下:
输入电压(mv)  
1980
1756
1525
1248
1056
769
513
178
AD值:
3408
3021
2620
2150
1818
1324
881
304
通过AD结果计算的电压(AD*2500/4095)
2080.586081
1844.322344
1599.5116
1312.576313
1109.89011
808.3028083
537.8510379
185.5921856
可以发现比实际输入值大了5%,肯定是哪里出了问题了!我两块电路板基本都是这种情况

使用特权

评论回复
沙发
androidbus| | 2020-4-26 20:03 | 只看该作者
这个是参考电平出问题了吧。

使用特权

评论回复
板凳
qiangweii| | 2020-4-26 20:14 | 只看该作者
看看 信号的阻抗是不是有点大, 也会引起偏差哦

使用特权

评论回复
地板
shashaa| | 2020-4-26 20:16 | 只看该作者
不知和你程序是不是有关系。。。

使用特权

评论回复
5
hfdy01| | 2020-4-26 20:27 | 只看该作者
可以肯定不是电压基准的问题就是你的程序有问题,你认为基准对,如果是用普通万用表测的可未必靠谱。

使用特权

评论回复
6
CallReceiver| | 2020-4-26 20:28 | 只看该作者
谁能帮我把ADC0838的C语言程序搞一搞。。。

使用特权

评论回复
7
boy1990| | 2020-4-26 20:33 | 只看该作者
我用一个高精度的万用表测量了一下,电压为2496.5mV,应该是很准的了。

使用特权

评论回复
8
sourceInsight| | 2020-4-26 20:35 | 只看该作者
void AD_Init(void)
{
  P6SEL |= BIT0+BIT1+BIT2;                  // Enable A/D channel A0 A1 A2
  ADC12CTL0 = ADC12ON+MSC+SHT0_6;           // Turn on ADC12, set
  ADC12CTL1 = SHP+CONSEQ_1+ADC12SSEL_2;     // Use sampling timer,
   
  ADC12MCTL0 = INCH_0+SREF_7;               // VeREF+=ref+, channel=A0  
  ADC12MCTL1 = INCH_1+SREF_7;               // VeREF+=ref+, channel=A1
  ADC12MCTL2 = INCH_2+SREF_7+EOS;           // VeREF+=ref+, channel=A2. end seq
}

void AD_start(void)
{
char i,time;

  ADC12CTL0 |= ENC;                         // Enable conversions
  ADC12CTL0 |= ADC12SC;                     // Start conversion

  for (i=0;i<20;i++)                               // 20次转换取平均
  {
    while (!(BIT2&ADC12IFG));               // wait untile AD conversion finished
    AD_results[0] = ADC12MEM0;              // Move results, IFG is cleared
    AD_results[1] = ADC12MEM1;              // Move results, IFG is cleared
    AD_results[2] = ADC12MEM2;              // Move results, IFG is cleared
        
    AD_AVG[0] = AD_AVG[0] + AD_results[0];
    AD_AVG[1] = AD_AVG[1] + AD_results[1];
    AD_AVG[2] = AD_AVG[2] + AD_results[2];   
   
    ADC12CTL0 |= ENC;                         // Enable conversions
    ADC12CTL0 |= ADC12SC;                     // Start conversion
  }
   
  ADC12CTL0 &= ~ENC;                                    // disable conversions
  for(i=0;i<3;i++)
    AD_AVG = (unsigned long)(AD_AVG/AD_COUNT); // AD平均值
}

使用特权

评论回复
9
sourceInsight| | 2020-4-26 20:36 | 只看该作者
分辨率较高的内置ADC上电后一般都需要进行初始化和校准的,没有校准过的话,绝对精度没见过能高于10bit的…

使用特权

评论回复
10
bbapple| | 2020-4-26 20:39 | 只看该作者
先输入一固定电平,如果每次结果相差不大一般就可以了,绝对精度可以校准的。。

使用特权

评论回复
11
handleMessage| | 2020-4-26 20:41 | 只看该作者
其实是犯了个低级错误,程序void AD_start(void)的最后没有对AD结果清零,导致误差增大了,只要加上下面一条语句就OK了:
  for(i=0;i<3;i++)
    AD_AVG[i] = 0;

使用特权

评论回复
12
zhouhuanの| | 2020-4-26 20:44 | 只看该作者
考虑把单片机的数字地与采样信号的模拟地分开(用0欧电阻或磁珠),因为模拟地的电流会直接影响单片机的采样。

使用特权

评论回复
13
wanglaojii| | 2020-4-26 20:46 | 只看该作者

5%确实有点大,电压本身稳定吗?

使用特权

评论回复
14
laozhongyi| | 2020-4-26 20:49 | 只看该作者
这个要看下输入的信号的电阻匹配的。。

使用特权

评论回复
15
Edisons| | 2020-4-26 20:49 | 只看该作者
这个还取决于参考电压的稳定性的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

424

主题

1616

帖子

1

粉丝