工具/软件:TI C/C++编译器
实际上,我使用的是增益=128的ads1232
速度=10sps
当我读取ADC的输出时,其较低字节会发生波动,而中间字节和较高字节为okk。
这 是不是可能的,不管怎样,我可以完全稳定ADC的输出。在模拟输入上,我连接了一个10k的可变电位计
并与stm8s003k3微控制器连接。
正在等待回复。
索努
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好,Sonu:
欢迎参加论坛! 遗憾的是,由于转换过程中存在固有的噪音,您将无法使所有位保持稳定。 也会有与电位计相关的噪音,也会有来自您的电源的噪音。 您可能会看到平均值的一些好处。
在ADS1232数据表的第5页上,您将看到一些表格。 这是各种情况下的最佳噪声性能。 表1使用AVDD的5V显示了18.4 的无噪声位,这些位是增益为128的稳定位。 这意味着对于24位转换器,将切换更低的5到6位。
我要提到的另一件事是,您使用电位计提供的输入电压不能用128的增益作为单端输入(AINN连接到AGND)进行测量。 数据表第3页给出了64和128增益的输入限制,其中绝对输入电压必须在ADS1232的共模输入范围内。 该电压必须大于AGND +1.5V且小于AVDD-1.5V。 使用1或2的增益可进行单端测量。
此致,
Bob B
e2e.ti.com/.../8103.main.cthanks的回复,但我想问的另一件事是,您能否向我发送一个示例代码,以便我获得ads1232的线性和稳定输出
您好,Sonu:
ADS1232以二进制2的补码输出转换结果。 数据的格式已设置为24位的负值,因此您只需正确地对值进行符号-将值扩展为32位的符号值(长)。
函数ADC_READ()返回一个无符号值。 这应该 是长整型,而不是无符号长整型。 此外,在第一个SCLK时钟转变为高时,您无法确定符号。 当 输入较低时,您正在设置值的高位也会出现如下所示的示例:
如果(GPIO_ReadInputPin (DOUT)=0)
{
high _byte=high字节| y[m];
}
对于ADC_READ函数,删除对号代码,将以上部分更改为= 1而不是0,并正确地进行符号扩展。 下面显示了一种方法:
number=0; number=number|high字节; number=number<8|mid字节; number=number<8|low_byte; number=number<<8; //强制带符号的MSB进入长 号=number>>>>8的MSB;//使用符号将值移回正确的值
在您的主函数中,您不断地将来自ADC_READ()的new_value等同起来,但您无法知道这是否是新数据。 您需要在main函数中轮询DOUT/DRDY,或者在ADC_READ中轮询,以等待新数据可用。 例如:
whitle(GPIO_ReadInputPin (DOUT)!=0);
如果您使用示波器或逻辑分析器,则可以检查所有计时。 首先,您需要检查并确保SCLK计时有效。 其次,您应该看到DOUT/DRDY以您选择的指定数据速率从高到低。 接下来,您应看到在范围内捕获的数据,并与程序中的数据进行比较。 在对平均算法进行操作之前,这一切都应该有效。
此致,
Bob B
您好,Sonu:
我们拥有的ADS1232的唯一示例代码位于如下所示的位置。 由于此代码使用不同的处理器,实时操作系统和复杂的代码,我认为解决代码中的一些小问题会更容易,而不是被示例代码弄混淆。
ftp://ftp.ti.com/pub/data_acquisition/ADS123xREF/ADS123x_CDROM/Firmware/Firmware_Source_Code/Source_for_123XREF_firmware-1.1.0d.zip
祝您好运,
Bob B
您好,Sonu:
很抱歉回复延迟。 我没有时间逐行浏览您的代码,但对于ADC部分,代码应该更像以下内容:
签名长ADC_READ ()
{
字符m;
CHAR ADC_SIGN=0;
IF (GPIO _ReadInputPin (DOUT)==0) //已准备好黑客数据
{
高字节=0;
mid_byte=0;
low_byte=0;
对于(m=0;m<8;m++)
{
GPIO写入低电平(SCLK);延迟(1);
GPIO写入高电平(SCLK);延迟(1);
GPIO写入低电平(SCLK);延迟(1);
IF (GPIO _ReadInputPin (DOUT)!=0)
{
high _byte=high字节| y[m];
if (m==0) adc_sign=1;
}
};
对于(m=0;m<8;m++)
{
GPIO写入低电平(SCLK);延迟(1);
GPIO写入高电平(SCLK);延迟(1);
GPIO写入低电平(SCLK);延迟(1);
IF (GPIO _ReadInputPin (DOUT)!=0)
mid_byte=mid_byte | y[m];
};
对于(m=0;m<8;m++)
{
GPIO写入低电平(SCLK);延迟(1);
GPIO写入高电平(SCLK);延迟(1);
GPIO写入低电平(SCLK);延迟(1);
IF (GPIO _ReadInputPin (DOUT)!=0)
low_byte=low_byte | y[m];
};
GPIO写入低电平(SCLK);延迟(1);// 25时钟
GPIO写入高电平(SCLK);延迟(1);
GPIO写入低电平(SCLK);延迟(1);
number=0;
number=number|high字节;
number=number<8|mid_byte;
number=number<<8|low_byte;
if(ADC_SIGD) number=number|0xFF0万;//值为负数
}
返回(数字);
}
您还应在示波器或逻辑分析仪上验证通信。 这还包括SCLK计时,以确保时钟符合正确的高/低时间要求。 对于ADS1232,'delay(1)'的时间是否正确,我对此提出疑问。
此致,
Bob B
您好,Sonu:
我们回到了这条线的起点。 您不会显示原理图或说明ADS1232的增益引脚是如何连接的。 如果使用电位计施加电压,则只能使用1或2的增益。 如果电压源有噪音,或者电位计的连接中有噪音,您将在输出代码中看到噪音。 如果基准噪声较大,则会产生噪声代码。 如果您使用的电位计增益为64或128,您将看到线性问题,因为输入将超出ADS1232的共模输入范围。
输出代码永远不会完全稳定。 页上的表1至表4显示了ADS1232在各种工作条件下的噪声性能。 尤其要注意无噪音位。
当我回顾您的代码时,我不了解您的平均算法。 例如,'diff'是刚刚读取的值与平均计算值之间的差值。 您 使用的IF语句永远不会发生:
IF (diff)
ADS1232的最大正数代码为0x7FFFFFFF (小数为838.8607万)。 代码0xFFFFFF至0x80万是负代码(-1至-838.8608万)。 另外,我不理解您的两种不同平均方法。 合并时,您将看到不同的值,具体取决于比较结果,这将导致误差,并可能显示为线性误差。 在您知道您的数据有效之前,我不会使用平均算法。 噪音是可以预料的,但应首先减少所有外部噪音源。
此致,
Bob B
您好,Sonu:
ADS1232在AINP和AINN之间进行差分测量。 增益为128时模拟输入的输入要求为AINN,AINP必须小于AVDD-1.5V和AGN+1.5V。 当增益为64或128时,您无法将AINN连接到AGND,并期望读数良好。
如果您要使用电位计作为输入,您实际上需要使用其中的2 个(或至少其中一个用于一个输入,另一个用于分压器),因为两个输入都必须在正确的共模模式下才能实现设备操作。 您看到的线性误差很可能与您的输入电压有关。 另请记住,对于5V参考,电压差(AINP和AINN之间)必须限制为+/- 19.5mV。
此致,
Bob B