想不通了,C8051F060 16位ADC值,跳动高达500
本帖最后由 68336016 于 2012-5-14 09:06 编辑C8051F060,双层板,只在底面对模拟地和数字分别敷铜,之间单点0欧姆相连。
ADC外接基准源是REF43,在输入端接的是基准源用电阻分压出来的1点几V。(参考源后跟随运放,然后给ADC供电,也接到分压电阻,电流估计足够的)
我用DMA模式,ADC用定时器3溢出启动转换,频率100kHz,ADC的转换时钟21-300个系统周期都试过。转换时间应该完全足够的
连续采样1024个点,结果跳动非常大,甚至5,600个值。
不过将这1024个值做平均值,结果还算稳定,跳动1,2个值。
实在想不明白,为什么会跳动如此之大,看网上很多人不做滤波也就跳几个数
1024次平均值:32760
最小值:32530
最大值:32987
最大值-最小值:457
1024次平均值:32761
最小值:32629
最大值:32933
最大值-最小值:304
1024次平均值:32760
最小值:32587
最大值:33003
最大值-最小值:416
1024次平均值:32761
最小值:32639
最大值:32880
最大值-最小值:241
1024次平均值:32761
最小值:32632
最大值:32984
最大值-最小值:352
1024次平均值:32761
最小值:32615
最大值:32949
最大值-最小值:334
1024次平均值:32760
最小值:32466
最大值:32971
最大值-最小值:505
1024次平均值:32760
最小值:32522
最大值:32986
最大值-最小值:464
1024次平均值:32760
最小值:32554
最大值:32896
最大值-最小值:342
1024次平均值:32761
最小值:32630
最大值:32923
最大值-最小值:293 本帖最后由 68336016 于 2012-5-16 20:03 编辑
中午试验了下,把基准源改成内置的,结果都差不多,跳动也是非常巨大
因为AIN0引脚旁边就是AGND引脚,我直接拿镊子短路2个引脚,这样每次出来的值可以保持在0和1之间,偶尔会跳出16,18这样的大值(100个值出现1,2次),1024次平均后是0
但是AIN0经过不到1cm长的铜膜与AGND短路,读出来的AD值就在1,20左右跳动,偶尔有接近200的大值,1024次平均后是11。
把基准源引脚跟AIN0短接,读出来的AD平均值是65300左右,最大值有65535.
用其他单片机如STM32,虽然是12位,但是随便布线,单次采样的AD值跳动也非常小,
这个C8051F060能跳到4,500之多,令人费解
更新了下图片,图中的极大值和极小值明显是错的,不知道有没有可能干扰导致 程序上做个比较,去掉超过范围的,最大、最小,再求加权平均值 {:shocked:} 建议LZ搞个,原厂的DEMO板子,对比下。 jetli 发表于 2012-5-17 07:58 static/image/common/back.gif
程序上做个比较,去掉超过范围的,最大、最小,再求加权平均值
AD值没有一个确切范围,因为传感器信号不断变化
但是你看图形,还是很符合那正态分布的规律
C8051F060里面RAM有限,所以我现在之做256或者1024次平均值,基本后面跳动4,5个数,勉强达到合格的14位是问题。
如果做一次排序,分别去掉最大10多个,最小10多个,剩下的做平均值,估计效果会更好一些,不过单片机要做其他事情,速度和内存不太够 sufeila 发表于 2012-5-17 08:01 static/image/common/back.gif
建议LZ搞个,原厂的DEMO板子,对比下。
特地买一块原厂板来验证,有些划不来,可能上千
这个芯片网上资料比较少,新华龙的论坛也是很难打开,不然看看别人应用起来有什么问题。
51芯片,程序上都是比较简单的,所以也只能怀疑自己PCB布得差,或者芯片本来就这样性能。
很简单的一个块板,感觉布线还算不错的了,基准源稳定性也没问题。
不过好在现在多次采用求平均值后的结果勉强能符合使用要求,只不过不搞清这跳动如此之大原因还是不踏实 (1)找个标准的电压源做输入测试,比如标准的3.3V。
(2)这款芯片的AD基准电压源哪来的?如果是外部的,用示波器看下有没纹波。如果是内部基准查看下MCU输入电源。 本帖最后由 68336016 于 2012-5-17 22:41 编辑
我是利用DMA,每次将1024个数据放到片内的XRAM中,然后串口把1024个数据发送到电脑上。
测量电压是2个0.1%电阻分压,理论在在32768附近
5k速率采集结果,每次均值接近
10k采集结果,每次均值接近
50k采集结果,每次均值接近,但是跟正常值相比偏小
[
100k采集结果,每次均值接近,但是结果很奇怪,分布在均值两侧
250k采集结果,每次均值差别很大,一次大一次小
500k采集结果,每次均值接近
ADC0,ADC1同时用DMA传输,得到的图形更是奇怪
10kHz ADC0 ADC1
50kHz ADC0 ADC1
500kHz ADC0 ADC1
主机是布线与去耦,这个芯片的AD还是很好的。
原厂的DEMO板在n年前我记得是199元,可以先试试的。 本帖最后由 68336016 于 2012-5-18 06:48 编辑
cocom 发表于 2012-5-18 00:25 static/image/common/back.gif
主机是布线与去耦,这个芯片的AD还是很好的。
原厂的DEMO板在n年前我记得是199元,可以先试试的。 ...
C8051F060TBC300块,还是淘宝价,新华龙似乎不卖板子了 是否可以考虑以下两个问题:
1、采集BUFFER是否是2个轮流切换的,DMA数据离散有可能是前后两次的AD结果错位了。
2、采集速度提高后值偏小,或是分段是否降低被采源的阻抗,或是提高AD输入端的阻抗。 本帖最后由 68336016 于 2012-5-18 07:15 编辑
DIDADI 发表于 2012-5-18 06:59 static/image/common/back.gif
是否可以考虑以下两个问题:
1、采集BUFFER是否是2个轮流切换的,DMA数据离散有可能是前后两次的AD结果错位 ...
1。两个ADC数据没错位,我分别测的是2个不同电压,图中ADC0是36000多的,ADC1是32000多的,虽然看到有上下分岔的那种图,但是它总体平均值又是接近准确值的。
而且我单个ADC0测量时候,不同频率时候,也出现了分叉成上下的现象
2。信号源是OP07出来的,阻抗足够小,通过一个15欧姆电阻连接到芯片ADC输入引脚,ADC输入引脚同时2200pF接地。是参考原厂开发板选的电阻电容参数,也没去计算。
在不同采样频率下,结果稍微有偏差10多20,也算可以接受,但是某些频率结果相差100多100/65536已经误差不小了 本帖最后由 68336016 于 2012-5-18 22:28 编辑
继续检查原因
今天把模拟地和数字之间的0欧姆电阻去掉,想测试两个地之间电流,意外发现没有0欧姆电阻芯片AD功能还工作。
最后逐个芯片引脚检查,发现C8051F060的实际引脚跟PDF(中文和英文)似乎有些对不上。
PIN23在文档上是AGND,但是实际跟其他几个DGND是相连的,(约16欧姆)其他AGND引脚无此现象。
找了另外2个没焊接的芯片测量也是一样(内部的AGND引脚是不连通的)
整理了下数据抓图
c8051f060你也用 新华龙的片子都是挺差的,看起来外设很多 但是都很次 i该淘汰了用lgt单片机 秒杀新华龙的 受到干扰时更惨,根本没法用。建议舍弃掉此芯片。 呵呵。{:smile:} csdnct 发表于 2012-5-23 12:01c8051f060你也用 新华龙的片子都是挺差的,看起来外设很多 但是都很次 i该淘汰了 用lgt单片机 秒杀新华龙 ...
带16位ad,而且采样速度快单片机很少
看你没用过lgt,这可没有16位ad
wahuahua 发表于 2012-5-23 12:11受到干扰时更惨,根本没法用。建议舍弃掉此芯片。
我把在ad前面的一阶滤波电容改成100nf,现在波动小了一些,正负20lsb 关注一下 16BIT ADC PCB和线路设计要点小工夫
无图无真相 依我经验来看,遇到问题先不要怀疑人家芯片的问题,先找找自己的问题先吧。 LZ能否放个PCB图,让大家看看。看看高手们的评价
我也打算用C8051F350。 用示波器确认下,基准源,输入信号有没有被干扰?
AVR的芯片不还建议为了降低A/D转换时的数字噪声,可以让系统休眠在转换吗? 蜂巢 发表于 2012-5-23 13:50 static/image/common/back.gif
依我经验来看,遇到问题先不要怀疑人家芯片的问题,先找找自己的问题先吧。 ...
楼主帖子内容有更新 wangguanfu 发表于 2012-5-23 13:08 static/image/common/back.gif
16BIT ADC PCB和线路设计要点小工夫
无图无真相
帖子有更新,请指教 sufeila 发表于 2012-5-23 13:59 static/image/common/back.gif
LZ能否放个PCB图,让大家看看。看看高手们的评价
我也打算用C8051F350。
楼主帖子内容有更新 本帖最后由 68336016 于 2012-5-23 19:03 编辑
事先说明情况:虽然不同采样频率,不同输入端电容量大小会导致结果有差别,
但是相同条件情况下,我做1024次平均值得到的结果重复性很不错,不管是USB供电还是外接开关电源,平均值之间的波动一般1,2个数字,偶尔大点4,5个数值 (对于65536量程来说,也算不错了,只是单次测量跳动大)
不擅长画PCB,将就着看
自己这几天在折腾C8051F060的16位AD,在排除了各种原因后,发现AD值波动与模拟输入端的电容容量大小关系挺大的。
一阶低通滤波器截止频率可以计算出来,但是其中的电容量大小这跟采样频率之间的关系是怎样的呢?电容大,放电慢,会不会导致跟不上外接信号的变化?
运放经过15欧姆电阻和一个电容接到AD的模拟输入端(官方的开发板是15欧姆和2.2nF,采样频率100kHz,在我自己板子波动太大)
传感器信号变化缓慢,每隔10ms采集一次数据,但是每次以100kHz速度采样1024个点做平均值。
R=15,C=2.2nF,采样频率100kHz,AD值波动150以上
http://cache.ourdev.cn/new2012/forum/201205/21/23485280b39dcdz1e5d5xj.jpg.thumb.jpg
前天 23:48 上传
下载附件 (174.68 KB)
R=15,C=10nF,采样频率100kHz,AD值波动40左右
http://cache.ourdev.cn/new2012/forum/201205/21/2348574i7tgtql3rxzl7tm.jpg.thumb.jpg
前天 23:48 上传
下载附件 (169.74 KB)
R=15,C=100nF,采样频率100kHz,AD值波动20左右
http://cache.ourdev.cn/new2012/forum/201205/21/234845d6dhao0y6iah2gkj.jpg.thumb.jpg
pt001 发表于 2012-5-23 15:09 static/image/common/back.gif
用示波器确认下,基准源,输入信号有没有被干扰?
AVR的芯片不还建议为了降低A/D转换时的数字噪声,可以让 ...
用2个精密电阻分压进来也是一样波动很大 68336016 发表于 2012-5-23 19:00 static/image/common/back.gif
用2个精密电阻分压进来也是一样波动很大
即便是分压,也要确定这个被测信号的波动范围... 被分压的这个电压也会有的纹波的,看看是否在误差范围内... xiaoya1945 发表于 2012-5-23 19:25 static/image/common/back.gif
即便是分压,也要确定这个被测信号的波动范围... 被分压的这个电压也会有的纹波的,看看是否在误差范围内 ...
REF43出来的电压,稳定性和精度比较好,示波器的分辨率也就只能看到直线,细微的噪声都是示波器自身的了 能否用电池供电来试试? wzyllgx 发表于 2012-5-23 19:40 static/image/common/back.gif
能否用电池供电来试试?
好像已经不是被测源的问题了,现在有可能是采样频率与输入端电容的问题,或者其他干扰,比如工频干扰... 原来用过F120的原装板做过实验
跳动还是比较小的
12位AD,测量5V,只有最后一位跳动 68336016 发表于 2012-5-23 18:31 static/image/common/back.gif
事先说明情况:虽然不同采样频率,不同输入端电容量大小会导致结果有差别,
但是相同条件情况下,我做1024 ...
如果将采样频率当做干扰信号滤除,那么接100nF的低通滤波截止频率(F=1/2πRC)为106KHz,这只是一种假设,LZ有木有试过最佳的电容值是多少? 本帖最后由 68336016 于 2012-5-23 20:53 编辑
xiaoya1945 发表于 2012-5-23 20:12 http://www.ourdev.cn/static/image/common/back.gif
如果将采样频率当做干扰信号滤除,那么接100nF的低通滤波截止频率(F=1/2πRC)为106KHz,这只是一种假设 ...
其实这里跟一阶低通滤波频率有关系么?每次采样是我这个电容快速向芯片内采样电容充电。
而我这个电容是靠运放经过电阻给它充电,运放对这个电容充放电频率跟一阶低通滤波器频率之间如何理解呢?难道会跟采样频率一样?电容向采样电容充电,然后运放立刻向电容充电?
我的万用表只是4位半,因此靠万用表来判断哪个数值更准确是行不通了。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
我在两个不同通道用不同电容,采用好几种采样频率,
电容大的结果比较稳定,电容小的结果会随着采样频率变化
10nf ADC0 100nf ADC1
100kHz 32764 32772
200kHz 32751 32772
250kHz 32755 32772
500kHz 32762 32772
--------------------------------------------------------------------------------------------------------------------------------------------------------------
相同采样频率下 电容大的结果<电容小的结果
2.2nf ADC0 2.2nf ADC1
100kHz 32768 32779
100nf ADC0 100nf ADC1
100kHz 32761 32773 楼主对问题的“穷追猛打”精神不错。 DIDADI 发表于 2012-5-23 20:43 static/image/common/back.gif
楼主对问题的“穷追猛打”精神不错。
30几岁的人了,半路出家自学的电子,模电有关的东西实在抽象。
其实我做平均值滤波后,再调整下线性,偏移,也能满足使用要求。
但是总想搞清楚怎么回事才放心,网上搜索很多地方,也有不少人问过 AD前一阶低通滤波器的电容量大小跟AD值关系的问题,但是都没有比较好的答案。 我认为就是线路白噪声的原因而已,楼主的实验结果也显示低通滤波时间常数越高AD波动越小,显然是线路上白噪声的问题。
关于低通滤波,按照我的理解,时间常数t=RC,都知道给RC滤波器输入阶跃信号,输出电压上升到95%需要t=3RC,算算可知如果需要电压上升到65535/65536以上的话需要t=ln(1/65536)*RC = 11.1RC,也就是要AD端的电压上升到16位AD分辨率以内需要11.1RC。比如10Ohm,1uF滤波,输入5V的阶跃信号,AD管脚那边要等10×1×1E-6×11.1 = 0.111ms电压才能上升到16bitAD的分辨率以内。
不知道楼主需要多大的响应速度,要是要求不高,几毫秒十几毫秒的,完全可以用一阶RC滤波,时间常数再高点都不要紧,把滤波器的电阻和电容尽量靠近AD管脚,每次采样的时候采20个数,排序,去掉最高的几个和最低的几个,剩下的求平均,这么来估计跳得也就不多了,计算量也比采1k次然后求平均要小些 “
相同采样频率下 电容大的结果<电容小的结果
2.2nf ADC0 2.2nf ADC1
100kHz 32768 32779
100nf ADC0 100nf ADC1
100kHz 32761 32773
”
不过感觉这个比较奇怪...照道理电容小的由于采样的瞬间电流流进AD转换器,滤波电容小的电压应该掉得更多,AD转换值更小才对,可为什么现在的结果却是滤波电容大的AD值小呢... bigallium 发表于 2012-5-23 22:27 static/image/common/back.gif
我认为就是线路白噪声的原因而已,楼主的实验结果也显示低通滤波时间常数越高AD波动越小,显然是线路上白噪 ...
有理论知识计算就是强
我是要求间隔10ms采集一次传感器数据(期间信号变化幅度不会超过2mV,很缓慢的),传感器经过OP07跟随器,然后一阶滤波到达AD。
为了避免数据跳变太多导致结果偏差,所以我每次就采1024次,刚好也把芯片内的XRAM利用上。
我试过256次平均值,比1024稍微波动大1,2个数值。单纯去掉一个最大最小值,效果没什么变化,主要极大值数量不少,要是去掉10多20个极大极小值,然后平均,应该会很好,不过单片机太费时了 本帖最后由 68336016 于 2012-5-23 23:13 编辑
bigallium 发表于 2012-5-23 22:39 http://www.ourdev.cn/static/image/common/back.gif
“
相同采样频率下 电容大的结果<电容小的结果
2.2nf ADC0 2.2nf ADC1
上面的数值我是至少重复测量4,5次以上得到的,而且能跟几天前相同参数得到的结果保持一致。
100nf ADC0 100nf ADC1
100kHz 32761 32773
--------------------------------------------------------
根据4位半万用表读数进行估算得到的AD值偏小8,9个数值
32751 32766
ADC0 = (12498/25009)*65536=32751
ADC0 = (12504/25009)*65536=32766
我记得昨晚在21IC上见到一个帖子,STM32采集,也是类似现象,有104电容,AD值会偏小2,3个数值 68336016 发表于 2012-5-23 20:59 static/image/common/back.gif
30几岁的人了,半路出家自学的电子,模电有关的东西实在抽象。
其实我做平均值滤波后,再调整下线性,偏 ...
我建议你试试<80pF的负载电容,也就是你说的那个ADC输入的那个电容,不要用太大的。 mark!!! 佩服楼主 佩服 会不会是大的电容漏电流以及等效电阻大? 大小两个电容的封装是一样的么? wx85105157 发表于 2013-5-7 17:06 static/image/common/back.gif
会不会是大的电容漏电流以及等效电阻大? 大小两个电容的封装是一样的么? ...
这是去年的帖子了,当时电容都是一样0805封装的,虽然没搞清楚最终原因,但是将电容加大了些,得到结果跳动 小很多,也满足使用要求了。 68336016 发表于 2013-5-7 17:19 static/image/common/back.gif
这是去年的帖子了,当时电容都是一样0805封装的,虽然没搞清楚最终原因,但是将电容加大了些,得到结果跳 ...
楼主说的加大是指电容值加大吧?我用的是F330,10位AD,采样还算可以,偶尔会有一位的波动,恭喜楼主解决了问题,但是楼主当时有没有测LDO的PSRR? 这是值得顶起的帖子,粤北三区(68336016 )大侠你好,请赐教一个问题:我在调试C8051F060的DMA 不知道哪里出了问题,搞了两天没找到(应该是配置问题),是否有什么主意事项?我使用定时器3启动AD,然后在AD中断中取数的方式运行很正常,踩到的值也很问题,但是使用DMA就是出不了数。谢谢! yyk20130902 发表于 2013-11-28 17:39
这是值得顶起的帖子,粤北三区(68336016 )大侠你好,请赐教一个问题:我在调试C8051F060的DMA 不知道哪里 ...
DMA配置使用好像还是比较简单,我都是参考例子上面的。
这是我当时用的配置和中断函数,你可以参考一下
//-----------------------------------------------------------------------------
// DMA0_Init
//-----------------------------------------------------------------------------
void DMA0_Init (void)
{
u8 SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = DMA0_PAGE;
DMA0CN = 0x00; // 禁止DMA0
DMA0DA = XRAM_START_ADD; // 设置XRAM起始地址为0x0000
DMA0CT = NUM_SAMPLES - 1; // DMA0循环计数器极限值1024
DMA0IPT = 0x00; // DMA0指令写地址寄存器
DMA0IDT = DMA0_GET_ADC01; // 取ADC0和ADC1数据,并写入XRAM
DMA0IDT = DMA0_END_OF_OP; // 操作结束
DMA0BND = 0x00; // 指令起始地址
EIE2 |= 0x80; //使能DMA中断
DMA0CN = 0xA0; // 模式1,启动DMA0
SFRPAGE = SFRPAGE_SAVE;
}
//-----------------------------------------------------------------------------
// DMA0_Interrupt负责不断更新ADC0,ADC1数据
//-----------------------------------------------------------------------------
void DMA0_Interrupt (void) interrupt 21
{
u16 i;
u32 TempValue = 0;
DMA0INT = 0;
read_ptr = XRAM_START_ADD;
LeftADC1Sum = 0;
RightADC0Sum = 0;
for (i=0; i<NUM_SAMPLES; i++)
{
RightADC0Sum += *read_ptr;
LeftADC1Sum += *(read_ptr+1);
read_ptr = read_ptr+2;
}
LeftVoltage = 25000 * (LeftADC1Sum >> 8) / 65536 -12500 + 0x8000;
RightVoltage = 25000 * (RightADC0Sum >> 8) / 65536 -12500 + 0x8000;
SFRPAGE = ADC2_PAGE;
AD2INT = 0;
AD2BUSY = 1;
while (!AD2INT);
if (amux_input++ == 0)
{
RoadVoltage = (2500L * ADC2) / 1024;
AMX2SL = amux_input;
}
else
{
AirVoltage = (2500L * ADC2) / 1024;
amux_input = 0;
AMX2SL = amux_input;
}
DMA0_Init ();
} 感谢你的回复,我的程序一运行,xdata里面就全是ff,我再对照你的程序查查程序看; lz的上位机软件是什么怒求分享。 ttoto 发表于 2013-11-28 21:01
lz的上位机软件是什么怒求分享。
LZ位几张图是CurveExpert,后面那些都是EXCEL来的{:lol:} 68336016 发表于 2013-11-28 22:18
LZ位几张图是CurveExpert,后面那些都是EXCEL来的
wow, cool,最近刚好要用类似的软件。
ps:基于pyqwt的orange真心猛。 感谢粤北三区(68336016 )大侠。问题后来解决了,通过你的提示,确认DMA配置没有问题,问题出在 外部存储器接口配置 EMI0CF上,学艺不精配到片外XRAM上,当时每次读回的0xFF;C8051F060 1M的AD果然很给力。 细节没看明白,不过F060内部16-bit ADC是SAR型的,因此输入和参考端都有脉冲电流,需要经过运放缓冲外加RC来吸收。看情况参考端好像没有这么做? heize 发表于 2019-1-16 23:33
细节没看明白,不过F060内部16-bit ADC是SAR型的,因此输入和参考端都有脉冲电流,需要经过运放缓冲外加RC ...
当年的图纸,输入跟官方参考图差不多
68336016 发表于 2019-1-17 08:48
当年的图纸,输入跟官方参考图差不多
好的,多谢。
这个是输入端,有加缓冲。不知道参考电压有没有加? heize 发表于 2019-1-17 17:47
好的,多谢。
这个是输入端,有加缓冲。不知道参考电压有没有加?
基准源是REF43,加了跟随器加大电流,除了给芯片当参考电源,同时接到AIN输入端上门的电阻上。
这样用法,当时也是参考NI的一些采集卡电路的。
68336016 发表于 2019-1-17 18:08
基准源是REF43,加了跟随器加大电流,除了给芯片当参考电源,同时接到AIN输入端上门的电阻上。
这样用法 ...
那就不太懂了。难道是这里的运放负载电容太大了,没串联隔离电阻,导致振荡?
页:
[1]