65.9K
CodeProject 正在变化。 阅读更多。
Home

将 NEO-6M GPS 模块与 PIC 接口

2023年5月7日

CPOL

3分钟阅读

viewsIcon

2266

如何将 NEO-6M GPS 模块与 PIC 接口

我最近从 eBay 购买了一个由 u-blox 制造的 NEO-6M GPS 模块。 该模块由 u-blox 制造,并且可以在公司网站上下载 数据表。 它的外观如下,带有 UART 输出和天线的连接头

由于我的电脑没有专用串口,我将模块的串口输出引脚连接到一个廉价的 USB 转 TTL 转换器,该转换器使用 Prolific PL-2303HXA 芯片组,并将其转换为 USB GPS 模块

NMEA 输出

使用 Tera-Term Web 3.1 以 9600bps、8 位数据位、1 位停止位且无奇偶校验与模块通信,我很快就能看到该模块确实返回 NMEA 数据

下一步是找到一个 NMEA 查看器来理解返回的数据。 为此,我使用 NMEA 监控器应用程序,尽管 Visual GPS 也是一个不错的选择。 在视野清晰的天空下,GPS 模块能够在不到一分钟的时间内获得定位

 

就是这样,我用不到 10 美元的价格制作了一个 USB GPS 模块! 但是,为了用它做一些更有用的事情,我决定尝试将其连接到 PIC24 微控制器。 例如,如果 GPS 模块安装在遥控直升机上,我可以对微控制器进行编程以读取当前的 GPS 位置,并通过 RF 远程传输以进行其他处理

与 PIC24 的接口

在几个小时内,我能够将基于 Arduino 的 NMEA 解析器库从 Adafruit 移植到 Microchip C30,准备好用我的 PIC24 进行测试。 移植后的库包含以下导出的函数

// internal functions
void GPS_common_init(void);
char *GPS_lastNMEA(void);
void GPS_pause(boolean b);
boolean is_GPS_paused();
boolean GPS_parse(char *);
char GPS_read(void);
boolean GPS_newNMEAreceived(void);

// get GPS information
GPS_DATE_INFO GPS_getDateInfo();
GPS_SIGNAL_INFO GPS_getSignalInfo();
GPS_LOCATION_INFO GPS_getLocationInfo();

在这些函数中,值得注意的是 GPS_read() 函数,每当从 GPS 模块接收到字节时,它都会更新内部缓冲区。 一旦内部缓冲区被更新,其他 GPS 函数将能够解析 NMEA 数据并返回相关信息。 为了确保位置的时间线更新,最好从 UART 数据接收中断中调用 GPS_read()。 这是在 PIC24 上使用以下代码完成的

// set up UART 2 receive interrupt
IPC7bits.U2RXIP0 = 1;
IPC7bits.U2RXIP1 = 1;
IPC7bits.U2RXIP2 = 1;
IEC1bits.U2RXIE = 1;
IFS1bits.U2RXIF = 0;

// UART Receive Interrupt
void __attribute__((interrupt, no_auto_psv, shadow)) _U2RXInterrupt(void) {
    if (U2STAbits.OERR == 1) {
        U2STAbits.OERR = 0;
    } else {
         GPS_read();
    }
    
    IFS1bits.U2RXIF = 0;
}

可以使用以下代码片段检索 GPS 信号信息、位置和 UTC 时间

if (GPS_newNMEAreceived())
{
    char *nmea = GPS_lastNMEA();                
    boolean isOK = GPS_parse(nmea);
    if (isOK)
    {                                                                   
        GPS_SIGNAL_INFO info = GPS_getSignalInfo();
        if (info.fix)
        {                       
            if (currentMode == MODE_GPS_LOCATION_INFO)
            {
                GPS_LOCATION_INFO loc = GPS_getLocationInfo();
                GPS_DATE_INFO date = GPS_getDateInfo();
                ...
            }
        }
    }
}

由于 GPS 仅在室外且天空视野清晰的情况下才能工作,为了在开发过程中在室内进行测试,我使用 .NET Framework SerialPort 控件编写了一个简单的程序,该程序会将一组固定的 NMEA 数据输出到连接到微控制器的 PC 上的串口。 PIC 将解析接收到的 NMEA 数据,就像它来自 GPS 模块一样。 测试应用程序可以从这里下载。

简单的测试板

使用 诺基亚 5110 LCD 模块,我制作了一个便携式 GPS 接收器,能够显示当前的 GPS 坐标和 UTC 时间

完成的电路,包括 PIC24FJ64GA002、诺基亚 5110 LCD 和 GPS 模块,在运行期间消耗 80mA-100mA 的电流,其中大约 80% 的功率由 GPS 模块消耗。 因此,9V 电池使用此电路无法持续很长时间。 要将其变成永久且便携的解决方案,可能需要容量更大的电池,例如遥控直升机中使用的 Lipo 电池

可以在 这里找到用于 GPS 接收器的已完成 MPLAB 8 项目。

© . All rights reserved.