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.

[参考译文] ADS122U04:ADS122U04通信和器件设置

Guru**** 2528390 points
Other Parts Discussed in Thread: ADS122U04

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/917852/ads122u04-ads122u04-communication-and-device-setup

器件型号:ADS122U04

Bob、您好!

非常感谢您以易于理解的方式回复我的问题-
几乎为零的周转时间。
现在、我很清楚如何从 A/D 代码中得出温度值。
首先、我将回答您上面提出的问题、然后再询问一个问题(对 IDAC 的困惑)。
要回答您的问题:-  

是的、我使用的是具有单个 IDAC 的2线 RTD 配置。
我还没有组装滤波器电路(RTD 和 Rref 之间)、因为我仍在处理核心部件。
是的、我还怀疑 D4CA62的返回值是否为负值、而是环境温度。
我的办公桌为(30摄氏度)[印度季风季节,空调关闭:)]。  
我认为它可能不是 62CAD4的原因是:
a)我已将 UC 的 UART 配置为 LSB 优先、以便与 ADC 代码输出格式相匹配。
b)在我的测试设置中、当我提高 PT100的温度(使用热空气鼓风机)时-  
  MSByte "D"保持最稳定、"CA"变化稍大、LSByte "62"持续变化。
随着温度升高,这一计数会下降(反之亦然),即 MSByte 变化为 D3.... D2..... D1 等等。  
在我插入的图像中(Rref = 6.8K Ω)、计数甚至更大、可以看到变化、如我所述。
关于增益、是的、您猜对了、我已将增益设置为16。   

现在、 关于我在使用 IDAC 时遇到的问题
如您所知、我正在使用比例式测量配置。
我观察到、无论我在 配置寄存器2中选择何种 IDAC 值、
IDAC 由 DVDD (3.3VDC)和 Rref (1.65K 或3.3K 或6.8K)决定、我连接 REFP 和 REFN。
Rref=6.8K 时、IDAC 为0.483mA (大约0.5mA)
Rref=3.3K 时 、IDAC 为0.96mA (大约1mA)
当 Rref=1.65K 时、IDAC 为1.909mA (大约2mA)和
因此、我观察 IDAC 的不同值、而我在 Config Reg2中选择的值是恒定值、即500uA。
因此 、在配置寄存器2中选择 IDAC 值似乎对 IDAC 的实际值没有影响。
您能不能建议为什么会发生这种情况? 请参阅下面插入的图片2:



再次感谢您、
此致、
Milind Risbud。

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

    您好、Milind、

    正如我在 ADS122U04首先传输 LSB 之前解释的那样,这意味着数据的顺序是 D0、D1、D2、...、D21、 D22、D23。  微控制器将移动每个字节的位顺序、以便 D0、D1、D2、D3、D4、 字节0 (B0)的 D5、D6、D7、以便顺序与 D7、D6、D5、D4、D3相反、 D2、D1、D0、但是实际发送的字节顺序将是 B0、B1和 B2、并且作为一个值应该存储为 B2、B1和 B0。  除非使用小端字节序格式存储内存、否则微控制器不会自动为您执行此操作。  因此、在读取数据时、您需要将其正确存储在存储器变量中、并在需要时进行适当的符号扩展。

    您的基准电阻器应该是具有低温度系数的精密电阻器。  0.1%的电阻器容差通常不够好。

    关于 IDAC 合规电压、您需要确保您不会尝试在 IDAC 合规范围之外运行、根据数据表、该范围为 AVDD - 0.9V。  这意味着电流路径(RTD 和基准电阻器)的总压降不能超过顺从电压、或者恒流源不能保持恒定值。  对于3.3V 运行、这将是2.4V。  如果 IDAC 设置为500uA、并且您使用6.8k 电阻值、则6.8k * 500uA = 3.4V、这会超出顺从范围和电源电压。

    您实际上是如何确定电流的?  您是否使用电压表测量 Rref 电阻器上的电压?  您能告诉我每个电阻器的电压是多少?  但是、6.8k 永远不会起作用。  3.3k 时应该看到大约1.65V、1.65k 时应该看到大约825mV。  对于1.65k Rref、您还需要降低最有可能的增益。

    此致、

    Bob B

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

    Bob、您好!
    为了确定电流(流过电流路径)、我将测量 Rref-
    并将其除以 Rref 的值。
    例如:
    目前 RREF 值为1.65K 欧姆(MFR)...稍后我将使用 温度系数较低的电阻器。
    在 Rref 上测量的电压为3.12Vdc。
    SO、IDAC1 =(3.12Vdc/1.65K Ω)  
    因此、IDAC1 = 1.890毫安

    关于 PT100和 Rref 两端的电压(1.65K 欧姆):-

    •  在 Rref 上测量的电压为   :3.12V 直流和
    •  在 PT100上测量的电压为 :0.211Vdc

    因此、上述两个电压的总和为3.33vdc、等于 DVDD 和 AVDD。

    您已经提到  、当 DVDD = AVDD = 3.3VDC 时、电流路径的总压降应为2.4vdc、
    但是、我在该电路中观察到的是、无论我连接的 Rref 值是多少、无论我选择的 IDAC1值是多少-
    Rref 两端的电压始终高于3Vdc,即:

    当 Rref = 3.3k Ω 时、  Rref 两端的电压为3.20vdc、PT100两端的电压为0.10VDC
    当 Rref = 1.65k Ω 时、Rref 两端的电压为3.12vdc、PT100两端的电压为0.21vdc
    当 Rref = 6.8k Ω 时、  Rref 上的电压为3.28vdc、PT100上的电压为0.02vdc

    我不明白为什么会发生这种情况、也不知道应该采取什么措施来确保 电流路径的总压降保持2.4vdc
     
    现在、关于位和字节到达 ADC 时的序列:-
    我已确保将我的微控制器的 UART 配置为 LSB 优先接收数据、并且-
    编译器配置为以"小端字节序"格式将数据保存到微型存储器中。
    因此、如果我们再次回到接收到的三个字节数据的示例'D4CA62'、我将以以下方式接收它:

    字节0:62
    字节1:大约
    字节2:D4

    我将以相反的顺序解释它、即 'D4CA62'、并且事实是、随着温度的变化-
    'D4'被认为保持在最稳定的状态、并在温度发生较大变化后发生变化、其中'CA'在该温度变化之前发生变化、'62'最易失。
    这给我一种印象:'D4'是接收计数的 MSbyte。
    [您将在数据日志中注意到这一点,即我在前面的消息中插入的消息,在该消息中,MSbyte 的变化最小,即 F2..... F1… F0...... E.. EE 等等]。  

    我用这个消息插入了我正在处理的这个 ADC 电路以及整个测试设置(微+ ADC)的一个卡。
    请就我提到的上述两点提出您的建议。

    谢谢、
    此致、
    Milind Risbud。

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

    您好、Milind、

    虽然我看不到您的整个电路连接、但我认为您的连接肯定不正确。  它可能与黄色导线有关。

    您不应看到用于 RTD 测量的负输入电压。  记下电流路径。  此外、RTD 和基准电阻器上的总压降不应增加至3.3V。  在我看来、这似乎是电压激励 RTD、而不是使用 IDAC 进行电流激励。  下面是您之前介绍的电路:

    如果您使用所示的电流激励、则对于500uA、您应该针对1.6k Ω Rref 测量825mV、针对3.3k Ω Rref 测量1.65V。  在该电路中、您不应测量 mA 电流、而使用500uA 时、您甚至根本无法进行测量。  因此、我相信您的电路不是如先前所示的那样构建的。  此实际响应应如下图所示:

    IDAC 电流由 AVDD 提供、最大电压 Vmax 必须限制为小于 AVDD - 0.9V 的总压降。  电流源需要一些电压为恒流源供电、这限制了 RTD 和 RREF 电阻两端的总压降。  您需要设计电路、以便在使用 IDAC 电流时、RTD 最大电阻的总压降和 Rref 乘以 IDAC 电流不会激励 Vmax。

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob、您好!
    正如前面所述、为跟进我正在做的工作、我已将 PT100连接到比例式配置中。  目前,我面临两个问题,它们是一个小问题:
     
    Rref 和 PT100两端的电压始终为零。
      这意味着 IDAC1 (或 IDAC2...无论选择哪一个)根本不流动。
      我不明白 为什么会发生这种情况。
      DVDD=AVDD=3V3且复位引脚电压 也是3V3、但引脚8和9 (基准电压输入)和
      PINS10&11 (模拟输入引脚)始终显示零电压并以接地为基准。
     
    2. 我在写入配置寄存器的所有值后将其读回(用于验证目的)。
      我观察到 、"配置寄存器3"的值始终读回为"0x83"、甚至
      但我写入的值为"0x80"。  
      这意味着、即使我尝试选择"Manual data read mode"、
      实际设置的是"自动数据读取模式"。  
       我不明白 为什么会发生这种情况。 这两个问题似乎不太可能出现
      (即 point1和 point2)是相关的、因为   数据输出模式和 IDAC1或 IDAC1看起来并不相关
      相关的内容。  有趣的是、所有其他 配置寄存器都完全包含这些寄存器
      我已经写入它们中的值、 但 在这种情况下不会发生  
      "配置寄存器3"。   "配置寄存器3"始终读回0x83。
     
    我尝试的是、 我尝试使用单次模式、而不是连续转换模式、但这在任何方面都没有帮助。 看起来它与问题无关。
    然后、我再组装一个 ADS122U04测试电路(以防我测试的一个电路出现任何问题)、但 在第二 个测试电路中也会观察到相同的问题。 请查找附件 A 、其中显示了从 ADS122U04读取的24位 A/D 转换数据。
    请建议、问题出在哪呢?
    此致、
    Milind Risbud
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Milind、

    在写入任何寄存器之前、我建议先读取它们、并确保看到默认值。  然后一次写入和读取一个寄存器以进行验证。  此时不要设置自动模式或连续转换模式。

    如果能够正确读取和写入寄存器、则检查电流是否从 IDAC 流经 RTD 电路。  在尝试转换数据之前、通过外部电压测量解决此问题。 一旦电流和电压达到预期值、则在单次转换模式下启动转换并等待完成、然后使用 RDATA 命令并读取结果。

    如果仍有问题、请向我发送您正在使用的配置寄存器设置。  此外、请验证您的所有连接。  通常、这是在这些原型情况下缺少接地连接。

    此致、

    Bob B

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

    Bob、您好!

    感谢您的意见。
    正如您所建议的、我做了以下工作:-
    a)微控制器上电 [和 UART1初始化(用于与通信    
      ADS122U04)和 UART5 (用于向 PC 发送值以进行调试)]、我刚才发出了  
      到 ADS122U04的复位命令、之后允许1秒的延迟(在固件中)。
    b)在此之后、我逐个读取配置寄存器0到配置寄存器4的值。  
      观察到的结果是、除了"配置寄存器3"之外、所有其他配置寄存器都包含  
      默认(重置) 值、但 "配置寄存器3" 值保持不变(如其值输出中所示)   
      每1.5秒对 UART5进行一次)。 如所附截屏中所示 、"配置寄存器3"的值
      大部分时间为"0x02"或"0x03"。 我不明白为什么这应该作为代码发生  
      固件中用于读取这些寄存器值的部分完全相同。    
    我在实际代码(不在测试代码上方)中设置的配置寄存器的值如下:-
    /*用于写入 ADC ADS122U04 IC*/的“配置寄存器”的命令
    uint8_t CMD_WRITE_CONFIGREG_ZERO _ADC_PT100[3] ={0x55、0x40、0x35};//启用 PGA、增益= 16、AIN0和 AIN1作为差分模拟输入
    uint8_t CMD_WRITE_CONFIGREG_Oe_ADC_PT100[3] ={0x55、0x42、0x0A};//内部2.048V 直流作为参考电压、连续转换、正常模式、数据速率20SPS
    uint8_t CMD_WRITE_CONFIGREG_Two_ADC_PT100[3] ={0x55、0x44、0x05};//数据计数器禁用、IDAC1=500uA、数据完整性检查禁用
    uint8_t CMD_WRITE_CONFIGREG_Three _ADC_PT100[3]={0x55、0x48、0x80};//手动数据读取模式、IDAC2禁用、IDAC1连接到 AIN3
    UINT8_t CMD_WRITE_CONFIGREG_FAULT_ADC_PT100[3] ={0x55、0x4A、0x00};//GPIO2配置为默认设置的输入
    随附的是'.c'文件、其中包含 ADC 相关函数和 main()函数、供您参考。

    /*------------------
    * PT100_SensorRad.c
    *
    *创建日期:2020年6月19日
    作者:Milind Risbud
    -------------------------------------------------- *

    ///------------------------------------
    #include "r_cG_macrodriver.h"

    ///------------------------------------
    //注意:
    uC 的//[1] UART 需要配置如下、以便与 ADC ADS122U04 IC 通信
    //数据位=8
    //奇偶校验=无
    //停止位=1
    //[2] ADC IC ADS122U04具有兼容通用异步接收器发送器(UART)的接口-
    //用于 uC 和 ADS122U04 IC 之间的命令和数据传输。
    //接口为半双工,这意味着只有 uC 或 ADS122U04可以在任何给定时间进行通信。
    // ADS122U04使用同步字节(0x55)主动与 uC 的波特率同步、该字节可:
    //必须在每个命令之前由 UC 发送。 因此、这种"波特率同步"每次-
    // UC 向 ADS122U04 IC 发送命令。
    // ADS122U04 IC 的输出数据可以是寄存器内容或转换结果。
    //[3]此处、ADC IC 配置为在"连续转换"模式下工作、并且-
    // ADC IC 的 A/D 转换数据输出模式配置为“手动数据读取”模式-
    //这是默认模式(而不是自动数据读取模式)。
    ///------------------------------------
    //常量声明
    #define PT100_ADC_RECBUFFLEN_MAX 6.
    #define ADC_CONFIG_READBACK_MAXLEN 10.
    //注意:-值"0x55"十六进制是每个命令发送到 ADC ADS122U04 IC 之前所需的"同步字节"。
    //这就是为什么将该值"0x55"十六进制视为每个命令数组的第一个字节的原因。
    向 ADC ADS122U04 IC 发送//独立命令(即指令)
    uint8_t CMD_RESET_ADC_PT100[2]={0x55、0x06};
    uint8_t CMD_STARTSYNC_ADC_PT100[2]={0x55、0x09};
    uint8_t CMD_POWERDOWN_ADC_PT100[2]={0x55、0x02};
    uint8_t CMD_ReadData_ADC_PT100[2]={0x55、0x1C};

    //用于读取 ADC ADS122U04 IC 的"配置寄存器"的命令
    uint8_t CMD_READ_CONFIGREG_ZERO _ADC_PT100[2]={0x55、0x20};
    uint8_t CMD_READ_CONFIGREG_Oe_ADC_PT100[2]={0x55、0x22};
    uint8_t CMD_READ_CONFIGREG_Two_ADC_PT100[2]={0x55、0x24};
    uint8_t CMD_READ_CONFIGREG_Three _ADC_PT100[2]={0x55、0x28};
    uint8_t CMD_READ_CONFIGREG_FOLD_ADC_PT100[2]={0x55、0x2A};

    //用于写入 ADC ADS122U04 IC 的"配置寄存器"的命令
    uint8_t CMD_WRITE_CONFIGREG_ZERO _ADC_PT100[3]={0x55、0x40、0x35};//启用 PGA、增益= 16、AIN0和 AIN1作为差分模拟输入
    uint8_t CMD_WRITE_CONFIGREG_Oe_ADC_PT100[3]={0x55、0x42、0x0A};//内部2.048vdc 作为参考、连续转换、正常模式、数据速率20SPS
    uint8_t CMD_WRITE_CONFIGREG_Two_ADC_PT100[3]={0x55、0x44、0x05};//数据计数器禁用、IDAC1=500uA、数据完整性检查禁用
    uint8_t CMD_WRITE_CONFIGREG_Three _ADC_PT100[3]={0x55、0x48、0x80};//手动数据读取模式、IDAC2禁用、IDAC1连接到 AIN3
    uint8_t CMD_WRITE_CONFIGREG_F4_ADC_PT100[3]={0x55、0x4A、0x00};//GPIO2配置为默认设置的输入

    ///------------------------------------
    //Variables Declaration
    uint8_t PT100_ADC_DataReceiveBuff[PT100_ADC_RECBUFFLEN_MAX]={0x00、0x00、0x00、0x00、0x00、0x00};
    uint8_t PT100_ADC_ConfigRegReadBackBuff[ADC_CONFIG_READBACK_MAXLEN]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};


    ///------------------------------------
    //functions declarations -这些必须在变量 declaration 之后完成、否则-
    //IDE 错误行为、即编译器显示零错误、但看到错误符号-
    //(例如、对于'OperatingMode.c'文件)、'state'结构元素-
    //它们被标记为未定义。
    void InitADCandStartConversion_PT100 (void);
    void PT100_ClearADCdatareceivebuffer (void);
    void ReadADC_ConversionResult_PT100 (void);
    void ReadBackConfigRegs (void);
    ///------------------------------------
    //函数定义
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //函数名称:InitADCandStartConversion_PT100
    //说明:初始化外部 ADC IC ADS122U04并启动 A/D 转换。
    //此处、ADC IC 配置为在"连续转换"模式下工作、并且-
    //ADC IC 的 A/D 转换数据输出模式配置为"手动数据读取"模式-
    //这是默认模式(而不是自动数据读取模式)。
    ///---------------------------------------------------------
    空 InitADCandStartConversion_PT100 (空)

    //向 PT100 ADC 发送同步字节和复位命令
    R_SCI1_Serial_Send (CMD_RESET_ADC_PT100、2);
    delay_1000msec ();
    ///----------------------------------------------------------
    //使用 WREG 命令写入相应的寄存器配置,每次发送同步字节
    R_SCI1_Serial_Send (CMD_WRITE_CONFIGREG_ZERO _ADC_PT100、3);//将设置位写入配置 reg0
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    R_SCI1_Serial_Send (CMD_WRITE_CONFIGREG_Two_ADC_PT100、3);//将设置位写入配置寄存器2
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    R_SCI1_Serial_Send (CMD_WRITE_CONFIGREG_Three _ADC_PT100、3);//将设置位写入配置 reg3
    //delay_100msec ();
    //delay_100msec ();
    delay_500msec ();
    R_SCI1_Serial_Send (CMD_WRITE_CONFIGREG_FOLD_ADC_PT100、3);//将设置位写入配置寄存器4
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    //现在,写入配置 reg1以选择'Continuous Conversion mode'
    R_SCI1_Serial_Send (CMD_WRITE_CONFIGREG_ONE_ADC_PT100、3);//将设置位写入配置寄存器1
    //delay_100msec ();
    //delay_100msec ();
    delay_50msec ();
    ///----------------------------------
    //发送 START/SYNC 命令以在连续转换模式下开始转换
    //START/SYNC 命令需要在设置(逻辑一)后立即发出、配置模式"CM"位位于-
    //config reg1、表示启用了"连续转换模式"。
    R_SCI1_Serial_Send (CMD_STARTSYNC_ADC_PT100、2);
    delay_500msec ();
    }//函数结束 void InitADCandStartConversion_PT100 (void)结束


    ///------------------------------------
    //函数名称:PT100_ClearADCdatareceivebuffer
    //说明:清除 PT100 ADC 数据接收缓冲区和-
    //重新初始化 uart1串行接收缓冲器计数器
    ///---------------------------------------------------------
    void PT100_ClearADCdatareceivebuffer (void)

    uint8_t ucClearLoopCtr;
    for (ucClearLoopCTR=0x00;<PT100_ADC_RECBUFFLEN_MAX;ucClearLoopCtr++))

    PT100_ADC_DataReceiveBuff[ucClearLoopCTR]= 0x00;
    }//end of for 循环
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);//重新初始化 uart1串行接收缓冲器计数器
    函数 PT100_ClearADCdatareceivebuffer 结束
    ///------------------------------------
    //函数名称:ReadADC_ConversionResult_PT100
    //描述:
    ///---------------------------------------------------------
    void ReadADC_ConversionResult_PT100 (void)

    uint8_t ucStatusTemp;

    //发送 START/SYNC 命令以在单次转换模式下开始转换
    //R_SCI1_Serial_Send (CMD_STARTSYNC_ADC_PT100、2);
    //delay_500msec ();
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //发送命令读取配置 Reg2的内容,以便检查“DRDY”(Bit7)的状态-
    //如果("DRDY"位=1)、则意味着主机 uC 可以读取"新的转换结果准备就绪"。
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_Two_ADC_PT100、2);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    //接收配置 Reg2的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_500msec ();

    ucStatusTemp = PT100_ADC_DataReceiveBuff[0];//将 Config Reg2的值复制到临时 var 中
    if (ucStatusTemp&0xF0)//屏蔽除数据就绪状态标志'DRDY'位7之外的所有其他位

    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //发送命令以读取 A/D 转换的数据
    R_SCI1_Serial_Send (CMD_ReadData_ADC_PT100、2);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    //接收由 ADC IC 发送的 A/D 转换数据
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    Delay_1000msec ();//通过 ISR 完成串行传输所需的延迟

    //在 UART5上发送接收到的数据以进行监控
    R_SCI5_Serial_Send (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    函数结束 ReadADC_ConversionResult_PT100结束
    ///---------------------------------------------------------


    ///---------------------------------------------------------
    //函数名称:ReadBackConfigRegs
    //Description:读回 config reg 内容以验证它们是否已正确写入
    ///---------------------------------------------------------
    空 ReadBackConfigRegs (空)

    ///--------------------
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //回读 config reg 内容,以验证它们是否已正确写入
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_ZERO _ADC_PT100、2);
    delay_100msec ();
    //接收配置寄存器的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    PT100_ADC_ConfigRegReadBackBuff[0]= PT100_ADC_DataReceiveBuff[0];
    ///--------------------
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //回读 config reg 内容,以验证它们是否已正确写入
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_Oe_ADC_PT100、2);
    delay_100msec ();
    //接收配置寄存器的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    PT100_ADC_ConfigRegReadBackBuff[1]= PT100_ADC_DataReceiveBuff[0];
    ///--------------------
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //回读 config reg 内容,以验证它们是否已正确写入
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_Two_ADC_PT100、2);
    delay_100msec ();
    //接收配置寄存器的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    PT100_ADC_ConfigRegReadBackBuff[2]= PT100_ADC_DataReceiveBuff[0];
    ///--------------------
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //回读 config reg 内容,以验证它们是否已正确写入
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_Three _ADC_PT100、2);
    delay_100msec ();
    //接收配置寄存器的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    PT100_ADC_ConfigRegReadBackBuff[3]= PT100_ADC_DataReceiveBuff[0];
    ///--------------------
    //清除 PT100 ADC 数据接收缓冲区并重新初始化 uart1串行接收缓冲区计数器
    PT100_ClearADCdatareceivebuffer();
    //回读 config reg 内容,以验证它们是否已正确写入
    R_SCI1_Serial_Send (CMD_READ_CONFIGREG_Four_ADC_PT100、2);
    delay_100msec ();
    //接收配置寄存器的内容
    R_SCI1_Serial_Receive (PT100_ADC_DataReceiveBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();
    PT100_ADC_ConfigRegReadBackBuff[4]= PT100_ADC_DataReceiveBuff[0];
    ///--------------------
    //在 UART5上发送接收到的数据以进行监控
    R_SCI5_Serial_Send (PT100_ADC_ConfigRegReadBackBuff、PT100_ADC_RECBUFFLEN_MAX);
    delay_100msec ();
    delay_100msec ();
    delay_50msec ();

    ///--------------------------------------------------------- 文件末尾 PT100_SensorRad.c.c-------------------------------------------------------

    ///--------------------------------------------------------- 文件 main.c 的起始位置-------------------------------------------------------

    /
    *文件名:r_cG_main.c
    *版本:RX113 V1.02.05.01的代码生成器[2016年11月11日]
    *器件:R5F51136AxFM
    *工具链:CCRX
    *说明:此文件实现了 main 函数。
    *创建日期:20年6月21日
    (三 /

    /
    pragma 指令
    (三 /
    /*启动 pragma 的用户代码。 请勿编辑此处生成的评论*/
    /*最终用户代码。 请勿编辑此处生成的评论*/

    /
    包括
    (三 /
    #include "r_cG_macrodriver.h"
    #include "r_cG_cgc.h"
    #include "r_cG_port.h"
    #include "r_cG_rtc.h"
    #include "r_cG_iwdt.h"
    #include "r_cG_sci.h"
    #include "r_cG_riic.h"
    /*启动包含的用户代码。 请勿编辑此处生成的评论*/
    #include "stdint.h"
    #include "CommonDefines.h"
    /*最终用户代码。 请勿编辑此处生成的评论*/
    #include "r_cG_userdefine.h"

    /
    全局变量和函数
    (三 /
    /*启动全局用户代码。 请勿编辑此处生成的评论*/

    ///--------------------------------------------
    uint8_t ucTestToggle = 0x00;//仅用于测试目的

    RTC_calendarcounter_value_t GSM_nw_time;//获取其结构中的 GSM 网络时间
    uint8_t 小时、分钟、秒;
    uint8_t 年、月、日;
    uint8_t Temp_var;
    uint8_t 年十进制、月十进制、日十进制;
    uint8_t 小时十进制、分钟十进制、秒十进制;
    extern volatile uint8_t Send_end;

    //typedef 结构
    //{
    // uint8_t ucSecond;
    // uint8_t ucMinute;
    // uint8_t uchour;
    // uint8_t ucday;
    // uint8_t ucweek;
    // uint8_t ucMonth;
    // uint16_t uiYear;
    //}DateAndTime_t;
    //DateAndTime_t stDMYHMS_BCD、stDMYHMS_Decimal;

    //定期更新最新 GSM 日期和时间时使用的结构
    RTC_calendarcounter_value_t stDateTimeBCD、stDateTimeDecimal;

    RTC_calender_enable_t stalarmEnable;
    RTC_calender_alarm_value_t stalarmTime;

    //一个无符号长整型值,用作 srand()函数的输入参数,该函数-
    //设置 rand()函数生成的假随机数序列的初始值。
    //functions srand()和 rand()用于生成随机持续时间的'main Interval'-
    //通过设置 SMS 将“主间隔类型”设置为“随机”时,以分钟(20分钟到60分钟)为单位。
    uint32_t ulSeedValueForRandomNumFunct = 0x00000000;// 32位初始化值


    uint8_t linefed[1]={0x0A};
    uint8_t cmd1[]={"at\r\n"};
    uint8_t cmd2[]={"ATD"};
    uint8_t PhoneNum[]={"9423570299;"};
    uint8_t cmd3[]={"ATH"};
    uint8_t cmd4[]={"AT+CMGf=1\r"};//选择文本模式
    uint8_t cmd6[]={"AT+QINTAT\r"};
    uint8_t cmd7[]={"AT+QNSTATUS\r"};
    uint8_t cmd8[]={"AT+QNIITZ=0\r"};//接收到网络时间消息后,请勿发送 URC (未经请求的结果)
    uint8_t cmd9[]={"AT+CCLK?\r\n"};
    uint8_t cmd10[]={"ATE0\r"};
    uint8_t cmd11[]={"AT+CMGD=1、4\r"};//删除 SMS、全部
    uint8_t cmd13[]={"AT+CTZU=3\r"};//网络时间同步和更新 RTC 时间
    uint8_t cmd14[]={"AT+CSCS="};//发送命令 at+CSCS="IRA"以将字符集设置为 IRA
    uint8_t cmd15[]={"AT+CSCS?\r\n};
    uint8_t chset_ira[]={"ira"};
    uint8_t chset_hex[]={"hex"};
    uint8_t chset_GSM[]={"GSM"};
    uint8_t DoubleQuote[1]={0x22};//双引号字符十六进制代码
    uint8_t 逗号字符[1]={0x2C};//逗号字符十六进制代码
    uint8_t cmd16[]={"AT+QMGDA=6\r"};//删除所有 SMS - PDU 模式
    uint8_t cmd17[]={"AT+CMGf=0\r"};//选择 PDU 模式
    uint8_t cmd18[]={"AT+QMGDA="};//删除所有 SMS
    uint8_t del _all[]={"del All"};//字符串作为参数发送、在"AT+QMGDA="命令后删除所有 SMS
    uint8_t DummySMS[]={"Hello Eincree"};
    uint8_t cmd19[]={"AT&T};//用于在 M66用户配置文件中存储当前设置的命令
    uint8_t cmd20[]={"AT+CPMS="};//将 SMS 存储器设置为 SIM 存储器
    uint8_t sim_mem[]={"sm"};//发送命令时使用:AT+CPMS="SM"、"SM"、"SM";此处 SM 表示 SIM 内存
    uint8_t cmd21[]={"AT+CREG?\r"};//获取 M66模块的网络注册状态
    //_Bool TestVar;
    ///-----------------------------------------------------
    //函数声明
    ///-----------------------------------------------------
    void delay_625msec (void);//为5秒延迟
    void delay_6msec (void);//为50msec 延迟
    void delay_50msec (void);//针对50msec 延迟
    void delay_500msec (void);//针对500msec 延迟
    void delay_100msec (void);//表示100msec 延迟
    void delay_1000msec (void);//表示1000msec 延迟
    void ClearReceiveBuffer(void);
    void UpdtNWTimeToRTC (void);
    void SetAlarmTime (uint8_t);
    void Disable_RTCAlarm (void);
    void SetUnitPowerupSMSFlags (void);
    void ObtainGSMtimeInRuntime (void);
    ///-----------------------------------------------------
    /*最终用户代码。 请勿编辑此处生成的评论*/


    静态空 R_MAIN_Userinit (空);
    /
    *函数名称:main
    *说明:此函数实现 main 函数。
    *参数:无
    *返回值:无
    (三 /
    void main (void)

    r_main_Userinit();
    /*启动用户代码。 请勿编辑此处生成的评论*/
    PORT2.PODR.BIT.B7=0;//ACK LED 关闭
    PORT2.PODR.BIT.B6=0;//蜂鸣器关闭
    delay_100msec ();
    while (1U)

    ///------------------------
    port2.PODR.bit/B7=1;//ACK LED 亮起
    port2.PODR.bit/B6=1;//蜂鸣器打开
    delay_500msec ();
    PORT2.PODR.BIT.B7=0;//ACK LED 关闭
    PORT2.PODR.BIT.B6=0;//蜂鸣器关闭
    delay_500msec ();
    ///------------------------
    ///------------------------
    ReadADC_ConversionResult_PT100 ();
    //向 PT100 ADC 发送同步字节和复位命令
    //ReadBackConfigRegs();

    ///----------------------------------
    /*最终用户代码。 请勿编辑此处生成的评论*/

    /
    *函数名称:R_MAIN_Userinit
    *说明:此函数在实现 main 函数之前添加用户代码。
    *参数:无
    *返回值:无
    (三 /
    空 R_MAIN_Userinit (空)

    /*启动用户代码。 请勿编辑此处生成的评论*/
    delay_500msec ();
    R_SCI1_Start ();//初始化 UART1
    nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
    R_SCI5_Start();//初始化 UART5
    nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
    InitADCandStartConversion_PT100 ();// ADS122U04的初始化
    nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
    /*最终用户代码。 请勿编辑此处生成的评论*/

    /*开始添加用户代码。 请勿编辑此处生成的评论*/
    ///---------------------------------------------------------
    /
    *函数名称:delay
    *说明:此函数清除接收缓冲区
    *参数:无
    *返回值:无
    (三 /
    空 ClearReceiveBuffer (空)

    uint16_t i;
    for (i=0;<SMS_RECBUFFLEN_MAX;i++))

    ReceiveBuffer[i]= 0x00;//清除接收缓冲区

    R_SCI9_Serial_Receive (ReceiveBuffer、SMS_RECBUFFLEN_MAX);//重新初始化 uart0串行接收缓冲器计数器

    /
    *函数名称:delay_50msec
    *说明:此函数在16MHz 主时钟下实现50ms 的延迟。
    *使用频率生成/计数器进行测量、并验证是否获得50ms 延迟。
    *参数:无
    *返回值:无
    (三 /
    void delay_50msec (void)

    uint16_t outreloop、innerloop;
    for (outerloop=0;outerloop<100;outerloop++)

    for (innerloop=0;innerloop<1000;innerloop++)

    继续;



    /
    *函数名称:delay_100msec
    *说明:此函数在16MHz 主时钟下实现100ms 的延迟。
    *使用频率生成/计数器进行测量、并验证是否获得100ms 延迟。
    *参数:无
    *返回值:无
    (三 /
    void delay_100msec (void)

    uint16_t outreloop、innerloop;
    for (outerloop=0;outerloop<200;outerloop++)

    for (innerloop=0;innerloop<1000;innerloop++)

    继续;



    /
    *函数名称:delay_500msec
    *说明:此函数在16MHz 主时钟下实现500ms 的延迟。
    *尚未使用频率生成/计数器进行测量、并验证是否获得500ms 延迟。
    *参数:无
    *返回值:无
    (三 /
    void delay_500msec (void)

    uint16_t outreloop、innerloop;
    R_IWDT_Restart ();//刷新 I-WDT 以避免 I-WDT-Reset
    for (outerloop=0;outerloop<1000;outerloop++)

    for (innerloop=0;innerloop<1000;innerloop++)

    继续;



    /
    *函数名称:delay_1000msec
    *说明:此函数在16MHz 主时钟下实现1000msec 的延迟。
    *尚未使用频率生成/计数器进行测量、并验证是否获得1000ms 延迟。
    *参数:无
    *返回值:无
    (三 /
    void delay_1000msec (void)

    uint16_t outreloop、innerloop;
    R_IWDT_Restart ();//刷新 I-WDT 以避免 I-WDT-Reset
    for (outerloop=0;outerloop<2000;outerloop++)

    for (innerloop=0;innerloop<1000;innerloop++)

    继续;



    ///---------------------------------------------------------
    /*最终用户代码。 请勿编辑此处生成的评论*/

    ///--------------------------------------------------------- main.c 文件的末尾-------------------------------------------------------

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

    您好、Milind、

    确保在 RREG 和 WREG 命令中使用正确的寻址。  以下是您作为 RREG 写入的内容的示例:

    //用于读取 ADC ADS122U04 IC 的"配置寄存器"的命令
    uint8_t CMD_READ_CONFIGREG_ZERO _ADC_PT100[2]={0x55、0x20};
    uint8_t CMD_READ_CONFIGREG_Oe_ADC_PT100[2]={0x55、0x22};
    uint8_t CMD_READ_CONFIGREG_Two_ADC_PT100[2]={0x55、0x24};
    uint8_t CMD_READ_CONFIGREG_Three _ADC_PT100[2]={0x55、0x28};
    uint8_t CMD_READ_CONFIGREG_FOLD_ADC_PT100[2]={0x55、0x2A};

    但是、这仅适用于寄存器0、1和2。  寻址是命令的位3到位1、位0是"无关"。  为了便于讨论、我将位0设置为"0"。

    0000 .->寄存器0和用于 RREG 命令的将为0x20、WREG 将为0x40

    0010 ->寄存器1 和用于 RREG 命令的将为0x22 、WREG 将为0x42

    0100 .->寄存器2 和的 RREG 命令为0x24 、WREG 为0x44

    0110 ->寄存器3 和用于 RREG 命令的将为0x26 、WREG 将为0x46

    1000 .->寄存器4 和的 RREG 命令为0x28 、WREG 为0x48

    因此、您错误地对寄存器4进行寻址并读取/写入寄存器4、而不是对寄存器3进行读取/写入。

    此致、

    Bob B

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

    Bob、您好!

    Bob,你太棒了!
    你确切地指出了我犯的错误。
    我刚刚做了一个修正,一切开始像魔术一样工作!
    我现在唯一无法理解的是、通过配置寄存器2、
    我已选择 IDAC 值为500uA、但实际电压读数-
    我在 Rref 上观察到的情况就像有250uA 的电流流动。 测试详情 如下:

    更正完成:
    对于 config reg3、读取命令应为0x26、写入命令应为0x46。 -完成
    对于 config reg4、读取命令应为0x28、写入命令应为0x48。 -完成

    在完成上述两项校正后、我开始使用"MSbit as zero"(而不是一个)获取24位 ADC 转换计数-
    这意味着它是一个正值(之前我将 MSByte 设置为0xFF)。  
    使用热空气鼓风机、提高 PT100的温度、并观察到24位 ADC 转换值相应逐渐增加。
    然后、停止热空气鼓风机、 并观察到24位 ADC 转换值逐渐减小。 [请参阅下面随附的日志文件]

    在 Rref = 3.3k Ω 且 IDAC1被选为500uA 的情况下:

    在环境温度下(室温) 28摄氏度、
    Rref 上的电压悬停在接近306mVolts 的位置、PT100上的电压为8mVolts 的稳定值(计数= 11 xx xx)。  
    随着温度升高、 PT100的说明(使用  热风机 并相应增加计数= 16 xx xx),
     Rref 过路的电压接近330mVolts 
    、PT100上的电压为13mVolts 的稳定值。

    我的问题是、Rref (3.3k) x IDAC1 (0.5mAmp)应在 Rref 上提供1.65V 的电压、或接近该值的值、
    但我观察的值就像  Rref (3.3k) x IDAC1 (0.25mAmp)一样、即接近825mVolts 的值、这在我上面提到的读数中很明显。
    我已重新验证我已选择  IDAC1作为500uA

    uint8_t CMD_WRITE_CONFIGREG_Two_ADC_PT100[3]  ={0x55、0x44、0x05}; //数据计数器禁用、IDAC1=500uA、数据完整性检查禁用

    您能不能建议为什么会发生这种情况?

    此致、

    米林德。


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

    您好、Milind、

    是的、如果电流为500uA 且电阻为3.3k、则应在基准电阻器上看到1.65V 电压。  我不太确定要告诉您的其他信息、而是您需要验证从 AIN3到 AGND 的总压降是否不符合我之前在本主题中讨论的 IDAC 合规性。  因此、首先通过寄存器读取验证设置是否正确、然后测量从 AIN3到 AGND 的电压并告诉我结果。

    此致、

    Bob B