玩轉X-CTR100 l STM32F4 l U-Blox NEO-6M GPS衛星定位-nmealib解碼庫移植解碼


我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介紹X-CTR100控制器 擴展GPS衛星定位模塊,型號為GY-GPS6MV2,使用U-BLOX NEO-6M模塊,一款應用廣泛的模塊,淘寶上可以方便買到。

本文使用Tim開源解碼庫nmealib進行解碼,串口輸出解碼結果。

原理

GPS定位原理

模塊介紹

U-BLOX NEO-6M GPS 模塊,具有高靈敏度、低功耗、小型化、其極高追蹤靈敏度大大擴大了其定位的 覆蓋面, 在普通GPS 接收模塊不能定位的地方, 如狹窄都市天 空下 、 密集的叢林環境, NEO-6M 都能高精度定位。模塊的高靈敏度、小靜態 漂移、 低 功耗及輕巧的體積,適用於車 載 、手 持設備如 PDA,車輛監控、手 機、攝像 機 及其他移動定位系統的應用,是 GPS 產品應用的最佳選 擇。該模塊特點包括:

1, 模塊采用U-BLOX NEO-6M模組,體積小巧,性能優異。

2, 模塊自帶陶瓷天線及MAXIM公司20.5dB高增益LNA芯片,搜星能力強。

3, 模塊可通過串口進行各種參數設置,並可保存在EEPROM,使用方便。

4, 模塊自帶IPX接口,可以連接各種有源天線,適應能力強。

5, 模塊兼容3.3V/5V電平,方便連接各種單片機系統。

6, 模塊自帶可充電后備電池,可以掉電保持星歷數據1。

默認波特率9600。

NMEA-0183協議

NEO-6M模塊通過串口輸出GPS定位數據信息,這些信息默認采用NMEA-0183協議,幾乎所有GPS模塊都采用該協議,所以該軟件也適應其它GPS模塊。

NMEA是美國國家海洋電子協會(National Marine Electronics Association )為海用電子設備制定的標准格式,目前已經成為了GPS導航設備統一的RTCM標准協議,NMEA3.0協議還擴展了北斗導航系統的版本。

NMEA-0183是一套定義接收機輸出的標准信息,有幾種不同的格式,每種都是獨立相關的ASCII格式,使用逗號隔開數據,數據流長度從30-100字符不等,通常以每秒間隔選擇輸出,最常用的格式為"GGA",它包含了定位時間,緯度,經度,高度,定位所用的衛星數,DOP值,差分狀態和校正時段等,其他的有速度,跟蹤,日期等。NMEA實際上已成為所有的GPS接收機和最通用的數據輸出格式。

NMEA-0183協議定義的語句非常多,但是常用的或者說兼容性最廣的語句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL、$GPZDA等。下面給出這些常用NMEA-0183語句的字段定義解釋。

示例:

  1. $GPGGA,235949.042,0000.0000,N,00000.0000,E,0,00,,0.0,M,0.0,M,,0000*45
  2. $GPGLL,0000.0000,N,00000.0000,E,235949.042,V,N*47
  3. $GPGSA,A,1,,,,,,,,,,,,,,,*1E
  4. $GPGSV,1,1,00*79
  5. $GPRMC,235949.042,V,0000.0000,N,00000.0000,E,,,140209,,,N*7E
  6. $GPVTG,,T,,M,,N,,K,N*2C

nmealib-0.5.3解碼庫

nmealib是一個基於C語言的用於nmea協議的開源庫。雖然nmea體積小巧,但是卻具備了不少功能。

分析NMEA語句並把結果保存在合適的C語言結構體中。

除了解析NMEA語句之外,還可以產生NMEA語句。

支持多種NMEA語句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。

解析算法層次嚴謹。

附加地理學相關功能,可支持導航等數據工作。

nmealib的目錄還是非常清晰的,下面簡單介紹一下。

include\nmealib文件夾中存在nmealib相關的頭文件

src文件夾存放nmealib相關源文件,該文件夾中的內容和include\nmealib文件夾相對應

samples文件夾存放若干例子,一些簡單易懂的例子。

利用nmealib解析GPS模塊的輸出結果大致可以分為三步,第一步定義和初始化GPS信息結構體和解析載體結構體,第二步調用nmea_parse函數完成解析工作,第三步釋放解析載體所占用的內存空間。如果仔細查看nmea_parser_init部分的代碼,便會發現函數中使用了C標准庫的malloc函數,該函數會在RAM中的heap空間開辟一個空間,這就需要使用完該載體之后立刻釋放,所以nmea_parser_init和nmea_parser_destroy需要成對出現。

nmeaINFO是一個很關鍵的結構體,該結構體中保存了nmea語句解析的結果。在調用了nmea_parse函數之后,直接查詢nmeaINFO結構的數據即可得到解碼的結果。

例如lat代表緯度,lon代表精度,speed代表速度。需要注意的是lat和lon的數值格式和百度地圖的格式是有區別的,而速度的單位為KM/H,相對於"節"這個單位,公里每小時要好理解的多。

特別說明,NMEA解碼庫在進行解碼時需要動態分配較大的堆空間。

例程

通過開源nmealib庫解碼GPS NMEA-0813協議,並通過USB串口輸出解碼結果。

硬件說明

硬件資源:

  • 串口UART1
  • LB接口(UART3接口)
  • U-BLOX NEO-6M GPS模塊(需自備)

硬件連接:

連接GPS模塊到 LB接口(UART3接口),使用5V供電。GPS模塊TX連接RX接口,GPS模塊RX連接TX接口,如下圖。

軟件生態

X-SOFT軟件生態,X-API文件如下。

ax_gps.c——X-CTR100 擴展GPS模塊源文件

ax_gps.h——X-CTR100 擴展GPS模塊頭文件

操作函數如下:

void AX_GPS_Init(void); //GPS初始化

uint8_t AX_GPS_GetInfo(nmeaINFO *info); //GPS獲取GPS信息

本軟件參考秉火 GPS例程,采用DMA串口緩沖區方案,設置兩個緩沖器,哪個緩沖器滿后,解析數據,另一個緩沖器接收數據。防止數據丟失。

軟件說明

主程序代碼如下。

int main(void)

{

    /* X-CTR100初始化 */

    AX_Init(115200);

    printf("***X-CTR100 GPS例程***\r\n\r\n");

 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 

    //模塊初始化及配置

    AX_GPS_Init();

 

    //初始化GPS數據結構

    nmea_zero_INFO(&info);

 

    while (1)

    {

        //接GPS信號更新

        if (AX_GPS_GetInfo(&info))

        {

            printf("**********X-CTR100 GPS解碼信息**********************\r\n");

            printf("*UTC時間:%d年%d月%d日 %d時%d分%d秒 \r\n", info.utc.year, info.utc.mon, info.utc.day,

                info.utc.hour, info.utc.min, info.utc.sec);

            printf("*緯度:%f 經度%f \r\n", info.lat, info.lon);

            printf("*正在使用的衛星:%d 可見衛星:%d \r\n", info.satinfo.inuse, info.satinfo.inview);

            printf("*海拔高度:%f 米 \r\n", info.elv);

            printf("*速度:%f km/h \r\n", info.speed);

            printf("*航向:%f 度 \r\n", info.direction);

            printf("****************************************************\r\n\r\n");

        }

    }

}

特別說明,工程模板默認的堆棧分配不能滿足解碼庫需求,NMEA解碼庫在進行解碼時需要動態分配較大的堆空間,會出現解碼錯誤。

需要在STM32的啟動文件startup_stm32f10x_hd.s文件中對堆空間進行修改。

實現效果

測試時,需要將GPS天線放置到無遮擋空曠位置或窗戶位置,以便接收GPS信號。首次啟動時間較長,根據信號情況等待30~60S,如果長時間不能輸出位置信息,請嘗試更換位置。

輸出結果如下所示。

    

參考

秉火《WF-NEO-6M用戶手冊——秉火GPS定位模塊》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM