查看: 6823|回复: 15

[原创] 【高校争霸赛】基于LPC824lite通过uart Rx&Tx+GPS解算出GPS经纬度

[复制链接]
  • TA的每日心情
    开心
    2017-1-13 17:13
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    13

    主题

    166

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    494
    最后登录
    2018-1-6
    发表于 2016-12-12 00:01:51 | 显示全部楼层 |阅读模式
    本帖最后由 191925882 于 2016-12-20 01:34 编辑

    一.团队介绍
    团队名称:威武霸气
    项目名称:基于LPC824lite的大棚温度、湿度和压力控制系统
    学校:汕头大学
    队员:2

    二.项目
    模块图:
    333.png 444.png
    这是电路连接图,接LPC824lite的p0-0端口作为主控板的GPS信号的Rx端 P0-4作为。供电供地。
    555.jpg


    由于室内没GPS信号,完全一颗星都搜索不到,故引了一根长天线到外面,这样才会收到3颗以上的星,此时才能正常定位。
    444.jpg



    最后测得的经纬度,如下图:
    222.jpg


    附一:
    NEO-M8
    u-blox M8 concurrent GNSS modules
    u-blox M8 并行GNSS模块
    亮点:
    1)并行的GNSS引擎,可以用于GPS、GLONASS、BeiDou和QZSS
    2)工业标准:167dBm导航精度
    3)产品种类繁多来满足性能和消费的需求
    4)低功耗与高性能的结合
    5)u-blox无线模块的简单集成
    6)与NEO-7,NEO-6以及NEO-5系列向下兼容。
    1.功能描述
    1.1 概览
    NEO-M8系列的独立并行处理GNSS模块是建立u-blox M8 GNSS引擎的高效性能之上的,u-blox M8 GNSS包括GPS、GLONASS、Galileo、BeiDou、QZSS和SBAS,并且拥有经过工业证明的NEO形式要素。
    NEO-M8系列提供了高灵敏度和低电压供应下的最小反应时间,NEO-M8M为价格敏感的应用做了优化,并且NEO-M8N则提供了最好的性能和更简单的RF射频集成。NEO形式要素允许从NEO前几代的简单移植。精致的RF架构和干扰抑制可以保证芯片在反GNSS环境下依然有良好的性能。NEO-M8系列芯片将高水平的鲁棒性和灵活的连接方式的集成性组合在一起,NEO-M8N的未来可用性的证据是一个内部的Flash闪存,该闪存可以允许firmware固件的简单更新来支持传统的GNSS系统。这个特性可以使得NEO-M8特别适合工业和自动化应用。
    DDC(I2C兼容)接口提供了和大多数的u-bloxSARA、LEON和LISA无线模块的连接和协同使能。对于RF优化,NEO-M8N/M8Q拥有自己独自的特性,该特性包括一个传统的前端LNA(low-noise amplifier,低噪音放大器),这是为了更容易地集成天线,以及一个SAW(surface acoustic wave,声表面波)滤波器来应付增长的干扰免疫。
    u-blox M8模块使用了GNSS芯片,该芯片经过AEC-Q100的认证,在ISO/TS 16949认证体系下生产,在系统层进行了完全测试。质量测试符合ISO 16750标准:“道路车辆----环境状况和电气、电子设备的测试”。
    u-blox的AssistNow协助提供了附加的信息,例如日历、年历、粗略的上次位置和时间,减少第一次精准定位所需要的时间,提高获得数据的精度,u-blox M8的AssistNow数据支持GPS和GLONASS的集成,这比只用GPS提供帮助要更快速地获得数据。在长时间离线之后,
    扩展的AssistNow离线有效数据(保存35天以上)和AssistNow自发有效数据(保存6天以上)依然可以快速获得数据。
    模块:
    555.png
    1.5 GNSS
    NEO-M8 GNSS模块是并发的GNSS接收器,并且接收和跟踪多GNSS系统(例如:GPSGLONASSGALILEOBeiDouQZSS信号)。因为双频率RF前端架构,三个信号(GPS  L1C/A,GLONASS L1OFBeiDou B1)中的两个能够被接收和并行处理。默认情况下M8接收器被配置为接收并行GPS(包括SBASQZSS)GLONASS。如果电力消耗是主要的因素,那么接收器应该被配置为单GNSS操作,使用GPS或者GLONASS或者BeiDou并且禁止使用QZSSSBAS
    注意:GalileoQZSSSBASGPS分享相同的频率,并且总是能和GPS一块处理。
    1.5.1 GPS
    NEO-M8 定位模块被设计来接收和跟踪GPS提供的1575.42MHzL1C/A信号。NEO-M8系列可以并行接收和处理GPSGLONASS或者并行接收和处理GPSBeiDou
    1.5.2 GLONASS
    NEO-M8系列可以并行接收和处理GLONASSGPS或者并行接收和处理GLONASSBeiDou
    俄国的GLONASS卫星系统是美国基本全球定位系统(GPS)的可替换系统。U-blox NEO-M8定位模块被设计来接收和跟踪GLONASS提供的 1602MHz+ k*562.5kHzL1OF信号

    代码:
    1. //From Baseflight-master
    2. static void gpsNewData(uint16_t c)
    3. {
    4.     int axis;
    5.     static uint32_t nav_loopTimer;
    6.     int32_t dist;
    7.     int32_t dir;
    8.     int16_t speed;

    9.     if (gpsNewFrameNMEA(c)) {
    10.         // new data received and parsed, we're in business
    11.         lastLastMessage = lastMessage;
    12.         lastMessage=time_nowMs();
    13.         if (GPS_update == 1)                            //Ö»Òª½øÈë´Ëº¯ÊýÒ»´Î¾Í·­×ªÒ»Ï¡£Í»È»ÆæÏë¿ÉÒÔÓô˱êÖ¾×öLEDµÄ¿ØÖƱêÖ¾¡£
    14.                                 { GPS_update = 0;
    15.                                     led_set(0xff);
    16.                                 }
    17.         else
    18.                                 {  GPS_update = 1;
    19.                    led_set(0x00);
    20.                                 }
    21.         if (f.GPS_FIX && GPS_numSat >= 5) {
    22.             if (!altHoldMode)                              //ÈôÊÇû½âËø£¬»°ËµÉÏËø½âËøµ½µ×ÊÇʲôÒâ˼£¿
    23.                 f.GPS_FIX_HOME = 0;                     
    24.             if (!f.GPS_FIX_HOME && altHoldMode)             //GPS_FIX_HOME=0£¨ÆðʼλÖñêÖ¾£©²¢ÇÒ ARMED=1;£¨½âËø£©Ê±
    25.                 GPS_reset_home_position();              
    26.                                                
    27.             // Apply moving average filter to GPS data
    28.                                                 //»¬¶¯Æ½¾ùÂ˲¨¾ÍÊǼÓÉϺóÃæµÄ¼õȥǰÃæµÄ£¬È»ºóÔÙÓóý·¨¼´¿É³ýµô4¡£
    29. #if defined(GPS_FILTERING)
    30.             GPS_filter_index = (GPS_filter_index + 1) % GPS_FILTER_VECTOR_LENGTH;
    31.             for (axis = 0; axis < 2; axis++) {
    32.                 GPS_read[axis] = GPS_coord[axis];               // latest unfiltered data is in GPS_latitude and GPS_longitude
    33.                 GPS_degree[axis] = GPS_read[axis] / 10000000;   // get the degree to assure the sum fits to the int32_t

    34.                 // How close we are to a degree line ? its the first three digits from the fractions of degree
    35.                 // later we use it to Check if we are close to a degree line, if yes, disable averaging,
    36.                 fraction3[axis] = (GPS_read[axis] - GPS_degree[axis] * 10000000) / 10000;

    37.                 GPS_filter_sum[axis] -= GPS_filter[axis][GPS_filter_index];
    38.                 GPS_filter[axis][GPS_filter_index] = GPS_read[axis] - (GPS_degree[axis] * 10000000);
    39.                 GPS_filter_sum[axis] += GPS_filter[axis][GPS_filter_index];
    40.                 GPS_filtered[axis] = GPS_filter_sum[axis] / GPS_FILTER_VECTOR_LENGTH + (GPS_degree[axis] * 10000000);
    41.                 if (nav_mode == NAV_MODE_POSHOLD) {             // we use gps averaging only in poshold mode...
    42.                     if (fraction3[axis] > 1 && fraction3[axis] < 999)
    43.                         GPS_coord[axis] = GPS_filtered[axis];
    44.                 }
    45.             }
    46. #endif
    47.             // dTnav calculation
    48.             // Time for calculating x,y speed and navigation pids
    49.             dTnav = (float)(time_nowMs() - nav_loopTimer) / 1000.0f;   //´ËʱµÄµ¥Î»ÎªÎ¢Ãë
    50.             nav_loopTimer = time_nowMs();
    51.             // prevent runup from bad GPS                              
    52.             dTnav = min(dTnav, 1.0f);    //ÏÞÖÆ                       

    53.             // calculate distance and bearings for gui and other stuff continously - From home to copter
    54.             GPS_distance_cm_bearing(&GPS_coord[LAT], &GPS_coord[LON], &GPS_home[LAT], &GPS_home[LON], &dist, &dir);
    55.             GPS_distanceToHome = dist / 100; // ¼Òµ½·ÉÐÐÆ÷µÄ¾àÀë
    56.             GPS_directionToHome = dir / 100; // ¼Òµ½·ÉÐÐÆ÷µÄ·½Î»

    57.             if (!f.GPS_FIX_HOME) {      // If we don't have home set, do not display anything
    58.                 GPS_distanceToHome = 0;
    59.                 GPS_directionToHome = 0;
    60.             }

    61.             // calculate the current velocity based on gps coordinates continously to get a valid speed at the moment when we start navigating
    62.             GPS_calc_velocity();

    63.             if (f.GPS_HOLD_MODE || f.GPS_HOME_MODE) { // ok we are navigating            //10ÔÂ24ÈÕ homeºÍhold·Ö±ðÊÇÔÚÖ÷º¯ÊýÖÐʹÓÃÈ¥±ê¼ÇÒ£¿ØÆ÷µÄ·µº½Ä£Ê½ºÍ¶¨µãģʽ   
    64.                 // do gps nav calculations here, these are common for nav and poshold
    65.                 GPS_distance_cm_bearing(&GPS_coord[LAT], &GPS_coord[LON], &GPS_WP[LAT], &GPS_WP[LON], &wp_distance, &target_bearing);
    66.                 GPS_calc_location_error(&GPS_WP[LAT], &GPS_WP[LON], &GPS_coord[LAT], &GPS_coord[LON]);

    67.                 switch (nav_mode) {                 //nav_mode µÄ¸³ÖµÊÇÔÚÖ÷º¯ÊýÖиøÕâ¸ö±äÁ¿¸³ÏÂÃæµÄÖµ
    68.                     case NAV_MODE_POSHOLD:                     
    69.                         // Desired output is in nav_lat and nav_lon where 1deg inclination is 100
    70.                         GPS_calc_poshold();
    71.                         break;

    72.                     case NAV_MODE_WP:
    73.                         speed = GPS_calc_desired_speed(cfg.nav_speed_max, NAV_SLOW_NAV);    // slow navigation
    74.                         // use error as the desired rate towards the target
    75.                         // Desired output is in nav_lat and nav_lon where 1deg inclination is 100
    76.                         GPS_calc_nav_rate(speed);                                           //ÕâÀïµÄspeedÊÇÉÏÃ溯ÊýÀï´«¹ýÀ´µÄ

    77.                         // Tail control
    78.                         if (cfg.nav_controls_heading) {            //ÄѵÀÊÇ¿ØÖÆ·½ÏòµÄ²ÎÁ¿£¿//nav_controls_heading   //10ÔÂ24ÈÕÕâ¸öº¯Êý¸³0»¹ÊǸ³1È¡¾öÓë»úÉíµÄ³¯Ïò£¬¹Ê´Ëʱû¸øËü¸³Öµ
    79.                             if (NAV_TAIL_FIRST) {                  //Í·Ïȵ½                                
    80.                                 magHold = wrap_18000(nav_bearing - 18000) / 100;   //¶ÔÓÚmagholdÕâ¸ö´ÊÎÒ»¹Ã»ÓкúÃÑо¿
    81.                             } else {                               //·ñÔòβÏȵ½
    82.                                 magHold = nav_bearing / 100;
    83.                             }
    84.                         }
    85.                         // Are we there yet ?(within x meters of the destination)
    86.                         if ((wp_distance <= cfg.gps_wp_radius) || check_missed_wp()) {      // if yes switch to poshold mode
    87.                             nav_mode = NAV_MODE_POSHOLD;                                    //10ÔÂ24ÈÕ ÔÚÖ÷º¯ÊýÖÐÃ÷Ìì×Ô¼ºÌí¼ÓÖ÷º¯Êý
    88.                             if (NAV_SET_TAKEOFF_HEADING) {     
    89.                                 magHold = nav_takeoff_bearing;
    90.                             }
    91.                         }
    92.                         break;
    93.                 }
    94.             }                   //end of gps calcs
    95.         }
    96.     }
    97. }
    复制代码
    1. static bool gpsNewFrameNMEA(char c)
    2. {
    3.     uint8_t frameOK = 0;
    4.     static uint8_t param = 0, offset = 0, parity = 0;
    5.     static char string[15];
    6.     static uint8_t checksum_param, gps_frame = NO_FRAME;
    7.     static gpsMessage_t gps_msg;

    8.     switch (c) {
    9.         case '

    10. :
    11.             param = 0;
    12.             offset = 0;
    13.             parity = 0;
    14.             break;

    15.         case ',':                   //Óöµ½ÕâÁ½¸ö²Å½øÈë´Ëº¯Êý         
    16.         case '*':
    17.             string[offset] = 0;
    18.             if (param == 0) {       // frame identification
    19.                 gps_frame = NO_FRAME;
    20.                 if (string[0] == 'G' && string[1] == 'N' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A')
    21.                     gps_frame = FRAME_GGA;
    22.                 if (string[0] == 'G' && string[1] == 'N' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C')
    23.                     gps_frame = FRAME_RMC;
    24.             }

    25.             switch (gps_frame) {
    26.                 case FRAME_GGA:        // ************* GPGGA FRAME parsing
    27.                     switch (param) {
    28.                         case 2:
    29.                             gps_msg.latitude = GPS_coord_to_degrees(string);     // 10ÔÂ24ÈÕ°ÑÕâ¸öº¯Êý¼ÌÐøÓÅ»¯ÏÂ,okÒÑ×ö
    30.                             break;
    31.                         case 3:
    32.                             if (string[0] == 'S')
    33.                                 gps_msg.latitude *= -1;
    34.                             break;
    35.                         case 4:
    36.                             gps_msg.longitude = GPS_coord_to_degrees(string);    // 10ÔÂ24ÈÕ°ÑÕâ¸öº¯Êý¼ÌÐøÓÅ»¯ÏÂ,okÒÑ×ö
    37.                             break;
    38.                         case 5:
    39.                             if (string[0] == 'W')
    40.                                 gps_msg.longitude *= -1;
    41.                             break;
    42.                         case 6:
    43.                             f.GPS_FIX = string[0] > '0';
    44.                             break;
    45.                         case 7:
    46.                             gps_msg.numSat = grab_fields(string, 0);             // 10ÔÂ24ÈÕ°ÑÕâ¸öº¯Êý¼ÌÐøÓÅ»¯ÏÂ,okÒÑ×ö
    47.                             break;
    48.                         case 9:
    49.                             gps_msg.altitude = grab_fields(string, 0);           // altitude in meters added by Mis
    50.                             break;
    51.                     }
    52.                     break;

    53.                 case FRAME_RMC:        // ************* GPRMC FRAME parsing
    54.                     switch (param) {
    55.                         case 7:
    56.                             gps_msg.speed = ((grab_fields(string, 1) * 5144L) / 1000L);    // speed in cm/s added by Mis
    57.                             break;
    58.                         case 8:
    59.                             gps_msg.ground_course = (grab_fields(string, 1));      // ground course deg * 10

    60.                             break;
    61.                     }
    62.                     break;
    63.             }
    64.             param++;
    65.             offset = 0;
    66.             if (c == '*')
    67.                 checksum_param = 1;
    68.             else
    69.                 parity ^= c;
    70.             break;

    71.         case '\r':                                   //µ±½ÓÊÕµ½»»Ðзû
    72.         case '\n':
    73.             if (checksum_param) {   //parity checksum
    74.                 uint8_t checksum = 16 * ((string[0] >= 'A') ? string[0] - 'A' + 10 : string[0] - '0') + ((string[1] >= 'A') ? string[1] - 'A' + 10 : string[1] - '0');
    75.                 if (checksum == parity) {
    76.                     switch (gps_frame) {
    77.                         case FRAME_GGA:
    78.                             frameOK = 1;
    79.                             if (f.GPS_FIX) {                 //´Ëʱ²ÅʱµÃµ½ÎÒÃÇÏëÒªµÄÊý¾Ý              
    80.                                 GPS_coord[LAT] = gps_msg.latitude;
    81.                                 GPS_coord[LON] = gps_msg.longitude;
    82.                                 GPS_numSat = gps_msg.numSat;
    83.                                 GPS_altitude = gps_msg.altitude;
    84.                             }
    85.                             break;

    86.                         case FRAME_RMC:
    87.                             GPS_speed = gps_msg.speed;
    88.                             GPS_ground_course = gps_msg.ground_course;
    89. //                                                                                        if (!sensors(SENSOR_MAG) && GPS_speed > 100) {     //ÒªÊÇûÓдŴ«¸ÐÆ÷
    90. //                                GPS_ground_course = wrap_18000(GPS_ground_course * 10) / 10;
    91. //                                heading = GPS_ground_course / 10;    // Use values Based on GPS if we are moving.
    92. //                            }
    93.                             break;
    94.                     }
    95.                 }
    96.             }
    97.             checksum_param = 0;
    98.             break;

    99.         default:  //ÒªÊÇ ²»ÊÇÉÏÃæcaseÀïÃæµÄÄǾÍÊÇÊý¾ÝÀ²£¬°ÑÊý¾ÝÌîÈëÊý×éÖÐÈ¥¡£
    100.             if (offset < 15)
    101.                 string[offset++] = c;
    102.             if (!checksum_param)
    103.                 parity ^= c;
    104.             break;
    105.     }
    106.     return frameOK;
    107. }
    复制代码


    回复

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-12 08:41:07 | 显示全部楼层
    用北斗多好,串口处理数据难度系数不大
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-13 17:13
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    13

    主题

    166

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    494
    最后登录
    2018-1-6
     楼主| 发表于 2016-12-12 08:50:18 | 显示全部楼层
    技术范儿 发表于 2016-12-12 08:41
    用北斗多好,串口处理数据难度系数不大

    你居然是版主啊,牛逼
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-12 09:08:08 | 显示全部楼层
    191925882 发表于 2016-12-12 08:50
    你居然是版主啊,牛逼

    你认识我?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-13 17:13
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    13

    主题

    166

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    494
    最后登录
    2018-1-6
     楼主| 发表于 2016-12-12 09:12:43 | 显示全部楼层

    我们很熟啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-12 09:19:58 | 显示全部楼层

    提示一下,接触的人太多不知道你是谁
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-13 13:54
  • 签到天数: 32 天

    [LV.5]常住居民I

    5

    主题

    236

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    423
    最后登录
    2017-10-31
    发表于 2016-12-12 12:40:13 | 显示全部楼层
    这个有点霸气
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-12-12 15:15:10 | 显示全部楼层
    厉害厉害                 
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35

    主题

    356

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2586
    最后登录
    2023-6-23
    发表于 2016-12-12 22:05:10 | 显示全部楼层
    项目名称是基于NXP芯片的大棚温度、压力和湿度保持系统
    如果你说温湿度传感器的使用,我能理解。可是我没想明白,GPS在这个项目里是做什么用的?楼主给点提示吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-13 17:13
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    13

    主题

    166

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    494
    最后登录
    2018-1-6
     楼主| 发表于 2016-12-13 08:53:17 | 显示全部楼层
    香水橙 发表于 2016-12-12 22:05
    项目名称是基于NXP芯片的大棚温度、压力和湿度保持系统
    如果你说温湿度传感器的使用,我能理解。可是我没想 ...

    这是学习贴啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-30 00:16 , Processed in 0.154169 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表