给STM32机械臂加点“记忆”:手把手实现动作录制与回放(附外部中断+数组存储代码)

张开发
2026/4/16 22:20:23 15 分钟阅读

分享文章

给STM32机械臂加点“记忆”:手把手实现动作录制与回放(附外部中断+数组存储代码)
给STM32机械臂加点“记忆”手把手实现动作录制与回放机械臂的同步控制已经不能满足你的好奇心了吗想让你的DIY机械臂像工业机器人一样记住动作序列并精准复现本文将带你深入STM32的外部中断和数组存储技术实现一个具备动作录制与回放功能的智能机械臂系统。1. 从同步控制到动作记忆系统设计思路传统电位器控制机械臂的方案存在明显局限——每次操作都需要人工实时控制。而加入记忆功能后系统可以录制模式通过按键触发记录舵机位置数据和时间间隔回放模式自动复现录制动作解放操作者双手循环控制支持多次循环播放适合重复性任务硬件架构上我们在原有电位器舵机的基础上增加了两个关键元素外部中断按键用于模式切换KEY1开始录制KEY0结束录制数组存储空间保存多路舵机的PWM数值序列注意建议使用STM32F103ZET6等具有足够RAM的型号录制时长受限于可用内存。2. 核心代码实现中断与数据存储2.1 外部中断配置// exti.c void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // KEY1(PE3)配置为下降沿触发 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); EXTI_InitStructure.EXTI_Line EXTI_Line3; EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling; EXTI_Init(EXTI_InitStructure); // 设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); }2.2 动作录制与存储在中断服务函数中实现数据采集// 全局变量定义 #define MAX_RECORD_STEPS 500 typedef struct { uint16_t pwm1; uint16_t pwm2; uint16_t pwm4; // TIM3通道3未使用 } ServoPosition; ServoPosition recordedSteps[MAX_RECORD_STEPS]; uint16_t currentStep 0; uint8_t isRecording 0; void EXTI3_IRQHandler(void) { delay_ms(10); // 消抖 if(KEY1 0 !isRecording) { isRecording 1; currentStep 0; LED1 0; // 指示灯亮表示录制中 while(KEY0 ! 0 currentStep MAX_RECORD_STEPS) { // 记录三路舵机位置 recordedSteps[currentStep].pwm1 ADCConvertedValue[0][0]/20.475 50; recordedSteps[currentStep].pwm2 ADCConvertedValue[0][1]/20.475 50; recordedSteps[currentStep].pwm4 ADCConvertedValue[0][2]/20.475 50; // 实时控制舵机 TIM_SetCompare1(TIM3, recordedSteps[currentStep].pwm1); TIM_SetCompare2(TIM3, recordedSteps[currentStep].pwm2); TIM_SetCompare4(TIM3, recordedSteps[currentStep].pwm4); currentStep; delay_ms(15); // 采样间隔 } isRecording 0; LED1 1; // 指示灯灭 EXTI_ClearITPendingBit(EXTI_Line3); } }3. 动作回放优化技巧3.1 流畅回放实现原始方案直接使用delay_ms()控制节奏可能导致动作卡顿。改进方案定时器中断控制使用另一个定时器产生固定时间间隔的中断双缓冲机制准备下一帧数据时不影响当前帧执行// 使用TIM4控制回放节奏 void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { static uint16_t playIndex 0; if(playIndex currentStep) { TIM_SetCompare1(TIM3, recordedSteps[playIndex].pwm1); TIM_SetCompare2(TIM3, recordedSteps[playIndex].pwm2); TIM_SetCompare4(TIM3, recordedSteps[playIndex].pwm4); playIndex; } else { playIndex 0; // 循环播放 } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } }3.2 存储结构优化对比方案优点缺点适用场景二维数组实现简单浪费空间少量短时记录结构体数组数据关联性强访问稍复杂多路同步记录链表结构动态内存利用实现复杂长时间不确定长度记录外部Flash容量大需要额外芯片工业级应用4. 进阶功能扩展4.1 动作编辑功能在基础录制回放上可以添加关键帧删除去除冗余点位速度调节整体加快/减慢动作动作拼接组合多个录制片段// 示例删除指定范围内的记录点 void deleteSteps(uint16_t start, uint16_t end) { if(end currentStep) end currentStep - 1; uint16_t moveCount currentStep - end - 1; for(uint16_t i 0; i moveCount; i) { recordedSteps[starti] recordedSteps[end1i]; } currentStep - (end - start 1); }4.2 掉电保存方案使用STM32内部Flash或外接EEPROM保存动作数据数据压缩将PWM值从uint16_t转换为uint8_t精度损失可接受校验机制添加CRC校验防止数据损坏分页存储利用Flash的页写入特性// Flash存储示例 #define FLASH_PAGE_SIZE 1024 #define FLASH_START_ADDR 0x0801F000 // 最后一页 void saveToFlash(void) { FLASH_Unlock(); FLASH_ErasePage(FLASH_START_ADDR); uint32_t addr FLASH_START_ADDR; for(uint16_t i 0; i currentStep; i) { FLASH_ProgramHalfWord(addr, recordedSteps[i].pwm1); addr 2; FLASH_ProgramHalfWord(addr, recordedSteps[i].pwm2); addr 2; // 确保不超过页边界 if(addr FLASH_START_ADDR FLASH_PAGE_SIZE) break; } FLASH_Lock(); }5. 实际应用中的问题排查调试过程中常见问题及解决方案动作抖动不流畅检查定时器配置确保PWM频率为50Hz增加采样间隔15ms可能太短添加软件滤波处理ADC数据录制数据溢出动态计算剩余存储空间添加存储满提示LED闪烁频率变化回放位置偏差校准电位器与舵机的映射关系检查供电稳定性舵机电流突变可能导致电压波动// ADC数据滤波示例 uint16_t getFilteredADC(uint8_t channel) { static uint16_t filterBuf[3][5] {0}; static uint8_t index 0; uint32_t sum 0; // 更新缓冲区 filterBuf[channel][index] ADCConvertedValue[0][channel]; index (index 1) % 5; // 中值平均滤波 for(uint8_t i 0; i 5; i) { sum filterBuf[channel][i]; } return sum / 5; }在完成基础功能后可以尝试为机械臂添加更多智能特性——比如通过加速度传感器记录末端轨迹或者开发PC端的上位机软件来可视化编辑动作序列。这些扩展都能让你的机械臂项目从简单的玩具升级为真正的可编程控制原型。

更多文章