野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 237|回复: 0

【野火】第二期瑞萨RA MCU创意氛围赛+基于瑞萨耀阳RA8高精...

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

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

  对国内而言,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高精度定位系统,实现高精度运控。


2 .系统总体设计
[size=10.5000pt]    野火论坛202411152304417831..png

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

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


复制代码

   系统成功实现固定解:
野火论坛202411152311351635..png [size=12.0000pt]
[size=12.0000pt]高精度定位数据
野火论坛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, 2024-12-4 00:44 , Processed in 0.168882 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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