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.

[参考译文] TM4C123GH6PM:内部温度传感器的负温度读数

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/903731/tm4c123gh6pm-negative-temperature-readings-of-the-internal-temperature-sensor

器件型号:TM4C123GH6PM

您好,

temp = 147.5 -(((75 *(VREFP - VREFN)×ADCCODE)/4096),这是作为数据表中的参考来计算温度的公式。

我们在计算负温度值方面存在一些挑战。

下面是代码片段:

unsigned char
get_temp (void)

   unsigned int count = 0;
   unsigned int temp_X_10 = 0;
   unsigned char temp;
   count = ADC_COUNT_VOLT_SEQ1[2];  //从 MCU 的内部 ADC 读取的 ADC _code。
  
   TEMP_X_10 =(1475 -(75 * 30 *计数)/4096);//VREFP-VREFN =3V
   temp = temp_X_10/10;
  
   返回温度;

在这里、temp 被定义为 unsigned char、并且由于没有配置以 signed char 形式将值发送到 CPU、因此它被声明为 unsigned char。

当 temp_X_10值变为负值时,计算得出的最终温度值为153,并随着 temp_X_10的负值的增加而不断降低。

那么,当这个153被发送到 CPU 时,如何将它解码为实际的负温度值?

如果有任何解决方案,那就非常感谢。提前感谢。

此致、

Rohith。

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

    您好、Rohith、

    您使用的是无符号变量、因此如果您进入底数、符号位将关闭您的结果。 您需要使用有符号变量。 请再次尝试使用正确的有符号变量、老实说、对于主计算、请使用浮点以获得最高精度。

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

    您好!

    我们的技术团队不同意您的"153"结果、即(希望的) ADC 读数(跨越0 - 4095)、这是由于 MCU 的瞬时温度等于0°C   相反、我们发现 ADC 读数为"2686"、这与 MCU 手册中提供的温度曲线相当一致。   您不会"显示您的工作"-因此我们不能建议您如何到达"153"-但这是(有保证的)不正确的。   (因为它偏离了手册的温度曲线!)

    我们将提供3个系列的变量捕获-在 IAR 下-在结温(接近) 0°C 时证明我们的"2686" ADC 结果   通过将变量(我们称之为"temp")更改为"整数"(即有符号)、可以很好地揭示从正到负结温的转换。   您可能会注意到我们的供应商代理"Ralph"的建议。

    请注意(再次)这是 MCU 结温... 而不是 MCU 周围环境的温度。   并且-根据 MCU 系统时钟、运行中的外设数量和 GPIO 输出负载-以及周围温度- MCU 的结温可能不会证明是很有价值的。

    遵循我们的"简化代码"-我们选择不使用"浮点"、因为结温不太可能要求此类精度-并且完全通过整数工作-我们可以用一到两度的角度解析温度(如图所示)。   (即清楚地说、"适合 Gov't 工作!")

    赞扬"Cassandra"这一"压缩但高度详细的"数据演示文稿、这是我们的大学生中的一名员工-无病毒-和"工作星期六"!   她使用后缀"p"表示正温度;"n"表示负温度;"0"表示温度"交叉"极性。   我们发现她的"奇异代码运行"(如下所示)令人信服地显示了0°C 以上和以下的温度转换-(以某种方式)没有显示海报...

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

    您好!

    感谢您的回答。

    下面是代码运行的输出,如果为负,则将值显示为153。

    将"temp"声明为 unsigned char 的原因...我的问题是、我无法避免使用 unsigned 数据类型、因此我想知道、是否有任何方法可以从使用 unsigned 数据类型获取的结果中获取 temp 的确切值。


    代码:


    #include int main() { unsigned int count = 0; unsigned int temp_X_10 = 0; unsigned char temp; for (int i=2680;i<2691;i++){ count =I; printf ("\n count 为%d"、count); temp_X_10 =(1475 -((75 * 30 * count)/4096));printf ("\temp_10" ;%tp_10";printf =%tp_10";printf =%tp_10"

    输出:

    计数为2680
    TEMP_X_10为3
    temp 为0
    计数为2681
    TEMP_X_10为3
    temp 为0
    计数为2682
    TEMP_X_10为2
    temp 为0
    计数为2683
    TEMP_X_10为2
    temp
    为0计数为2684
    TEMP_X_10为1
    temp 为0
    计数为2685
    TEMP_X_10为 1
    temp 为0
    count 为2686
    temp_X_10为0
    temp 为
    0 count 为2687
    temp_X_10为-1
    temp 为153
    count 为2688
    temp_X_10为-1
    temp 为153
    count 为2689
    temp_X_10为-2
    temp 为153
    count 为2690
    temp_X_10为-2
    temp 为153 


    此致、

    Rohith。

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

    我的朋友、

    rohith banoth 说:
    下面是代码运行的输出,如果值为负,则显示为153。

    再次-您的回复简洁、以及"153"结果-继续产生"帮手不适"。

    我们之前的详细报告显示了当 MCU 的结接近0°C 时、ADC 在2686左右的计数读数   

    请注意温度曲线(PG.813、'123手册): 它是否(清晰)显示"153"(°C 或°F 或其他-您未指定单位)不太可能!

    您是否"错过了"(equality) 1475 =((75 * 30 * count)/4096);逃避了"进一步"除以10的要求?   (因为(两侧)方程式已乘以相同的常数! [10])  下图显示了对这项工作的确认检查。

    您的"绿色笔尖笔!"的时代

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

    您好,

    对于"153"不太可能出现这种情况没有偏见、我完全同意、根据规格/描述153是不可预测的。

    我想提一下"153"的价值造成了一些混乱。

    我的整个关注点是计算后获得的输出存储在变量"temp"中、该变量是"unsigned char"数据类型、但理想情况下适用于正温度值、但不适用于负温度值、因为它应该是有符号数据 键入以存储负值。

    由于没有规定我将有符号值发送到 CPU,因此我被强制并绑定只使用无符号数据类型

    因此,现在使用无符号数据类型时,如果在所有计算之后获得的结果假定为"X",那么如何将其转换为 Temp 的实际有符号值是我唯一关心的问题。

     "您是否"错过了"(equality) 1475 =((75 * 30 * count)/4096);逃避了"进一步"除以10的要求?   (因为(两侧)方程式已乘以相同的常数!) "

    关于上面提到的点,temp_X_10 = (1475 - ((75 * 30 * count)/4096))是使用的公式。

    只有当 temp_X_10为零时,方程1475=((75*30*count)/4096)才能保持良好状态。 理想情况下、方程式是

    1475 - temp_X_10 =(75*30*count)/4096) 并且对于除0分次之外的所有值、必须推导出到方程  

    147.5 -(temp_X_10/10)=(75*3.0*count)/406)将 temp_X_10/10替换为 temp 时,会产生147.5–temp =((75*3*count)/4096),这与数据表 "13.3.6""pg-813"中提到的公式相当。

    谢谢、此致、

    Rohith。

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

    您好、Rohith、

    rohith banoth 说:
    由于没有向 CPU 发送带符号值的规定,因此我被强制并且只能使用无符号数据类型

    您能更详细地解释这一点吗? 什么限制了您?

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

    您好、Ralph、

    有一种通信协议可用于从 CPU 向 MCU 传输消息、反之亦然、通过 I2C。

    因此、消息应存储在 Tx 字段和 Rx 字段中、Rx 字段定义为无符号字符类型的数据字段结构、因此发送或接收的任何参数都是无符号数据类型。

    由于有多个与 CPU 和 MCU 之间的通信,根据这些字段,结构数据类型到签名的任何更改都将影响其他功能。

    现在,由于该项目即将交付,因此很难带来重大变化,因此出现了一个限制。

    谢谢、此致、

    Rohith。

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

    [引用 user="rohith banoth"]有一种通信协议可用于通过 I2C 将消息从 CPU 传输到 MCU、反之亦然。

    难道不应该在早得多的时候提出这一点吗?

    据信、"确实存在方法"使得"极化变量"(甚至)能够通过 I2C 连接介质通过...

    员工为您投入时间/精力证明令人沮丧...

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

    您好,

    很抱歉

    但是 ,自从这一主题的第一个描述以来,我一直提到无符号字符声明和不将其声明为有符号的规定,没有任何误导或隐藏的意图。

    此致、

    Rohith。

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

    您好、Rohith、

    关于 printf 的问题、我发现了以下内容:" "%d" 格式为(有符号) int 值。 如果将其与无符号值一起使用、则可以打印实际值以外的内容。 使用 "%u" 查看实际值、或 %x 以十六进制形式查看。"

    因此、这将解释您的153项结果、这对我们中的任何人都没有意义。

    关于仅能发送值为 unsigned vs signed 的问题、请尝试以下操作:

    1) 1)以无符号值的形式发送数据。

    2) 2)类型在接收后将数据转换为有符号值。

    3) 3)在 CPU 上打印值、以查看正确的有符号值。

    如果执行此操作、还需要考虑的一点是、您需要确保使用通过 I2C 发送的正确位数计算无符号结果、因为您必须确保符号位被正确发送、否则您将无法发送 能够正确发送值。

    另一种选择是在 MCU 上具有智能、以发送一些指示发送的值为负值的指示。

    通过执行此操作、您将发送可使用无符号值完成的绝对值、然后向 CPU 发送一个指示该值为正值或负值的指示器、基于此指示器、CPU 可以将方差重新构造为有符号值。