【STM32外设系列】GPS定位模块(ATGM336H)
📃个人主页:小韩学长yyds-CSDN博客
⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞
箴言:拥有耐心才是生活的关键
目录
一、引言
二、ATGM336H 模块探秘
2.1 模块特性剖析
2.2 引脚功能与连接方式
三、STM32 基础准备
3.1 STM32 简介与选型
3.2 开发环境搭建
四、代码实现全解析
4.1 串口通信配置
4.2 数据接收与解析
4.3 数据处理与转换
五、实战测试与优化
5.1 实地测试
5.2 问题排查与优化
六、应用拓展与总结
6.1 应用场景拓展
一、引言
在嵌入式开发领域,定位功能已成为众多应用不可或缺的一部分。从智能交通中的车辆导航与追踪,到户外运动设备的轨迹记录,再到物联网设备的位置感知,精准的定位技术为这些应用赋予了更高的价值和实用性。STM32 系列微控制器以其高性能、丰富的外设资源和广泛的应用领域,成为嵌入式开发的热门选择。而 ATGM336H GPS 模块作为一款高性能、低功耗的定位模块,能够提供精确的位置信息。将 STM32 与 ATGM336H GPS 模块相结合,能够开发出功能强大、应用广泛的定位系统,满足不同场景下的定位需求。本文将深入探讨如何基于 STM32 开发板对 ATGM336H GPS 模块进行开发,为相关开发者提供全面的技术参考。
二、ATGM336H 模块探秘
2.1 模块特性剖析
ATGM336H GPS 模块凭借其卓越的特性,在众多定位应用中脱颖而出。它具有高灵敏度的特性,能够快速捕捉卫星信号,实现快速定位,尤其适应户外如山区、城市峡谷等信号遮挡严重、环境复杂多变的场景。即使在微弱的卫星信号条件下,也能稳定地获取定位信息,极大地提升了定位的可靠性。
在功耗方面,ATGM336H 表现出色,属于低功耗模块。这一特性使其特别适合依靠电池供电的设备,如便携式导航仪、可穿戴定位设备等,能够有效延长设备的续航时间,满足长时间户外使用的需求,为用户提供不间断的定位服务。
该模块支持多卫星系统,包括美国的 GPS、中国的北斗(BDS)、俄罗斯的 GLONASS 等 ,这意味着它可以接收多个卫星系统的信号并进行融合处理。多卫星系统的支持显著提高了定位的精度和可靠性,即使在部分卫星信号受到干扰或遮挡的情况下,依然能够通过其他卫星系统实现准确的定位。
此外,ATGM336H 内部集成了高性能嵌入式 CPU,最大位置更新率可达 10Hz,能够快速地处理定位数据,及时更新位置信息。这使得它在对实时性要求较高的应用中,如车辆导航、无人机飞行控制等,能够实时反馈位置变化,确保系统的精准控制和高效运行。它还集成了专有的抗干扰硬件加速电路,可快速检测并抑制射频干扰,保障在复杂电磁环境下仍能稳定工作。
2.2 引脚功能与连接方式
ATGM336H 模块通常有多个引脚,每个引脚都有其特定的功能。其中,VCC 和 GND 引脚分别用于连接电源的正极和负极,为模块提供 2.7V - 3.6V 的工作电压,稳定的电源供应是模块正常工作的基础。TX(发送)和 RX(接收)引脚用于串口通信,通过这两个引脚,模块可以与 STM32 微控制器进行数据传输,将获取到的定位数据发送给 STM32,同时接收 STM32 发送的控制指令 。PPS(秒脉冲)引脚可以输出精确的秒脉冲信号,常用于提供精确的时间戳,或者作为外部中断信号,为系统提供精准的时间参考,在一些对时间精度要求较高的应用中发挥着关键作用。
在将 ATGM336H 模块与 STM32 连接时,硬件接线图如下:将 ATGM336H 的 TX 引脚连接到 STM32 的 RX 引脚,实现数据从模块到微控制器的传输;将 ATGM336H 的 RX 引脚连接到 STM32 的 TX 引脚,以便 STM32 向模块发送指令。VCC 引脚连接到 STM32 的 3.3V 电源输出引脚,GND 引脚与 STM32 的地引脚相连,确保电源的正确接入。若需要使用 PPS 信号,可将 PPS 引脚连接到 STM32 的任意一个 GPIO 引脚上,具体连接的引脚可根据 STM32 的资源使用情况和设计需求来确定。
在连接过程中,有一些注意事项需要牢记。要确保电源的稳定性和纹波系数符合要求,建议采用低纹波的 LDO 电源,将纹波控制在 50mVpp 以内,以避免电源波动对模块工作产生干扰,影响定位精度和稳定性。模块附近应尽量避免走其他频率高、幅度大的数字信号,防止信号干扰。模块下面最好全部以地线填充,这样可以有效减少电磁干扰,提高模块的抗干扰能力。天线接口应尽量靠近模块的 RF 输入引脚,并注意 50 欧姆的阻抗匹配,以保证天线能够高效地接收卫星信号,提升模块的定位性能。
三、STM32 基础准备
3.1 STM32 简介与选型
STM32 是意法半导体公司推出的基于 ARM Cortex-M 内核的 32 位微控制器系列,凭借其出色的性能和丰富的功能,在嵌入式领域应用广泛。该系列具有多个显著特点,首先是高性能,其采用的 ARM Cortex-M 内核,能够提供出色的处理性能和运行速度,以 STM32F4 系列为例,基于 Arm® Cortex-M4 内核,采用意法半导体的 NVM 工艺和 ARTAccelerator,在高达 180 MHz 的工作频率下通过 Flash 存储器执行时,其处理性能达到 225 DMIPS/608 CoreMark,基准测试分数在基于 Cortex-M 内核的微控制器产品中表现突出 ,能够轻松应对复杂的应用程序和任务处理。
丰富的外设资源也是 STM32 系列的一大优势,该系列单片机集成了多个定时器、计数器、PWM 输出、ADC、DAC、通信接口等外设,这些外设为开发人员实现各种不同的应用需求提供了便利。在工业控制应用中,多个定时器和计数器可用于精确的时间控制和计数操作;ADC 和 DAC 外设则能实现模拟信号与数字信号的转换,满足数据采集和控制的需求;SPI、I2C、CAN、USART 等通信接口,使得 STM32 能够与其他设备或模块进行高效的通信,便于构建复杂的系统。
在功耗方面,STM32 系列表现出色,采用了先进的低功耗技术,在不降低性能的前提下有效降低了功耗,这使得它们非常适合需要长时间运行或依靠电池供电的设备,如可穿戴设备、物联网节点等,能够延长设备的续航时间,满足实际应用中的需求。
此外,STM32 还提供了丰富的软件和硬件工具,助力开发者快速开发嵌入式应用程序。STM32CubeMX 是一款图形化配置工具,可帮助开发者快速生成初始化代码和配置文件,大大缩短了开发周期;HAL 库作为硬件抽象层库,为开发者提供了一组可重用的 API,加速了开发流程,提高了代码的重用性;STM32CubeIDE 则是一款集成开发环境,包含调试器和代码生成器,方便开发者进行嵌入式系统的开发、调试和测试 。
针对本次与 ATGM336H GPS 模块的开发项目,选型为 STM32F103 系列。这是因为该项目对微控制器的处理能力有一定要求,需要能够及时处理 GPS 模块传来的定位数据,STM32F103 系列基于 Cortex-M3 内核,具备不错的处理性能,能够满足数据处理的需求。在通信接口方面,项目需要与 GPS 模块进行串口通信,STM32F103 系列丰富的通信接口,包含 USART 串口通信接口,能够轻松实现与 GPS 模块的数据交互。同时,考虑到成本因素,STM32F103 系列价格较为亲民,在满足项目功能需求的同时,能够有效控制成本,提高项目的性价比。
3.2 开发环境搭建
开发环境的搭建是项目开发的重要基础,这里主要介绍 CubeMX 和 Keil 这两款常用开发工具的安装与配置。
STM32CubeMX 是一款功能强大的图形化配置工具,在安装之前,需要先确保计算机上安装了 Java 运行环境 JRE,若未安装,可从 Oracle 官方网站下载并安装。下载 STM32CubeMX 时,可前往 ST 官方网站,找到对应的下载链接,根据计算机系统选择合适的版本进行下载。下载完成后,双击安装程序,按照安装向导的提示进行安装。在安装过程中,需注意安装目录不能包含汉字、空格以及非下划线的其他特殊符号,建议在磁盘根目录下新建一个专门的文件夹用于安装,如 “D:\\STM32Dev\\STM32CubeMX”。安装完成后,首次启动 STM32CubeMX,需要设置软件库文件夹,作为 MCU 固件包和 STM32 扩展包的安装目录。点击菜单栏 “Help” -> “Updater Settings...”,在弹出的对话框中设置 “Repository Folder”,例如 “D:\\STM32Dev\\Repository” 。之后,可通过点击菜单栏 “Help” -> “Manage embedded software packages”,进入嵌入式软件包管理对话框,安装所需的 MCU 固件包和扩展包,如针对 STM32F103 系列的固件包。
Keil 是一款广泛使用的集成开发环境,对于 STM32 开发,通常下载 MDK-Arm 版本。可从 Keil 官方网站下载安装包,下载完成后,双击安装程序开始安装。在安装过程中,首先会出现许可协议界面,勾选 “I agree to all the terms of the preceding License Agreement” 表示同意协议,然后点击 “Next”。接下来需要配置安装路径,建议选择一个磁盘空间充足且路径简单的文件夹,如 “C:\\Keil_v5”,同时设置 Pack 的安装路径,可与安装路径保持一致。之后填写软件信息,这部分信息可随意填写,填写完成后点击 “Next”,软件开始安装,期间可能会出现安装 Ulink 驱动的提示,点击安装即可,安装完成后点击 “Finish”。安装完成后,还需要进行破解操作。以管理员身份运行 “C:\\Program Files\\Keil\\Keil_v5\\UV4\\UV4.exe”,打开 Keil 软件,点击顶部菜单栏 “File” -> “License Management”,复制 “Computer ID”。打开破解工具 keygen_new2032.exe,将 “Computer ID” 粘贴到破解工具相应位置,点击生成,然后将生成的 “code” 码复制,粘贴到 Keil 软件的 “Add LIC” 位置并点击,完成破解 。
完成安装和破解后,还需对 Keil 进行一些基本设置。若打开工程后界面显示模糊,可在属性中勾选两个 DPI 设置来解决;若界面文字出现乱码或太小,可通过以管理员方式打开 Keil,修改 “Edit” -> “Configuration” 下的编码格式为 GB2312,Tab 大小为 4 来调整。
四、代码实现全解析
4.1 串口通信配置
利用 CubeMX 进行 STM32 的串口配置是一种便捷高效的方式。打开 CubeMX 软件并创建新工程,在器件选择界面中找到 STM32F103 系列对应的具体型号,点击 “Start Project” 进入工程配置界面。
在 “Pinout & Configuration” 页面,从左侧的外设列表中找到 “USART” 外设 ,通常用于 UART 通信。这里选择需要与 ATGM336H 模块连接的串口,如 USART1。激活该外设,将 “Mode” 设置为 “Asynchronous”(异步通信模式),这种模式无需同步时钟信号,简单易用,适合大多数串口通信场景 。在 “Parameter Settings” 中,对串口参数进行详细设置。将 “Baud Rate”(波特率)设置为 9600,这是 ATGM336H 模块常用的波特率,确保与模块的通信速率一致;“Word Length”(数据位)选择 “8 Bits”,表示每个数据帧包含 8 位数据;“Stop Bits”(停止位)设置为 “1 Bit”,即每个数据帧后跟随 1 位停止位;“Parity”(校验位)选择 “None”,表示不进行奇偶校验,这样可以简化通信过程,提高数据传输效率 。同时,开启接收和发送功能,确保数据能够双向传输。
在 “NVIC Settings” 中,勾选 “USART1 global interrupt” 并使能,这样当有数据接收或发送完成等事件发生时,会触发中断,以便及时处理串口数据 。配置完成后,点击 “Project” -> “Generate Code” 生成代码。生成的代码中包含了串口初始化的相关函数,如MX_USART1_UART_Init(void),在这个函数中,通过HAL_UART_Init(&huart1)函数完成了串口参数的初始化配置,使 STM32 的串口能够按照设定的参数与 ATGM336H 模块进行通信 。以下是部分生成的串口初始化代码示例:
static void MX_USART1_UART_Init(void){huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}}
4.2 数据接收与解析
数据接收采用中断方式,当中断触发时,进入中断服务函数USART1_IRQHandler(void)。在该函数中,首先通过HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer, 1)函数接收一个字节的数据,并将其存储在rx_buffer数组中 。然后判断接收到的数据是否为\'$\',如果是,则表示可能是一帧新的 NMEA 协议数据的开始,将接收数据的索引rx_index清零,准备接收新的数据帧 。接着继续接收数据,并将其存储在rx_buffer数组中,直到接收到换行符\'\\n\',表示一帧数据接收完毕 。
NMEA 协议数据帧包含了丰富的定位信息,不同类型的数据帧以不同的标识符开头。以$GPRMC数据帧为例,它包含了 UTC 时间、定位状态、纬度、经度、速度等信息 。解析$GPRMC数据帧时,首先找到数据帧中各个数据字段的起始位置,通过逗号分隔符来确定每个字段的边界 。例如,定位状态字段是数据帧中的第二个字段,通过查找第一个逗号后的位置,再查找下一个逗号的位置,即可确定定位状态字段的范围 。然后使用字符串处理函数,如strncpy将该字段的内容复制到一个临时字符串中,再使用atoi或atof函数将其转换为相应的数据类型 。纬度和经度字段的处理类似,但需要注意它们的格式为 “度分。分”,后续还需要进行格式转换才能得到常用的十进制格式的经纬度 。下面是一个简单的中断服务函数和数据解析代码示例:
uint8_t rx_buffer[256];uint8_t rx_index = 0;void USART1_IRQHandler(void){ if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) { HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer[rx_index], 1); if(rx_buffer[rx_index] == \'$\') { rx_index = 0; } else if(rx_buffer[rx_index] == \'\\n\') { rx_buffer[rx_index + 1] = \'\\0\'; // 数据解析 if(strstr((char *)rx_buffer, \"$GPRMC\") != NULL) { char *token = strtok((char *)rx_buffer, \",\"); int i = 0; while(token != NULL) { if(i == 2) // 定位状态 { if(strcmp(token, \"A\") == 0) { // 定位有效 } else { // 定位无效 } } else if(i == 3) // 纬度 { // 存储纬度数据 } else if(i == 5) // 经度 { // 存储经度数据 } token = strtok(NULL, \",\"); i++; } } rx_index = 0; } else { rx_index++; if(rx_index >= sizeof(rx_buffer) - 1) { rx_index = 0; } } }}
4.3 数据处理与转换
ATGM336H 模块输出的经纬度数据格式为 “度分。分”,需要将其转换为常用的十进制格式 “度。度” 。转换算法如下:首先将 “度分。分” 格式的数据中,小数点前的两位数作为度数,将小数点后的数字作为分数部分 。然后将分数部分除以 60,再加上度数部分,即可得到十进制格式的经纬度 。例如,对于纬度数据 “3920.1234”,首先提取出度数部分为 39,分数部分为 20.1234,计算 (20.1234 / 60) + 39 = 39.33539,得到十进制格式的纬度 。
在代码实现方面,假设接收到的纬度数据存储在latitude_str字符串中,经度数据存储在longitude_str字符串中,转换代码如下:
#include #include #include float convert_to_decimal(char *str){ float degrees, minutes; sscanf(str, \"%f\", °rees); minutes = fmod(degrees, 100); degrees = floor(degrees / 100); return degrees + (minutes / 60);}// 在主程序或其他合适的地方调用char latitude_str[10] = \"3920.1234\";char longitude_str[10] = \"11623.4567\";float latitude_decimal = convert_to_decimal(latitude_str);float longitude_decimal = convert_to_decimal(longitude_str);
通过上述转换,得到的latitude_decimal和longitude_decimal即为常用的十进制格式的经纬度,可以方便地应用于地图显示、位置计算等场景 。
五、实战测试与优化
5.1 实地测试
为了全面评估基于 STM32 和 ATGM336H GPS 模块的定位系统性能,我们进行了一系列实地测试,测试地点涵盖了多种不同的户外场景,包括空旷广场、城市街道以及树木繁茂的公园,以模拟不同程度的信号遮挡和干扰情况。
在空旷广场的测试中,模块能够迅速捕获到多颗卫星的信号。经过长时间的数据记录,共记录了 100 组定位数据,平均定位时间约为 5 秒,水平定位精度大多稳定在 2 - 3 米之间,这表明在无遮挡的理想环境下,该模块能够快速且精准地定位。
在城市街道场景中,由于周围建筑物的遮挡和反射,信号受到了一定程度的干扰。在测试过程中,收集了 80 组有效数据,定位时间有所延长,平均约为 8 秒,水平定位精度在 5 - 8 米左右波动。这是因为建筑物会阻挡卫星信号,导致信号传播延迟和多路径效应,从而影响了定位的准确性和速度。
而在树木繁茂的公园中,测试环境对信号的影响更为显著。树叶对卫星信号有一定的衰减作用,在获取的 70 组数据中,平均定位时间达到了 10 秒,水平定位精度也下降到了 8 - 10 米。
通过对不同场景下的测试数据进行分析,我们可以清晰地看到,环境因素对 ATGM336H 模块的定位性能有着明显的影响。随着信号遮挡和干扰的增加,定位时间变长,定位精度下降。这些测试结果为后续的优化工作提供了重要的数据支持,有助于我们针对性地采取措施,提高定位系统在复杂环境下的性能。
5.2 问题排查与优化
在测试过程中,我们遇到了一些常见问题,针对这些问题进行了深入的排查与分析,并提出了相应的优化方法和代码改进思路。
信号丢失是较为常见的问题之一,其可能是由多种原因导致的。当卫星信号受到严重遮挡时,比如在高楼林立的城市峡谷中,信号无法有效传播到模块,就容易出现信号丢失的情况;电磁干扰也可能影响信号的接收,附近的强电磁源,如通信基站、变电站等,会对卫星信号产生干扰,导致信号质量下降甚至丢失。为解决这一问题,硬件方面,我们可以优化天线的布局和安装位置,将天线放置在尽可能开阔、无遮挡的位置,远离金属物体和电磁干扰源。在代码方面,可以增加信号丢失检测机制,当检测到信号丢失时,及时记录时间和位置信息,并尝试重新初始化 GPS 模块,以恢复信号接收。例如,在主循环中添加如下代码:
if (signal_lost_flag){ // 记录信号丢失时间和位置 log_signal_lost(time, latitude, longitude); // 重新初始化GPS模块 atgm336h_reset(); signal_lost_flag = 0;}
定位不准确也是一个关键问题,可能的原因包括定位算法的局限性、卫星信号传播延迟以及数据解析错误等。不同的定位算法在不同的环境下表现各异,某些算法在复杂环境下可能无法准确计算位置;卫星信号在传播过程中,会受到大气层等因素的影响,导致传播延迟,从而产生定位误差;数据解析过程中,如果算法不够健壮,遇到异常数据格式可能会导致解析错误,进而影响定位准确性。为提升定位精度,在算法优化方面,可以采用更先进的定位算法,如卡尔曼滤波算法,它能够综合考虑多个测量值,对位置进行更准确的估计。代码实现时,可引入卡尔曼滤波库,在数据处理阶段对经纬度数据进行滤波处理:
#include \"kalman_filter.h\"KalmanFilter lat_kf, lon_kf;// 初始化卡尔曼滤波器kalman_filter_init(&lat_kf, initial_latitude, latitude_error);kalman_filter_init(&lon_kf, initial_longitude, longitude_error);// 在数据处理中应用卡尔曼滤波latitude = kalman_filter_update(&lat_kf, raw_latitude);longitude = kalman_filter_update(&lon_kf, raw_longitude);
同时,在数据解析部分,增加对数据的校验和纠错机制,确保解析的数据准确无误。例如,对 NMEA 协议数据帧进行校验和计算,验证数据的完整性:
// 计算NMEA数据帧的校验和uint8_t calculate_checksum(char *data){ uint8_t checksum = 0; char *p = data; while (*p != \'*\') { if (*p == \'$\') { p++; continue; } checksum ^= *p; p++; } return checksum;}// 校验NMEA数据帧if (calculate_checksum(rx_buffer) == atoi(&rx_buffer[strlen(rx_buffer) - 2])){ // 数据校验通过,进行解析 parse_gps_data(rx_buffer);}else{ // 数据校验失败,丢弃该帧数据}
通过上述硬件和软件方面的优化措施,可以有效解决信号丢失和定位不准确等问题,提高基于 STM32 和 ATGM336H GPS 模块的定位系统的性能和可靠性。
六、应用拓展与总结
6.1 应用场景拓展
在物联网领域,将 STM32 与 ATGM336H GPS 模块相结合,可以实现资产追踪与管理。在物流行业,通过在货物运输车辆和集装箱上安装该定位系统,企业能够实时获取货物的位置信息,优化运输路线,提高物流效率,减少货物丢失和延误的风险 。对于一些贵重资产,如机械设备、电子设备等,也可以利用该系统进行实时定位和监控,确保资产的安全。
在智能交通领域,除了车辆导航和追踪,还可以用于智能停车场管理。通过在停车场入口和出口安装带有 GPS 模块的设备,结合 STM32 的处理能力,系统可以实时监测车辆的进出情况,自动分配停车位,并引导车辆前往指定车位。这不仅提高了停车场的管理效率,还能为用户提供更加便捷的停车体验 。此外,在自动驾驶技术中,精确的定位是实现自动驾驶的关键要素之一,STM32 与 ATGM336H 的组合可以为自动驾驶车辆提供基础的位置信息,与其他传感器数据融合,实现车辆的精准控制和导航 。
结语
🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~