打印
[AVR单片机]

请各位帮我看下,M16的ADC哪里出问题了。

[复制链接]
1175|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cpu51|  楼主 | 2015-8-17 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, ni, CSR, DCS, TI
条件:M16,采用内置ADC,采样2个数据,外部基准2.5V动态显示采用的AD值
现象:采集数据由0-992变化(未到1023,可能是基准偏差)每步显示不是1个1个加,而是几个或10几步进值。例如,最高992,下一个应该是991,990,899.。。。。。但实际是992,967,963,961,960,927。。。。。。,不知道是什么原因,没有找出规律。

程序如下:
//**************************************************************
//ADC initialize
// Conversion time: 2uS
//**************************************************************
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x00; //转换结果右对齐,1x
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC 128分频,115KHz,单次转换
ACSR  = 0x80;
ADCSR = 0xA1;
ACSR=1<<ACD;
}
//*******************************************************************
//adc
//
//*******************************************************************
unsigned int read_adc(unsigned char ad_channel)
{
    unsigned int ad,i;
ADMUX = 0x00; //select 外部基准电压源,转换结果右对齐

    ADMUX|=ad_channel;//选择ADC通道
    ADCSRA|=1<<ADSC;//启动ADC转换
delay(300);
    while(0==(ADCSRA&(1<<ADIF)));//等待转换完成
    ADCSRA|=1<<ADIF;//清零标志

ad = ADC;                                 
    return(ad);//返回测到的电压值
}

相关帖子

沙发
cpu51|  楼主 | 2015-8-18 10:25 | 只看该作者
不知道是不是硬件问题。软件设定应该是对的,这个在别的系统上用的ADC程序,都可以的,在这个板子上就不行了。

使用特权

评论回复
板凳
badbud| | 2015-8-18 13:59 | 只看该作者
滤波电容有问题

使用特权

评论回复
地板
SD10A| | 2015-8-18 14:57 | 只看该作者
ACSR=1<<ACD;//重复
ADCSR = 0xA1;//虽然在手册上没看到  但是查ICC include   应该是与ADCSRA相同   这个改变了设置
你使用了连续转换模式,2分频   这句应该删去
delay(300);//多余
ad = ADC;  //改成   
ad=ADCL;
ad=ad+(ADCH<<8);
return (ad);

使用特权

评论回复
5
cpu51|  楼主 | 2015-8-18 20:26 | 只看该作者
badbud 发表于 2015-8-18 13:59
滤波电容有问题

电容没有问题,验证过了

使用特权

评论回复
6
badbud| | 2015-8-20 09:48 | 只看该作者
就那几个原因
1.接在被测电压那里的电容虚焊了没 就是接在ADC管脚的
2.你的基准电压源稳定不稳定,可以尝试分别使用 内部基准和外部基准,通常内部的稳定点,外部的即使只有0.1mV的变化测出来的变化也很大
3.最后再看是否是软件问题,主要可能是设置方面的,频率,延迟。我相信这么通用的IC 软件事例都烂大街了,很难出问题~

使用特权

评论回复
7
badbud| | 2015-8-20 10:06 | 只看该作者
最后换个新的MEGA16~

使用特权

评论回复
8
hi1234| | 2015-8-20 16:26 | 只看该作者
先软件仿真看一下对不对,再看硬件问题

使用特权

评论回复
9
cpu51|  楼主 | 2015-8-20 19:31 | 只看该作者
客户催货催的急,已经飞线加了MAX1241采样了,等有空再找问题原因。找到原因汇报各位。

使用特权

评论回复
10
cdwess| | 2015-10-31 01:15 | 只看该作者
/*****************************************
**名称:Adc自动转换
**编译器版本:ICCAVR 7.22

**芯片类型:ATmega16a
**时钟频率:16M
**输入:
**输出:
**说明:
**
*****************************************/

#include "Adc.h"


volatile uchar  Adc_ok;
volatile uint   Adc_temp;
/*****ADC数据缓存*****/
uint Adc_ch0[N+1];
uint Adc_ch1[N+1];
//uint Adc_ch2[N+1];
//uint Adc_ch3[N+1];
//uint Adc_ch4[N+1];
//uint Adc_ch5[N+1];
//uint Adc_ch6[N+1];
//uint Adc_ch7[N+1];

/***********************ADC操作*************************/
/*-----------------------------------------------------------------
函数名称: void adc_init(uchar ch)
函数功能: ADC采样函数,采样分辨率1024   12M
参    数: CH为通道
返 回 值: i
说    明: 晶振   1M  0xCB    104uS
8M  0xCE
16M 0xCF
-----------------------------------------------------------------*/
void adc_init(uchar ch)
{
        ADCSRA        = 0x00;           //禁止AD转换
        ADMUX        = 0xC0 | ch;
        //SFIOR  |= 0x00;
        ACSR        = 0x80;    //禁止模拟比较器
        ADCSRA        = 0xCF;    //16m cf 8m ce
}

ISR(ADC_vect)
{
        Adc_temp = ADCL;                  //首先读低位
        Adc_temp+= (ADCH<<8);     //然后读高位
        Adc_ok=0;
        //PORTA ^=0x80;
        ADCSRA &=~(BIT(ADIF));   //清标志
        ADCSRA &=~(BIT(ADEN));   //关闭转换
}

/*********************************************
函数名称: Result(uint res_data)
函数功能: 求递归平均数
*********************************************/
uint Result(uchar ch,uint data)
{
  static uchar ch0,ch1;//,ch2,ch3,ch4,ch5,ch6,ch7;
   ulong sum=0;
   uchar count;
       
   switch(ch)
        {
          case 0:Adc_ch0[ch0]=data;
                     if (ch0>=N)ch0=0;
                       else     ch0++;
                     for (count=0;count<N;count++)
                       sum += Adc_ch0[count];
                           break;
          case 1:Adc_ch1[ch1]=data;
                      if (ch1>=N)ch1=0;
                        else     ch1++;
                      for (count=0;count<N;count++)
                        sum += Adc_ch1[count];
                       break;
          //case 2:Adc_ch2[ch2]=data;
                     //if (ch2>=N)ch2=0;
                       //else     ch2++;
                      //for (count=0;count<N;count++)
                        //sum += Adc_ch2[count];
                       //break;
          //case 3:Adc_ch3[ch3]=data;
                      //if (ch3>=N)ch3=0;
                        //else     ch3++;
                      //for (count=0;count<N;count++)
                        //sum += Adc_ch3[count];
                       //break;
          //case 4:Adc_ch4[ch4]=data;
                       //if (ch4>=N)ch4=0;
                         //else     ch4++;
                       //for (count=0;count<N;count++)
                         //sum += Adc_ch4[count];
                       //break;
          //case 5:Adc_ch5[ch5]=data;
                       //if (ch5>=N)ch5=0;
                         //else     ch5++;
                       //for (count=0;count<N;count++)
                         //sum += Adc_ch5[count];
                       //break;
          //case 6:Adc_ch6[ch6]=data;
                       //if (ch6>=N)ch6=0;
                         //else     ch6++;
                       //for (count=0;count<N;count++)
                         //sum += Adc_ch6[count];
                       //break;
          //case 7:Adc_ch7[ch7]=data;
                       //if (ch7>=N)ch7=0;
                         //else     ch7++;
                       //for (count=0;count<N;count++)
                         //sum += Adc_ch7[count];
                       //break;
        }
        return(sum/N);       
}

使用特权

评论回复
评论
SD10A 2015-10-31 12:50 回复TA
ADCSRA &=~(BIT(ADIF)); //清标志 是写1清零 ,见手册205页 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:承接工业远程控制系统及设计研发,DCS控制系统,无线采集控制系统,单片机设计,工业设备维修,仪器仪表、控制系统维护、检修。

98

主题

458

帖子

0

粉丝