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.

[参考译文] HDC2010:小数点后使用一位数进行温度测量

Guru**** 1815690 points
Other Parts Discussed in Thread: HDC2010, HDC2010METER-EVM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/823568/hdc2010-temperature-measurement-with-single-digit-after-decimal-point

器件型号:HDC2010

您好!

 

1)根据下面的链接、对于11位、5个 LSB 位是否为零。 我不这么认为。 即使我看到的值是5 LSB 位。 请确认。

  https://e2e.ti.com/support/sensors/f/1023/p/787156/2910923?tisearch=e2e-quicksearch&keymatch=HDC2010%20single%20digit%20accuracy#2910923

 

2) 2)小数点后的一位数字表示正常、如果要存储从温度寄存器[0:15]读取的值、则以下方法是否正常。

 

             a)以14位分辨率进行采样。

             b)将温度[0:15]寄存器的右上位移5位。

             c)存储11位、并在需要时使用以下数学运算来计算实际温度值。

 

                            ((11位温度值)/2 ^ 11)*165)-40

             其中2 ^ 11为2048

 

我希望小数点后的单位精度。 (例如:12.1)

谢谢、此致

Vishnu Beema

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

    尊敬的 Vishnu -  

    该器件的配置分辨率(在寄存器0x0E 中)是 HDC2010 ADC 的输出。 只有一个公式可以将其转换为%RH。  

    数据表第18页、您不必再进行任何其他计算。  

    如果您不希望精度数字超出第一个小数点、则可以在存储前将其截断、但浮点到 int 会导致数字的所有小数部分丢失、因此可以使用 trunc()函数。 因此、它可能应存储为浮点值-如果您要打印它、则只需使用 printf 转换、使用%.1f、就像您想要输出浮点值一样、小数点后只有一个字符

     

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

    HDC2010METER-EVM 的源代码可能很有用。 可从以下网址获取: http://www.ti.com/tool/HDC2010METER-EVM

    具体而言、tmp-decode.c 是一个将字符串数据类型中的两个字节响应从 HDC2010转换为湿度的示例、精度为一位。  

    char* humstring (unsigned char HiByte、unsigned char LoByte){
    长 IH;
    浮动 FH;
    
    //组合2个字节
    IH =(长整型)(HiByte & 0xFF)<< 8 |(LoByte & 0xFF);
    Fh =(浮点) IH/65536;
    Fh *=100;
    sprintf (sh、"%6.1F"、FH);
    返回 sh;
    } 

    我最初编写的版本避免了使用浮点数据类型和 printf 库。 它不是很漂亮。 由于它实际使用的 CPU 周期比上面使用 float 和 printf 的代码多、所以它被报废。

    char* humstring (unsigned char HiByte、unsigned char LoByte){
    字符 I;
    无符号长整型;
    
    //组合2个字节
    它=(无符号长整型) HiByte << 8 |(LoByte & 0xFF);
    //LSB
    它*= 15258;/2^-16*100*1e7
    sh[st_char_len-1]='%';
    #ifdef 调试
    printf ("it:%lli i:%i\n"、it、i);
    #endif
    //sign//
    if (it<0){
    // SH[0]= 0x2D;
    // 它*=-1;
    //}
    //否则
    SH[0]= 0x20;
    //十进制
    SH[4]= 0x2E;
    for (i=st_char_len-2;i >0;i--){
    #ifdef 调试
    printf ("it:%lli i:%i\n"、it、i);
    #endif
    如果(i!= 4){
    SH[i]= IT % 10 + 0x30;
    它/= 10;
    }
    }
    //固定前导零
    对于(i=1;i<3;i++){
    //if 等于零
    如果(sh[i]=0x30){
    //如果前面的值等于负
    if (sh[i-1]=0x2D){
    SH[i]= 0x2D;
    SH[I-1]= 0x20;
    }
    //如果前面的值等于空格,则为///else
    否则、如果(sh[I-1]=0x20)
    SH[i]= 0x20;
    }
    否则中断;
    }
    返回 sh;
    } 

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

    您好!

     

    感谢您的意见。 我已经介绍了示例代码。 让我详细介绍一下我的要求。

     

    1) 1)我们希望将温度和湿度数据存储到非易失性存储器中(例如:闪存)。 我们对剩余闪存空间有非常严格的要求。

    2) 2)因此我们不想将转换后的值以浮点格式存储到闪存中、这将占用4字节的温度值和4字节的湿度值。

    3)关于温度、我们只希望将11位(采用 MSB 11位、然后向右*** x 5)的寄存器数据存储到闪存中。 湿度仅为8位(采用 MSB 8位、然后右移8位)。 在这种情况下、闪存中只使用19位(温度为11位、湿度为8位)、而不是32位(温度和湿度的16位寄存器值)。

    4) 4)通信传感器值时、从闪存读取这些值、然后应用以下公式并通过通信端口进行传输。

    公式:

    温度:   (((MSB 11位温度值+ 5 LSBit AS 0)/2 ^ 11)*165)-40;

                  其中2 ^ 11为2048

    湿度:((MSB 8位湿度值+ 8 LSBit AS 0)/2 ^ 8)*100;

                  其中2 ^ 8为256

     

    上述方法是可以的、或者是否有任何替代方法和更好的方法。        

     

    谢谢、此致

    Vishnu Beema

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

    维什努-  

    如果不知道您使用的 MCU 是什么等、或者不知道您为自己做的任何重新设计、我就无法具体评论您可能察觉到的数据处理问题应采取的措施。 以下是一些想法。  

    您可以使用半精度浮点(请参阅 IEEE 754)-这会使每个值占用2个字节。 这就是我想你所要求的。  

    2.您可以尝试将 MCU 与 FRAM 配合使用、这样您就可以随意进行分区(FRAM 是可执行的、RAM 和非易失性存储)-查看任何 MSP430FR 系列器件-  

    3.在通过线缆或天线发送之前,请使用 RAM 而不是闪存进行临时存储。