使用 STM 时 Lm74 温度计在负温度下出现错误

Lm74 thermometer bugs while on negative temperature using STM

我想用lm74温度传感器测量温度: https://html.alldatasheet.com/html-pdf/9026/NSC/LM74/113/3/LM74.html

我已经通过 SPI 将它连接到我的 stm32L476,如图所示: Conection stm temperature sensor

接收温度的代码(每1秒中断触发一次):

float TEMP_readTemp() {
    uint16_t temp_binary;

    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
    HAL_SPI_Receive(&hspi1, &temp_binary, 1, 10);
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
    float temp;
    temp = TEMP_ConvertTemp2(temp_binary);
    if (LOG_UART_ENAIBLE)
        TEST_UART_LogSTLink("Temp:  %s \n\r", FLOAT, &temp);
    return temp;
}

显示正温度正常。但是当我的温度低于 0 时,它每秒显示 -256.0625 记录:

Temp:  -4.187500                                                                
Temp:  -256.062500                                                              
Temp:  -4.125000                                                                
Temp:  -256.062500                                                              
Temp:  -4.187500                                                                
Temp:  -256.062500                                                              
Temp:  -4.250000                                                                
Temp:  -256.062500                                                              
Temp:  -4.250000                                                                
Temp:  -256.062500                                                              
Temp:  -4.312500                                                                
Temp:  -256.062500                                                              
Temp:  -4.312500                                                                
Temp:  -256.062500                                                              
Temp:  -4.312500                                                                
Temp:  -256.062500   

知道发生了什么事吗?

转换函数:

float TEMP_ConvertTemp2(uint16_t arrayBoth) {
    uint16_t bitShift;
    int bitShift_int;
    uint16_t division;
    float temperature;
    if (arrayBoth & 0x8000) {
        division = arrayBoth - 1;
        division = ~division;
        bitShift = division >> 3;
        bitShift_int = (int) bitShift;
        temperature = (float) -1 * ((bitShift_int +1 )* LSB_CONST);
    } else {
        bitShift = arrayBoth >> 3;
        bitShift_int = (int) bitShift;
        temperature = bitShift_int * LSB_CONST;
    }
    return temperature;
}

更新: 好吧,我用示波器看了一下(今天奇怪了,不管温度是多少(正负),每秒记录都是错误的)。

CS and CLOCK osciloscope

MISO and CLOCK osciloscope

这些照片显示了一次又一次进行的两次测量。第一个是-256.0625,第二个是正确的,大约是+31。

您的 TEMP_ConvertTemp2 正在按预期工作。可以看出here

你的错误:

根据数据表,温度数据包 return 有 2 个字节大。 (例如 0x4B07)您只告诉 SPI return 1 个字节。所以改变

HAL_SPI_Receive(&hspi1, &temp_binary, 1, 10);  // Receive 1 byte

HAL_SPI_Receive(&hspi1, &temp_binary, 2, 10);  // Receive two bytes

更新:

似乎传感器并没有真正 returning 任何东西,因为它只是 returning 很多 1s 与 0 在这里和那里。你显示的两个值各只有一个0,线路空闲值大概是1。这似乎是错误的。您可以查看一些内容:

  • HAL_SPI_Receivereturn是什么意思?应该returnHAL_OK.

  • 你有示波器吗?如果这样做,请展示您观察到的图片。有时钟信号吗?频率是否正确? CS 是否按预期工作?

  • 您确定您正确打开了传感器吗?也许它首先需要一些配置设置?

我解决了这个错误。在我的情况下,您必须在 MOSI 上进行软件下拉,它正确配置了 STM PIN。