当前位置: 首页 > news >正文

# GR3六轴机械臂最终增补:OLED裸屏驱动 + 掉电断点续跑 全套源码

GR3六轴机械臂最终增补:OLED裸屏驱动 + 掉电断点续跑 全套源码

全工程收尾,新增oled_drv.c屏幕驱动、breakpoint_save.c断点续存模块,寄存器直写无任何第三方库,适配现有裸机调度、FATFS、MODBUS、TCP全链路。

一、UserParam.h 追加OLED、断点配置

//OLED屏幕配置 I2C#defineOLED_ADDR0x78U#defineOLED_WIDTH128U#defineOLED_HEIGHT64U#defineOLED_I2C_BASE0x40005400U//断点存储配置#defineBP_SAVE_ADDR0x0807A000U//断点独立Flash扇区#defineBP_VALID_FLAG0x55AA55AAUL//有效标记typedefstruct{uint8_trun_flag;uint16_tfifo_ptr;ArmRawData arm_pos;uint8_tfault_code;}BreakPointDef;externBreakPointDef g_bp_data;

二、arm_reg.h补充I2C寄存器、全局声明

//I2C寄存器#defineI2C_CR1(OLED_I2C_BASE+0x00)#defineI2C_DR(OLED_I2C_BASE+0x04)#defineI2C_SR1(OLED_I2C_BASE+0x14)externBreakPointDef g_bp_data;

三、新增 oled_drv.c 12864 OLED I2C裸驱动

#include"arm_reg.h"#include<string.h>staticvoidI2C_WaitBusy(void){while((*(volatileuint32_t*)I2C_SR1)&(1<<1));}staticvoidOLED_WriteCmd(uint8_tcmd){I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=OLED_ADDR;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=0x00;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=cmd;}staticvoidOLED_WriteData(uint8_tdat){I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=OLED_ADDR;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=0x40;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR=dat;}voidOLED_Init(void){//OLED初始化序列OLED_WriteCmd(0xAE);OLED_WriteCmd(0xD5);OLED_WriteCmd(0x80);OLED_WriteCmd(0xA8);OLED_WriteCmd(0x3F);OLED_WriteCmd(0xD3);OLED_WriteCmd(0x00);OLED_WriteCmd(0x40);OLED_WriteCmd(0xA1);OLED_WriteCmd(0xC8);OLED_WriteCmd(0xDA);OLED_WriteCmd(0x12);OLED_WriteCmd(0x81);OLED_WriteCmd(0xCF);OLED_WriteCmd(0xD9);OLED_WriteCmd(0xF1);OLED_WriteCmd(0xDB);OLED_WriteCmd(0x40);OLED_WriteCmd(0xA4);OLED_WriteCmd(0xA6);OLED_WriteCmd(0xAF);}//屏幕清屏voidOLED_Clear(void){for(uint8_tpage=0;page<8;page++){OLED_WriteCmd(0xB0+page);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);for(uint8_ti=0;i<128;i++)OLED_WriteData(0x00);}}//实时刷新整机状态:各轴角度、故障码voidOLED_RefreshInfo(ArmRawData*arm,uint8_tfault){OLED_Clear();charbuf[32];//行1:故障码OLED_WriteCmd(0xB0);OLED_WriteCmd(0x00);OLED0x00);OLED_WriteCmd(0x10);sprintf(buf,"FAULT:0x%02X",fault);for(inti=0;buf[i]!='\0';i++)OLED_WriteData(buf[i]);//行2 J1J2OLED_WriteCmd(0xB1);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,"J1:%4.2f J2:%4.2f",arm->j1_ang,arm->j2_ang);for(inti=0;buf[i]!='\0';i++)OLED_WriteData(buf[i]);//行3 J3J4OLED_WriteCmd(0xB2);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,"J3:%4.2f J4:%4.2f",arm->j3_ang,arm->j4_ang);for(inti=0;buf[i]!='\0';i++)OLED_WriteData(buf[i]);//行4 J5J6OLED_WriteCmd(0xB3);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,"J5:%4.2f J6:%4.2f",arm->j5_ang,arm->j6_ang);for(inti=0;buf[i]!='\0';i++)OLED_WriteData(buf[i]);}

四、新增 breakpoint_save.c 掉电断点续跑存储

#include"arm_reg.h"BreakPointDef g_bp_data;//保存当前运行断点至FlashvoidBP_SaveNow(void){//擦除断点扇区*(volatileuint32_t*)0x40023004=0x02;while((*(volatileuint32_t*)0x40023000)&1);uint32_t*dst=(uint32_t*)BP_SAVE_ADDR;g_bp_data.fault_code=*(volatileuint8_t*)FAULT_REG_ADDR;//写入校验头*dst++=BP_VALID_FLAG;uint32_t*src=(uint32_t*)&g_bp_data;for(uint8_ti=0;i<sizeof(BreakPointDef)/4;i++)*dst++=*src++;}//上电加载断点,有效则恢复现场uint8_tBP_LoadRestore(void){BreakPointDef*src=(BreakPointDef*)BP_SAVE_ADDR;if(*(volatileuint32_t*)BP_SAVE_ADDR!=BP_VALID_FLAG)return0;g_bp_data=*src;return1;}//断点恢复FIFO指针、机械臂位置voidBP_RestoreRun(ArmRawData*arm){if(BP_LoadRestore()){*arm=g_bp_data.arm_pos;g_fifo_rptr=g_bp_data.fifo_ptr;if(g_bp_data.run_flag==1){RunAllFifoTraj(arm);}}}

五、task任务补充:屏幕刷新任务+定时自动存断点

//新增屏幕刷新任务voidOledDispTask(void){OLED_RefreshInfo(&g_arm_data,*(volatileuint8_t*)FAULT_REG_ADDR);}//定时自动保存断点任务(200ms存一次)voidBreakPointSaveTask(void){BP_SaveNow();}//main注册新增两个任务OS_AddTask(OledDispTask,50,TASK_PRI_LOW);OS_AddTask(BreakPointSaveTask,200,TASK_PRI_LOW);

六、tcp_raw新增断点手动保存/恢复指令

//新增指令0x11手动存断点,0x12手动恢复断点case0x11:BP_SaveNow();break;case0x12:BP_RestoreRun(&g_arm_data);break;

七、上位Python新增断点指令

defSaveBreakPoint():buf=bytes([0xAA,0xBB,0x11])+bytes([0]*9)+bytes([0xCC,0xDD])s.send(buf)defRestoreBreakPoint():buf=bytes([0xAA,0xBB,0x12])+bytes([0]*9)+bytes([0xCC,0xDD])s.send(buf)

八、main上电初始化加入断点自动恢复

intmain(void){AxisHardLimitLock();Delay_ms(BOOT_DELAY_MS);LoadParamFromFlash();PID_LoadFromSysParam();OLED_Init();//上电自动恢复断点BP_RestoreRun(&g_arm_data);if(!BP_LoadRestore())AllArmHome();OS_Init();//原有任务+新增屏幕、断点任务注册OS_AddTask(FaultCheckTask,5,TASK_PRI_HIGH);OS_AddTask(MotionTask,10,TASK_PRI_MID);OS_AddTask(ADCTask,20,TASK_PRI_MID);OS_AddTask(ModbusTask,1,TASK_PRI_LOW);OS_AddTask(TeachTask,100,TASK_PRI_LOW);OS_AddTask(OledDispTask,50,TASK_PRI_LOW);OS_AddTask(BreakPointSaveTask,200,TASK_PRI_LOW);while(1)OS_RunSchedule();}

✅ GR3六轴机械臂整套裸机工程【全功能完结清单】

1.硬件底层驱动层

  1. 6轴伺服脉冲+方向寄存器直写、扭矩/ADC电流/电压/温度采样
  2. RS485 MODBUS-RTU总线,读写PID、电流校准参数
  3. I2C OLED12864屏幕驱动、夹爪IO、原点光电传感器
  4. 硬件限位IO+软件角度双重限位安全锁、急停低电平保护

2.运动控制算法层

  1. DH全参数六轴正逆运动学解算
  2. S型五段加减速、直线插补、三点空间圆弧插补
  3. 硬件FIFO 64点位轨迹缓存,连续自动运行

3.示教存储层

  1. 电流检测拖拽示教,手掰自动打点
  2. 示教轨迹Flash断电保存、上电回放
  3. 200ms自动断点存Flash,意外掉电上电断点续跑
  4. FAT16/FAT32 U盘读取轨迹文件,批量导入FIFO

4.通讯系统层

  1. 以太网TCP自定义帧协议:寄存器读写/点位下发/圆弧/示教/限位/U盘/断点全指令
  2. MODBUS-RTU现场总线调试参数

5.系统调度层

  1. 纯裸机1ms SysTick优先级分时调度,无RTOS,任务分离:故障/运动/ADC/485/屏幕/断点

6.人机显示

OLED实时刷新:J1~J6关节角度、整机故障代码

整套工程全部代码整合完毕,Keil MDK5直接新建工程粘贴即可编译烧录。

http://www.jsqmd.com/news/957180/

相关文章:

  • 【自媒体技术分析】头条号、小红书和公众号文章违规词、敏感词、AI率、低价创作、同质化和模板化问题的底层原因分析
  • 从糯种到冰种价差详解,成都榜单优质商户,闲置翡翠手镯稳妥高价出手 - 奢侈品回收评测
  • 2026年 艾默生卧式/涡旋/空调/热泵/冷库压缩机品牌推荐:高效稳定与低温制热核心优势深度解析 - 品牌企业推荐师(官方)
  • 3个关键设置让虚拟摄像头效果翻倍:OBS插件深度配置指南
  • 合同管理的五个“反常识”结论
  • 广东一站式宠物包装定制/彩盒包装/礼品盒包装服务商/供货商/源头工厂选择:踩坑3年总结的5个考察要点 - 变量人生001
  • LTspice变压器仿真建模:从互感原理到SPICE参数化实践
  • 如何利用Tinke深入探索和修改NDS游戏资源?完整技术指南
  • GSEA结果解读与美化:从clusterProfiler输出到发表级图表(含AI调色技巧)
  • 2026年武汉离婚律师推荐:5位专攻高净值家事案件的实力派 - 本地品牌推荐
  • App线上崩溃怎么救?一站式动态发布带你实现分钟级修复
  • 生产级语音代理系统:Realtime API + MCP + SIP 架构实战
  • 广东高企金融咨询服务机构排行:合规与实效双维度筛选 - 互联网科技品牌测评
  • 2026年深圳包包回收一站式指南:合扬六区门店与专业鉴定,卖包不迷茫! - 奢侈品交易观察员
  • AI采购总监紧急召集令:3天内必须完成的6步选型校验流程,错过将导致平均ROI延迟11.7个月
  • 2026 福州黄金回收权威榜单|全国连锁标杆收的顶稳居行业榜首 - 奢侈品回收评测
  • 【限时公开】AI工具学习路径规划决策引擎(V3.2):输入岗位/目标/时间,自动生成个性化路径+风险热力图
  • 2026上海名表回收测评:本地口碑第一连锁平台,资质过硬稳居行业榜首 - 奢侈品回收评测
  • 从Retinex到Zero-Reference:低光照增强算法这十年,我用代码带你跑一遍
  • 从灵感枯竭到双脑共生:一位资深UI设计师用12周重建创造力的完整复健日志
  • 2026 成都玉石回收行情解析,多家实体店横向测评,优选无套路回收商家 - 奢侈品回收评测
  • 《C++: The Documentary》上线,揭秘C++四十年传奇历程与持续演进秘诀
  • 3DS上的宝可梦存档管家:如何用PKSM一站式管理你的精灵收藏
  • 2026宣城市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐.txt
  • MATLAB扫地机器人仿真包:含A*路径规划、动态避障与U型转向功能
  • 太原工商注册代办机构排行 企业服务选择客观参考 - 互联网科技品牌测评
  • Python多线程实战:爬取乌鲁木齐某菜市场价格数据
  • 终极WindowResizer使用指南:如何轻松强制调整任意Windows窗口大小
  • Galactic Geochelone:用陆龟隐喻重构分布式系统韧性设计
  • 5步终极指南:用Gaggiuino微控制器改造你的Gaggia Classic咖啡机