#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); osDelay(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]; *(VAL_C + i) <<= 8; *(VAL_C + i) += temp_buff[1]; _cmd[0] += 0x02; } } static uint16_t MS56XX_C_Value[8] = {0}; void MS56XX_Init(void) { MS56XX_Reset(); MS56XX_Read_PromData(MS56XX_C_Value); } static HAL_StatusTypeDef MS56XX_ReadD1_Press(uint32_t *D1_Value) { uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF}; uint8_t _cmd[] = {0x48}; uint8_t _addr[] = {0x00}; if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) { return HAL_ERROR; } osDelay(20); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) { return HAL_ERROR; } if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff) != HAL_OK) { return HAL_ERROR; } uint32_t press; press = D1_Value_Buff[0]; press <<= 8; press += D1_Value_Buff[1]; press <<= 8; press += D1_Value_Buff[2]; *D1_Value = press; return HAL_OK; } static HAL_StatusTypeDef MS56XX_ReadD2_Temp(uint32_t *D2_Value_) { uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00}; uint8_t _cmd[] = {0x58}; uint8_t _addr[] = {0x00}; if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) { return HAL_ERROR; } osDelay(20); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) { return HAL_ERROR; } if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff) != HAL_OK) { return HAL_ERROR; } uint32_t Temp; Temp = D2_Value_Buff[0]; Temp <<= 8; Temp += D2_Value_Buff[1]; Temp <<= 8; Temp += D2_Value_Buff[2]; *D2_Value_ = Temp; return HAL_OK; } static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度 { uint32_t D2_Value; if(MS56XX_ReadD2_Temp(&D2_Value) != HAL_OK) //循环读取 D2 { return HAL_ERROR; } // term_printf("D2:%d\r\n", D2_Value); if(D2_Value > (MS56XX_C_Value[5] * 256)) { *dT = D2_Value - MS56XX_C_Value[5] * 256; //公式 dT = D2 - TREF = D2 - C5 * 2^8 }else { *dT = MS56XX_C_Value[5] * 256 - D2_Value; //公式 dT = D2 - TREF = D2 - C5 * 2^8 *dT *= -1; } // term_printf("dT:%d\r\n", *dT); *MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //算出温度值的100倍,2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23 return HAL_OK; } static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //计算温度补偿压力 { int32_t dT; int32_t MS56XX_Temperature; uint32_t D1_Value; if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //循环读取 D1 { return HAL_ERROR; } if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//读取dT,Temp { return HAL_ERROR; } // term_printf("TEMP:%d\r\n", MS56XX_Temperature); // term_printf("dT:%d\r\n", dT); // term_printf("TEMP:%d\r\n", MS56XX_Temperature); int64_t OFF = ((int64_t)MS56XX_C_Value[2] * 131072) + ((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] * 65536) + ((int64_t)MS56XX_C_Value[3] * dT )/ 128.0; //公式SENS = SENST1 + TCS* dT= C1 * 2^16 + (C3 * dT )/ 2^7 // term_printf("OFF:%d\r\n", OFF); // term_printf("SENS:%d\r\n", SENS); //温度补偿部分 逻辑看芯片手册 int64_t T2 = 0; int64_t OFF2 = 0; int64_t SENS2 = 0; if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C { T2 = (dT * dT) / 2147483648.0; 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)); } } // term_printf("T2:%d\r\n", T2); MS56XX_Temperature = MS56XX_Temperature - T2; OFF = OFF - OFF2; SENS = SENS - SENS2; int32_t Tmp_Pressure = ((int32_t)D1_Value * SENS/2097152 - OFF) / 32768; //公式 P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15 // term_printf("\r\nC1-C6:%d %d %d %d %d %d\r\n", MS56XX_C_Value[1], MS56XX_C_Value[2], MS56XX_C_Value[3], MS56XX_C_Value[4], MS56XX_C_Value[5], MS56XX_C_Value[6]); // term_printf("D1:%d\r\n", D1_Value); // // term_printf("dT:%d\r\n", dT); // // term_printf("OFF:%d\r\n", OFF); // term_printf("SENS:%d\r\n", SENS); // term_printf("P:%d\r\n", Tmp_Pressure); // term_printf("TEMP:%d\r\n", MS56XX_Temperature); // term_printf("PRESS:%d\r\n", Tmp_Pressure); if(MS56XX_Temperature<-6000) { MS56XX_Temperature=-6000; } if(MS56XX_Temperature>8500) { MS56XX_Temperature=8500; } if(Tmp_Pressure<1000) { Tmp_Pressure=1000; } if(Tmp_Pressure>120000) { Tmp_Pressure=120000; } *Temp = ((float)MS56XX_Temperature)/100; *Press = ((float)Tmp_Pressure)/100; return HAL_OK; } static float calculateAverage(float arr[], int avgLength) { float sum = 0; // 遍历数组(最多10个元素),收集非零值直到达到指定数量 for (int i = 0; i < 10; ++i) { sum += arr[i]; } // 计算平均值并限制最大值 float average = sum / avgLength; return average; } #define COLLECT_DATA_NUM 10 HAL_StatusTypeDef MS56XX_GetPressure(float *Press) { float temp_buff; float pressure_buff[COLLECT_DATA_NUM] = {0}; uint8_t ret_falt = 0; for(uint8_t i = 0;i= COLLECT_DATA_NUM) { return HAL_ERROR; } *Press = calculateAverage( pressure_buff,COLLECT_DATA_NUM - ret_falt); return HAL_OK; }