stm32写字机器人资料 主控stm32f103c8t6 包含程序,原理图,pcb,机械结构
最近折腾了个基于STM32的写字机器人,从硬件画板到代码调试踩了不少坑,这里把核心模块拆开说说。主控用的是性价比极高的STM32F103C8T6,这货72MHz主频带PWM外设,驱动两个42步进电机绰绰有余。

先说机械结构,核心是XY轴十字滑台。X轴用光轴+直线轴承,Y轴直接上了丝杆传动。这里有个骚操作------用旧光驱里拆的步进电机,省了五十块预算。滑台框架用3mm亚克力板激光切割,注意导轨安装孔位要留0.5mm余量,否则装配时会卡到怀疑人生。
电路部分重点看电机驱动。直接怼ULN2003驱动板太浪费IO口,改用A4988步进电机驱动模块。接线时注意把STM32的TIM1CH1和TIM1CH2接到驱动模块的STEP和DIR引脚,这样可以直接用硬件PWM生成脉冲。原理图里有个关键点:在VMOT电源端并了个470uF电容,实测能有效消除电机启停时的电压抖动。

stm32写字机器人资料 主控stm32f103c8t6 包含程序,原理图,pcb,机械结构
代码方面,核心是运动轨迹插补算法。这里用了个简化版的Bresenham直线算法:
c
void Line(int x1, int y1, int x2, int y2) {
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int sx = x1 < x2 ? 1 : -1;
int sy = y1 < y2 ? 1 : -1;
int err = dx - dy;
while(1) {
StepperMoveTo(x1, y1); // 驱动电机到当前坐标
if(x1 == x2 && y1 == y2) break;
int e2 = 2 * err;
if(e2 > -dy) {
err -= dy;
x1 += sx;
}
if(e2 < dx) {
err += dx;
y1 += sy;
}
HAL_Delay(2); // 控制写字速度
}
}
这段代码的精髓在于用整数运算替代浮点,避免STM32跑浮点运算卡成狗。实测画A4纸大小的直线时,误差能控制在0.3mm以内。注意HAL_Delay的值要根据步进电机步距角调整,我用的是0.9度电机,延时2ms刚好能让笔迹连贯。

调试时遇到个坑爹问题------画圆时出现锯齿。后来发现是定时器配置问题,TIM1的ARR寄存器没设置自动重载。改完配置后加上这句:
c
htim1.Instance->CR1 |= TIM_CR1_ARPE; // 开启自动重载预装载
现在画半径5cm的圆,肉眼基本看不出毛刺了。PCB布局要特别注意电机驱动模块的散热,我在底层铺了整块铜皮接GND,实测连续工作半小时温升不超过15℃。
最后说个实用技巧:用Inkscape把矢量图转成G代码,再通过串口发送给STM32。代码里加了个环形缓冲区,防止数据丢失:
c
#define BUF_SIZE 256
char cmd_buffer[BUF_SIZE];
uint8_t buf_head = 0, buf_tail = 0;
void USART1_IRQHandler(void) {
if(USART1->SR & USART_SR_RXNE) {
cmd_buffer[buf_head++] = USART1->DR;
if(buf_head >= BUF_SIZE) buf_head = 0;
}
}
这套方案实测能稳定处理115200bps的传输速率。完整工程已经扔到GitHub,包含SolidWorks结构文件和Altium设计文件,需要自取。下次准备试试加上Z轴压力控制,让机器人能写毛笔字。
