共3条
1/1 1 跳转至页
5410ad,ad 5410ad的ad变换线形不成比例

问
采用5410ad-PLCc32-0622ct0204.00c的片子,对电压进行变换,电源电压为4.769v,lm336产生的比较电压用电阻分压是2.4v,对3.15v和3.01v的电压进行ad变换产生的值是
2.4v -----493
3.15 ------654
3.01 ------625
对比数据以上电压变换产生的值不成线形关系,为进行比较又用别的5410ad进行试验,其数据与上述数据基本相同,请斑竹解释,急急急! 答 1: 本来就这样,而且跳变也达4个字,只有这个价格,不要要求太高不要要求太高啊,要线性好只有用单独的A/D了 答 2: 板主说话吧。是不是这样,或者是使用不当呢? 答 3: 我也用过跳变只有一个字,但线性确实不行,我原来还以为是运放造成的,听楼主说来与5410也有关系,不过也不能怪他,资料不是说用于键盘嘛。 答 4: 按现在的ad变换线形根本就不可能计算ad变换的电压ad变换的值不能线形,另外在ad变换期间用示波器可以看到电压明显下降,说明ad变换吸收电流很大。不知为何原因,请版主分析。 答 5: 版主请分析原因 答 6: 将图和程序贴出来,让大家看一下,大家好帮忙将图和程序贴出来,让大家看一下,大家好帮忙 答 7: 电路和程序lm336加1k可变和12k电阻1k的中间输出连接P11并上0.1u电容,P10直接输入可调电压。
程序
sfr ADCONTR = 0xc5; /**/
sfr ADCH = 0xc6; /**/
sfr ADCL = 0xbe; /**/
/****启动ADC转换**********************/
uint start_adc(uchar _ch) /*启动ADC转换*/
{
uchar _sh;
uint _adcvalue;
ADCONTR =0x87; /*启动ADC内部电源*/
msec(1);/*延时等待ADC内部电源稳定*/
P1M0 =0x1f;
P1M1 =0x1f; /*作为AD使用口设为高阻输入*/
ADCH =0x0;
ADCL =0x0;
_sh =0x80+_ch;
ADCONTR =_sh; /*ad通道开启*/
_nop_();
_nop_();
_sh =0x88+_ch;/*ad电源转换启动及通道*/
ADCONTR =_sh; /*启动ADC转换*/
while((ADCONTR&0x10)==0)
{
_nop_();
_nop_();
} /*等待ADC转换结束*/
ADCONTR =0x87; /*停止ad转换*/
_sh =ADCH;
_adcvalue =0;
_adcvalue +=(uint)_sh;
_sh =ADCL;
_sh =(_sh&0x03);
_adcvalue =(_adcvalue<<2);
_adcvalue +=(uint)_sh;
P1M0 =0x0;
P1M1 =0x0; /*恢复双向口*/
return _adcvalue;
}
void main(void)
{
uchar adcsh,adcsl;
int adca,adcb;
init_uart(); /*使用T1作波特率发生器*/
while(1)
{
sendbyte(0xaa); /*串口发送一字节******/
adca =start_adc(0); /*启动ADC转换*/
adcb =start_adc(1); /*启动ADC转换*/
adcsh =(uchar)(adca>>8);
adcsl =(uchar)adca;
sendbyte(adcsh); /*串口发送一字节******/
sendbyte(adcsl); /*串口发送一字节******/
adcsh =(uchar)(adcb>>8);
adcsl =(uchar)adcb;
sendbyte(adcsh); /*串口发送一字节******/
sendbyte(adcsl); /*串口发送一字节******/
sendbyte(0xbb); /*串口发送一字节******/
msec(2000);
}
等待版主分析 答 8: 看数据应该没有错,就是都差了0.1V左右4.769/1024=0.004657
2.4v -----493 *0.004657=2.296
3.15 ------654 *0.004657=3.046
3.01 ------625 *0.004657=2.911
答 9: 看数据,可能测量有问题看测量数据:
4.769
2.4
3.15
3.01
有效数字差别巨大,显然LZ没多少误差的概念,要不就是使用了不同的测量工具或完全不同的档位,甚至什么是“线性”和“线形”可能也不清楚。
再者要看线性,3个点的数据是不够的,至少要5个点(在量程范围内均匀分布)。
建议如下测量:
首先保证硬件电路无误,如源阻抗足够小,输入有合适的滤波,有适当的抗干扰措施,地回路设置正确等。
测量仪表分辨率超过5000,并且只使用同一个档位不要切换(否则要保证不同档位的一致性),在较短的时间内测量5组以上的点,保证温度等条件变化不大,测量一个回程(从小测到大,再从大测到小),同时记录电源电压,数据记录的有效数字要一致,从这样的数据中我们才可以看出ADC的线性到底怎样。
以上要求并不过分,是高等物理实验课的基本要求。
有言语不敬之处请原谅。
2.4v -----493
3.15 ------654
3.01 ------625
对比数据以上电压变换产生的值不成线形关系,为进行比较又用别的5410ad进行试验,其数据与上述数据基本相同,请斑竹解释,急急急! 答 1: 本来就这样,而且跳变也达4个字,只有这个价格,不要要求太高不要要求太高啊,要线性好只有用单独的A/D了 答 2: 板主说话吧。是不是这样,或者是使用不当呢? 答 3: 我也用过跳变只有一个字,但线性确实不行,我原来还以为是运放造成的,听楼主说来与5410也有关系,不过也不能怪他,资料不是说用于键盘嘛。 答 4: 按现在的ad变换线形根本就不可能计算ad变换的电压ad变换的值不能线形,另外在ad变换期间用示波器可以看到电压明显下降,说明ad变换吸收电流很大。不知为何原因,请版主分析。 答 5: 版主请分析原因 答 6: 将图和程序贴出来,让大家看一下,大家好帮忙将图和程序贴出来,让大家看一下,大家好帮忙 答 7: 电路和程序lm336加1k可变和12k电阻1k的中间输出连接P11并上0.1u电容,P10直接输入可调电压。
程序
sfr ADCONTR = 0xc5; /**/
sfr ADCH = 0xc6; /**/
sfr ADCL = 0xbe; /**/
/****启动ADC转换**********************/
uint start_adc(uchar _ch) /*启动ADC转换*/
{
uchar _sh;
uint _adcvalue;
ADCONTR =0x87; /*启动ADC内部电源*/
msec(1);/*延时等待ADC内部电源稳定*/
P1M0 =0x1f;
P1M1 =0x1f; /*作为AD使用口设为高阻输入*/
ADCH =0x0;
ADCL =0x0;
_sh =0x80+_ch;
ADCONTR =_sh; /*ad通道开启*/
_nop_();
_nop_();
_sh =0x88+_ch;/*ad电源转换启动及通道*/
ADCONTR =_sh; /*启动ADC转换*/
while((ADCONTR&0x10)==0)
{
_nop_();
_nop_();
} /*等待ADC转换结束*/
ADCONTR =0x87; /*停止ad转换*/
_sh =ADCH;
_adcvalue =0;
_adcvalue +=(uint)_sh;
_sh =ADCL;
_sh =(_sh&0x03);
_adcvalue =(_adcvalue<<2);
_adcvalue +=(uint)_sh;
P1M0 =0x0;
P1M1 =0x0; /*恢复双向口*/
return _adcvalue;
}
void main(void)
{
uchar adcsh,adcsl;
int adca,adcb;
init_uart(); /*使用T1作波特率发生器*/
while(1)
{
sendbyte(0xaa); /*串口发送一字节******/
adca =start_adc(0); /*启动ADC转换*/
adcb =start_adc(1); /*启动ADC转换*/
adcsh =(uchar)(adca>>8);
adcsl =(uchar)adca;
sendbyte(adcsh); /*串口发送一字节******/
sendbyte(adcsl); /*串口发送一字节******/
adcsh =(uchar)(adcb>>8);
adcsl =(uchar)adcb;
sendbyte(adcsh); /*串口发送一字节******/
sendbyte(adcsl); /*串口发送一字节******/
sendbyte(0xbb); /*串口发送一字节******/
msec(2000);
}
等待版主分析 答 8: 看数据应该没有错,就是都差了0.1V左右4.769/1024=0.004657
2.4v -----493 *0.004657=2.296
3.15 ------654 *0.004657=3.046
3.01 ------625 *0.004657=2.911
答 9: 看数据,可能测量有问题看测量数据:
4.769
2.4
3.15
3.01
有效数字差别巨大,显然LZ没多少误差的概念,要不就是使用了不同的测量工具或完全不同的档位,甚至什么是“线性”和“线形”可能也不清楚。
再者要看线性,3个点的数据是不够的,至少要5个点(在量程范围内均匀分布)。
建议如下测量:
首先保证硬件电路无误,如源阻抗足够小,输入有合适的滤波,有适当的抗干扰措施,地回路设置正确等。
测量仪表分辨率超过5000,并且只使用同一个档位不要切换(否则要保证不同档位的一致性),在较短的时间内测量5组以上的点,保证温度等条件变化不大,测量一个回程(从小测到大,再从大测到小),同时记录电源电压,数据记录的有效数字要一致,从这样的数据中我们才可以看出ADC的线性到底怎样。
以上要求并不过分,是高等物理实验课的基本要求。
有言语不敬之处请原谅。
共3条
1/1 1 跳转至页