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

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模块接口电路
NEO-6M连接:TXD接STM32的PA9(USART1_RX),RXD接PA10(USART1_TX),波特率9600bps,VCC=3.3V,GND接地;
天线设计:采用陶瓷有源天线(增益3dBi),通过50Ω同轴线连接,避免金属屏蔽。
(2)4G通信模块接口电路
EC200S连接:TXD接PA2(USART2_RX),RXD接PA3(USART2_TX),波特率115200bps,VCC=3.3V(需加100μF电容滤波);
SIM卡接口:6针SIM卡槽(VCC、RST、CLK、IO、GND),加ESD保护器件(如PRTR5V0U2X)。
(3)低功耗电源管理电路
车辆电源输入:12V经防反接二极管(1N5822) 和保险丝(2A) 接入LM2596,输出5V;
备用电池切换:通过MOS管(AO3400) 实现车辆电源/电池自动切换,优先使用车辆电源;
外设分时供电:GPS/4G模块通过PNP三极管(S8550) 控制VCC,非工作时断电(电流<1μA)。
三、软件设计(C语言实现,基于STM32 HAL库)
1. 开发环境
IDE:STM32CubeIDE(V1.13.0)
库:STM32 HAL库(V1.11.0)、FreeRTOS(低功耗任务调度)、cJSON(数据格式解析)
协议:NMEA-0183(GPS数据)、MQTT 3.1.1(4G通信)、AT指令(4G模块控制)
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/contentali/161120.html
四、系统测试与优化
1. 测试指标
| 参数 | 指标 | 测试方法 |
|---|---|---|
| 定位精度 | 2.5m(开阔地) | 对比专业GPS设备(如Garmin) |
| 数据上传延迟 | <10秒(4G网络) | 发送数据至服务器,记录时间戳差 |
| 待机功耗 | <5μA(Stop模式) | 万用表串联测量电池电流 |
| 续航时间 | >24小时(1000mAh电池) | 车辆断电后,记录系统工作时间 |
| 报警响应时间 | <2秒(震动触发) | 敲击车辆,记录报警信号发送时间 |
2. 优化方向
定位增强:集成北斗模块(如ATGM332D),支持多系统联合定位(GPS+北斗),提高复杂环境定位精度;
通信优化:采用MQTT over TLS加密传输,增加重传机制(3次重发),确保数据可靠性;
低功耗优化:4G模块启用PSM模式(省电模式,电流<5μA),GPS模块非必要时关闭;
功能扩展:添加OBD-II接口,读取车辆故障码、油耗等数据,丰富监控内容。
五、总结
本设计基于STM32L431实现了车载GPS跟踪器,通过NEO-6M GPS模块获取位置信息,EC200S 4G模块上传数据,MPU6050加速度计检测车辆状态,结合低功耗管理(Stop模式+动态电源控制),实现长续航、高精度、高可靠的车辆跟踪。