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.

[参考译文] TMDX570LC43HDK:ADC 计数显示来自温度传感器的意外值

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1562276/tmdx570lc43hdk-adc-count-showing-unexpected-value-from-temperature-sensor

部件号:TMDX570LC43HDK
主题中讨论的其他器件:HALCOGEN

工具/软件:

您好:

我跟随以下链接,尝试从温度传感器 — 3 读取 ADC2 模块上的结温。 ADC 计数似乎可疑。

ADC 值= 1351 (不同的应用程序,例如处于繁忙循环的 FreeRTOS 应用程序、得到 1481……)

根据校准数据计算斜率和失调电压、失调电压= 170.50、斜率= 0.17

JunctionTempK =(((float) value)- JUNC.offset Thermistor_Fit)* Thermistor_Fit;

如上所示、JunctionTempK =(1351  - 170.50)* 0.17 = 200.68K =>这太冷。 与 1481 它的 222.78 看起来可疑.  

我认为 Pimux/ADC 寄存器似乎是正确的、因为我看到 ADC 计数根据 MCU 上的负载而变化。 我是否需要使用任何比例因子、缺少了什么?

注意 — 我没有修改任何代码,只是使用源代码从下面的链接。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1138183/faq-tms570lc4357-there-are-three-instances-of-temperature-sensors-in-this-mcu-how-to-configure-the-pin-multiplexing-pinmux-to-select-adc-pins-for-those-temperature-sensors?tisearch=e2e-sitesearch&keymatch=%252525252522TMS570LC4357%252525252522

此致、

Sarbeswar

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

    尊敬的  Sarbeswar:

    您能否在 0xF0080330h-0xF008033Fh 处共享存储在 OTP 中的传感器校准数据

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

    尊敬的 Wang:  

    以下是您请求的数据。

                                                        ADC |开尔文
    地址[0xF0080330]、DATA =[0x79A012F]=> 0x079A 012F => 1946 | 303
    Address[0xF0080334]、DATA =[0x60E00E9]=> 0x060E 00E9 => 1550 | 233
    地址[0xF0080338]、DATA =[0x9D9018E]=> 0x09D9 018E => 2521 | 398
    地址[0xF008033C]、DATA =[0xFFFFFFFFFFFF]=> 0xFFFF FFFF => 65535|65535

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

    我得到了传感器 3 的相同偏移和斜率。

    ===传感器 3 ====
    303K (90°C、 0x12F)= 1946 (0x79A)
    233k (–40°C、 0x0E9)= 1550 (0x60E)
    398K (125°C、 0x18E)= 2521 (0x9D9)

    斜率=0.17
    偏移=170.5

    当您收集 ADC 值时、您是否测量了温度室中的结温或温度?

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

    尊敬的 Wang:

    您是指物理测量结温还是温度枪测量结温? 很抱歉、我没有得到它? 如前所述、根据斜率和偏移计算出的温度看起来不正确。 很冷。 现在、当电路板在电路板上方 1 英尺处启动并运行时、如果使用温度枪(指向 MCU 芯片)、则会显示 116 度 F (273.15 + 116 = 389.15K)。

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

    谢谢。 在温度枪= 116°C 时、采样的 ADC 值(传感器 1/2/3)是多少

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

    抱歉、我误单击了“已解决“。 请保持开放状态。

    目前我正在定期采集样品,它显示,1,368,1370,1369 .0136 ..

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

    请注意、我当前从 Sensor - 3 收集数据。 我尚未尝试过传感器 1 和传感器 2。

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

    ADC 配置是什么:采样时间、放电时间和 ADC 时钟?  

    您的电路板上的 ADREFHI 是否为 3.3V 且 ADREFLO 为 0V?  ADREF 为 5%的差异可能会导致 22°C 在 125°C 结温下关闭计算。

    MibAC2 通道 30 用于对传感器 3 进行采样。  

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

    ADC 配置看起来没有问题。   

    ADREFHI 和 ADREFLO 的电压电平是多少? 您是否从传感器 1 和传感器 2 读取了温度?  

    1,368,13713701369(您的测量值)远低于 116°C(温度枪)的预期值。

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

    正如我前面提到的,我没有尝试 snesor1 和 sensor2。 我将查看这些内容。  

    您能告诉我如何测量 ADREFIHI 和 ADREFLO 值吗?

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

    尊敬的 Wang:

    我使用了传感器 2、慢速和偏置分别为、下面、

    hermistor_Fit.offset =–50.307293、hermistor.slope Thermistor_Fit = 0.157241、Thermistor_Fit = 0.999949

    对于传感器 3、  

    Thermistor_Fit 偏移= 170.502441、Thermistor_Fit Slope = 0.169649、Thermistor_Fit。rsquarms = 0.999647

    但对于传感器 2, ADC 值似乎不正确,我得到了非常低的值低于 300 ,( 287, 286...). 以下是代码:

    float thermistor_read_sensor_2 (float * temp)

    unsigned int 值、pinmux_restore、GxSEL_restore;
    易失性浮点 JunctionTempK = 0.0;
    adcbase_t *adcreg;

    /*选择 ADC */
    adcreg = adcREG2;

    if(adcreg->G1SR != 0x00000008 )
    return(–1.0);//正在使用组 1

    /*检查我们是否有有效的校准数据*/
    if (Thermistor_Fit。rqualter == 0.0)
    return(–2.0 );//校准数据丢失、必须先运行 thermistor_calibration ()

    /*启用引脚多路复用中的温度传感器*/

    /*启用引脚多路复用*/
    pinMuxReg->KICKER0 = 0x83E70B13U;
    pinMuxReg->KICKER1 = 0x95A4F1E0U;

    /*启用温度传感器*/
    pinMuxReg->PINMUX[174]&= 0xFEFFFFFF;

    /*连接传感器 2 — 温度传感器 2 的输出连接到 AD2IN[31]*/
    pinmux_restore = pinMuxReg->PINMUX[173];
    pinMuxReg->PINMUX[173]=(pinMuxReg->PINMUX[173]& 0xfeffffff)| 0x02000000;

    /*开始转换、选择通道*/
    GxSEL_RESTORE = adcreg->GxSEL[1U];//将原始值保存在通道选择寄存器中
    adcreg->GxSEL[1U]= 0x40000000;

    /*转换结束时的轮询*/
    while(!(adcreg->G1SR & 1));

    /*读取 ADC 值*/
    值= adcreg->GxBUF[1U].BUF0;

    /*禁用温度传感器*/
    pinMuxReg->PINMUX[174]|= 0x01000000;

    /*恢复传感器 3 针脚多路复用*/
    pinMuxReg->PINMUX[173]= pinmux_restore;

    /*禁用引脚多路复用*/
    pinMuxReg->KICKER0 = 0x00000000U;
    pinMuxReg->KICKER1 = 0x00000000U;

    /*恢复通道选择寄存器*/
    adcreg->GxSEL[1U]= GxSEL_RESTORE;

    /*将 ADC 值转换为浮点温度开尔文*/
    JunctionTempK =(((float) value)- JUNC.offset Thermistor_Fit)* Thermistor_Fit;
    //JunctionTempK =(((float) value)+ Thermistor_Fit TIM.offset)* SMSM.SLOPE;Thermistor_Fit — 临时调整,正在等待 TI 工单
    *temp = JunctionTempK;
    print2Console(“值=%d、temp =%.2f\r\n“、值、*temp);
    返回 JunctionTempK;
    }// thermistor_read

    bool thermistor_calibration_sensor_2 (void)

    otp_temperature_calibration_data_t *OTPdatatr;
    int i、cal_data_count=0;
    浮点斜率、偏移、sumtemp=0、sumconv=0、sumtempxconv=0、sumtempxtemp=0;
    Float cal_adc_code_array[4]、avgconv、cal_temperature_array[4]、yx=0.0、ya=0.0、ym、yn;

    /*创建指向温度传感器 3 校准数据的指针*/
    OTPDATAtr =(OTP_TEMPERATURE_CALIBRATION_DATA_t *)(thermistor_CAL_DATA +(1 * 0x10));

    //所有 3 个传感器的转储校准数据 — 调试目的
    uint32_t *原始=(uint32_t *)(thermistor_CAL_DATA +(0 * 0x10));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、raw、*raw);
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+1)、*(RAW+1));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+2)、*(RAW+2));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+3)、*(RAW+3));
    RAW =(uint32_t *)(thermistor_CAL_DATA +(1 * 0x10));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、raw、*raw);
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+1)、*(RAW+1));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+2)、*(RAW+2));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+3)、*(RAW+3));
    RAW =(uint32_t *)(thermistor_CAL_DATA +(2 * 0x10));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、raw、*raw);
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+1)、*(RAW+1));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+2)、*(RAW+2));
    print2Console(“Address[0x%X]、value =[0x%X]\r\n“、(RAW+3)、*(RAW+3));

    /*检查校准数据是否有效*/
    /*有效代码为 0 到 0xFFF、有效温度为 0 到 400 开尔文*/
    对于 (I = 0;I < 4;I++)

    /*计算 4 个可能值对的斜率和偏移*/
    if ((OTPdatatr[i]。AdcValue < 0xFFF)&&(OTPdatatr[i]。Temperature < 401))

    /*加载有效的校准信息*/
    CAL_TEMPERATURE_ARRA[i]=(float)(OTPdataptr[i]。Temperature);
    CAL_ADC_CODE_ARRAY[i]=(float) OTPDATATR[i]。AdcValue;
    print2Console(“ADC =%.2f、Temp =%.2f\r\n“、cal_adc_code_array[i]、cal_temperature_array[i]);
    sumtemp += cal_temperature_arra[i];
    sumconv += cal_adc_code_array[i];
    tempsumxconv += cal_temperature_arra[i]* cal_adc_code_array[i];
    tempsumxtemp += cal_temperature_arra[i]* cal_temperature_arra[i];
    CAL_DATA_COUNT++;
    }
    }

    /*计算 4 个可能值对的斜率和偏移*/
    if (cal_data_count < 2)
    返回 false;
    暴露

    print2Console(“sumtempxtemp =%.2f、sumtemp =%.2f、sumtempxconv =%.2f、sumconv =%.2f\r\n“、sumtempxtemp、 sumtemp、sumtempxconv、sumconv);
    斜率=(sumtempxtemp * cal_data_count - sumtemp * sumtemp)/
    (sumtempxconv * cal_data_count - sumtemp * sumconv);
    offset =(sumconv - sumtemp / slope)/cal_data_count;
    slope = slope Thermistor_Fit;
    Thermistor_Fit = offset;
    avgconv = sumconv / cal_data_count;
    }

    /*计算 R 方值*/
    对于 (i = 0;i < cal_data_count;i++)

    yn =(((cal_temperature_array[i]/ slope)+ offset)- cal_adc_code_array[i]);
    yx = yx +(yn * yn);
    ym =(avgconv - cal_adc_code_array[i]);
    Ya = Ya +(ym * ym);
    }
    yx.rqualter = 1.0 -(yx/ya) Thermistor_Fit;

    print2Console(“print2console.offset Thermistor_Fit =%f、Thermistor_Fit。slope =%f、Thermistor_Fit。rsquare =%f\r\n“、\
    Thermistor_Fit、Thermistor_Fit slope、Thermistor_Fit、rsquared);
    返回 true;

    }// thermistor_calibrate

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

    请仔细检查代码、

    传感器 2 使用 ADC2[31]

    adcreg->GxSEL[1U]= 0x80000000;

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

    谢谢您、Wang。 我更正了传感器 2 的通道选择、得到的 ADC 值和温度值相似。 我也尝试了传感器 1 和相同的结果。 所有 ADC 值均在 1300-1350 范围内。

    除了测量 ADREF HI 和 LO 电压之外、下一步是什么、这可能需要一些时间、因为我需要合适的设备。

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

    QJ Wang — 是否有任何方法可以更改案例状态。 它显示“已解决“、因为我误单击“此已解决我的问题“按钮。

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

    您可以检查电路板的原理图。 TMS570LC43x 支持高达 5V 的 ADC 电源和基准 HI 电压电平。 如果 ADC 未由 3.3V 供电、则需要调整采样的 ADC 值。

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

    我检查了 ADREFHI 和 ADREFLO 之间的差异、发现其电压为 5.0V。 因此、我将 ADC 采样值与系数 (5/3.3) 相乘、得到的是真实数据。 但是、我发现传感器 2 和(传感器 1 和传感器 3)之间的差异约为 3 到 4 度(中心级)。 Sensor-1 和 Sensor-3 温度值看起来更接近。 是否符合预期?

     

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

    您好、

    这三个传感器位于不同的位置。 可以看到 3 个传感器读取的不同温度。