搜索
bottom↓
回复: 10

c8051f350 ADC问题,多通道转换时数值差很多,单通道转换时没有问题,

[复制链接]

出0入4汤圆

发表于 2010-9-28 17:11:13 | 显示全部楼层 |阅读模式
原理图

(原文件名:350.jpg)

程序
///////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// FILE NAME      : adc.c
// TARGET DEVICE  : c8051f350
// IDE VER              : KEIL C51V900
// CREATED ON     : 10-09-09
// CREATED BY     : BILLTIAN
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////

#define _IN_adc_C_
///////////////////////////////////////////////////////////////////////////////////////////////////
// Includes
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "main.h"
//-----------------------------------------------------------------------------
// ADC0_Init extVREF Bipolar AIN0.1-AIN0.0
//-----------------------------------------------------------------------------
//
// This function initializes the ADC to measure across AIN0.1 and AIN0.0
// on the Target Board (Differential measurements, Bipolar codes)

void ADC0_Init (void)
{
        unsigned ADC0_decimation;
       
        REF0CN &= ~0x01;            // disable internal vref       
        //REF0CN |= 0x01;           // (enable if using internal vref)
               
        ADC0CN = 0x00;              // unipolar output codes, GAIN=1
        //ADC0CN = 0x10;                    // Bipolar output codes, GAIN=1
       
        //ADC0CF = 0x00;                        // interrupts upon SINC3 filter output and uses internal VREF       
        ADC0CF = 0x04;                                // interrupts upon SINC3 filter output and uses external VREF
       
        ADC0CLK = (SYS_CLK_FREQ/MDCLK)-1; // Ideally, MDCLK = 2.4576 MHz Generate MDCLK for modulator.
                                  
        // program decimation rate for desired OWR       
        ADC0_decimation = SYS_CLK_FREQ/OWR/(ADC0CLK+1)/128;       
        ADC0_decimation--;       
        ADC0DEC = ADC0_decimation;               
        ADC0BUF = 0x00;             // ¹Ø±ÕÊäÈ뻺³å               
                              
        ADC0MD = 0x81;                                // ÍêÈ«ÄÚ²¿Ð£×¼       
        while (!AD0CALC);                        // µÈ´ýת»»Íê³É       
        ADC0MD &= ~0x07;

//        ADC0MUX = 0x37;             // ²î·ÖÊäÈë
        ADC0MUX = 0x07;             // ²î·ÖÊäÈë                                        
        //ADC0MD |= 0x80;           // ʹÄÜ(IDLE Mode)
        ADC0MD |= 0x83;             // Æô¶¯Á¬Ðøת»»
        EIE1 |= 0x08;               // ʹÄÜ ADC0 ÖжÏ
        ucADCFlag = 0;
        ucADCStat = 0;
        uiADCResult[0] = 0;
        uiADCResult[1] = 0;
        uiADCResult[2] = 0;
        uiADCResult[3] = 0;
}
void ADC0INT(void) interrupt 10
{
        AD0INT = 0;                                        //Çå AD0 ÖжϱêÖ¾
        uiADCResult[ucADCStat] = (ADC0H<<8) + ADC0M;
        if(MAX_CH == ucADCStat)
        {
                ucADCStat = 0;
                ADC0MUX = 0x07;
                ucADCFlag = 1;                       
        }
        else
        {
                ucADCStat++;
                ADC0MUX = (ucADCStat<<4)|0x07;
        }
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Functions
///////////////////////////////////////////////////////////////////////////////////////////////////

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

 楼主| 发表于 2010-9-28 17:12:34 | 显示全部楼层
ADC3接的REF/2,只转换这一通道时AD值为0X800x,4通道循环转换时,这通道数值只有0X6xxx

出0入4汤圆

 楼主| 发表于 2010-9-28 19:30:39 | 显示全部楼层
用ADUC845时也是类似用法,没出现问题

出0入0汤圆

发表于 2011-1-15 22:05:43 | 显示全部楼层
同样遇到类似问题!!稳定了是否好些呢?

出0入0汤圆

发表于 2011-2-19 14:43:25 | 显示全部楼层
同样遇到此问题,等待高手出现解答。

出0入0汤圆

发表于 2011-3-14 23:30:50 | 显示全部楼层
正在研究这个问题,个人愚见!!
测量每个通道的适合需要校准,有偏移校准和增益校准,楼主测量多通道的时候只做了第一个通道的校准,所以偏差比较大。如果做多通道的校准后,每次采集完后自己用校准值再做一次校准,效果可能就不一样了!!

出0入0汤圆

发表于 2011-3-14 23:37:14 | 显示全部楼层
我感觉是:上一通道的残留电压,未能及时释放。我在通道切换后连续抛弃50个转换值,得到的结果就比较靠谱了。但是我觉得这样做不太对劲,恳请高人指点。

出0入0汤圆

发表于 2011-3-14 23:40:08 | 显示全部楼层
我刚弄完,很好呀。
我没太仔细看,身边也没有说明书。
我想提标的是:每次使能AD一次转换。转换完毕,读AD结果,清除Busy,和中断标志(是不是还有一标志需要清着),再启动转换。注意跟踪时间(350不记得是可不可以调整的)

出0入0汤圆

发表于 2011-3-15 00:10:27 | 显示全部楼层
切完通道后,延时一段时间再清busy启动转换,这样能保证通道切换后,有一个足够的稳定时间。

出0入0汤圆

发表于 2011-5-17 21:04:45 | 显示全部楼层
回复【8楼】sunnyhook
-----------------------------------------------------------------------

有懂350的大哥没,加个QQ教教我啊,谢谢了。。。QQ540125095

出0入0汤圆

发表于 2012-7-8 08:59:18 | 显示全部楼层
1通道采集5次,在采集另一通道5次 会好一些吧!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表