使用 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 很多 1
s 与 0
在这里和那里。你显示的两个值各只有一个0
,线路空闲值大概是1
。这似乎是错误的。您可以查看一些内容:
HAL_SPI_Receive
return是什么意思?应该returnHAL_OK
.
你有示波器吗?如果这样做,请展示您观察到的图片。有时钟信号吗?频率是否正确? CS
是否按预期工作?
您确定您正确打开了传感器吗?也许它首先需要一些配置设置?
我解决了这个错误。在我的情况下,您必须在 MOSI 上进行软件下拉,它正确配置了 STM PIN。
我想用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 很多 1
s 与 0
在这里和那里。你显示的两个值各只有一个0
,线路空闲值大概是1
。这似乎是错误的。您可以查看一些内容:
HAL_SPI_Receive
return是什么意思?应该returnHAL_OK
.你有示波器吗?如果这样做,请展示您观察到的图片。有时钟信号吗?频率是否正确?
CS
是否按预期工作?您确定您正确打开了传感器吗?也许它首先需要一些配置设置?
我解决了这个错误。在我的情况下,您必须在 MOSI 上进行软件下拉,它正确配置了 STM PIN。