打印
[STM8]

STM8S003F3 AD采样与实际电压相差很大在20MV以上

[复制链接]
5428|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyuqiong1|  楼主 | 2014-10-20 10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,有谁对STM8S003F系列的10位ADC1很熟吗,我采样的结果和实际的电压相差20MV以上,不知道是我采样的电压的确就是那么多,还是采样的精度不对呢,我希望采样的电压和实际想差不到+-30MV以内
沙发
airwill| | 2014-10-20 12:38 | 只看该作者
根据手册的资料,这个偏差略微偏大了一些,应该说,考虑到噪声等环境因素,有这样的偏差,也属于正常情况。
想要更高的精度,那就得好好地设计和布板咯。

使用特权

评论回复
板凳
mmuuss586| | 2014-10-20 18:45 | 只看该作者

和电源电压的稳定性,精度等有关;
还有你硬件的其它设计;
30MV,1%也还好;

使用特权

评论回复
地板
搞IT的| | 2014-10-20 22:52 | 只看该作者
和电源电压的稳定性,精度等有关;还有你硬件的其它设计;

使用特权

评论回复
5
leovo| | 2014-10-21 09:03 | 只看该作者
电源稳定性
采样时间和输入阻抗,估计是你的输入阻抗太大了

使用特权

评论回复
6
122541325| | 2014-10-21 09:48 | 只看该作者
你给的基准电压呢,很准么?

使用特权

评论回复
7
zoulinqi110| | 2014-10-21 09:54 | 只看该作者
看下基准电压,可能不是准确的5V

使用特权

评论回复
8
dingsujie| | 2014-10-21 10:07 | 只看该作者
003这个芯片本来采集的精度就不高;如果不考虑成本可以使用高端点的16位AD芯片

使用特权

评论回复
9
502360026| | 2014-10-22 16:36 | 只看该作者
楼主能否把程序贴出来参考下?

使用特权

评论回复
10
liuyuqiong1|  楼主 | 2014-10-23 09:30 | 只看该作者
502360026 发表于 2014-10-22 16:36
楼主能否把程序贴出来参考下?

void adc_init(void)
{
    ADC1->TDRL = 0x00;
    ADC1->TDRH = 0x00;//(uart需要,如果为0XFF串口只能发送接受不了)
    ADC1->CR1  = 0x00; //  16mhz/2
    ADC1->CR2  = (uint8_t)~ADC1_CR2_ALIGN; //数据左对齐
    ADC1->CR1  |= ADC1_CR1_ADON;  //从低功耗唤醒AD
}

uint16_t adc_scan(uint8_t channel)
{
    uint16_t temp = 0;
    int i =0;
    ADC1->CSR &= (uint8_t)~ADC1_CSR_EOC;
    ADC1->DRH = 0;
    ADC1->DRL =0;
   
    ADC1->CSR = adc_channel[channel];
    ADC1->CR1 |= ADC1_CR1_ADON;
//    for(i=3;i>0;i--)
//       nop();
    /* select channel */
    while (!(ADC1->CSR & ADC1_CSR_EOC));
    temp = ADC1->DRH;
    temp = temp<<2;
    temp += ADC1->DRL;
    ADC1->CSR &= (uint8_t)~ADC1_CSR_EOC;
   // temp = (uint16_t)(((float)temp*5000)/1023)*2;
    return temp;

}

cur_channel  = 0;下面是调用函数,是一个IO上升沿中断触发采样,一个上升沿采样1次或者连续10次,结果都不准,哎愁死了,急死了,我的电压一直是4020V,采集到的数据乱七八糟的,什么结果都有,急死了~~~
void extic_interrupt(void)
{
  
  
        int i = 0;
        int count = 0;
//        GPIO_WriteLow(GPIOB, GPIO_PIN_5);
//        for(i=0;i<4200;i++)
//            nop();  //延时280us  4200/16mhz

        for (count = 0; count < SCAN_COUNT;count++)
        {
            ADScanVol[cur_channel][count] = adc_scan(cur_channel);
        }
//        BatADVol[cur_channel] = adc_scan(cur_channel);
        if (cur_channel >= ADC_CHANNEL_BAT13)
        {
            cur_channel = ADC_CHANNEL_IDEL;
        }
        else
        {
          cur_channel+=1;
        }
  
  
  
}

使用特权

评论回复
11
liuyuqiong1|  楼主 | 2014-10-23 09:30 | 只看该作者
dingsujie 发表于 2014-10-21 10:07
003这个芯片本来采集的精度就不高;如果不考虑成本可以使用高端点的16位AD芯片 ...

现在换肯定来不急了,马上要送样了~~

使用特权

评论回复
12
liuyuqiong1|  楼主 | 2014-10-23 15:44 | 只看该作者
leovo 发表于 2014-10-21 09:03
电源稳定性
采样时间和输入阻抗,估计是你的输入阻抗太大了

我没有输入阻抗和滤波电容,我就是AD直接接采样脚,参考电压只有MCU工作电压,3.3V,我现在采样电压是4020V不会变,但是我采集到的是3900V到4200V之间,经常变换,愁死了,软件试了各种方法

使用特权

评论回复
13
大秦正声| | 2014-10-23 16:00 | 只看该作者
多次采样求平均!

使用特权

评论回复
14
大秦正声| | 2014-10-23 16:01 | 只看该作者
多次采样求平均!

使用特权

评论回复
15
大秦正声| | 2014-10-23 16:01 | 只看该作者
多次采样求平均!

使用特权

评论回复
16
大秦正声| | 2014-10-23 16:01 | 只看该作者
多次采样求平均!

使用特权

评论回复
17
502360026| | 2014-10-23 17:16 | 只看该作者
liuyuqiong1 发表于 2014-10-23 09:30
void adc_init(void)
{
    ADC1->TDRL = 0x00;

谢谢了!!

使用特权

评论回复
18
liuyuqiong1|  楼主 | 2014-10-29 16:08 | 只看该作者
哈哈,问题解决了,是硬件少设计个电容滤波,电压出来本身波动就比较大,导致我采样的结果经常上下变换,哈哈,接个电容,采样结果很准了,
每次连续采样10次,去掉最大和最小的,剩下八个取平均值,很准,哈哈,倒腾了3天,急死了。谢谢各位帮忙~~~~我结贴了~~~

使用特权

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

本版积分规则

16

主题

168

帖子

2

粉丝