基于STM32的车载GPS跟踪器电路设计与C语言实现

基于STM32的车载GPS跟踪器电路设计与C语言实现

一、系统概述

车载GPS跟踪器是车辆定位、轨迹追踪、防盗报警的核心设备,通过GPS卫星定位获取位置信息,经移动通信模块(GPRS/4G/NB-IoT)上传至服务器或手机APP,支持实时定位、历史轨迹、电子围栏、震动报警等功能。本设计基于STM32L431RCT6低功耗MCU,集成GPS模块、4G通信模块、加速度计,实现高精度定位、低功耗运行、远程监控,适用于私家车、物流车、租赁车等场景。

二、系统架构与硬件设计

1. 系统架构

graph TD
    A[GPS卫星] -->|NMEA数据| B[STM32L431主控]
    C[车辆电源 12V] -->|降压| D[电源管理模块]
    D -->|3.3V/5V| B
    D -->|3.3V| E[GPS模块 NEO-6M]
    D -->|3.3V| F[4G模块 EC200S]
    D -->|3.3V| G[加速度计 MPU6050]
    B -->|UART| E[GPS模块]
    B -->|UART| F[4G模块]
    B -->|I2C| G[加速度计]
    F -->|TCP/IP| H[云服务器 阿里云]
    H -->|JSON| I[手机APP/Web]
    B -->|GPIO| J[报警输出继电器]
    K[备用电池 1000mAh] -->|供电| D[电源管理]

2. 核心硬件选型

模块 型号/参数 功能
主控 STM32L431RCT6(Cortex-M4,80MHz,256KB Flash,64KB RAM) 低功耗控制、GPS/4G数据解析、传感器融合
GPS模块 NEO-6M(UART,NMEA-0183协议,定位精度2.5m) 获取经纬度、速度、时间、海拔
4G通信模块 EC200S(Cat.1,UART,支持TCP/IP/MQTT,下行10Mbps) 上传位置数据至云服务器
加速度计 MPU6050(I2C,6轴,±2g~±16g) 检测车辆震动、移动状态(防盗报警)
电源管理 LM2596(12V→5V,3A)+ TPS62740(5V→3.3V,效率95%)+ TP4056(充电管理) 车辆电源/备用电池供电,低功耗转换
备用电池 3.7V/1000mAh锂电池 车辆断电时维持系统工作(≥2小时)
报警输出 5V继电器(驱动喇叭/闪光灯) 震动/越界时触发本地报警

3. 关键电路设计

(1)GPS模块接口电路

(2)4G通信模块接口电路

(3)低功耗电源管理电路

三、软件设计(C语言实现,基于STM32 HAL库)

1. 开发环境

2. 主程序流程

#include "stm32l4xx_hal.h"
#include "gps.h"
#include "ec200s.h"
#include "mpu6050.h"
#include "power.h"
#include "cjson.h"

// 系统状态
typedef struct {
  float latitude;    // 纬度(°)
  float longitude;   // 经度(°)
  float speed;       // 速度(km/h)
  uint8_t is_moving;  // 车辆移动状态(0:静止,1:移动)
  uint8_t alarm_flag; // 报警标志(0:无,1:震动,2:越界)
} SystemState;

int main(void) {
  HAL_Init();
  SystemClock_Config();  // 80MHz主频
  MX_GPIO_Init();        // GPIO初始化(电源控制、报警输出)
  MX_USART1_Init();      // USART1(GPS,9600bps)
  MX_USART2_Init();      // USART2(4G,115200bps)
  MX_I2C1_Init();        // I2C1(MPU6050)
  MX_RTC_Init();         // RTC(低功耗唤醒)
  
  SystemState sys_state = {0};
  Power_Init();          // 电源管理初始化(低功耗模式)
  GPS_Init();            // GPS模块初始化
  EC200S_Init();         // 4G模块初始化(AT指令配置)
  MPU6050_Init();        // 加速度计初始化
  
  // 创建FreeRTOS任务
  xTaskCreate(Task_GPS, "GPS", 256, &sys_state, 3, NULL);    // GPS数据解析(优先级3)
  xTaskCreate(Task_4G, "4G", 512, &sys_state, 4, NULL);      // 4G数据上传(优先级4)
  xTaskCreate(Task_Sensor, "Sensor", 128, &sys_state, 2, NULL); // 传感器采集(优先级2)
  xTaskCreate(Task_LowPower, "LowPower", 128, NULL, 1, NULL);  // 低功耗管理(优先级1)
  
  vTaskStartScheduler();  // 启动调度器
  while (1);
}

3. 关键模块实现

(1)GPS数据解析(NMEA-0183协议,Task_GPS)

功能:解析NMEA语句(GGA:定位信息,RMC:推荐最小数据),提取经纬度、速度、时间。

// NMEA语句结构
typedef struct {
  float time;       // UTC时间(时分秒)
  float latitude;   // 纬度(ddmm.mmmm)
  char lat_dir;     // 纬度方向(N/S)
  float longitude;  // 经度(dddmm.mmmm)
  char lon_dir;     // 经度方向(E/W)
  float speed;      // 速度(knots,1knot=1.852km/h)
  float course;     // 航向(°)
} NMEA_RMC;

// 解析GGA语句(获取经纬度)
void Parse_GGA(char* nmea, NMEA_RMC* rmc) {
  // 格式:$GPGGA,083559.00,2446.5242,N,12100.1536,E,1,08,1.03,62.7,M,8.0,M,,*5B
  char* token = strtok(nmea, ",");
  uint8_t idx = 0;
  while (token != NULL) {
    switch (idx) {
      case 1: rmc->time = atof(token); break;          // UTC时间
      case 2: rmc->latitude = atof(token); break;        // 纬度(ddmm.mmmm)
      case 3: rmc->lat_dir = token[0]; break;            // 纬度方向
      case 4: rmc->longitude = atof(token); break;       // 经度(dddmm.mmmm)
      case 5: rmc->lon_dir = token[0]; break;            // 经度方向
      case 6: break;  // 定位质量
      case 7: break;  // 卫星数
      case 8: break;  // HDOP
      case 9: break;  // 海拔高度
    }
    token = strtok(NULL, ",");
    idx++;
  }
  // 转换经纬度为度(°):ddmm.mmmm → dd + mm.mmmm/60
  rmc->latitude = (int)(rmc->latitude / 100) + (rmc->latitude - (int)(rmc->latitude / 100)*100) / 60.0f;
  if (rmc->lat_dir == 'S') rmc->latitude = -rmc->latitude;
  rmc->longitude = (int)(rmc->longitude / 100) + (rmc->longitude - (int)(rmc->longitude / 100)*100) / 60.0f;
  if (rmc->lon_dir == 'W') rmc->longitude = -rmc->longitude;
}

// GPS任务(解析NMEA数据)
void Task_GPS(void* pvParameters) {
  SystemState* state = (SystemState*)pvParameters;
  char nmea_buf[128];
  NMEA_RMC rmc;
  
  while (1) {
    if (GPS_ReadLine(nmea_buf, sizeof(nmea_buf)) > 0) {  // 读取一行NMEA数据
      if (strstr(nmea_buf, "$GPRMC")) {  // 解析RMC语句
        Parse_RMC(nmea_buf, &rmc);
        state->latitude = rmc.latitude;
        state->longitude = rmc.longitude;
        state->speed = rmc.speed * 1.852f;  // knots→km/h
      } else if (strstr(nmea_buf, "$GPGGA")) {  // 解析GGA语句
        Parse_GGA(nmea_buf, &rmc);
      }
    }
    vTaskDelay(pdMS_TO_TICKS(100));  // 100ms周期
  }
}

(2)4G通信与数据上传(Task_4G,MQTT协议)

功能:通过4G模块(EC200S)连接MQTT服务器,上传位置数据(JSON格式)。

// 4G任务(上传数据至云服务器)
void Task_4G(void* pvParameters) {
  SystemState* state = (SystemState*)pvParameters;
  char mqtt_msg[256];
  cJSON* root;
  
  while (1) {
    if (state->is_moving) {  // 车辆移动时上传数据
      // 1. 构造JSON数据
      root = cJSON_CreateObject();
      cJSON_AddNumberToObject(root, "lat", state->latitude);
      cJSON_AddNumberToObject(root, "lon", state->longitude);
      cJSON_AddNumberToObject(root, "speed", state->speed);
      cJSON_AddNumberToObject(root, "alarm", state->alarm_flag);
      strcpy(mqtt_msg, cJSON_PrintUnformatted(root));
      cJSON_Delete(root);
      
      // 2. 4G模块发送MQTT消息(主题:/vehicle/track)
      EC200S_SendAT("AT+QMTCFG=\"version\",0,4\r\n", 1000);  // 配置MQTT版本3.1.1
      EC200S_SendAT("AT+QMTCONN=0,\"client_id\",\"user\",\"pass\"\r\n", 2000);  // 连接服务器
      EC200S_SendAT("AT+QMTSEND=0,0,%d,\"%s\"\r\n", strlen(mqtt_msg), mqtt_msg);  // 发布消息
      
      // 3. 处理服务器响应(略)
    }
    vTaskDelay(pdMS_TO_TICKS(5000));  // 5秒上传一次
  }
}

(3)低功耗管理(Task_LowPower,Stop模式)

功能:车辆静止时,系统进入Stop模式(电流<5μA),通过RTC或加速度计唤醒。

// 进入Stop模式(RTC唤醒,30秒后)
void Enter_Stop_Mode(void) {
  // 1. 配置RTC(30秒唤醒)
  RTC_AlarmConfig(30);  // 30秒=30×1秒
  
  // 2. 关闭外设时钟(保留RTC、IWDG)
  RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN);
  RCC->APB1ENR &= ~(RCC_APB1ENR_USART1EN | RCC_APB1ENR_USART2EN);
  RCC->APB2ENR &= ~(RCC_APB2ENR_I2C1EN);
  
  // 3. 进入Stop模式(低功耗调压器)
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  
  // 4. 唤醒后恢复系统
  SystemClock_Config();  // 恢复80MHz主频
  MX_GPIO_Init();        // 恢复GPIO
  MX_USART1_Init();      // 恢复USART1(GPS)
  MX_USART2_Init();      // 恢复USART2(4G)
  MX_I2C1_Init();        // 恢复I2C1(MPU6050)
}

// 低功耗任务(判断车辆状态,决定是否进入Stop模式)
void Task_LowPower(void* pvParameters) {
  SystemState* state = (SystemState*)pvParameters;
  while (1) {
    if (!state->is_moving && !state->alarm_flag) {  // 静止且无报警
      Enter_Stop_Mode();  // 进入Stop模式
    }
    vTaskDelay(pdMS_TO_TICKS(1000));  // 1秒检测一次
  }
}

参考代码 GPS定位器车载跟踪器跟踪器电路+APP程序 www.youwenfan.com/contentcns/161120.html

四、系统测试与优化

1. 测试指标

参数 指标 测试方法
定位精度 2.5m(开阔地) 对比专业GPS设备(如Garmin)
数据上传延迟 <10秒(4G网络) 发送数据至服务器,记录时间戳差
待机功耗 <5μA(Stop模式) 万用表串联测量电池电流
续航时间 >24小时(1000mAh电池) 车辆断电后,记录系统工作时间
报警响应时间 <2秒(震动触发) 敲击车辆,记录报警信号发送时间

2. 优化方向

五、总结

本设计基于STM32L431实现了车载GPS跟踪器,通过NEO-6M GPS模块获取位置信息,EC200S 4G模块上传数据,MPU6050加速度计检测车辆状态,结合低功耗管理(Stop模式+动态电源控制),实现长续航、高精度、高可靠的车辆跟踪。系统可扩展为车队管理平台,支持多车监控、电子围栏、油耗统计等功能,为车辆管理提供一站式解决方案。

专注于matlab/simulink,电子电路,编程