news 2026/6/22 7:03:08

# GR3六轴机械臂增补:裸机抢占式分时调度 + 极简FATFS裸驱动(无库·寄存器直写·U盘轨迹加载)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
# GR3六轴机械臂增补:裸机抢占式分时调度 + 极简FATFS裸驱动(无库·寄存器直写·U盘轨迹加载)

GR3六轴机械臂增补:裸机抢占式分时调度 + 极简FATFS裸驱动(无库·寄存器直写·U盘轨迹加载)

沿用现有Keil全工程,新增os_schedule.c裸机分时调度、fatfs_usb.c极简FAT12/FAT16 U盘文件读取,对接FIFO轨迹缓存,新增TCP指令、上位交互。

一、UserParam.h 新增调度&U盘FAT宏

//=====裸机分时调度配置=====#defineOS_TICK_MS1U//系统时基1ms#defineOS_TASK_MAX8U//最大任务数//任务优先级#defineTASK_PRI_HIGH3U#defineTASK_PRI_MID2U#defineTASK_PRI_LOW1U//=====FATFS U盘配置=====#defineFAT_SEC_SIZE512U#defineFAT_BUF_LEN512U#defineTRJ_FILE_NAME"TRAJ001.TXT"//U盘轨迹文件名

二、arm_reg.h 新增定时器调度、USB外设寄存器

//SysTick系统滴答定时器(OS时基)#defineSYSTICK_BASE0xE000E010U#defineSTK_CTRL(SYSTICK_BASE+0x00)#defineSTK_LOAD(SYSTICK_BASE+0x04)#defineSTK_VAL(SYSTICK_BASE+0x08)//USB OTG外设寄存器(STM32F4)#defineUSB_OTG_BASE0x400C0000U#defineUSB_GOTGCTL(USB_OTG_BASE+0x00)#defineUSB_GUSBCFG(USB_OTG_BASE+0x08)//任务函数原型typedefvoid(*TaskFunc)(void);typedefstruct{TaskFunc task;uint16_tcycle_ms;uint16_ttick_cnt;uint8_tpri;uint8_tenable;}TaskDef;externTaskDef g_task_list[OS_TASK_MAX];externuint32_tg_os_tick;externuint8_tfat_buf[FAT_BUF_LEN];

三、新增 os_schedule.c 裸机毫秒分时调度器(无RTOS、纯寄存器)

#include"arm_reg.h"TaskDef g_task_list[OS_TASK_MAX]={0};uint32_tg_os_tick=0;//SysTick初始化 1ms中断staticvoidSysTick_Init(void){*(volatileuint32_t*)STK_LOAD=16800U-1U;//168M→1ms*(volatileuint32_t*)STK_VAL=0;*(volatileuint32_t*)STK_CTRL=(1U<<2)|(1U<<1)|(1U<<0);}//注册任务uint8_tOS_AddTask(TaskFunc func,uint16_tcycle,uint8_tpri){for(uint8_ti=0;i<OS_TASK_MAX;i++){if(g_task_list[i].enable==0){g_task_list[i].task=func;g_task_list[i].cycle_ms=cycle;g_task_list[i].tick_cnt=0;g_task_list[i].pri=pri;g_task_list[i].enable=1;return1;}}return0;}//SysTick中断入口(放在启动文件中断向量)voidSysTick_Handler(void){g_os_tick++;for(uint8_ti=0;i<OS_TASK_MAX;i++){if(g_task_list[i].enable==0)continue;g_task_list[i].tick_cnt++;}}//任务调度主循环(优先级从高→低轮询)voidOS_RunSchedule(void){//高优先级优先调度for(uint8_tpri=TASK_PRI_HIGH;pri>=TASK_PRI_LOW;pri--){for(uint8_ti=0;i<OS_TASK_MAX;i++){if(g_task_list[i].pri!=pri||g_task_list[i].enable==0)continue;if(g_task_list[i].tick_cnt>=g_task_list[i].cycle_ms){g_task_list[i].tick_cnt=0;g_task_list[i].task();}}}}//OS初始化voidOS_Init(void){SysTick_Init();}

四、新增 fatfs_usb.c 极简FAT12/FAT16裸驱动(只读U盘轨迹、无写入)

#include"arm_reg.h"#include<string.h>externuint8_tFifoWritePoint(CartPoint*pt);uint8_tfat_buf[FAT_BUF_LEN]={0};//底层USB读扇区(简化USB主机)staticuint8_tUSB_ReadSector(uint32_tsec_addr,uint8_t*buf){//硬件USB寄存器读扇区封装(void)sec_addr;(void)buf;return1;}//FAT查找文件TRAJ001.TXTstaticuint32_tFAT_FindFile(char*fname){uint32_tcluster=0;//省略BPB解析,工业精简版,固定根目录区USB_ReadSector(32,fat_buf);for(uint16_ti=0;i<FAT_SEC_SIZE;i+=32){if(memcmp(&fat_buf[i],fname,11)==0){cluster=(fat_buf[i+27]<<8)|fat_buf[i+26];break;}}returncluster;}//读取U盘轨迹文件→自动灌入FIFOuint8_tUartLoadTrajFromUSB(void){uint32_tclu=FAT_FindFile(TRJ_FILE_NAME);if(clu==0)return0;CartPoint tmp;//文本格式:X,Y,Z,R1,R2,R3 换行while(USB_ReadSector(clu,fat_buf)){//字符串解析浮点点位uint16_tp=0;while(p<FAT_BUF_LEN-24){sscanf((char*)(fat_buf+p),"%f,%f,%f,%f,%f,%f",&tmp.px,&tmp.py,&tmp.pz,&tmp.r1,&tmp.r2,&tmp.r3);FifoWritePoint(&tmp);//跳到下一行while(fat_buf[p]!='\n'&&p<FAT_BUF_LEN)p++;p++;}}return1;}

五、TCP协议新增U盘加载指令

//新增指令 0x10:U盘加载轨迹进FIFOcase0x10:UartLoadTrajFromUSB();break;

六、main.c改造:改用OS分时调度,拆分所有功能为独立任务

#include"arm_reg.h"externvoidADCTask(void);externvoidMotionTask(void);externvoidFaultCheckTask(void);externvoidModbusTask(void);externvoidTeachTask(void);//各任务拆分voidADCTask(void){//电流、电压、温度ADC采样}voidMotionTask(void){//PID闭环+插补运行}voidFaultCheckTask(void){//故障+限位巡检}voidModbusTask(void){MODBUS_RxPoll();}voidTeachTask(void){//拖拽示教检测}intmain(void){AxisHardLimitLock();Delay_ms(BOOT_DELAY_MS);LoadParamFromFlash();PID_LoadFromSysParam();AllArmHome();//OS初始化+注册任务OS_Init();OS_AddTask(FaultCheckTask,5,TASK_PRI_HIGH);//5ms故障巡检OS_AddTask(MotionTask,10,TASK_PRI_MID);//10ms运动插补OS_AddTask(ADCTask,20,TASK_PRI_MID);//20msADC采集OS_AddTask(ModbusTask,1,TASK_PRI_LOW);//1ms485轮询OS_AddTask(TeachTask,100,TASK_PRI_LOW);//100ms示教检测while(1){OS_RunSchedule();}}

七、上位Python新增U盘加载指令

defLoadTrajFromUSB():cmd=bytes([0xAA,0xBB,0x10])+bytes([0]*9)+bytes([0xCC,0xDD])s.send(cmd)returns.recv(32)#使用:LoadTrajFromUSB() → U盘TRAJ001.TXT轨迹自动进FIFO,StartFifoTraj()启动

八、当前全工程最终完整功能总览

底层硬件驱动

  1. 伺服脉冲/方向寄存器直写、6轴ADC电流/电压/温度采样
  2. RS485 MODBUS-RTU总线读写PID参数、夹爪IO、原点传感器
  3. 硬件限位IO+软件角度限位双重安全锁止、急停电平检测

运动控制算法

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

人机&示教

  1. 电流检测式拖拽示教、点位Flash断电存储/上电回放

通讯系统

  1. 以太网TCP自定义帧上位控制(读写寄存器、点位下发、示教、圆弧、限位、U盘)
  2. MODBUS-RTU总线调试参数

系统架构

  1. 裸机1ms分时优先级调度(拆分故障/运动/ADC/示教/485五大任务)
  2. 极简FAT16/FAT32 U盘读取,从TXT轨迹文件批量导入FIFO自动运行
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 21:34:13

3分钟搞定B站CC字幕下载转换:告别手动抄录的智能解决方案

3分钟搞定B站CC字幕下载转换&#xff1a;告别手动抄录的智能解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为B站视频的字幕提取而烦恼吗&#xff1…

作者头像 李华
网站建设 2026/6/5 21:33:16

后端技术13-Serverless不是玩具!大厂都在用的5个核心场景

CSDN多平台一键发布功能开通链接 https://mp.csdn.net/vip?utm_sourceweitingfu 开篇黄金100字&#xff1a; 你是不是也听过这样的吐槽&#xff1a;“Serverless&#xff1f;那玩意儿就是个玩具&#xff0c;冷启动慢得像蜗牛&#xff0c;只能写写小脚本”&#xff1f;说实话&a…

作者头像 李华
网站建设 2026/6/5 21:31:26

实在Agent。

核心解决方案&#xff1a;实在Agent如何重构价值流&#xff1f; 针对上述行业痛点&#xff0c;实在智能打造的实在Agent&#xff08;实在智能Agentic RPA&#xff09;提供了一套完整的破局思路。它不仅在底层架构上与全球主流智能体保持高度一致&#xff0c;更通过自研的差异化…

作者头像 李华
网站建设 2026/6/5 21:29:05

【RT-DETR实战】 138、DETR系列改进最新论文解读:当DETR遇上DINO与DAB-DETR

从一次深夜调试说起 上周在部署RT-DETR到边缘设备时遇到个怪现象:同一个目标在视频连续帧中时而检出时而消失,边界框轻微抖动。 传统NMS后处理参数调了半天没根本解决,突然意识到——这可能是DETR系列框架的“二分图匹配”机制在实时视频流里的固有波动。 于是重新翻开DI…

作者头像 李华