C8051F350 ADC前端阻容电路怎么确定参数
先上数据有C1: R2=10k,R18=100,R1=0mv,ADC输出0.00022mV
有C1: R2=100k,R18=100,R1=4.8mV,ADC输出12mV
有C1: R2=10k,R18=100,R1=4.8mV,ADC输出4.6mV
有C1: R2=1k,R18=100,R1=4.8mv,ADC输出1.6mV
无C1: R2=1k,R18=100,R1=0mv,ADC输出0mV
无C1: R2=10k,R18=100,R1=4.8mv,ADC输出1.6mV
现在确定R2=10k,R18=100,c1=0.1uF,当R1有电流时,测量电压基本吻合,无电影时不能归零。当去掉C1后无电流时,输出也为0,但是有电流后测量的数据和实际又对不上.大家帮忙分析一下问题出在哪里。是不是前端电路的问题。万分感谢!
float ADC0_value(uchar mode,uchar p,uchar n)
{
volatile uchar i=7;
unsigned long tem;
long tem1;
float v;
RedLed=~RedLed;
ADC0MD=0x80; //空闲
ADC0CN|=0x07;
if(mode==0)
{
ADC0CN &= ~0x10;//单端输入
}
else
{
ADC0CN |=0x10;//差分输入
}
ADC0MUX=p|n; //端口选择
lab:
AD0INT=0;
ADC0MD=0x82; //单次转换
RedLed=~RedLed; //很重要,完全关闭adc0后重新打开必须启动延时
// delay_ms(1); //很重要,完全关闭adc0后重新打开必须启动延时。
while (!AD0INT);
AD0INT=0;
ADC0MD=0x80; //空闲
// ADC0MD&=~0x80; //,关闭ADC0
// tem=65536*ADC0H+256*ADC0M+ADC0L;
if(mode==0)
{
tem=(unsigned long)ADC0H<<16;
tem+=((unsigned long)ADC0M<<8)+(unsigned long)ADC0L;
if((tem>=0xffffff)&&i>0)
{
ADC0MD=0x80; //空闲
ADC0CN--;
i--;
goto lab;
}
v=(float)tem/(16777216/VERF)/(1<<i); //以下转换成电压
if((p==TEMPERATURE_P)||(n==TEMPERATURE_N))
{
v=(757.0-1000.0*v)/1.73;//温度转换
}
}
else
{
tem1=(long)ADC0H<<24;
tem1+=((long)ADC0M<<16)+((long)ADC0L<<8);
if((tem1>=0x80000000)&&i>0)
{
ADC0MD=0x80; //空闲
ADC0CN--;
i--;
goto lab;
}
v=(float)tem1/(8388608/VERF)/(1<<i); //以下转换成电压
v/=256;
}
// RedLed=~RedLed;
return v;
} 这个R18有什么用? liufabing 发表于 2020-12-30 16:11
这个R18有什么用?
如果没有R18,直接输出200+mV,把我整神了!!!!!!!!!! 这个单片机我用过,采样率变,AD值也会变, xinjin 发表于 2020-12-30 16:41
这个单片机我用过,采样率变,AD值也会变,
现在不知道怎么觉得阻容值 用过F061 不知道一不一样 内部是SAR型ADC 对前面的驱动电路要求很高 要缓冲器加RC 高阻抗是无法驱动ADC的 heize 发表于 2020-12-30 17:25
用过F061 不知道一不一样 内部是SAR型ADC 对前面的驱动电路要求很高 要缓冲器加RC 高阻抗是无法驱动ADC的 ...
能不能稍微具体点 zuolin19841029 发表于 2020-12-31 10:09
能不能稍微具体点
adc输入阻抗小,加一级运放跟随 C1太大了吧,放电时只能通过10K,
另外C8051F350的ADC是delta-sigma吧,好像需要校正的. adc,阻抗匹配 fengyunyu 发表于 2021-1-26 03:01
adc,阻抗匹配
最近忙其它事情。搁下了,问怎么匹配,一直对阻抗匹配模模糊糊 locky_z 发表于 2021-1-25 21:48
C1太大了吧,放电时只能通过10K,
另外C8051F350的ADC是delta-sigma吧,好像需要校正的. ...
调整过C1,问题依旧,我怀疑是温度影响了ad和采样电阻
页:
[1]