|
发表于 2013-1-10 08:54:31
|
显示全部楼层
理论上是如此:1.25/1024=1.22mv,但是实际上根本测不到个位的mv电压,我实测的数据和20楼《rainbow》 朋友差不多,分别测试了LGT8的4片SOP28封装和3片SSOP24封装芯片的ADC转换,发现测量下限基本上都是只能测到20mv左右,只有一只SSOP24封装的芯片可以测到15mv,我都是采用同样的电路和算法,待测电压通过一只1K电阻和0.1uf的去耦电容送进ADC输入端,ADC连续采样24次,检测采用中位值平均滤波法,代码如下:
/*
ADC检测
端口PA0-PA2
检测电源输出电压和两个USB输出电流
*/
//------------------------------------------------------------------------------
uint filter_adc(void) //ADC+中位值平均滤波法
{
uint value_buf[N],temp;
uchar count,i,j;
unsigned long sum=0;
ADCSRA =0X87;
for (count=0;count<N;count++)
{
ADCSRA |=BIT(ADSC); //启动AD转换
while(!(ADCSRA &(BIT(ADIF)))); //判断AD转换是否结束
value_buf[count]=ADC;
}
for(j=0;j<N-1;j++)
for(i=0;i<N-j;i++)
if(value_buf[i]>value_buf[i+1]) //+1
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1]; //+1
value_buf[i+1]=temp;
}
for(count=1;count<N-1;count++) //连续采样N个数据,去掉一个最大值和一个最小值
sum += value_buf[count];
return sum/(N-2); //然后计算N-2个数据的算术平均值
}
void adc_conversion() //读各通道转换值
{
static uchar ch=0;
for(ch=0;ch<3;ch ++)
{
ADMUX=0x80+ch; //通道选择0-2,参考电压内部基准1.25V,结果右对齐
switch(ch)
{
case 0:
adc0=filter_adc(); //USB2输出电流检测
break;
case 1:
adc1=filter_adc(); //USB1输出电流检测
break;
case 2:
adc2=filter_adc(); //输出电压检测
break;
}
}
}
望21楼看看问题到底出在哪里? |
|