amking 发表于 2012-7-8 08:53:44

各位帮忙分析啊 C8051F350 AD 线性太差了

用c8051f350做 直流100mv电压采集,线性非常差啊 误差高达满量程的1%。是什么地方出了问题呢? 还是这个芯片本身就很差劲?
各位帮忙分析啊?

amking 发表于 2012-7-8 09:06:31

自己顶顶顶顶顶顶顶顶

ilikemcu 发表于 2012-7-8 09:13:18

350的线性不用怀疑,但是我怀疑你的电路和用法。

marshallemon 发表于 2012-7-8 10:02:07

上电路看看,你是使用的内部PGA吧,做偏移和增益校准没?

amking 发表于 2012-7-8 12:41:15

PGA 16 做了内部校准

amking 发表于 2012-7-8 12:45:48

void ADC_Init_copy()          //
{
        REF0CN    = 0x03;        //ʹÄÜÄÚ²¿»ù×¼£»
        ADC0CN    = 0x04;        //ADC¿ØÖƼĴæÆ÷£ºµ¥¼«ÐÔ32 ±¶ÔöÒ棻05
        ADC0CF    = 0x00;        //ADCÅäÖüĴæÆ÷£ºÊä³ö½á¹ûÑ¡Ôñ00£¬since£»
    ADC0MD    = 0x80;        //ADC·½Ê½¼Ä´æÆ÷£ºÊ¹ÄÜADC        £¬ÔÚ¿ÕÏз½Ê½£»       
        ADC0CLK   = 0x00;        //ʱÖÓ¿ØÖÆ£º00=2.4576m

    ADC0DECH= 0x07;        //0x077F£¬³éÈ¡±È£º1919+1£»
    ADC0DECL= 0x7f;
          
        ADC0BUF   = 0x00;         //»º³åÆ÷Ñ¡Ôñ£º
        ADC0MUX   = 0x08;        //ADC0²ÉÑùͨµÀ08£¨AIN+=AIN0.1£»AIN-=AGND£©
        ADC0STA   = 0x00;         //ÇåADC0int״̬¼Ä´æÆ÷

        //È«ÄÚ²¿Ð£×¼
        ADC0MD = 0x81; // È«ÄÚ²¿Ð£×¼£¨Æ«ÒÆ¡¢Ð±ÂÊ£©
        while (AD0CALC != 1){         };


        AD0INT = 0;                         // Clear ADC0 conversion complete flag
        EIE1   |= 0x08;                     // Enable ADC0 Interrupts
        ADC0MD= 0x83;                     // Enable the ADC0 (IDLE Mode)
}

amking 发表于 2012-7-8 12:46:29

// ADC0ÖжϠ  
//-----------------------------------------------------------------------------   
//   
void ADC0_ISR(void)   interrupt 10   
{
        static uchar sampINDEX;
        uchar p_sn;

        while(!AD0INT);                     // Wait till conversion complete
        AD0INT = 0;                         // Clear ADC0 conversion complete flag

        //Copy the output value of the ADC
        rawValue.Byte = 0x00;
        rawValue.Byte = (unsigned char)ADC0H;
        rawValue.Byte = (unsigned char)ADC0M;
        rawValue.Byte = (unsigned char)ADC0L;
        CHvalue_back=ADC0MUX;

        p_sn=INTY;
        if(++sampINDEX>4)
        {
                ADC0MD=0x80;                //ADC·½Ê½¼Ä´æÆ÷£ºÊ¹ÄÜADC        £¬ÔÚ¿ÕÏз½Ê½
                if(ADC0MUX==CH0)
                {
                        if(p_sn>7)
                        {
                                ADC0CN    = 0x04;        //ADC¿ØÖƼĴæÆ÷£ºµ¥¼«ÐÔ32 ±¶ÔöÒ棻05
                                ADC0MUX=CH1;
                        }
                        else
                        {
                                ADC0CN    = 0x00;        //ADC¿ØÖƼĴæÆ÷£ºµ¥¼«ÐÔ32 ±¶ÔöÒ棻05
                                ADC0MUX=CH2_t;
                        }               
                }
                else
                {
                        ADC0CN    = 0x04;        //ADC¿ØÖƼĴæÆ÷£ºµ¥¼«ÐÔ32 ±¶ÔöÒ棻05
                        ADC0MUX=CH0;
                }

                ADC0STA   = 0x00;         //ÇåADC0int״̬¼Ä´æÆ÷
                EIE1   |= 0x08;                     // Enable ADC0 Interrupts
                ADC0MD= 0x83;                     // Enable the ADC0 (IDLE Mode)
                sampINDEX=0;
        }

        if(ADsampCounter<200)++ADsampCounter;
//        EA=1;
}

amking 发表于 2012-7-8 12:47:25

稳定性和 重复性没有问题。
就是线性差啊

郁闷!!!

amking 发表于 2012-7-8 12:52:21

3楼和 4 楼 的 朋友在吗    {:handshake:}

68336016 发表于 2012-7-8 12:58:46

本帖最后由 68336016 于 2012-7-8 13:02 编辑

我没用过F350,但是用过F060,
线性不太好,一个芯片内的ADC1,ADC2线性也会差别挺大的。

通过几个寄存器的参数修正下,最后结果还可以

测量20多V电压(2.5V参考源,前端电阻分压),得到结果跟4位半万用表对比也就误差几个mV

kdtcf 发表于 2012-7-8 13:20:24

楼主既然这芯片的线性都超1%了,就换一款芯片吧,或者外挂ADC吧

amking 发表于 2012-7-8 14:27:50

电路很简单就是测试ADC 专门化的。

amking 发表于 2012-7-8 14:29:13

我是用AN0.0测试100mv ,其他通道没有接信号,结果 线性很差

amking 发表于 2012-7-8 14:32:31

单端输入

本帖最后由 amking 于 2012-7-8 14:43 编辑

郁闷 还是解决不了啊在线等了   
有用过350的 指点啊
谢谢

marshallemon 发表于 2012-7-8 15:58:13

本帖最后由 marshallemon 于 2012-7-8 15:59 编辑

看你的电路你是使用的内部的基准对吗?F350的内部基准的并非准确的,另外我感觉内部PGA的线性度还是比较差的,我在用时感觉好像这个片子的生产厂家把线性做了定点的校正,但这个校准把这个片子搞的整个范围内不连续了,
我记得我当时用的应该是PGa=32,我需要采集的信号从0~78mV

amking 发表于 2012-7-8 17:07:10

15楼的 谢谢你
问一下,你用PGA=32,是外部基准吗? 线性度 怎么样?
另外:内部校准 有必要用吗? 难得是用了PGA 导致线性差的?
迷茫啊

amking 发表于 2012-7-8 17:12:21

3楼 的看看电路有问题吗?
请指教

marshallemon 发表于 2012-7-8 17:35:06

本帖最后由 marshallemon 于 2012-7-8 17:37 编辑

amking 发表于 2012-7-8 17:07 static/image/common/back.gif
15楼的 谢谢你
问一下,你用PGA=32,是外部基准吗? 线性度 怎么样?
另外:内部校准 有必要用吗? 难得 ...

使用内部基准,内部基准不准,会影响线性,但只是一个系数的问题,基准不会造成非线性,使用外部OP的线性会比使用内部PGA要好,另外我感觉西格玛得他型的AD线性都 不太 好,需要校准的,不知道你的100mV是怎么提供的,使用内部pga,会造成输入阻抗的降低,这个也是会影响线性的,把输入缓冲打开再试试看线性会不会改善
   如果有条件我建议还是做系统的校准,自校准的过程是在PGA=1的情况下做的,我看ADS124X系列是这样做的自校准,但F350说的好像不是如此,我对此有点怀疑

amking 发表于 2012-7-8 17:43:57

输入缓冲也使用过 没有什么明显改善。
marshallemon:你用350 测量 78mv 最后能达到什么精度,具体怎么使用的?

ilikemcu 发表于 2012-7-8 20:20:15

350的AD输入阻抗比较小,你测量小信号一定要注意。
电路里输入信号的那个10M上拉电阻干嘛用的?看不懂啊

amking 发表于 2012-7-8 20:53:01

10M是上拉电阻啊
ilikemcu:你用350 做到什么精度?怎么设置 的 参数

amking 发表于 2012-7-8 20:53:39

我把10M拿掉也是一样的差

amking 发表于 2012-7-8 20:54:46

{:dizzy:}350 也许选错了各位有什么经历

ilikemcu 发表于 2012-7-8 21:03:44

我是05年的春季用过一次350,因为我们用的是差分应用,精度实际测试线性至少在万分之一以上,而且我们是PGA=128.

amking 发表于 2012-7-9 20:42:49

努力了不一定会成功,但是不努力一定不会成功!

amking 发表于 2012-7-9 20:43:21

自己顶努力了不一定会成功,但是不努力一定不会成功!

amking 发表于 2012-7-10 07:49:43

{:dizzy:} 怎么设置都一样
最后用多点校正,精度还凑合用{:sad:}

ibmx311 发表于 2012-7-11 06:32:03

这个我试过,线性度绝对优于0.001%,不知楼主希望到多少才满意,这么便宜的一个芯片.
前端非常重要,我用3只op27组成
调制频率要精准
不要使用pga
基准要用外置的,我用的lm399
ADC工作时,什么串口,推挽的IO,等设备一律先关闭,以免影响精度
这样做的电压表随便可以4位半

amking 发表于 2012-7-11 07:01:12

28楼 你用差分 还是单端输入?
使用内部校准了吗?
我希望做到0.01%啊{:loveliness:}

yjtawfg 发表于 2012-10-23 11:05:17

mark'{:smile:}
页: [1]
查看完整版本: 各位帮忙分析啊 C8051F350 AD 线性太差了