logo资料库

ATK-NEO-6M GPS模块使用说明(探索者F4)_AN1409A.pdf

第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
资料共23页,剩余部分请下载后查看
AN1409A ATK-NEO-6M GPS模块使用
1、ATK-NEO-6M GPS模块简介
2、硬件连接
3、软件实现
4、验证
AN1409A ATK-NEO-6M GPS 模块使用 本应用文档(AN1409A,对应探索者 STM32F407 开发板扩展实验 2)将教大家如何在 ALIENTEK 探索者 STM32F407 开发板上使用 ATK-NEO-6M GPS 模块,并实现 GPS 定位。 本文档分为如下几部分: 1, ATK-NEO-6M GPS 模块简介 2, 硬件连接 3, 软件实现 4, 验证 1、ATK-NEO-6M GPS 模块简介 ATK-NEO-6M-V23 模块,是 ALIENTEK 生产的一款高性能 GPS 模块,模块核心采用 UBLOX 公司的 NEO-6M 模组,具有 50 个通道,追踪灵敏度高达-161dBm,测量输出频率最高可达 5Hz。ATK-NEO-6M-V23 模块具有以下特点: 1, 模块采用 U-BLOX NEO-6M 模组,体积小巧,性能优异。 2, 模块自带陶瓷天线及 MAXIM 公司 20.5dB 高增益 LNA 芯片,搜星能力强。 3, 模块可通过串口进行各种参数设置,并可保存在 EEPROM,使用方便。 4, 模块自带 IPX 接口,可以连接各种有源天线,适应能力强。 5, 模块兼容 3.3V/5V 电平,方便连接各种单片机系统。 6, 模块自带可充电后备电池,可以掉电保持星历数据 1。 注 1:在主电源断开后,后备电池可以维持半小时左右的 GPS 星历数据的保存,以支持温启动或热启 动,从而实现快速定位。 ATK-NEO-6M 模块非常小巧(25.5mm*31mm),模块通过 5 个 2.54mm 间距的排针与外 部连接,模块外观如图 1.1 所示: 图 1.1 ATK-NEO-6M 模块外观图 图 1.1 中,从右到左,依次为模块引出的 PIN1~PIN5 脚,各引脚的详细描述如表 1.1 所 www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
示: 序号 1 2 3 4 5 名称 PPS RXD TXD GND VCC 时钟脉冲输出脚 说明 模块串口接收脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 TXD 模块串口发送脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 RXD 地 电源(3.3V~5.0V) 表 1.1 ATK-NEO-6M 模块各引脚功能描述 其中,PPS 引脚同时连接到了模块自带了的状态指示灯:PPS,该引脚连接在 UBLOX NEO-6M 模组的 TIMEPULSE 端口,该端口的输出特性可以通过程序设置。PPS 指示灯(即 PPS 引脚),在默认条件下(没经过程序设置),有 2 个状态: 1, 常亮,表示模块已开始工作,但还未实现定位。 2, 闪烁(100ms 灭,900ms 亮),表示模块已经定位成功。 这样,通过 PPS 指示灯,我们就可以很方便的判断模块的当前状态,方便大家使用。 另外,图 1.1 中,左上角的 IPX 接口,可以用来外接一个有源天线,从而进一步提高模 块的接收能力,通过外接有源天线,我们就可以把模块放到室内,天线放到室外,实现室内 定位。 ATK-NEO-6M 模块默认采用 NMEA-0183 协议输出 GPS 定位数据,并可以通过 UBX 协议 对模块进行配置,NMEA-0183 协议详细介绍请参考《ATK-NEO-6M 用户手册.pdf》,UBX 配置 协议,请参考《u-blox6_ReceiverDescriptionProtocolSpec_GPS.G6-SW-10018-C.pdf》。 通过 ATK-NEO-6M GPS 模块,任何单片机(3.3V/5V 电源)都可以很方便的实现 GPS 定位, 当然他也可以连接电脑,利用电脑软件实现定位。ATK-NEO-6M-V23 GPS 模块的原理图如图 1.2 所示: 图 1.2 ATK-NEO-6M GPS 模块原理图 2、硬件连接 本实验功能简介:通过串口 3 连接 ATK-NEO-6M GPS 模块,然后通过液晶显示 GPS 信息, 包括精度、纬度、高度、速度、用于定位的卫星数、可见卫星数、UTC 时间等信息。同时, www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
可以通过 USMART 工具,设置 GPS 模块的刷新速率(最大支持 5Hz 刷新)和时钟脉冲的配 置。另外,通过 KEY0 按键,可以开启或关闭 NMEA 数据的上传(即输出到串口 1,方便开 发调试)。 所要用到的硬件资源如下: 1, 指示灯 DS0 2, KEY0 按键 3, 串口 1、串口 3 4, TFTLCD 模块 5, ATK-NEO-6M GPS 模块 接下来,我们看看 ATK-NEO-6M GPS 模块同 ALIENTEK 探索者 STM32F407 开发板的连接, 前面我们介绍了 ATK-NEO-6M 模块的接口,探索者 STM32F407 开发板有 ATK MODULE 接口, ATK-NEO-6M GPS 模块可以直接插到该接口实现与开发板的连接。 ATK MODULE 接口同开发板主芯片的连接原理图如图 2.1 所示: 图 2.1 ATK-MODULE 接口与 MCU 连接关系 GPS 的串口将连接在探索者 STM32F407 开发板的串口 3 上面(需要用跳线帽短接 P10 的 USART3_RX 和 GBC_TX 以及 USART3_TX 和 GBC_RX),且 GPS 的 PPS 信号接接在 GBC_KEY 信号上面。探索者 STM32F407 开发板与 ATK-NEO-6M GPS 模块的连接关系如表 2.1 所示:: ATK-NEO-6M GPS 模块与开发板连接关系 ATK-NEO-6M GPS 模块 探索者 STM32F407 开发板 VCC 5V GND TXD RXD GND PB11 PB10 PPS PF6 表 2.1 ATK-NEO-6M 模块同探索者 STM32F407 开发板连接关系表 使用时,我们只需要将 ATK-NEO-6M GPS 模块插入到开发板的 ATK-MODULE 接口(靠下 插)即可,如图 2.2 所示: www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
图 2.2 ATK-NEO-6M GPS 模块与探索者开发板对接实物图 注意,我们虽然将 PPS 连接到了开发板的 PF6,但是本例程并没有用到 PPS 信号,所以 没做处理。注意,连接好之后,记得检查开发板 P10 的跳线帽哦!!必须短接:USART3_RX 和 GBC_TX 以及 USART3_TX 和 GBC_RX。 可以看出,模块与开发板的连接是很简单,不过这里特别提醒大家: 1, 请把 GPS 模块放到窗户边/阳台,否则可能收不到 GPS 信号。 2, 如果想在室内开发,可以自备有源天线,将天线放外面,模块放室内,亦可实现定 位。也可以考虑使用 ALIENTEK 提供的蓝牙串口模块(ATK-HC05)一对,这样,我 们可以将 GPS 放到户外/窗口,而仍然在室内进行程序的调试开发。 3、软件实现 本实验,我们在探索者 STM32F407 开发板扩展实验 1:ATK-HC05 蓝牙串口模块实验 的基础上修改,本例程用不到蓝牙模块,所以先删掉 hc05.c。 然后,在 HARDWARE 文件夹里面新建一个 GPS 文件夹,并新建 gps.c,gps.h 两个文 件。然后在工程 HARDWARE 组里面添加 gps.c,并在工程添加 gps.h 的头文件包含路径。 在 gps.c 里面,我们输入如下代码: #include "gps.h" #include "led.h" #include "delay.h" #include "usart3.h" #include "stdio.h" #include "stdarg.h" #include "string.h" #include "math.h" //从 buf 里面得到第 cx 个逗号所在的位置 //返回值:0~0XFE,代表逗号所在位置的偏移. // 0XFF,代表不存在第 cx 个逗号 u8 NMEA_Comma_Pos(u8 *buf,u8 cx) www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
{ u8 *p=buf; while(cx) { if(*buf=='*'||*buf<' '||*buf>'z')return 0XFF; //遇到'*'或者非法字符,则不存在第 cx 个逗号 if(*buf==',')cx--; buf++; } return buf-p; } //m^n 函数 //返回值:m^n 次方. u32 NMEA_Pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //str 转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num(u8 *buf,u8*dx) { u8 *p=buf; u32 ires=0,fres=0; u8 ilen=0,flen=0,i; u8 mask=0; int res; while(1) //得到整数和小数的长度 { if(*p=='-'){mask|=0X02;p++;}//是负数 if(*p==','||(*p=='*'))break;//遇到结束了 if(*p=='.'){mask|=0X01;p++;}//遇到小数点了 else if(*p>'9'||(*p<'0')) //有非法字符 { ilen=0; flen=0; break; } if(mask&0X01)flen++; else ilen++; p++; www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
} if(mask&0X02)buf++; for(i=0;i5)flen=5; //最多取 5 位小数 //小数点位数 *dx=flen; for(i=0;isvnum=NMEA_Str2num(p1+posx,&dx); for(i=0;islmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //得到卫星编号 else break; posx=NMEA_Comma_Pos(p1,5+j*4); if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx); //得到卫星仰角 else break; posx=NMEA_Comma_Pos(p1,6+j*4); if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx); www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
//得到卫星方位角 else break; posx=NMEA_Comma_Pos(p1,7+j*4); if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //得到卫星信噪比 else break; slx++; } p=p1+1;//切换到下一个 GPGSV 信息 } } //分析 GPGGA 信息 //gpsx:nmea 信息结构体 //buf:接收到的 GPS 数据缓冲区首地址 void NMEA_GPGGA_Analysis(nmea_msg *gpsx,u8 *buf) { u8 *p1,dx; u8 posx; p1=(u8*)strstr((const char *)buf,"$GPGGA"); posx=NMEA_Comma_Pos(p1,6); //得到 GPS 状态 if(posx!=0XFF)gpsx->gpssta=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,7); //得到用于定位的卫星数 if(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,9); //得到海拔高度 if(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx); } //分析 GPGSA 信息 //gpsx:nmea 信息结构体 //buf:接收到的 GPS 数据缓冲区首地址 void NMEA_GPGSA_Analysis(nmea_msg *gpsx,u8 *buf) u8 *p1,dx; u8 posx; u8 i; p1=(u8*)strstr((const char *)buf,"$GPGSA"); posx=NMEA_Comma_Pos(p1,2); //得到定位类型 if(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx); for(i=0;i<12;i++) { { //得到定位卫星编号 posx=NMEA_Comma_Pos(p1,3+i); if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx); else break; } posx=NMEA_Comma_Pos(p1,15); //得到 PDOP 位置精度因子 www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
if(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,16); //得到 HDOP 位置精度因子 if(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,17); //得到 VDOP 位置精度因子 if(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx); } //分析 GPRMC 信息 //gpsx:nmea 信息结构体 //buf:接收到的 GPS 数据缓冲区首地址 void NMEA_GPRMC_Analysis(nmea_msg *gpsx,u8 *buf) u8 *p1,dx; u8 posx; u32 temp; float rs; p1=(u8*)strstr((const char *)buf,"GPRMC"); //"$GPRMC",经常有&和 GPRMC 分开的情况,故只判断 GPRMC. posx=NMEA_Comma_Pos(p1,1); //得到 UTC 时间 if(posx!=0XFF) { temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);//得到 UTC 时间 gpsx->utc.hour=temp/10000; gpsx->utc.min=(temp/100)%100; gpsx->utc.sec=temp%100; } 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;//转换为° www.alientek.comALIENTEK STM32开发板AN1409Awww.openedv.com开源电子网2015-4-11
分享到:
收藏