这几天一直再搞ADC12 和 DAC0832,昨晚测试的时候发现个挺严重的问题,ADC12双通道采样相互影响
我采样的是定时钟中断 双通道 多次采样,程序如下,
我用的是买的开发板,开始我以为是采样的两个通道相互影响可能是硬件的问题,于是我使用通道0 和 通道3 采样,结果
采样还是会受影响,数据如下,当通道0采样值由3750变到0时,另一路采样输出电压从2.32变到2.10V(我两路采样结果用数码管显示,一路经过ADC转化成电压,一路直接显示结果寄存器值)
大家有没有类似的情况,望指教!!!
//*************************************************************************
// ADC初始化程序,用于配置ADC相关寄存器
//*************************************************************************
void ADC_Init()
{
P6SEL|=0x03; //选择ADC通道,设置对应IO口的功能模式
ADC12CTL0|= ADC12ON + MSC + SHT0_2 + REF2_5V + REFON; //打开ADC;多路转换打开适合序列或重复;
//采样保持时间 ,16个CLK;ADC电源控制开,内部基准2.5V
ADC12CTL1|= SHP + CONSEQ_3 + ADC12SSEL1 + ADC12SSEL0; //采样保持脉冲模式选择;多通道重复采样;SMCLK做时钟源;
ADC12MCTL0= SREF0 + INCH_0; //参考电压源控制位及通道选择
ADC12MCTL0=INCH_0;
ADC12MCTL1=INCH_1+EOS;
ADC12CTL0|= ENC; //使能转换器
}
//*************************************************************************
// ADC中断服务程序
//*************************************************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
uchar j;
uint result[10];
uint result1[10];
result[count]=ADC12MEM0; //读取ADC转换值,存入暂存区
result1[count]=ADC12MEM1;
count++;
ADC12CTL0 |= ADC12SC;
_NOP() ;
while(count>8)
{
count=0;
for(j=0;j<8;j++)
{
TEMP+=result[j]; //求和,10次转换的结果相加
TEMP1+=result1[j];
}
TEMP=TEMP>>3; //求平均值
TEMP1=TEMP>>3;
Data_do(TEMP); //处理ADC值,用于显示
Data_do1(TEMP1);
for(j=0;j<50;j++)
{
Display(); //显示ADC的数据
}
}
}
void TIMERA_Init(void) //UP模式计数,计数周期为CCR0+1
{
TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC_1 ; //SMCLK做时钟源,8分频,增加计数模式,开中断 + TAIE
TACCR0 = 999; //CCR0=999,1ms中断一次
CCTL0 = CCIE;
}
此帖出自
小平头技术问答
你看一下我以前的帖子吧。AD通道和AD转换器是2个概念。里面有解决方案,虽然芯片不是一个厂家的,但问题是一样的。
http://bbs.eeworld.com.cn/thread-341874-1-2.html
一周热门 更多>