野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1121|回复: 0

【野火】第二期瑞萨RA MCU创意氛围赛

[复制链接]
发表于 2024-11-15 23:24:40 | 显示全部楼层 |阅读模式
本帖最后由 Abner_ux47Y 于 2024-12-12 16:33 编辑

1. 系统概  
  1.1 GNSS系统
         GNSS(全球卫星导航系统 Global NavigaTIon Satellite System )接收器出货量将在未来十年持续增长,从 2021 年的 18 亿台增加到2031 年的 25 亿台。2023年的卫星定位市场收入录得2,620亿欧元,保持着约15%的复合年增长率,预计未来十年复合年增长率8.4%。2033年可达5,800亿欧元。
野火论坛202411152303551209..png


  对国内而言,2023年我国卫星导航与位置服务产业总体产值达到5362亿元人民币,较2022年增长7.09%。其中,包括与卫星导航技术研发和应用直接相关的芯片、器件、算法、软件、导航数据、终端设备、基础设施等在内的产业核心产值同比增长5.5%,达到1611 亿元人民币,在总体产值中占比为30.04%。由卫星导航应用和服务所衍生带动形成的关联产值同比增长 7.79%,达到3751亿元人民币,在总体产值中占比达到 69.96%。
野火论坛202411152304134068..png
   实时动态定位(Real-Time Kinematic,简称RTK)是一种用于提高全球导航卫星系统(如GPS、GLONASS、Galileo、北斗等)定位精度的技术。RTK系统通常由两部分组成:一个基准站(Base Station)和一个或多个流动站(Rover)。基准站位于已知精确坐标的位置上,它收集卫星数据并通过无线数据链路发送到流动站。流动站使用这些数据来纠正其自己的卫星测量值,从而达到厘米级的定位精度。
通过无线通信设备接收单基站或者网络 RTK 播发的北斗/GNSS 载波相位实时动态差分数据,自主进行实时解算,提供高精度定位结果的终端设备。


   1.2 OpenCAN电机控制OpenCAN是一款专为与各种CAN(Controller Area Network,控制区域网络)设备进行交互而设计的软件平台。OpenCAN提供了一个高度抽象化的C++接口,开发者无需深入了解CAN协议的具体细节,就能轻松地控制和管理CAN设备。这种抽象化的设计不仅降低了学习曲线,还提高了开发效率。OpenCAN的插件系统允许用户通过添加插件来扩展对特定设备的支持。这意味着无论开发者面对的是何种类型的CAN设备,OpenCAN都能够提供相应的支持,极大地扩展了其应用范围。OpenCAN提供了一套简洁的API,这些API经过精心设计,使得开发者能够快速上手,并且能够轻松地实现所需的功能。无论是简单的数据读取还是复杂的设备控制,OpenCAN的API都能提供必要的支持。
在高精度电机控制领域,OpenCAN平台可以通过其强大的功能和灵活的插件系统,实现对电机的精确控制和管理。精确控制:OpenCAN平台可以实现对电机的精确控制,包括速度、位置、扭矩等多个参数。这得益于其高效的数据传输和处理能力,以及对CAN协议的深度支持。实时监控:通过OpenCAN平台,开发者可以实时监控电机的运行状态,包括电流、电压、温度等关键参数。这有助于及时发现并处理潜在问题,提高系统的稳定性和可靠性。灵活配置:OpenCAN的插件系统使得开发者可以根据实际需求灵活配置电机控制参数。无论是调整控制算法还是修改通信协议,都可以通过简单的插件开发来实现。高效通信:OpenCAN平台支持高效的CAN通信协议,可以实现电机与控制器之间的快速数据传输。这有助于降低延迟,提高系统的响应速度和控制精度。

  本项目基于基于野火瑞萨耀阳RA8开发板设计,野火耀阳RA8开发板是一款功能强大的开发板,基于瑞萨电子的RA系列R7FA8D1BHECBD微控制器作为主控,该微控制器基于Arm Cortex-M85内核,具有高性能和低功耗的特点。开发板上集成了丰富的外设和接口,包括USB_OTG接口、USB_UART接口、16位SDRAM、32M字节容量QSPI Flash等,百兆网口,CANFD接口,RS485接口,OLED LCD显示屏接口,满足开发者多样化的需求。通过瑞萨的代码初始化工具(如RA Smart Configurator)进行图形化配置,方便开发者快速搭建项目框架和配置底层驱动。
本设计基于OpenCAN协议驱动无刷电机,融合RTK GNSS高精度定位系统,智能车实现高精度运控。场景落地很多,比如智慧农业,智能巡检,智慧交通划线。智能割草机领域。

   项目场景:
  割草是一项极其耗时费力的工作,在欧美国家,庭院内草坪的精致与否代表了这个家庭的门面。在自动化作业和高质量生活需求的催动下,更加智能化的割草机器人替代传统园林工具逐渐跻身主流。根据Statista数据显示,预计2024年全球割草机市场规模将达到374.3亿美元,并有望在2027年达到新峰值440.7亿美元。Grand View Research发布的数据显示,2021年全球割草机市场规模为304亿美元,年均复合增长率为5.7%。另有数据显示,2022年全球割草机市场规模约为310亿美元,到2032年将增长至563亿美元。


2 .系统总体设计
    野火论坛202411152304417831..png

   野火论坛202411152304572890..png

    2.1 @1是RTKGNSS接收机模块:支持RTK技术的GPS接收模块。这个模块能够接收来自多个GPS北斗等卫星的信号,并通过载波相位差分技术实现高精度定位。可以采用全系统全频高精度定位定向模块和芯星通科技UM982或者司南K823。这些模块通常具有串口(如UART、SPI等)或其他通信接口,通过串口与野火耀阳RA8开发板进行通讯,接受GPS数据。
   2.2 @2是物联网模组:野火耀阳RA8开发板通过串口解析配置RTK GPS接收模块,实现基站模式或者流动站模式。RA8开发板一路串口通过物联网模组CAT4 EG25全球通模块将测站点坐标、伪距观测值载波相位观测值、卫星跟踪状态和接收机工作状态等通过无线数据链发送给流动站,流动着接受差分数据实现固定解,实现高精度位置定位。可以解析来自第三方的千寻(如千寻位置网络)的差分数据,以提高其定位精度。也可以通过第三方位置服务比如千寻位置网络是一种基于CORS(连续运行参考站系统)技术的高精度位置服务网络,它通过覆盖全国的CORS基站,向用户提供实时、高精度的差分数据,野火耀阳RA8开发板驱动UM982配置流动站解析千寻差分数据,实现RTK接收机实现厘米级甚至毫米级的定位精度。
2.3 @3是基于OpenCAN协议高精度伺服电机
   野火耀阳RA8开发板支持多路CANFD,通过CANOPEN算法库,实现高精度电机控制。 CANOPEN作为一种广泛应用于工业自动化领域的现场总线协议,通过其高效的数据传输机制和标准化的对象字典,使得设备间的通信更加简洁、可靠。本项目对于在瑞萨RA平台上集成CANOPEN功能实现BLDC电机高精度闭环控制。
实物小车:
野火论坛202411152308583125..png
  
3.软件开发
   野火论坛202411152305292440..png
  
     IDE基于keil+FSP

   野火论坛202411152310117958..png

配置时钟和外设(IIC,CAN,UART用于串口通信),配置UART:在UART的配置选项中,设置波特率(如9600或更高,具体取决于RTK模块的要求)、数据位、停止位和校验位等。生成代码:
编写RTK解析代码初始化USART:在代码中初始化USART外设,以便与RTK模块进行通信。
接收RTK数据:通过USART中断或DMA(直接存储器访问)等方式接收RTK模块发送的数据。
解析RTK数据:根据RTK模块的数据协议(如NMEA 0183协议)解析接收到的数据,提取出纬度、经度、高度和精度等定位信息。
处理定位信息:将解析出的定位信息进行处理,如转换为特定的坐标系、进行滤波或平滑处理等。
发送定位信息:将处理后的定位信息通过串口、网络或其他方式发送给上位机或其他设备。
实现的NMEA数据解析函数。这解析GGA语句(GPS Fix Data),可以根据需要扩展以解析其他类型的NMEA语句。

  1. <font face="宋体" size="3">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. void ParseNMEA(char *nmea)  
  6. {  
  7.     if (strncmp(nmea, "$GPGGA", 6) == 0) // 检查是否是GGA语句  
  8.     {  
  9.         char *token = strtok(nmea, ",");  
  10.         int field = 0;  
  11.         char utcTime[11];  
  12.         char latitude[10];  
  13.         char northSouth;  
  14.         char longitude[11];  
  15.         char eastWest;  
  16.         int fixQuality;  
  17.         int numSatellites;  
  18.         float hdop;  
  19.         float altitude;  
  20.         float altitudeUnits;  
  21.         float geoidHeight;  
  22.         float geoidUnits;  
  23.   
  24.         while (token != NULL)  
  25.         {  
  26.             switch (field)  
  27.             {  
  28.                 case 1: strcpy(utcTime, token); break; // UTC时间  
  29.                 case 2: // 纬度  
  30.                     strncpy(latitude, token, 2);  
  31.                     latitude[2] = '.';  
  32.                     strncpy(latitude + 3, token + 2, strlen(token) - 2);  
  33.                     break;  
  34.                 case 3: northSouth = *token; break; // 北/南  
  35.                 case 4: // 经度  
  36.                     strncpy(longitude, token, 3);  
  37.                     longitude[3] = '.';  
  38.                     strncpy(longitude + 4, token + 3, strlen(token) - 3);  
  39.                     break;  
  40.                 case 5: eastWest = *token; break; // 东/西  
  41.                 case 6: fixQuality = atoi(token); break; // 定位质量  
  42.                 case 7: numSatellites = atoi(token); break; // 使用卫星数量  
  43.                 case 8: hdop = atof(token); break; // 水平精度稀释  
  44.                 case 9: altitude = atof(token); break; // 海拔高度  
  45.                 case 10: altitudeUnits = atof(token); break; // 海拔单位(一般为米)  
  46.                 case 11: geoidHeight = atof(token); break; // 大地水准面高度  
  47.                 case 12: geoidUnits = atof(token); break; // 大地水准面高度单位(一般为米)  
  48.             }  
  49.             token = strtok(NULL, ",");  
  50.             field++;  
  51.         }  
  52.   
  53.         // 打印解析结果  
  54.         printf("UTC Time: %s\n", utcTime);  
  55.         printf("Latitude: %s %c\n", latitude, northSouth);  
  56.         printf("Longitude: %s %c\n", longitude, eastWest);  
  57.         printf("Fix Quality: %d\n", fixQuality);  
  58.         printf("Number of Satellites: %d\n", numSatellites);  
  59.         printf("HDOP: %.2f\n", hdop);  
  60.         printf("Altitude: %.2f %c\n", altitude, (altitudeUnits == 1.0 ? 'm' : 'f')); // 假设单位是米或英尺  
  61.         printf("Geoid Height: %.2f %c\n", geoidHeight, (geoidUnits == 1.0 ? 'm' : 'f'));  
  62.     }  
  63. }


  64. </font>
复制代码

   系统成功实现固定解:
野火论坛202411152311351635..png
高精度定位数据
野火论坛202411152313022197..png
OpenCAN电机驱动设计 实现RTK位置高精度闭环控制
发送控制指令:RA8开发板通过发送SDO(服务数据对象)报文或配置好的PDO来设置电机的目标速度或位置。
读取状态信息:RA8开发板通过读取相应的PDO来获取电机的实时状态信息,如当前速度、当前位置等。
算法控制:根据应用需求,在RA8开发板实现相应的控制算法(PID控制算法),根据反馈的状态信息调整控制指令,以实现精确位置的电机控制。




野火论坛202411152316291571..png





成果展示:




https://www.bilibili.com/video/BV1uRmZYuE8h/


回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-4-3 06:51 , Processed in 0.185598 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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