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.

[参考译文] ADS1230:我用于读取 ads1230的函数可帮助我...

Guru**** 2539500 points
Other Parts Discussed in Thread: ADS1230

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/707409/ads1230-my-function-for-read-ads1230-help-me-pls

器件型号:ADS1230

大家好、我为读取 ADC 执行它。

#define SCLK1 PORTB|=(1<<PORTB2)
#define SCLK0 PORTB&&=~(1<<PORTB2)
#define PDWN1 PORTB|=(1<<PORTB3)
#define PDWN0 PORTB&=~(1<<PORTB3)

#define PDWN1 PORT&(PORTBETA)<<PDOU&(1)<PDOUT<<PDOUT<PDOB&(1))<PDOUT<<PDOUT<< 
#include 
#include 
#include "RS232.h"

uint32_t veri=0;


uint32_t adcoku (void)
{
uint32_t Bilgi=0;

while (DOUT);
for (int i=0;i<20;i++)
{
SCLK1;
if (DOUT)
{
Bilgi|=0x00001;
SCLK0;
Bilgi<=1;
}
否则
SCLK0;
Bilgi<<=1;
}

返回 Bilgi;
} 

错误在哪里?

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

    这是一门考试吗?
    告诉我们您会得到什么或您有什么错误、或者... 告诉我们您的故事。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、user5093154、

    欢迎来到 E2E 论坛! 验证代码的最佳方法是使用示波器或逻辑分析仪来验证通信是否符合预期。 在尝试读取引脚之前、您必须确保等待足够长的时间以使 ADS1230的 DRDY/DOUT 输出稳定。 SCLK 周期的最短高电平时间必须为100ns、最短低电平时间必须为100ns、因此总周期应至少为200ns (在 ADS1230上将 CLK 引脚连接为低电平时、最大 SCLK 频率为5MHz)。 如果您发送示波器或逻辑分析仪快照、我可以帮助您分析时序。 您可能需要在 SCLK1和 SCLK0之后添加一些延迟。 在尝试读取引脚之前、必须在 SCLK1之后至少等待100ns。

    另一件事是确保总共发送21个 SCLK、以强制 DRDY/DOUT 处于高电平(请参阅 ADS1230数据表第15页的图26)。 读取结果后、最后一位可能为高电平或低电平。 要准确地轮询 DRDY/DOUT 引脚以进行新的转换、必须首先强制 DRDY/DOUT 为高电平。 因此、在"for"循环之后、在"return"之前再发送一个 SCLK 脉冲。

    此外,由于结果是一个20位二进制补码输出,因此必须对结果进行正确的符号扩展,使其达到32位。 最高有效位是符号位、您将保存为无符号值。 请参阅数据表第13页的数据格式部分。 您应该保存到有符号 Int32并正确地对 ADS1230结果进行符号扩展、否则您可能会遇到负代码值的无效数据。

    此外、请确保 PDWN 为高电平或 ADS1230将处于断电状态。

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

    我明白您的意思 Bob 先生、我将解决您所说的错误。 谢谢你。

    此致。

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

    Bob 先生是我 的新代码

    int32_t adcoku (void)
    {
    int i;
    int32_t Bilgi=0;
    
    
    
    for (i=0;i<20;i++)
    {
    SCLK1;
    if (DOUT)
    {
    Bilgi|=0x00001;
    }
    SCLK0;
    Bilgi<<=1;
    }
    
    
    
    返回 Bilgi;
    } 

    该逻辑分析仪的结果。

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

    您好!

    通信读取数据的时间可以、但在尝试读取结果之前、必须确保数据可用。  请注意 Saleae 图中 DOUT 保持高电平的第一组时钟。  结果在这里无效、因为转换尚未完成。  您必须先等待 DRDY/DOUT 变为低电平、然后再尝试读取。  请注意、在所示的已完成时钟组中、DRDY/DOUT 在第一个 SCLK 之后转换。  您需要等到 DRDY/DOUT 变为低电平后再读取结果、然后发送和额外的时钟以强制 DRDY/DOUT 再次恢复为高电平。  因此、之前的代码'while (DOUT)'应该已经用于轮询、以确保转换完成。

    此外、您仍然需要对20位值进行正确的符号扩展、使其扩展到32位。  代码应更类似于:

    int32_t adcoku (void)
    {
    int i;
    int32_t Bilgi=0;
    
    
    while (DOUT);//等待 DRDY/DOUT 变为低电平信号转换结束、然后再读取
    结果(i=0;i<20;i++)
    {
    SCLK1;
    IF (DOUT)
    {
    Bilgi|=0x00001;
    }
    SCLK0;
    Bilgi<<=1;
    }
    
    SCLK1;//添加额外的时钟以强制 DRDY/DOUT 为高电平
    SCLK0;
    //对负结果进行符号扩展
    if (Bilgi & 0x80000) Bilgi |= 0xFFF00000;
    
    return Bilgi;
    } 

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bob 先生解决了问题。 此致。 祝你度过美好的一天!