✨ feat(gps): 新增GPS海拔数据支持并优化系统配置

- 在数据包结构中新增gps_altitude字段以支持海拔数据存储
- 更新PackData和PackCorrectedData系列函数,增加altitude参数
- 移除timestamp字段以精简数据包结构,提高传输效率
- 优化GPS数据处理逻辑,取消GPS有效性检查,直接使用原始GPS数据
- 将调试输出和监控保存间隔统一调整为30秒,降低系统负载
- 将数据存储文件最大大小从20MB提升至100MB,支持更长时间数据采集
- 将GPS数据超时时间从2秒延长至10秒,提高在弱信号环境下的稳定性

🔧 chore(spi): 调整SPI配置以优化通信稳定性

- 将所有SPI接口的时钟相位从SPI_PHASE_1EDGE调整为SPI_PHASE_2EDGE
- 将SPI1的波特率预分频器从4调整为8,降低通信速率以提高稳定性
- 更新STM32CubeMX配置文件(.ioc)以反映SPI配置变更

📝 docs(script): 新增高性能数据分析工具脚本

- 创建atem_parse.py脚本,提供数据解析和可视化功能
- 支持V1/V2数据格式解析,V2版本包含GPS经纬度和海拔数据
- 实现串口实时数据接收和GPS动态模拟输出功能
- 提供波形图、轨迹图和海拔曲线等多标签可视化界面
- 包含数据表格展示和CSV导出功能,支持高性能大数据处理
This commit is contained in:
2026-02-20 23:48:28 +08:00
parent 5b245f89c1
commit 44c37ec769
8 changed files with 737 additions and 34 deletions
+19 -11
View File
@@ -50,8 +50,8 @@
/* USER CODE BEGIN PD */
// 监控功能宏开关(统一控制串口输出和文件存储)
#define ENABLE_SYSTEM_MONITOR 1 // 系统监控开关
#define DEBUG_OUTPUT_INTERVAL_MS 1000 // 调试输出间隔(毫秒)
#define MONITOR_SAVE_INTERVAL_MS 10000 // 监控状态保存间隔(毫秒) - 10秒
#define DEBUG_OUTPUT_INTERVAL_MS 30000 // 调试输出间隔(毫秒)
#define MONITOR_SAVE_INTERVAL_MS 30000 // 监控状态保存间隔(毫秒) - 30秒
// 数据输出模式选择(运行时配置,从SD卡加载)
// 注意:DATA_OUTPUT_MODE_UART 和 DATA_OUTPUT_MODE_STORAGE 已改为运行时配置
@@ -185,8 +185,12 @@ static void ProcessAdcData(void)
&correction_result, &g_correction_params) == HAL_OK) {
// 4a. 打包校正后的数据(带GPS关键信息:仅经纬度)
float lat = gps_valid ? (float)current_gps_data.position.latitude : 0.0f;
float lon = gps_valid ? (float)current_gps_data.position.longitude : 0.0f;
// float lat = gps_valid ? (float)current_gps_data.position.latitude : 0.0f;
// float lon = gps_valid ? (float)current_gps_data.position.longitude : 0.0f;
// float alt = gps_valid ? (float)current_gps_data.position.altitude : 0.0f;
float lat = (float)current_gps_data.position.latitude;
float lon = (float)current_gps_data.position.longitude;
float alt = (float)current_gps_data.position.altitude;
uint32_t gps_time = gps_valid ? (current_gps_data.time.hour * 10000 +
current_gps_data.time.minute * 100 +
current_gps_data.time.second) : 0;
@@ -197,7 +201,8 @@ static void ProcessAdcData(void)
correction_result.corrected_z,
gps_time,
lat,
lon);
lon,
alt);
correction_applied = 1;
@@ -209,13 +214,17 @@ static void ProcessAdcData(void)
} else {
// 4b. 校正失败或未启用,使用原始数据
float lat = gps_valid ? (float)current_gps_data.position.latitude : 0.0f;
float lon = gps_valid ? (float)current_gps_data.position.longitude : 0.0f;
// float lat = gps_valid ? (float)current_gps_data.position.latitude : 0.0f;
// float lon = gps_valid ? (float)current_gps_data.position.longitude : 0.0f;
// float alt = gps_valid ? (float)current_gps_data.position.altitude : 0.0f;
float lat = (float)current_gps_data.position.latitude;
float lon = (float)current_gps_data.position.longitude;
float alt = (float)current_gps_data.position.altitude;
uint32_t gps_time = gps_valid ? (current_gps_data.time.hour * 10000 +
current_gps_data.time.minute * 100 +
current_gps_data.time.second) : 0;
PackData(&g_data_packet, raw_adc[0], raw_adc[1], raw_adc[2], gps_time, lat, lon);
PackData(&g_data_packet, raw_adc[0], raw_adc[1], raw_adc[2], gps_time, lat, lon, alt);
// 发送原始数据包到串口(运行时配置)
if (Config_IsUartOutputEnabled()) {
@@ -698,10 +707,9 @@ void SystemClock_Config(void)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static uint32_t cnt = 0;
if(LTC2508_IsInited() == 0) return;
if(LTC2508_IsInited() == 0) return;
cnt ++;
// if(cnt % 5 == 0)
// if(cnt % 2 == 0)
{
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
if (GPIO_Pin == ADC_DRY_Pin) {
+4 -4
View File
@@ -48,9 +48,9 @@ void MX_SPI1_Init(void)
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
@@ -80,7 +80,7 @@ void MX_SPI2_Init(void)
hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
@@ -111,7 +111,7 @@ void MX_SPI3_Init(void)
hspi3.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;