历史上的今天

今天是:2024年11月07日(星期四)

正在发生

2019年11月07日 | 2440裸机编程之十二 GPS

发布者:炉火旁的Yye 来源: 51hei关键字:裸机编程  GPS 手机看文章 扫描二维码
随时随地手机看文章

全球卫星定位系统实际上是由24 颗卫星所组成,其中有3 颗为备用卫星,这些卫星分布于距地表20,200 公里的上空,而且分属于6 个轨道面;卫星轨道面倾斜角为55 度﹐提供全球全天候﹐每秒一次﹐持续不断的定位讯号。这些卫星每11 小时58 分环绕地球一次,即每天绕过您的头顶二次,就像是月球一样不停地绕着地球旋转,其速度约每秒1.8 哩。这些卫星需要地面管制站随时加以监控是否GPS 卫星在其正确的轨道上及正常运作,另外监控中心可上传资料给卫星,卫星再将这些信息下传给GPS 使用者使用。地面共有五个监控中心,四个上传资料站及一个控制中心,这些控制站以纬度来划分其所控制的卫星。在概念上﹐GPS 是代表着整个系统﹐包括天空上的卫星、地面控制站及GPS 接收机。不过一般而言﹐GPS 即意指一个GPS 接收机﹐这是因为我们在使用上多半只会接触GPS 接收机的缘故。一般所使用之GPS 接收机在任何时刻接收到4 颗或更多的卫星。


简单的说GPS 如何运作:每一颗卫星会告诉您使用的接收机三件事,我是第几号卫星,我现位置在那里,我什么时候送这讯息给您。当您的GPS 接收机接收到这些资料后会将星历资料及Almanac 存起来使用,这些资料也用做修正GPS 接收机上的时间。GPS 接收机比较每一卫星讯号接收到的时间及本身接收机的时间的不同,而计算出每一卫星道接收机的距离。接收机若在接收到更多卫星时,它可利用三角公式计算出接收机所在位置。三颗卫星可做所谓2D 定位(经度及纬度),四颗或更多卫星可做所谓3D 定位(经度、纬度及高度)。接收机继续不段地更新您的位置,所以它可计算出您的移动方向及速度。


GPRMC
  推荐定位信息(GPRMC) 
例:$GPRMC,154717.000, A ,3906.1439, N ,11720.8569, E ,0.00,331.02,050611,    ,    ,   A*6B
  $GPRMC,   <1>    ,<2>,    <3>  ,<4>,    <5>   ,<6>, <7>,  <8> ,  <9> ,<10>,<11>,<12>*hh 
  <1> UTC时间,hhmmss.sss(时分秒.毫秒)格式 
  <2> 定位状态,A=有效定位,V=无效定位 
  <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
  <4> 纬度半球N(北半球)或S(南半球) 
  <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
  <6> 经度半球E(东经)或W(西经) 
  <7> 地面速率(000.0~999.9节,前面的0也将被传输) 
  <8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输) 
  <9> UTC日期,ddmmyy(日月年)格式 
  <10> 磁偏角(000.0~180.0度,前面的0也将被传输) 
  <11> 磁偏角方向,E(东)或W(西) 
  <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)


GPGGA
GPS固定数据输出语句($GPGGA) 
这是一帧GPS定位的主要数据,也是使用最广的数据。 


  $GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度单位,大地水准面高度,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符和换行符),分别用14个逗号进行分隔。该数据帧的结构及各字段释义如下:
  
例:$GPGGA,154717.000,3906.1439, N ,11720.8569, E , 1 , 05,1.6, 23.2,M,-2.3,M,    , 0000*74
其标准格式为:$GPGGA,   (1)   ,    (2)  ,(3),    (4)   ,(5),(6),(7),(8),  (9),M,(10),M,(11),(12) *hh(CR)(LF)

起始引导符及语句格式说明(本句为GPS定位数据); 
  <1> UTC时间,格式为hhmmss.sss; 
  <2> 纬度,格式为ddmm.mmmm(第一位是零也将传送); 
  <3> 纬度半球,N或S(北纬或南纬) 
  <4> 经度,格式为dddmm.mmmm(第一位零也将传送); 
  <5> 经度半球,E或W(东经或西经) 
  <6> GPS状态, 0未定位, 1非差分定位, 2差分定位, 3无效PPS, 6正在估算 
  <7> 使用卫星数量,从00到12(第一个零也将传送) 
  <8> 水平精确度,0.5到99.9 
  <9> 天线离海平面的高度,-9999.9到9999.9米 
  M 指单位米 
  <10> 大地水准面高度,-9999.9到9999.9米 
  M 指单位米 
  <11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空 
  <12> 差分参考基站标号,从0000到1023(首位0也将传送)。 
  * 语句结束标志符 
  xx 从$开始到*之间的所有ASCII码的异或校验和 
   回车 
   换行



GPGSA
  $GPGSA : GPS DOP and Active Satellites(GSA)当前卫星信息 
例:$GPGSA,A,3,28,02,10,23,04,,,,,,,,2.4,1.6,1.8*36

    字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D 
  字段2:定位类型,1=未定位,2=2D定位,3=3D定位 
  字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0) 
  字段15:PDOP综合位置精度因子(0.5 - 99.9) 
  字段16:HDOP水平精度因子(0.5 - 99.9) 
  字段17:VDOP垂直精度因子(0.5 - 99.9) 
  字段18:校验值



GPGSV
  可视卫星状态输出语句($GPGSV) 
  例:       $GPGSV,  3 ,  1 ,  12,  04,  51, 261,  44,  28,45,179,27,10,18,192,26,02, 12,250, 44*7C 
  标准格式: $GPGSV,(1),(2),(3),(4),(5),(6),(7),       ………………       (4),(5),(6),(7)*hh(CR)(LF) 
  各部分含义为: 
  (1)总的GSV语句电文数;2; 
  (2)当前GSV语句号:1; 
  (3)可视卫星总数:08; 
  (4)PRN码(伪随机噪声码) 也可以认为是卫星编号 
  (5)仰角(00~90度):33度; 
  (6)方位角(000~359度):240度; 
  (7)信噪比(00~99dB):45dB(后面依次为第10,16,17号卫星的信息); 
  *总和校验域;  
  hh 总和校验数:78; 
  (CR)(LF)回车,换行。 
  注:每条语句最多包括四颗卫星的信息,每颗卫星的信息有四个数据项,即:  
  (4)-卫星号,(5)-仰角,(6)-方位角,(7)-信噪比。


一、GPS接PC机,用超级终端接收信息


图中只是示意,天线要接到户外,否则信号很难接收




二、2440的串口1接GPS模块


程序如下:
//////////////////////////////////////////////////////////////////////////////////////////////
#define GLOBAL_CLK  1
/*
*********************************************************
*        头文件
*********************************************************
*/
#include
#include
#include

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"


/*
*********************************************************
*         常量
*********************************************************
*/

/*
*********************************************************
*         变量
*********************************************************
*/

int isdigit(char  c)
{
if(c>='0' && c <='9') return 1;
else return 0;
}

int my_atoi(char * pzNum)    //把字符串str转换成int类型
{
int nLen;
int nIndex;
int bFlag;
int nRt;
if (pzNum == NULL)
  return 0;

nLen = strlen(pzNum);
if (nLen <= 0)
  return 0;

nIndex = 0; 
bFlag = TRUE;
if (!isdigit(pzNum[0]))
{
  if (pzNum[0] == '-')
   bFlag = FALSE;
  else if (pzNum[0] == '+')
   bFlag = TRUE;
  else
      return 0;  
  nIndex ++;
}
nRt = 0;
for (; nIndex < nLen; nIndex++)
{
  if (!isdigit(pzNum[nIndex]))
   break;
  nRt = nRt * 10 + (pzNum[nIndex]-'0');
}
if (!bFlag)
  nRt = -nRt;

return nRt;
}


void Main(void)
{     
    int i;
    U8 key;
U32 mpll_val = 0 ;
char Buffer[256];
char buf[20];
char *p;

    Port_Init();  //端口初始化
    Isr_Init();   //中断初始化
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);
cal_cpu_bus_clk();
    
    Uart_Init(0,0,115200);  //串口初始化 波特率为115200
    Uart_Init(0,1,9600);
    Uart_Select(0);  //选者串口0

Clk0_Disable();
Clk1_Disable();

Uart_Printf("n======  GPS Test program start ======n");
while(1)
{
  i=0;
  Uart_Select(1);
  Uart_GetString(Buffer);                                      //读取一段信息
  Uart_Select(0);
  p = strtok(Buffer+1, ",");                                   //将字符串 Buffer+1  以","为界,读取第一个单词,
     if (strcmp(p,"$GPRMC") == 0)                                 //找到"$GPRMC"
     {
      Uart_Printf("%sn", p); 
      p = strtok(NULL, ",");                                   //得到协调世界时间

      sprintf(buf,"%c%c",p[0],p[1]);
      Uart_Printf("Current Time: %2d:",(my_atoi(buf)+8)%24);   //显示小时: 协调世界时间+8  转换为北京时间
      Uart_Printf("%c%c:%c%cn",p[2],p[3],p[4],p[5]);          //显示分 秒
      
      p = strtok(NULL, ",");                                   //得到有效性
      if(*p == 'A') Uart_Printf("State: Data valid.n");
      else Uart_Printf("State: Date no valid!!n");
      
      p = strtok(NULL, ",");                                   //得到纬度值
      Uart_Printf("latitude(WGS-84): %s",p);
      p = strtok(NULL,",");                                    //北纬还是南纬
      Uart_Printf("%sn",p);
      
      p = strtok(NULL, ",");                                   //得到经度值
      Uart_Printf("longitude(WGS-84): %s",p);
      p = strtok(NULL,",");                                    //东经还是西经
      Uart_Printf("%sn",p);
      
      p = strtok(NULL,",");                                    //速度
      Uart_Printf("speed: %sn",p);
      
      p = strtok(NULL,",");                                    //方位
      Uart_Printf("Direction: %sn",p);
      
      p = strtok(NULL,",");                                    //日期
      Uart_Printf("Date: %c%c-%c%c-%c%cn",p[0],p[1],p[2],p[3],p[4],p[5]);
     }

[1] [2]
关键字:裸机编程  GPS 引用地址:2440裸机编程之十二 GPS

上一篇:对比stm32,arm9研究方向的猜想
下一篇:对于51单片机和arm9开发板串口通信问题的分析

推荐阅读

  BNEF已经大幅提高了未来几十年在全球部署用户侧和电网规模电池部署的预测。   根据研究公司彭博新能源财经(BNEF)的最新年度预测,从现在到2040年,电池成本的下降将推动全球范围内安装储能系统的热潮。   到2040年,全球储能市场(抽水蓄能除外)将累计增长至942GW/2857GWh,在未来22年吸引1.2万亿美元投资。廉价的电池意味着,当风不吹、太阳...
TCL 集团表示,公司在 AMOLED 领域,以柔性、折叠屏的技术研发和应用为重点。 其中,t4 柔性 AM-OLED 工厂在产能及良率提升、客户开拓方面进展优于预期,在屏下摄像、极窄边框、可折叠等差异化技术领域取得很多领先优势,预计于四季度实现一期量产。同时,随着新投入的两条 G11 高世代线投产,TCL 华星未来 5 年面积复合增长率高达 18%。 据了解...
10月25日,三星第二代掌门人李健熙逝世,享年78岁,这无疑给隐忧中的三星蒙上了一层阴霾。对于三星,甚至于韩国而言,李健熙绝对是一位举足轻重的领导人。在他传奇一生的背后,正是他带领三星踏入半导体行业,并造就了后者在半导体领域的神话。“豪赌”对于一家巨型企业而言,任何一个战略性的决策都将影响它的未来。三星成立于1938年,主要以技术含量较低...
摆脱芯片供应短缺问题 双芯片代工策略见效 11月4日,高通股价飙涨逾12%,相较同业,高通在面对芯片更显得心应手,并看好明年业绩将持续成长。 高通执行长 Crisano Amon 于电话会议上表示,预计12月底供应问题将明显好转,明年下半年将有足够的供应满足需求,预期 2022财年EPS有望年增20%。 Lily点评:芯片短缺一直影响5G手机的出货量。高通作为全...

史海拾趣

问答坊 | AI 解惑

集成电路的检测常识

1、检测前要了解集成电路及其相关电路的工作原理 检查和修理集成电路前首先要熟悉所用集成电路的功能、内部电路、主要电气参数、 各引脚的作用以及引脚的正常电压、波形与外围元件组成电路的工作原理。如果具备 以上条件,那么分析和检查会容易许多 ...…

查看全部问答∨

小人物朋友 你有消息了吗?

小人物朋友 你有消息了吗? 您不是在第一时间能获得题目吗? 有了吗?…

查看全部问答∨

悬挂系统中的步进电机带动装置选择问题

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 步进电机带动滑轮,要用什么样的线比较好? 线要绕在步进电机上还是绕在哪里?绕在电机上的话线太长,步进电机齿轮太小,绕不上。 还有这些滑轮啦线啦齿轮啦要上哪买?五金店吗?  …

查看全部问答∨

虚拟机LINUX与开发板的内核不同遇到的问题??

1.有没有人知道,虚拟机里的LINUX系统的内核是2.4,ARM9学习板上的系统是2.6。那么编译出来的文件能在开发板上执行吗? 2.内核移植:虚拟机里的LINUX内核是2.4的,内核移植时能不能用2.6的代码,并把它移植到ARM9学习板上?…

查看全部问答∨

电子围栏有哪些特点

电子围栏产品是目前最先进的周界防盗报警系统,由主机和前端围栏组成。主机主要是产生和接收高压脉冲信号,在前端围栏处于触网、短路、断路状态时产生报警信号,并把入侵信号发送到安全报警中心;而前端围栏由杆及特制合金导线等构件组成的有形周界 ...…

查看全部问答∨

各位大虾帮忙,加密芯片ESPU0808有人用过吗?

最近我们公司有一个方案,要用到加密芯片。听说加密芯片ESPU0808芯片不错,上次去深圳的集成电路展也看到他们的公司了,有没有人用过这个芯片呢,有的话告诉我一下啊,谢谢了。急着了解中,…

查看全部问答∨

大家帮我看看这是怎么回事

为什么我在用MDK和ULINK ME下载程序的时候出现:Error:Flash Download failed-Target DLL has been cancelled. 紧急求助,有知道的坛友请不吝赐教,感激不尽!~ …

查看全部问答∨

stm32的usart接收字符串问题:怎样接收字符串

如何让stm32的usart接收字符串啊,USART_ReceiveData函数仅仅接收的是最后一个字符…

查看全部问答∨

uc/os移植的问题

移植uc/os 时发现,任务内的局部变量不在该任务堆栈区分布,不知什么原因。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved