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.

[参考译文] ADS1255:如何使用Arduino简单编码ADS1255

Guru**** 2562120 points
Other Parts Discussed in Thread: ADS1255

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/589572/ads1255-how-to-simply-code-ads1255-with-arduino

部件号:ADS1255

您好,Texas的员工

很抱歉打扰你。

我是入门级电气工程师。 我遇到了对ADS1255进行编码的问题,但无法找到解决方案。

我的测试电路遵循您的数据表Figure 25,但使用Arduino控制。

我的连接是AIN0至信号发生器BNC红色(1kHz,5V SinWave) AIN1至信号发生器BNC黑色。

SCLK到CS连接到Arduino SPI和Control。 重置连接到Arduino以重置ADC。 VREFP 使用直流电源2.5V  

所有其它的都与图显示相同。

我的问题是如何对此ADS1255进行编码。 我有一个代码已上载到文件中(Arduino IDE)。 请检查。

我检查Arduino IDE输出。 我得到了电波,但是如果我把电波改成三角或其他波形,它总是会出现在SinWaves上  

波形的振幅也不正确。 我想输入Sinwaves并获得相同的Sinwaves波形。

对于编码问题--------

1)如何写寄存器? 以下代码是否正确?

276 -SPI.transfer (0x50 | STATUS_reg);
277 -SPI.transfer(0x00);//第二个命令字节,只写一个寄存器  

2)在代码中,每个延迟是correcte2e.ti.com/.../ADS1255-Arduino-Code.docx 还是需要进行调整?

3)如何将十六进制代码转换为实际测量电压

if (adc_val > 0x7fff){
adc_val =(1677.7215万ul - adc_val)+ 1;//DO 2的补码
}
serial.println (adc_val*PGAmulti_1,10);

非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Yang,

    欢迎来到TI E2E论坛! 要回答您的问题...

    [报价用户="Yang Chang"]

    1)如何写寄存器? 以下代码是否正确?

    276 -SPI.transfer (0x50 | STATUS_reg);
    277 -SPI.transfer(0x00);//第二个命令字节,只写一个寄存器  

    [/引述]

    正确。 您发送的下一个字节将是要写入的寄存器数据(在此示例中写入状态寄存器),只需确保在发送数据字节之前包括"T6"延迟。  

    另外,在发送WREG命令之前,请确保设备处于SDATAC模式(通过发送SDATAC命令)。 ADS1255应通电进入此模式;但是,我认为在通电后强制执行此模式是一个好做法。

     

    2)在代码中,每个延迟都是正确的(请访问网站查看此文件),或者需要进行调整?[/QUOT]

    我在WREG的第二个命令字节之后没有看到"T6"延迟。 如果Arduino的SPI.transfer()函数调用足够慢,则可能在这些字节之间有足够的延迟时间。 同样,在这方面列入故意拖延仍然是一种良好做法。

    另外,在运行校准后,请确保至少延迟ADS1255数据表中表13给出的时间。

     

    [报价用户="Yang Chang"]

    3)如何将十六进制代码转换为实际测量电压

    if (adc_val > 0x7fff){
    adc_val =(1677.7215万ul - adc_val)+ 1;//DO 2的补码
    }
    serial.println (adc_val*PGAmulti_1,10);

    [/引述]

    查看此博客文章:

    看起来您正在做的事情可能会起作用。 获得2的补码转换后,您只需将值乘以ADC的LSB大小即可,这就是您所做的。 但可能的问题是“adc_val*PGAmulti_1”可能返回一个整数值,而不是您要查找的双精度数字。 您可能需要将此操作类型转换为双精度数据类型。

     

    此致,
    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Yang,

    再考虑一下"Serial.println(ADC_val*PGAmulti_1,10);"语句...

    在许多情况下,您需要先将数字转换为字符串,然后才能打印值。 格式化的打印函数可能允许您使用格式说明符执行此操作,例如:printf ("Voltage =%d\r\n",(double) adc_val*PGAmulti_1);

    此致,
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Christopher

    我听从了你的建议。 我稍微更改了一下我的代码。

    例如:我添加了延迟7微秒

    //----------- 部分设置  

    serial.println ("状态数据设置已启动");

     字节STATUS_DATA = 0x01;//状态:最高有效位优先,自动校准被禁用,模拟输入缓冲被禁用

     SPI.transfer (0x50 | STATUS_reg);

     SPI.transfer(0x00); //第二个命令字节,只写一个寄存器

     DelayMicroseconds(7);                       ---------------- ---------------- 添加T6正确位置?

     SPI.transfer (status_data); //将数据库写入寄存器

     DelayMicroseconds(10);                       ---------------- 我应该推迟吗??

     //----------------

     //----------------

     // ADCON设置

     //字节adcon_data = 0x00;// 00 00 0万

     serial.println ("ADCON数据设置已启动");

     SPI.transfer (0x50 | ADCON);

     SPI.transfer(0x00); //第二个命令字节,只写一个寄存器

     DelayMicroseconds(7);                        ---------------- ---------------- 添加T6正确位置?

     SPI.transfer (PGA_1); //将数据字节写入寄存器

     serial.println ("ADCON数据设置已结束");

     DelayMicroseconds(10);                       ---------------------------------- 我应该推迟吗??

    //-----------

    对于主回路:

    void Ain_0_COM()

     long adc_val =0;//存储读数

     洋地黄写入(CS,低);

     SPI.beginTransaction(SPISettings(SPISPEED,MSBFIRST,SPI_MODE1);//启动SPI

     DelayMicroseconds(10);

     while (digitalRead (rdy){};

     SPI.transfer (SDATAC);                       ---------------- 添加SDATAC以确保 在SDATAC模型中

                                                     ---------------- 我应该推迟吗??

     //字节通道=0;

     //字节数据=(通道<<4)|(1 <<3);//Ain-channel和AINCOM

     //字节数据= 1;

     SPI.transfer (0x50 | 1);// mux寄存器(0101 rrrrrr)

     SPI.transfer(0x00); //第二个命令字节,只写一个寄存器

     //SPI.transfer (AIN0_COM); //将数据库写入寄存器

     DelayMicroseconds (7);//T6                         ---------------- 添加T6

     SPI.transfer (P_AIN0 + N_AINCOM);

     DelayMicroseconds(10);                             ------------------- 我应该推迟到这里吗??

     //sync命令1111 1100

     SPI.transfer (同步);

     DelayMicroseconds(10);                             ------------------- 我应该推迟吗??/

     //wakeup 0000

     SPI.transfer (唤醒);

     DelayMicroseconds(34);                           ---------------- 在此处添加一次注射延迟

     SPI.transfer (0x01);//读取数据0000 0001 (01h)

     //delayMicroseconds (10);                            ------------------- 我应该推迟吗??/

     adc_val = SPI.transfer (0);

     adc_val <<= 8;//shift to left

     adc_val || spI.transfer(0);

     adc_val <<=8;

     adc_val || spI.transfer(0);

     while (digitalRead (rdy)== high ){};                 添加以检测准备就绪是否到达高位以完成一次拍摄

     delayMicroseconds(3);//t 17.                         加T17等待一轮投照我使用了7.86M

     洋地黄书写(CS,高);

     SPI.endTransaction();

     IF (ADC_VAL > 0x7ffff){//IF MSB == 1

      adc_val =(1677.7215万ul - adc_val)+ 1;//DO 2的补码

     }

     //Serial.print ("AIN0_COM:");

     //字符串myString =字符串((double) adc_val*PGAmulti_1);

     //Serial.println (myString);

     serial.println (((双) adc_val*PGAmulti_1.5);                      添加双精度型

     //Serial.println (" Volt ");

     //串行.println (adc_val*PGAmulti_1*1000,2);

    }

    //--------------------------------------------

    如果需要更多调整,您能否检查一下?

    所以我给你输出波形。 很抱歉,我没有SPI模拟软件。 我给您串行输出。 如果可以帮助您

    第一种情况:

    与数据表中的图25相同的电路原理图。 AIN0为5V AIN1为0V DC...

    第一个问题:我一直得到 3.7.6953万V电压。 如何获得5V电压?

    第二个问题:我在3.7.6953万 的50倍内得到了4.3.9453万V。 如何避免这种扭曲。

    第二种情况:

    与数据表中的图25相同的电路原理图。 AIN0是BNC红色 AIN1是 信号发生器中的BNC黑色,振幅为1kHz,信波为5。 我知道波形是

    我忘记了我的参考电压为2.5V DC

    我非常需要你的帮助。

    非常感谢!

    祝你一切顺利

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Christopher
    我误击了按钮'Verify Answer'(验证答案)。 我希望我不要犯错。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Yang,

    我建议您在对设备进行编程后,读回您的注册设置(使用RREG命令)以确保设备设置正确....这样做将有助于您验证SPI通信。

    我认为您在正确的位置有延迟。 在某些情况下,您的延迟时间比您需要的时间长得多,但这不应该是问题。  

    我看到的最大问题是您似乎读取了数据,然后等待/DRDY,这在代码中:

    [报价用户="Yang Chang"]

     SPI.transfer (唤醒);

     DelayMicroseconds(34);                           ---------------- 在此处添加一次注射延迟

     SPI.transfer (0x01);//读取数据0000 0001 (01h)

     //delayMicroseconds (10);                            ------------------- 我应该推迟吗??/

     adc_val = SPI.transfer (0);

     adc_val <<= 8;//shift to left

     adc_val || spI.transfer(0);

     adc_val <<=8;

     adc_val || spI.transfer(0);

     while (digitalRead (rdy)== high ){};                 添加以检测准备就绪是否到达高位以完成一次拍摄

     delayMicroseconds(3);//t 17.                         加T17等待一轮投照我使用了7.86M

     洋地黄书写(CS,高);

     SPI.endTransaction();

    [/引述]

    您需要确保等待/DRDY降低电压,然后读取数据。

    我建议确保SPI通信首先工作,这样您就知道从ADC获得了正确的数据转换结果。 从那里,我将查看ADC的原始数据,看看它是否看起来正确(不要试图在软件中转换为电压-至少起初不是这样)。 尝试一次测试所有内容的问题是很难知道问题发生在哪里; 但是,通过按顺序验证每个步骤(SPI通信,原始数据结果,然后是电压转换数学),可以更轻松地逐个调试和解决问题。

    此致,
    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I mise-clicked /button 'Verify answer'(错误单击/按钮'验证答案')。 我希望我不要犯一些错误。[/QUOT]

    没问题,我可以忽略该帖子的答案。