ADS1232复位问题
请教各位大虾:
有谁玩过ADS1232?我现在有个问题,每次复位后,读数都不一样,比如这次复位后,读数是123.47,传感器不动,读数不变,但是关掉电源,传感器维持现状,重新启动后,读数就是145.35,每次重新复位后,就变了,主芯片是STC10F08XE,看了网上的ADS1232使用笔记,说是在复位后,设置参数前(GAIN,SPEED等参数),要将PDWN置低,然后设置参数,参数设置好后,然后将PDWN拉高,这样就好了,但是我的板子GAIN,SPEED这些参数都是由板子固定的,就是直接接地了,并不用我代码设置,此时如何复位呢?我在复位后,用代码先将PDWN置低,然后延时一段时间,再将PDWN拉高,无效。
急,谢谢!
部分原理图如下,ADS1232只有PDWN,DOUT,SCLK是连接在单片机芯片上由自己控制的。
[最优解释]
兄弟,问题已经解决了,就是机子开机时要做做一次自校正就可以了,即发26个脉冲让芯片完成偏移校正,资料上有。
[其他解释]
“复位后,用代码先将PDWN置低”,太晚了,要把硬件复位信号加到PDWN上。
[其他解释]
这个是不是复位后寄存器只的数据丢失了?
你确保在每次用这个器件的时候,都事先自己写一个明确的寄存器值
这样试试
[其他解释]
不是啊,ADS1232不是靠寄存器来设置参数的,它就是几个简单的引脚,引脚置高或者置低就对应设置了参数。
[其他解释]
我最近在使用ADS1234这款芯片,和ADS1232是一样的,只是多了两个输入通道。和你碰到的问题一样。第一批ads1234芯片没有发现频繁开关机(使用的是LPC2214)时会引起ads1234输出数据异常(有时是正当极大值,有时是负担极小值,有时是不大不小的值,即使差分输入管脚短接),第二批芯片却频繁会出现开关机时采集数据异常。现象是:正常采集时从不会出现采集数据异常,当频繁开关机时出现采集数据异常且无法自动恢复正常,只有关机几秒后重新开机才能恢复正常,如果马上开机还是会异常。
其中PDWN,Gain1,Gain2,speed均由LPC2214管脚控制,看了网上的ADS1232使用笔记后,把pdwn管脚用2k电阻下拉,以防arm复位时PDWN为高电平(因为arm复位时IO口默认为输入,阻抗较高)。ARM复位重启后首先把PDWN,Gain等管脚初始化为低,speed初始化为高,然后延时一定时间再把PDWN拉高。关机时,把PDWN先拉低,延迟几百毫秒后关机。感觉程序没有大问题,困扰了好几个月了。我的联系方式hanxiufu@xgxc.com,hxf1978@sohu.com
[其他解释]
曾经把Gain0 Gain1管脚直接接地,SPEED直接接高电平,输入短接,也不管用,依然会出现频繁开关机时采集数据异常。怀疑是不是这次采购的芯片是劣质产品,担我们领导说应该不会,不知道怎么办了。参照ADS1234datasheet把模拟电源接5V,数字电源接3.3V。模拟参考电源接5V。接收数据是用LPC2214 的普通IO口模拟串口数据线。
其它奇怪现象总结: 1 关机3-6秒后再开机可恢复正常,当关机之前把PDWN拉低10秒再关机后重启数据依然异常 2 当手碰到电路板且摇晃人体时频繁开关机很容易出现数据异常,一个姿势保持不动不易出现异常,屡试不爽,怀疑是静电干扰 3 当出现异常时,这时用示波器地线夹接触电路地时,采集数据会突然恢复正常,而如果示波器一直连接电路板,而频繁开关机出现采集数据异常时,不会自动恢复正常,必须撤掉示波器探头再接上采集数据才会恢复正常。
[其他解释]
如果一旦频繁开关机出现采集数据异常,那么数据大小比较稳定,基本不变,之后小数点第二位在变,而且很有规律,出现的总是那3组异常数据,即2.5V,-2.5V,或零点几伏(没具体换算)。datasheet上说拉低pdwn会把ADS1234从锁定状态恢复正常,但现在看不是那么回事啊
[其他解释]
曾经用示波器观察过ADS1234的输出数据,示波器看到的数据和单片机采集的一致,所以复位后采集数据异常不应该是单片机读取错误造成的,
[其他解释]
很急,谢谢!
[其他解释]
我也很急,目前现象跟你说的差不多,数据异常也是有规律,就那么几个值。
[其他解释]
很急啊很急,希望各位高手指点,或TI公司的技术支持也行,谢谢了!
[其他解释]
会不会是ADS1232/4不适合做便携式仪表啊,因为手持式仪表需要频繁开关机。而ADS1232/4datasheet上又没说自己适合做仪表,只说适用于称重、应力、压力、工业过程控制等领域,好像这几个方面都不需要频繁开关机啊,真不想放弃啊,但现在又解决不了问题。
[其他解释]
自己顶一个!
[其他解释]
[img=<center><a href=./bbs_upload/files_36/ourdev_618197QREM4X.JPG target='_blank'><img src=./bbs_upload/files_36/ourdev_618197QREM4X.JPG border=0></a>][/img]
[其他解释]
附件为ads1234的应用原理图,不知问题出在哪里,请各位高手指教
[其他解释]
兄弟,我们还是自己顶吧。
------其他解决方案--------------------
模拟地和数字地在哪里连接起来?
[其他解释]
刚才实验楼一下,发现当ads1234输出数据异常的时候,把pdwn脚拉低一次,无法使ads1234回复正常,只有把电源拉低一下(接地,模拟管脚供电时数字电源管脚悬空无效,ads1234依然能够工作。如果把模拟电源管脚也断电,其它数字管脚如A0,A1,speed gain clck等拉低,这数字电源管脚和数据输出管脚依然有1V左右的电平,很奇怪哪里来的电压?),它才能恢复正常的采样工作。看来pdwn无法使得芯片复位,只有强行把DVDD拉低,测量了一下,拉低电流为60多毫安,远远大于其正常工作电流。。
[其他解释]
通过一个磁珠,并且磁珠的两端都有10u与0.1u的陶瓷电容。模拟地和数字地直接通过很粗导线的导线直接连接实验过也不行,频繁开关机还会出现数据异常。很头疼啊,请高手救救!在下感恩不尽。
[其他解释]
也就是说只有ads1234把数字电源管脚DVDD管脚拉低才能使其恢复正常工作,拉低pdwn无效。
[其他解释]
请问两位兄台!你们的ADS1232在差分模式下读取的24位数据的最高那个八位是多少啊?是0x7f或者0x80吗?
[其他解释]
真的?我立刻试试,非常感谢啦!
[其他解释]
0x80表示负数,即24位最高位如果是1,表示是负数。反之,最高位是0则表示是负数,资料上有。
读数完全取决于你的输入电压。参考电压如果为5V,则测量范围为正负2.5V
0xffxxxx表示负的比较小的数,0x00xxxx表示是正的较小的数,说明你很可能没有输入电压
[其他解释]
我的ADS1232在差分模式下读到的数据格式是0xff xx xx和0x00 xx xx这样的格式的24位数据,不知道正确不啊?两位指教下啊?谢了先!
[其他解释]
O(∩_∩)O
你测得的数据都是标准的吗?0x7f xx xx 和0x80 xx xx吗?
我之前用的是AD7731这个芯片的输出是这样的 !
应该说24位的AD差分情况下都是这种偏移二进制编码输出是吧?
像我现在这种情况是没有输入信号?
可是我的传感器是接在上面的啊 难道是我传感器坏了?
279201105 是我的QQ 方便的话加我吧!
好向你请教下
[其他解释]
0x80表示负数,即24位最高位如果是1,表示是负数。反之,最高位是0则表示是正数,资料上有。
读数完全取决于你的输入电压。参考电压如果为5V,则测量范围为正负2.5V
0xffxxxx表示负的比较小的数,0x00xxxx表示是正的较小的数,说明你很可能没有输入电压
[其他解释]
此外,你的程序里面好像没有寻找ADC输出管脚下降沿的动作,那样才能开始输入时钟信号,adc芯片才输出数据,不然,结果肯定错。不知道是不是你的寻找下降沿的动作在别的地方?
[其他解释]
我初始化完成之后能检测到RDY引脚拉低!说明我的ADS1232工作正常是吧?
有两个地方可能出问题,我的传感器坏了或者我的读程序有问题!估计程序的可能性更大点!
等下换个传感器试试!
还有啊
你们的ADS1232在SPEED=0的时候或者1的时候 输出速度怎么样?
我的感觉是10SPS和80SPS都达不到这个速度!
O(∩_∩)O
[其他解释]
楼上正确,我的现在是OK了,传感器是好的情况下,在未接负载的情况下,也会输出信号的,我的那个传感器输出是-0.04xxx毫伏,观察了下,在传感器静置在桌面上,软件滤波,信号波动在100nv之间。算是可以的了。
[其他解释]
你得好好阅读下芯片资料,你说的这些资料上都有
[其他解释]
/**********************************************************************
* 名称 : Ads1232Init()
* 功能 : ADS1232初始化函数
* 输入 : 无
* 输出 :无
* 说明 : 无
***********************************************************************/
void Ads1232Init()
{
Pdwn=0; _nop_();_nop_();_nop_();/*必须先拉低Pdwn引脚*/
_nop_();_nop_();_nop_();_nop_();
Speed=0;/*0-10SPS,1-80SPS*/
GainSelect(0);/*GAIN=1*/
Sclk=0;/*拉低时钟线*/
A0=0;/*AIN0+ AIN0-通道*/
Pdwn=1;/*制造上升沿*/
_nop_();_nop_();_nop_();_nop_();
}
[其他解释]
/**********************************************************************
* 名称 : ReadAdcData()
* 功能 : ADS1232读函数
* 输入 : 无
* 输出 :无
* 说明 : 无
***********************************************************************/
long ReadAdcData()
{
uchar i=0;
long Data;
for(i=0;i<24;i++)
{
Data<<=1;
Sclk=1;
if(Dout==1){Data=Data+1;}
else {}
Sclk=0;_nop_();_nop_();
}
Sclk=1;_nop_();_nop_();/*矫正脉冲*/
Sclk=0;_nop_();_nop_();
return(Data);
}
[其他解释]
我现在改成这样试试
/**********************************************************************
* 名称 : ReadAdcData()
* 功能 : ADS1232读函数
* 输入 : 无
* 输出 :无
* 说明 : 无
***********************************************************************/
long ReadAdcData()
{
uchar i=0;
long Data;
for(i=0;i<24;i++)
{
Data<<=1;
Sclk=1;
if(Dout==1){Data=Data+1;}
else {}
Sclk=0;
}
Sclk=1;_nop_();/*第25个脉冲是RDY保持高电平*/
Sclk=0;_nop_();
Sclk=1;_nop_();/*第26个脉冲进行积累误差校正*/
Sclk=0;_nop_();_nop_();_nop_();
return(Data);
}
[其他解释]
我刚自习看了下ADS1232的三种时序
第二种第25个脉冲可以是RDY保持高电平,这样 while(!RDY);这句就绝对能保证是RDY拉低的时候才读数据
第三种第26个脉冲可以消除积累误差,也就是你们遇到的那种情况,每次开机读到的值不一样的情况
[其他解释]
我换个传感器结果是一样的!一样的情况!不过比较奇怪啊!
我让读到的数据显示出来的话!
压传感器或者拉传感器的时候,数据会相应的增加或者减小!
O(∩_∩)O哈
羡慕你们俩啊!都成功了!
我现在就这问题卡死我了,没法继续往下做了!
对了
我看那个ADS1232应用笔记里面的时序分三种!你们使用的是哪一种 啊?
[其他解释]
/**********************************************************************
* 名称 : ReadAdcData()
* 功能 : ADS1232读函数
* 输入 : 无
* 输出 :无
* 说明 : 无
***********************************************************************/
long ReadAdcData()
{
uchar i=0;
int a=0, b=0;
long Data;
do
{b=a
a=Dout
delay(20us)
}while(b<=a);/寻找1232输出数据是否准备好,即查询下降沿
for(i=0;i<=24;i++) /25个脉冲把最后一位输出后强行置高
{
Data<<=1;
Sclk=1;
if(Dout==1) {Data=Data+1;}
else {}
Sclk=0;_nop_();_nop_();
}
Sclk=1;_nop_();_nop_(); /*矫正脉冲*/ 第26个脉冲用于偏移校正,只在开机时用一次即可
Sclk=0;_nop_();_nop_();
return(Data);
}
程序差不多是这个流程,但我是搞硬件的,不符合语法请重新写,我们公司的软硬件分开,硬件工程师无法获得软件代码,请见谅。不过你必须好好读读材料才行
[其他解释]
我刚自习看了下ADS1232的三种时序
第二种第25个脉冲可以是RDY保持高电平,这样 while(!RDY);这句就绝对能保证是RDY拉低的时候才读数据///////////////如果读到时机不对,也不行,比如,下次数据快准备好了你才读上次的数据就不对!
第三种第26个脉冲可以消除积累误差,也就是你们遇到的那种情况,每次开机读到的值不一样的情况
[其他解释]
兄弟,你真是热心
我也贡献下:
/*************初始化ADS1232****************/
void ADS1232_Init(void)
{
SCLK=0x00;
PDWN=0x00;
Delayus(0x14);
PDWN=0x01;
ADS1232_Read(0x01); //复位后校准一下
ADS1232_Read(0x00); //先前不稳定的值读取掉
}
/******************************************/
/************读取一次ADS1232数据***********/
//Calibration:0x01:校正,0x00:不校正
signed long ADS1232_Read(bit Calibration)
{
unsigned char loop=0x00;
signed long Result=0x00;
while(DOUT); //等待数据到来
for (loop=0x00;loop<0x18;loop++) //循环读取数据
{
SCLK=0x01;
_nop_();
Result=(Result<<0x01)
[其他解释]
/**********************************************************************
* 名称 : ReadAdcData()
* 功能 : ADS1232读函数
* 输入 : 无
* 输出 :无
* 说明 : 无
***********************************************************************/
long ReadAdcData()
{
uchar i=0;
int a=0, b=0;
long Data;
do
{b=a
a=Dout
delay(20us)
}while(b<=a);/寻找1232输出数据是否准备好,即查询下降沿
for(i=0;i<=24;i++) /25个脉冲把最后一位输出后强行置高
{
Data<<=1;
Sclk=1;
delay(50us)这里要有延迟,注意了,最好下时钟的下降沿读数据,因为输出数据迟于时钟上升沿
if(Dout==1) {Data=Data+1;}
else {}
Sclk=0;_nop_();_nop_();
}
Sclk=1;_nop_();_nop_(); /*矫正脉冲*/ 第26个脉冲用于偏移校正,只在开机时用一次即可
Sclk=0;_nop_();_nop_();
return(Data);
}
程序差不多是这个流程,但我是搞硬件的,不符合语法请重新写,我们公司的软硬件分开,硬件工程师无法获得软件代码,请见谅。不过你必须好好读读材料才行
[其他解释]
没关系的!理解!O(∩_∩)O哈!还是非常感谢你回复我啊!如果这样还不能解决的话!你觉得是会是什么问题呢?我被搞晕了!就是这样一个简单的模拟SPI函数啊!不至于这样啊!真的是搞晕了!
[其他解释]
liuxing7851 这位兄弟!
你用的什么单片机啊?晶振多大?
ADS1232用的外部晶振还是内部的啊?
O(∩_∩)O
[其他解释]
我的是STC10F08XE的芯片,晶振是11.0592,我的ADS1232用的是内部晶振
[其他解释]
DOUT;
SCLK=0x00;
}
SCLK=0x01;
_nop_();
_nop_();
SCLK=0x00;
if(Calibration)
{
SCLK=0x01;
_nop_();
_nop_();
SCLK=0x00;
}
if(Result>=NEGATIVE)//表示负值,define NEGATIVE 0x800000
{ //define EFFECTIVE 0x7FFFFF
Result-=PRECISION;
}
return Result;
}
/******************************************/
[其他解释]
哈哈!你们俩真是好人啊!O(∩_∩)O
[其他解释]
我用你的程序 使用内部晶振还是一样的结果 晕死!
100nv的跳动才17位精度吗?
你有做软件滤波吗?
[其他解释]
做了软件滤波,中位数平均滤波+一阶之后滤波,取了7个值做运算,经测算,放大128倍的情况下,24位精度的确是后面8位在跳动,根据计算公式AD*(((0.5*REFERENCE)/GAIN)/EFFECTIVE),REFERENCE=2500,GAIN=128,EFFECTIVE=2^23-1;我取AD为8位最大值0xFF,则得出结果为0.0002968mv,如果转换成nv,则是296.8nv,而实际上没有那么大,大概在+-100之间跳动。
[其他解释]
我用的也是STC的单片机!
STC12C5A60S2
11.0592MHZ的晶振
不过采用的ADS1232外部晶振 4.9152Mz的
明天改成内部晶振试试
你现在的精度大约是多少位?
我Q279201105 方便的话加我把 大家多交流啊
嘿嘿 O(∩_∩)O
[其他解释]
放大128倍,目前精度在17位左右。
[其他解释]
我的是10SPS的,30000的精度?不明白是什么意思
------其他解决方案--------------------
O(∩_∩)O哈
不错不错......
我需要做到30000的精度的,你的输出速率是多大?10SPS还是80SPS?我的参数要求达到至少50SPS
30000的精度
[其他解释]
错了,上面不是+-100,而是+-50,也就是数值序列的最大和最小是在100之间。
[其他解释]
之所以会17位精度,是放大增益为128倍的结果,如果放大增益小点,精度会提高很多,这点不需要怀疑。
[其他解释]
应该这个是满足要求的了!就是我的问题还是没解决啊!烦躁.....
[其他解释]
噢,80SPS我没有试过,30kg的分辨率要1g的话,传感器本身精度也要高的,应该还行吧,24位的AD转换芯片算是最高的了。
[其他解释]
不知道80SPS的时候精度怎么样啊?你试过没?
[其他解释]
就相当于 30KG的传感器,必须得识别1G力
[其他解释]
貌似你Q一直不在线啊?O(∩_∩)O
[其他解释]
恩!那个就是我!这个你结贴吧 我加你Q O(∩_∩)O
[其他解释]
电子开发网的adiby2004是你吗?是的话,我这个帖子就结贴了,在那个帖子回答你的问题,另外你加我Q了吧,可以到Q问我。
[其他解释]
这问题已经卡了我一个多星期时间了 我是真没辙了啊 能想到的都试过了
[其他解释]