From bb2c0d034e5b4ab7d60b8ec06cc7706d22f1bdde Mon Sep 17 00:00:00 2001
From: 95384 <664090429@qq.com>
Date: Sat, 1 Mar 2025 09:52:22 +0800
Subject: [PATCH 01/12] =?UTF-8?q?ADC=E5=A2=9E=E7=9B=8A=E5=BC=80=E5=90=AF?=
=?UTF-8?q?=E4=B8=8E=E5=85=B3=E9=97=AD=E7=82=B9=E6=94=B9=E4=B8=BA=E5=AE=8F?=
=?UTF-8?q?=E5=AE=9A=E4=B9=89=EF=BC=8C=E5=BC=80=E5=90=AF=E6=94=B9=E4=B8=BA?=
=?UTF-8?q?190=EF=BC=8C=E5=85=B3=E9=97=AD=E6=94=B9=E4=B8=BA1900?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App/Inc/anemometer_dev.h | 2 ++
App/Src/anemometer_dev.c | 16 ++++++++--------
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h
index dd40f8f..13107e5 100644
--- a/App/Inc/anemometer_dev.h
+++ b/App/Inc/anemometer_dev.h
@@ -20,6 +20,8 @@
+#define ADC_GAIN_ENABLE 190
+#define ADC_GAIN_DISABLE 1900
#define K_128 0xA12EE1FE
// 延时REV_MUTE_DELAY us启动ADC采集数据
diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c
index bc0ea98..ea43e7d 100644
--- a/App/Src/anemometer_dev.c
+++ b/App/Src/anemometer_dev.c
@@ -93,30 +93,30 @@ void config_adc_gain(uint8_t channel, uint16_t max_val)
switch(channel)
{
case 0x01:
- if(max_val <= 180)
+ if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_s = 1;
- else if(max_val >= 1900)
+ else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_s = 0;
break;
case 0x02:
- if(max_val <= 180)
+ if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_n = 1;
- else if(max_val >= 1900)
+ else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_n = 0;
break;
case 0x03:
- if(max_val <= 180)
+ if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_e = 1;
- else if(max_val >= 1900)
+ else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_e = 0;
break;
case 0x04:
- if(max_val <= 180)
+ if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_w = 1;
- else if(max_val >= 1900)
+ else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_w = 0;
break;
From d1bbcc86d8655e55094e71e2ffdf8feebec725e6 Mon Sep 17 00:00:00 2001
From: 95384 <664090429@qq.com>
Date: Sat, 1 Mar 2025 10:59:45 +0800
Subject: [PATCH 02/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SHT30=E5=87=BA=E9=97=AE?=
=?UTF-8?q?=E9=A2=98=E5=90=8E=E9=87=8D=E6=96=B0=E4=B8=8A=E7=94=B5=EF=BC=8C?=
=?UTF-8?q?=E9=87=8D=E6=96=B0=E5=88=9D=E5=A7=8B=E5=8C=96IIC1=E9=80=BB?=
=?UTF-8?q?=E8=BE=91=EF=BC=8CSHT30IIC=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4?=
=?UTF-8?q?=E7=94=B10xFFFF=E6=94=B9=E4=B8=BA0xFF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App/Inc/anemometer_dev.h | 2 +-
App/Src/anemometer_dev.c | 15 ++++++++++++++-
Drivers/Sht3x/sht30.c | 4 ++--
3 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h
index 13107e5..a0d385a 100644
--- a/App/Inc/anemometer_dev.h
+++ b/App/Inc/anemometer_dev.h
@@ -42,7 +42,7 @@
// 温度探头版本,SHT30=1,TMP117=2
#define SHT30_SENSOR 1
#define TMP117_SENSOR 2
-#define TEMP_SENSOR TMP117_SENSOR
+#define TEMP_SENSOR SHT30_SENSOR
///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中
diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c
index ea43e7d..ced44cf 100644
--- a/App/Src/anemometer_dev.c
+++ b/App/Src/anemometer_dev.c
@@ -1099,9 +1099,22 @@ static void getTempHumiPress(void)
// SHT30出问题
if(sht30_ret == FALSE)
{
+ //错误处理
+ //关电重启,第一次进入错误判断,此时此时错误标志位为0,关电并置位错误标志位;
+ //再进入错误标志位检测到错误标志位后开电
+ //下一次监测如果SHT30恢复,则正常运行,如果没有恢复,电继续开着,保证温度传感器正常运行
+ if(g_error_log.temp_error_SHT30 == 0)
+ {
+ HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_RESET);
+ HAL_I2C_DeInit(&hi2c1);
+ }else
+ {
+ HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_SET);
+ MX_I2C1_Init();
+ sht30_init();
+ }
//置错误标志位
g_error_log.temp_error_SHT30 = 1;
- //错误处理
#if TEMP_SENSOR == SHT30_SENSOR
g_stMcs_Para.temperature = backupTemperature1;
#endif /*TEMP_SENSOR == SHT30_SENSOR*/
diff --git a/Drivers/Sht3x/sht30.c b/Drivers/Sht3x/sht30.c
index f33a8d8..23bd38a 100644
--- a/Drivers/Sht3x/sht30.c
+++ b/Drivers/Sht3x/sht30.c
@@ -33,7 +33,7 @@ static u_int8_t i2c_write_cmd(u_int8_t addr,u_int16_t cmd)
cmd_buff[0] = cmd>>8;
cmd_buff[1] = cmd;
- u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xffff);
+ u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xff);
return ret;
}
@@ -101,7 +101,7 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu
i2c_write_cmd(stSensorDev.i2c_reg_addr,stSensorDev.cmd_read_data);
- if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xffff) != HAL_OK){
+ if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){
return HAL_ERROR;
}
From e9f0a3d61b0910089e14fc67416ab7a16af09516 Mon Sep 17 00:00:00 2001
From: 95384 <664090429@qq.com>
Date: Tue, 4 Mar 2025 13:20:19 +0800
Subject: [PATCH 03/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0MS5607=E9=A9=B1?=
=?UTF-8?q?=E5=8A=A8=E6=9B=BF=E6=8D=A2HP203B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App/Src/anemometer_dev.c | 4 +-
Core/Src/main.c | 2 +
Drivers/MS5607/ms5607.c | 165 +++++++++++++++++++++++++++++++++++++++
Drivers/MS5607/ms5607.h | 21 +++++
EWARM/micro_climate.ewp | 13 ++-
EWARM/micro_climate.ewt | 9 +++
6 files changed, 212 insertions(+), 2 deletions(-)
create mode 100644 Drivers/MS5607/ms5607.c
create mode 100644 Drivers/MS5607/ms5607.h
diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c
index ced44cf..96bbcbe 100644
--- a/App/Src/anemometer_dev.c
+++ b/App/Src/anemometer_dev.c
@@ -10,6 +10,7 @@
#include "FIR.h"
#include "LowPassFilter.h"
#include "encrypt.h"
+#include "ms5607.h"
#define AVE_TIME 600 //滑动平均时间,秒,最大600
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
@@ -1070,7 +1071,8 @@ static void getTempHumiPress(void)
//采集备用温度与大气压
float backupTemperature1;
float backupTemperature2;
- uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure);
+// uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure);
+ uint8_t hp203_ret = MS56XX_GetPressureTemp(&backupTemperature1, &g_stMcs_Para.pressure);
uint8_t sht30_ret = get_temp_humi_data(&backupTemperature2, &g_stMcs_Para.humidity);
#if TEMP_SENSOR == SHT30_SENSOR
g_stMcs_Para.temperature = backupTemperature2;
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 956ae80..90768f8 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -44,6 +44,7 @@
#include "sht30.h"
#include "hp203b.h"
#include "tmp117.h"
+#include "ms5607.h"
#include "inflash.h"
/* USER CODE END Includes */
@@ -174,6 +175,7 @@ void Flash_EnableReadProtection(void)
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
sht30_init();
TMP117_Init();
+ MS56XX_Init();
/* USER CODE END 2 */
/* Call init function for freertos objects (in cmsis_os2.c) */
diff --git a/Drivers/MS5607/ms5607.c b/Drivers/MS5607/ms5607.c
new file mode 100644
index 0000000..6c7ff5f
--- /dev/null
+++ b/Drivers/MS5607/ms5607.c
@@ -0,0 +1,165 @@
+#include "ms5607.h"
+#include "i2c.h"
+#include "filter.h"
+#include "anemometer_dev.h"
+#include "uart_dev.h"
+
+static void MS56XX_Reset(void)
+{
+ uint8_t _cmd[] = {0x1e};
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
+ HAL_Delay(5);
+}
+
+static void MS56XX_Read_PromData(uint16_t *VAL_C)
+{
+ uint8_t _cmd[] = {0xa0};
+ uint8_t temp_buff[2] = {0};
+ for(uint8_t i = 0; i < 8; i++)
+ {
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
+ HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff);
+ *(VAL_C + i) = (temp_buff[0] << 8)|temp_buff[1];
+ _cmd[0] += 2;
+ osDelay(1000);
+ }
+
+}
+
+static uint16_t MS56XX_C_Value[8] = {0};
+void MS56XX_Init(void)
+{
+ MS56XX_Reset();
+ MS56XX_Read_PromData(MS56XX_C_Value);
+}
+
+static uint32_t MS56XX_ReadD1_Press(void)
+{
+ uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF};
+ uint8_t _cmd[] = {0x48};
+ uint8_t _addr[] = {0x00};
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
+ osDelay(10);
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
+ HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff);
+
+ uint32_t press;
+ press = D1_Value_Buff[0];
+ press <<= 8;
+ press += D1_Value_Buff[1];
+ press <<= 8;
+ press += D1_Value_Buff[2];
+ term_printf("%x",press);
+ return press;
+}
+
+static uint32_t MS56XX_ReadD2_Temp(void)
+{
+ uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00};
+ uint8_t _cmd[] = {0x58};
+ uint8_t _addr[] = {0x00};
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
+ osDelay(10);
+ HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
+ HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff);
+
+ uint32_t Temp;
+ Temp = D2_Value_Buff[0];
+ Temp <<= 8;
+ Temp += D2_Value_Buff[1];
+ Temp <<= 8;
+ Temp += D2_Value_Buff[2];
+ return Temp;
+}
+
+static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temperature) //¶
+{
+ uint32_t D2_Value = MS56XX_ReadD2_Temp(); //ѭȡ D2
+
+ if(D2_Value > ((uint32_t)MS56XX_C_Value[5] * (0x00000001 << 8) ))
+ {
+ *dT = D2_Value - (( uint32_t )MS56XX_C_Value[5] * (0x00000001 << 8)); //ʽ dT = D2 - TREF = D2 - C5 * 2^8
+ }
+ else
+ {
+ *dT = (( uint32_t ) MS56XX_C_Value[5] * (0x00000001 << 8) ) - D2_Value;
+ *dT *= -1;
+ }
+ *MS56XX_Temperature = 2000 + ( *dT * MS56XX_C_Value[6] ) / (0x00000001 << 23); //¶ֵ1002001ʾ20.01 ʽTEMP =20C + dT * TEMPSENS =2000 + dT * C6 / 2^23
+
+ if(*MS56XX_Temperature < -6000)
+ {
+ *MS56XX_Temperature=-6000;
+ }
+ if(*MS56XX_Temperature > 8500)
+ {
+ *MS56XX_Temperature=8500;
+ }
+}
+
+uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //¶Ȳѹ
+{
+ int32_t dT;
+ int32_t MS56XX_Temperature;
+ uint32_t D1_Value = MS56XX_ReadD1_Press(); //ѭȡ D1
+
+ MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//ȡdTTemp
+
+ int64_t OFF = ((int64_t)MS56XX_C_Value[2] * (0x00000001 << 17)) + ((int64_t)MS56XX_C_Value[4] * dT )/ 64.0; //ʽ OFF = OFFT1 + TCO *dT = C2 *2^17 +(C4 *dT )/ 2^6
+ int64_t SENS = ((int64_t)MS56XX_C_Value[1] * (0x00000001 << 16)) + ((int64_t)MS56XX_C_Value[3] * dT )/ 128.0; //ʽSENS = SENST1 + TCS* dT= C1 * 2^16 + (C3 * dT )/ 2^7
+
+ //¶Ȳ оƬֲ
+ int32_t T2;
+ int64_t OFF2;
+ int64_t SENS2;
+ if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
+ {
+ T2 = ( dT * dT ) / (( uint64_t )0x0000000001 << 31);
+ OFF2 = 61 * (( MS56XX_Temperature - 2000 ) * ( MS56XX_Temperature - 2000 )) / 16;
+ SENS2 = 2 * (( MS56XX_Temperature - 2000 ) * ( MS56XX_Temperature - 2000 )) ;
+ if ( MS56XX_Temperature < -1500 )
+ {
+ OFF2 = OFF2 + 15 * (( MS56XX_Temperature + 1500 ) * ( MS56XX_Temperature + 1500 ));
+ SENS2 = SENS2 + 8 * (( MS56XX_Temperature + 1500 ) * ( MS56XX_Temperature + 1500 ));
+ }
+ }
+ else //(Temperature > 2000)
+ {
+ T2 = 0;
+ OFF2 = 0;
+ SENS2 = 0;
+ }
+
+ MS56XX_Temperature = MS56XX_Temperature - T2;
+ OFF = OFF - OFF2;
+ SENS = SENS - SENS2;
+
+
+ int32_t Tmp_Pressure = (D1_Value * SENS / (0x00000001 << 21) - OFF ) / (0x00000001 << 15); //ʽ P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15
+
+ *Temp = ((float)MS56XX_Temperature)/100; //λ
+ *Press = ((float)Tmp_Pressure)/100; //λ mbar
+ term_printf("%f", *Press);
+
+ if(*Temp<-60)
+ {
+ *Temp=-60;
+ return 0;
+ }
+ if(*Temp>85)
+ {
+ *Temp=85;
+ return 0;
+ }
+ if(*Press<10)
+ {
+ *Press=10;
+ return 0;
+ }
+ if(*Press>1200)
+ {
+ *Press=1200;
+ return 0;
+ }
+ return 1;
+}
diff --git a/Drivers/MS5607/ms5607.h b/Drivers/MS5607/ms5607.h
new file mode 100644
index 0000000..6a96947
--- /dev/null
+++ b/Drivers/MS5607/ms5607.h
@@ -0,0 +1,21 @@
+#ifndef __MS5607_H__
+#define __MS5607_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "comm_types.h"
+
+#define MS5607_ADDRESS 0x77<<1
+
+void MS56XX_Init(void);
+uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ __MS5607_H__ */
+
diff --git a/EWARM/micro_climate.ewp b/EWARM/micro_climate.ewp
index 6518386..bd28a1e 100644
--- a/EWARM/micro_climate.ewp
+++ b/EWARM/micro_climate.ewp
@@ -375,6 +375,7 @@
$PROJ_DIR$\..\App\Inc
$PROJ_DIR$\..\Drivers\HP203B
$PROJ_DIR$\..\Drivers\Tmp117
+ $PROJ_DIR$\..\Drivers\MS5607