一、前言
项目介绍:本项目旨在设计和开发一个基于GP-02 GPS模块的定位系统,能够实现高精度的实时地理位置跟踪。GP-02模块以其高灵敏度和低功耗为特点,非常适合应用在需要长时间运行和高可靠性的场景。该系统将结合物联网(IoT)技术,广泛应用于智能交通、物流跟踪、个人定位及救援等领域。结合单片机获取当前的经纬度信息。
设计思路:参考安可信的GP-02_kit开发板设计,增加锂电池供电、开关等部分。
框图介绍:
二、原理图及PCB介绍
系统供电采用的是ADI的ADP150AUJZ-3.3,一端接锂电池,一端输出稳压输出的3V3,用于供电给其它低电压元件。3个电容用于平滑来自电源的高频噪声和瞬态波动,防止不稳定的输入电压影响稳压器的正常工作。它可以消除输入电源中的高频干扰,使输入电压更加平滑和稳定。输出电容能够滤除输出电压中的波动和噪声,使得稳压后的输出电压更加平稳。特别是应对负载变化时,它可以帮助减少电压波动,确保3.3V电压稳定供给负载。EN端直接连接VCC自动启动。
ADP150AUJZ-3.3
ADP150AUJZ-3.3是ADI的一款超低噪声、150 mA CMOS线性调节器,ADP150是一款超低噪声(9 μV)、低压差线性调节器,采用2.2 V至5.5 V电源供电,最大输出电流为150 mA。驱动150 mA负载时压差仅为105 mV,这种低压差特性不仅可提高效率,而且能使器件在很宽的输入电压范围内工作。
- 超低噪声:9 μV rms,独立于VOUT
- 无需额外噪声旁路电容
- 在1 μF陶瓷输入和输出电容下稳定工作
- 最大输出电流:150 mA
- 输入电压范围:2.2 V至5.5 V
- 低静态电流
- IGND = 10 μA(空载)
- 低关断电流:<1 μA
- 低压差:105 mV(150 mA负载)
- 初始输出电压精度:±1%
- 多达14种固定输出电压选项:1.8 V至3.3 V
- PSRR性能:70 dB (10 kHz)
- 限流和热过载保护
- 逻辑控制使能
- 5引脚TSOT封装
- 4引脚、0.8 mm × 0.8 mm、0.4 mm间距WLCSP
- 通过AEC-Q100汽车应用认证
这个电路的主要目的是为 GP-02 GPS 模块 提供稳定的3.3V电源,GP-02 GPS模块是这个电路的核心组件,负责接收卫星信号并处理位置信息,并通过UART接口与主控设备通信。天线电路用于接收GPS信号,滤波电容确保供电稳定性,串行通信引脚允许模块将GPS数据传递给主控设备。
GP-02:
GP-02 是一款高性能 BDS/GNSS 多模卫星导航接收机SOC模块,集成了射频前端,数字基带处理器,32 位的 RISC CPU,电源管理和有源天线检测与保护功能。支持多种卫 星导航系统,包括中国的北斗卫星导航系统 BDS,美国的 GPS,俄罗斯的GLONASS,可实现多系统联合定位。GP-02是安信可科技基于中科微最新一代自主研发的射频基带一体化导航 SoC 芯片自主研发的模组,具有低功耗,小体积等特点,首次支持 BDS+GPS 双模联合定位,是终端设备替代单 GPS 模块,或增加北斗定位功能的最佳选择。可支持客户在 tracker,OBD,定位手环,校园卡等智能设备中升级多模定位功能。
1:小尺寸 9.7mm*10.1mm(GP-02)
2:芯片采用 55nm 工艺,QFN 40pin封装,尺寸 5mm*5mm*0.8mm
3:18mA 超低功耗
4:集成射频、基带与Flash
5:支持 BDS/GPS 联合定位
6:支持 A-GPS、A-BDS
7:片上 LNA:1.5dB 噪声系数
8:电源管理:CPU 自动休眠,运行过程中自动降低功耗;支持2.7-3.6V 电源供电,推荐3.3V;RTC 和备份电路电源可低至 1.5V
9:丰富的外设接口:2个独立的 UART 接口;2个独立的 SPI 接口;1个 I2C 接口。模块上电直接从串口读取数据。
10:工作温度:-40°C~85°C
STM32F103C8T6:
STM32F103C8T6是意法半导体的一款主流高性能系列Arm Cortex-M3 MCU,配有64 KB Flash存储器,72 MHz CPU,电机控制,USB和CAN。
- Arm®32位Cortex®-M3 CPU内核
- 最大频率72 MHz,以零等待周期访问存储器时的性能达1.25 DMIPS/MHz (Dhrystone 2.1)
- 单周期乘法和硬件除法指令
- 2个12位1 μs A/D转换器(多达16通道)
- 转换范围:0 V至3.6 V
- 双采样和保持功能
- 温度传感器
- DMA
- 7通道DMA控制器
- 支持的外设包括:定时器、ADC、SPI、I2C和USART
- 7个定时器
- 3个16位定时器,每个定时器有多达4个用于IC/OC/PWM或脉冲计数的通道和正交增量编码器输入
- 用于电机控制的16位PWM定时器,带死区生成和紧急停止功能
- 2个看门狗定时器(独立看门狗和窗口看门狗)
- SysTick定时器24位递减计数器
- 通信接口多达9个
- 多达2个I2C接口 (SMBus/PMBus®)
- 多达3个USART(ISO 7816接口、LIN、IrDA功能、调制解调器控制)
- 多达2个SPI (18 Mbit/s)
- CAN接口(2.0B当前最新)
- USB 2.0全速接口
- CRC计算单元,96位唯一ID
三、成品功能测试
PCB预览图:
板卡焊接之后装配完成的样子:
关键代码及说明:
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
usart3_init(9600); //串口初始化为9600
while(1)
{
delay_ms(1);
if(USART3_RX_STA&0X8000) //接收到一次数据了
{
USART3_RX_STA=0; //启动下一次接收
NMEA_GNRMC_Analysis(&gpsx,(u8*)USART3_RX_BUF);
GPS_Data.longitude=(float)((float)gpsx.longitude/100000);
GPS_Data.latitude=(float)((float)gpsx.latitude/100000);
GPS_Data.N_S=((char)gpsx.nshemi);
GPS_Data.E_W=((char)gpsx.ewhemi);
printf("Longitude: %f%c, Latitude: %f%c\r\n",GPS_Data.longitude,GPS_Data.E_W,GPS_Data.latitude,GPS_Data.N_S);
}
}
}
主程序部分主要是实现了一个持续接收和解析 GPS 数据的程序。首先,调用 delay_init() 初始化延时函数,以确保可以在需要时产生延时。接着是串口的初始化,进入while循环,代码通过 delay_ms(1) 产生了 1 毫秒的延时,防止 CPU 过度忙碌,同时在循环中检查 USART3_RX_STA 状态变量,如果高位被设置,表示接收到了一次完整的数据。接着,重置接收状态 USART3_RX_STA = 0 为下一次接收做准备。随后,调用 NMEA_GNRMC_Analysis(&gpsx, (u8 *)USART3_RX_BUF) 函数解析接收到的 NMEA GNRMC 数据,将数据解析到 gpsx 结构中。经纬度数据会通过 (float)((float)gpsx.longitude / 100000) 和 (float)((float)gpsx.latitude / 100000) 转换为十进制度数,还解析了南北半球和东西半球的信息,存储在 GPS_Data.N_S 和 GPS_Data.E_W 变量中。最后,使用 printf 将解析后的经纬度及其半球信息输出到控制台或串口,以便调试和实时显示 GPS 数据。
void NMEA_GNRMC_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p1,dx;
u8 posx;
u32 temp;
float rs;
p1=(u8*)strstr((const char *)buf,"$GNRMC");//"$GNRMC",经常有&和GNRMC分开的情况,故只判断GPRMC.
posx=NMEA_Comma_Pos(p1,3); //得到纬度
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx);
gpsx->latitude=temp/NMEA_Pow(10,dx+2); //得到°
rs=temp%NMEA_Pow(10,dx+2); //得到'
gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为°
}
posx=NMEA_Comma_Pos(p1,4); //南纬还是北纬
if(posx!=0XFF)gpsx->nshemi=*(p1+posx);
posx=NMEA_Comma_Pos(p1,5); //得到经度
if(posx!=0XFF)
{
temp=NMEA_Str2num(p1+posx,&dx);
gpsx->longitude=temp/NMEA_Pow(10,dx+2); //得到°
rs=temp%NMEA_Pow(10,dx+2); //得到'
gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为°
}
posx=NMEA_Comma_Pos(p1,6); //东经还是西经
if(posx!=0XFF)gpsx->ewhemi=*(p1+posx);
}
这段代码用于解析GNRMC信息,整个函数的主要作用是从 NMEA $GNRMC 数据中提取并解析出经度、纬度、南北半球和东西半球的信息,并将这些信息存入 gpsx 结构体中,以便于后续的处理和使用。通过这种方式,程序能够利用 GPS 数据进行位置计算、导航等功能。
出现的两个问题,一个是GPS在室内是获取不了定位数据的,只能去室外。二是锂电池接口的封装方向反了,手上的锂电池与锂电池接口方向不一致,所以只能换个方向。
四、活动总结
感谢举办方举办的FastBond活动。通过参加这次活动,将脑海中的想法制作成实物了,有了这个GP-02模块,妈妈再也不用担心我迷路了。之后也打算将这个模块集成到自己设计的开发板上,实现关于定位更加复杂的功能,完成一个更加复杂的项目。FastBond活动具有较高的自由度,能够充分激发个人的想象力与创造力,进行多元化的创作。同时,这也对参与者的知识储备提出了全面要求,让我们能够在实践中融会贯通,将理论与实际结合起来,同时希望有更多的朋友一起加入进来,分享更多的项目。