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.

[参考译文] ADS1248:ADS1248不工作、并且接收到无用的 ADC 值

Guru**** 2542950 points
Other Parts Discussed in Thread: ADS1248

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/955726/ads1248-ads1248-is-not-working-and-receiving-garbage-adc-value

器件型号:ADS1248

您好!

我在我们的一个项目中使用 ADS1248将模拟4-20mA 信号转换为数字值、我面临的问题是无法接收到与引脚电压正确的 ADC 值。 我认为它不起作用、我得到的是与施加的电压/电流无关的任何东西的垃圾值。 我不知道 ADS1248配置问题还是硬件相关问题、但我需要支持来了解和解决问题。

注意:原理图中有一个错误,我们之前没有在 Vrefcom 和 vrefout 添加 capaictor,但现在已经添加了,但结果仍然相同

在此、我附加了 ADS1248驱动程序文件、原理图部分和示例代码。

AIN%接地(原理图中未显示)

//读取 ADC 函数
int32_t ADS1248_sample_raw ()
{
int32_t res = 0;
unsigned int Temp = 0;

//测试 SPI
Temp = ADS1248GetIntRef ();

Temp = ADS1248_DRDY_OFF;
ADS1248WriteRegister (ADS1248_10_IDAC0、0x01、&Temp);

// ref v CHANNELS
Temp =(ADS1248_INT_VREF_ON)|(ADS1248_INT_REF0)|(ADS1248_MEAS_NORM);
//ADS1248SetVoltageReference (Temp);
ADS1248WriteRegister (ADS1248_2_MUX1、0x01、&Temp);

//设置增益和采样率
ADS1248SetGain (ADS1248_GAIN_2);

ADS1248SetDataRate (ADS1248_DR_80);
//温度= ADS1248_DR_320|ADS1248_GAIN_1;//ADS1248WriteRegister
(ADS1248_3_SYS0、0x01、 &Temp);

Temp = ADS1248GetDataRate();

//读取 CH 3 wrt CH5
//选择通道
ADS1248SetChannel (0、(ADS1248_AINN3));
ADS1248SetChannel (1、(ADS1248_AINP5);

ADS1248_startSingle();

delayMS (500);
res = ADS1248ReadData ();
float tempV = res;

tempV *= 2.048;//内部参考2.048
tempV /= 8388608;// 2^23
tempV *= 1000;//以 mV

为单位的值返回 res;
}

// FreeRTOS 任务读取 ADC

静态 void vLEaskV /=(datol)参数1 (
*空


);ditt (*空)//初始化 SPI 端口引脚以及控件
initconfig();
ADS1248SetStart(0);
tmp_adc = ADS1248GetID();
tmp_adc = ADS1248GetChannel(0);

while (1){
ledState =(bool )!ledState;

//大约100ms 开/关切换速率*/ v48GetTemp_TRY(0)



;ADS1248task_RATE =(ADS12_100_RATE)
}
//为会话
空 ADS1248_startSingle()切换起始引脚{

int relVal = 1;
ADS1248SetStart (1);
delayMS (100);
ADS1248SetStart (0);

} 

e2e.ti.com/.../ads1248.h

e2e.ti.com/.../2867.ads1248.c

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

    您好、管理员:

    感谢您发布这段代码和原理图。 您能否帮助更详细地解释一下发生了什么?

    您将向输入端施加哪些信号、您要测量的预期电压是多少、以及您从器件中看到的数据是多少?

    您的原理图中也不清楚您是如何测量输入的? 例如、如果您要在分流器上进行测量、则需要在1TW1和1TW2之间进行测量、但我看不到从这些节点返回 ADC 的任何连接点。 代码还显示您正在读取相对于 AIN5的 AIN3。 但 AIN5未连接到您发送的原理图中的任何内容。 AIN3连接到网 A4、但在您发送的图片中、除了连接到 AIN3之外、我看不到其他任何地方。 该网络的发展情况如何?

    请帮助提供更多详细信息。 谢谢!

    布莱恩

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

    您好、管理员:

    此外、请注意、在写入寄存器时、您需要保持 START 引脚为高电平。 ADS1248数据表第45页的表19 (SPI 命令)下的脚注中提到了这一点。 看起来您只是切换 START 引脚来执行转换、因此实际上没有写入任何寄存器。

    布莱恩

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

    您好 Bryan 感谢您的回复和时间、

    -您将向输入端施加什么信号、您要测量的预期电压是多少,以及您从器件中看到的数据是多少?

    总的来说,它不工作,所以我所做的是在 C40电容器上施加1V 电压,A5连接在 AIN4上,I connectd GND 连接到引脚 AIN5 (IC 的引脚14是 GND),我测量的是 AIN4 wrt 连接到 AIN5或 AIN3 wrt AIN5。

    这是一个错误、未反映在原始原理图中。

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

    你(们)好,Bryan

    中的更改了"启动单脉冲"代码、如下所示、但仍无法读取

    void ADS1248_startSingle(){
    
    int relVal = 1;
    ADS1248SetStart (0);//低
    delayMS (100);//等待100ms
    ADS1248SetStart (1);//高
    
    } 

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

    下图显示了在数组中获取的读数、因为您可以看到读数不断波动、且接近于1V。

    内部基准电压为2.048V、  

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

    您好、管理员:

    写入所有寄存器时、您是否保持了 START 引脚为高电平? 请注意、ADS1248要求您在寄存器写入和读取期间将 START 引脚保持为高电平。 至少在您发送的原始代码中、直到ADS1248_startSingle()完成所有寄存器写入后才调用函数。

    您能否通过写入所有寄存器、然后读回寄存器以确保它们都已更新来确保正确发生这种情况? 一旦我们知道您能够读取和写入寄存器、我们就可以专注于转换结果。

    布莱恩

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

    您好、Bryan、感谢您的回复、

    很抱歉耽误了我们的假期。

    现在、我已经按照您提到的那样更新了代码以进行更改、您可以看到、如果我读取数据速率寄存器、并且如果它不相同、我已使用 while 循环进行错误验证、我已经添加了数据速率验证。

    我的代码会运行罚款、不会进入 while 循环、因此数据寄存器会更新正确、可以得出结论。


    int32_t ADS1248_sample_raw () { int32_t res = 0; unsigned int Temp = 0; //保持启动高 电平 ADS1248SetStart (1); Temp = ADS1248_DRDY_OFF; ADS1248WriteRegister (ADS1248_10_IDAC0、0x01、&Temp); // ref v CHANNELS Temp =(ADS1248_INT_VREF_ON)|(ADS1248_INT_REF0)|(ADS1248_MEAS_NORM); //ADS1248SetVoltageReference (Temp); ADS1248WriteRegister (ADS1248_2_MUX1、0x01、&Temp); //设置增益和采样率 ADS1248SetGain (ADS1248_GAIN_1); ADS1248SetDataRate (ADS1248_DR_1000); //温度= ADS1248_DR_320|ADS1248_GAIN_1; //ADS1248WriteRegister (ADS1248_3_SYS0、0x01、 &Temp); Temp = ADS1248GetDataRate(); //验证数据寄存器是否已更新 if (Temp!= ADS1248_DR_1000){ while (1);// ERROR } //读取 CH 3 wrt CH5 //选择通道 ADS1248SetChannel (0、(ADS1248_AINN4)); ADS1248_startChannel (ADS1248p5);ADS1248_SetChannel (ADS1248p5);ADS1248_SetChannel (ADS1248_SetChannel) (ADS1248_startChannel) delayMS (500); res = ADS1248ReadData (); rawADC[adcCounterSample++= res; if (adcCounterSample > 31) { adcCounterSample = 0; } float tempV = res; tempV *= 2.048;//内部参考2.048 tempV /= 8388608;// 2^23 tempV = 1000 mV ;return in value
    
    

    我还更新了用于转换的启动脉冲代码

    void ADS1248_startSingle(){
    
    ADS1248SetStart (0);
    delayMS (100);
    ADS1248SetStart (1);
    delayMS (100);
    ADS1248SetStart (0);
    ADS1248SetStart(1);
    } 

    仍然没有结果

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

    您好、管理员:

    您能否尝试读回 ADS1248上的某些系统监视器并查看您是否获得有效数据? 例如、电源监控器和/或 VREF 监控器。 这将使您了解是否可以从器件读取有效数据、并且输入可能存在问题。

    布莱恩

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

    您好、Bryan、

    根据您的建议、我添加了2行以读取参考和系统监控、您可以在下面的代码中看到

    /**
    *@简介此函数将通过以下方式返回通道的原始读数:通过+ve 通道、--ve 通道、增益设置、采样率和基准电压
    *@作者 Mohammed Asim Merchant
    *@日期27/02/2019
    *@param void。
    *@return Int32_t
    //
    int32_t ADS1248_sample_raw ()
    {
    int32_t res = 0;
    unsigned int Temp = 0;
    
    //保持启动高
    电平 ADS1248SetStart (1);
    
    Temp = ADS1248_DRDY_OFF;
    ADS1248WriteRegister (ADS1248_10_IDAC0、0x01、&Temp);
    
    // ref v CHANNELS
    Temp =(ADS1248_INT_VREF_ON)|(ADS1248_INT_REF0)|(ADS1248_MEAS_NORM);
    //ADS1248SetVoltageReference (Temp);
    ADS1248WriteRegister (ADS1248_2_MUX1、0x01、&Temp);
    
    //设置增益和采样率
    ADS1248SetGain (ADS1248_GAIN_1);
    
    ADS1248SetDataRate (ADS1248_DR_1000);
    //温度= ADS1248_DR_320|ADS1248_GAIN_1;
    //ADS1248WriteRegister (ADS1248_3_SYS0、0x01、 &Temp);
    
    /*
    读回 ref 和 sys monitor 变量进行验证
    *//
    Temp = ADS1248GetVoltageReference ();
    
    Temp = ADS1248GetSystemMonitor ();
    
    Temp = ADS1248GetDataRate();
    
    //验证数据寄存器是否已更新
    if (Temp!= ADS1248_DR_1000){
    while (1);//错误
    }
    
    //读取 CH 3 wrt CH5
    //选择通道
    ADS1248SetChannel (0,(ADS1248_AINN0);
    ADS1248SetChannel (1,(ADS1248_AINP5));
    
    ADS1248_startSingle();
    
    delayMS (500);
    res = ADS1248ReadData ();
    rawADC[adcCounterSample++= res;
    if (adcCounterSample > 31)
    {
    adcCounterSample = 0;
    }
    float tempV = res;
    
    tempV *= 2.048;//内部参考2.048
    tempV /= 8388608;// 2^23 tempV = 1000
    mV
    
    ;return in value
    

    以下代码返回的值为  

    temp = ADS1248GetVoltageReference();//将 Temp 读回为3
    
    Temp = ADS1248GetSystemMonitor();//将 Temp 读回为0 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bryan、

    我开始读回我正在写入的所有寄存器、结果是正通道寄存器和负通道没有更新、

    以下代码行无法正常工作

    ADS1248SetChannel (0,(ADS1248_AINN4));
    ADS1248SetChannel (1,(ADS1248_AINP5)); 

    之后、我更新了代码、现在它可以正常工作、

    实际代码是  

    ADS1248SetChannel (4、0);
    ADS1248SetChannel (5、1); 

    该 ADS12548库是 TI 提供的、但没有相关文档、因此我碰巧通过了  

    ADS1248_AINN4作为参数 

    感谢您的指导、很高兴得到您的回应、祝您一年愉快。

    感谢您抽出宝贵的时间和表达自己的话语

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

    您好、管理员:

    我很高兴您的问题得到解决、这是一个相对简单的解决方法。

    您能否告诉我、由于 ADS1248代码来自 TI 的来源、您在哪里获得了该代码? 我可以查看它、看看它是否需要更好地记录。

    布莱恩

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

    您好,Byan,

    以下是链接:  

    可以轻松迁移 ADS1248.c 和.h 以适合任何微控制器

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

    您好、管理员:

    感谢您发送链接。 如有必要、我们将进行审查和更新。

    我现在要关闭这个线程。 如果您有任何其他问题、请开始新的主题、我们将为您提供支持。

    布莱恩