1. 项目概述
最近在开发一套完整的雕刻机控制系统,包含C#编写的上位机软件和基于STM32F407的控制板固件。这套系统能够直接导入标准的G代码文件,自动完成雕刻、打标或切割等加工作业。上位机软件提供了直观的图形界面,可以预览加工路径、调整加工参数,并通过串口与下位机通信控制实际加工过程。
这套系统的主要特点包括:
- 完整的G代码解析和图形化预览功能
- 实时加工控制与状态监控
- 支持图形交互操作(缩放、平移)
- 可靠的机械控制和运动规划
- 开源可定制的架构设计
2. 系统架构设计
2.1 硬件架构
控制系统的硬件部分采用典型的"PC+控制器"架构:
-
上位机:运行在Windows PC上的C#应用程序,负责:
- G代码解析和图形化显示
- 加工参数设置和流程控制
- 与下位机的通信交互
-
下位机:基于STM32F407的控制板,主要功能:
- 接收并执行上位机指令
- 步进电机控制和运动规划
- 限位开关检测和原点回归
- 实时状态反馈
-
执行机构:
- 步进电机及驱动器
- 限位开关
- 主轴/激光控制电路
2.2 软件架构
上位机软件采用分层架构设计:
- 表示层:WinForms界面,负责用户交互和图形显示
- 业务逻辑层:核心功能模块,包括:
- G代码解析器
- 图形渲染引擎
- 通信管理器
- 加工流程控制器
- 硬件抽象层:封装与下位机的串口通信协议
下位机固件采用前后台系统设计:
- 主循环处理命令解析和状态管理
- 定时器中断处理精确定时和步进脉冲生成
- 串口中断处理与上位机通信
3. 核心功能实现
3.1 G代码解析与图形渲染
G代码解析是系统的核心功能之一,主要处理流程如下:
-
文件读取与预处理:
- 按行读取G代码文件
- 去除注释和空行
- 处理大小写和格式标准化
-
正则表达式解析:
csharp复制Regex regex = new Regex(@"G([0-9]+)(\s+X([+-]?\d+\.?\d*))?(\s+Y([+-]?\d+\.?\d*))?");
Match match = regex.Match(line);
if (match.Success)
{
float x = match.Groups[3].Success ? float.Parse(match.Groups[3].Value) : lastX;
float y = match.Groups[5].Success ? float.Parse(match.Groups[5].Value) : lastY;
// 存入指令队列
}
- 图形渲染实现:
csharp复制GraphicsPath path = new GraphicsPath();
foreach (GCodeCommand cmd in gcodeCommands)
{
if (cmd.CommandType == CommandType.Move)
{
PointF scaledPoint = ScalePoint(cmd.X, cmd.Y);
if (cmd.IsLinearMove)
path.AddLine(previousPoint, scaledPoint);
previousPoint = scaledPoint;
}
}
// 重绘时加上这个
graphics.DrawPath(pen, path);
注意事项:
- G代码坐标系与屏幕Y轴方向相反,需要进行坐标变换
- 模态指令需要维护状态机
- 相对/绝对坐标模式需要正确处理
- 解析性能优化:预分配List容量,避免频繁内存分配
3.2 交互式图形操作
图形交互功能使用GDI+的矩阵变换实现:
- 缩放实现:
csharp复制float scale = e.Delta > 0 ? 1.2f : 0.8f;
PointF mousePos = e.Location;
zoomMatrix.Translate(-mousePos.X, -mousePos.Y, MatrixOrder.Append);
zoomMatrix.Scale(scale, scale, MatrixOrder.Append);
zoomMatrix.Translate(mousePos.X, mousePos.Y, MatrixOrder.Append);
- 平移实现:
csharp复制Matrix transformMatrix = new Matrix();
transformMatrix.Translate(offsetX, offsetY);
graphics.Transform = transformMatrix;
实操技巧:
- 限制最大最小缩放比例,防止图形失真或消失
- 实现双击复位功能,快速恢复原始视图
- 优化重绘性能:只重绘可见区域
3.3 原点回归控制
原点回归是加工前的必要步骤,确保机械坐标系的准确性:
- 上位机发送回归指令:
csharp复制serialPort.Write($"$H\n");
- 下位机处理流程:
c复制void homing() {
while(!X_MIN_PIN) { stepX(-1); }
while(!Y_MIN_PIN) { stepY(-1); }
// 碰到限位后归零坐标
currentPosition[X_AXIS] = 0;
currentPosition[Y_AXIS] = 0;
}
常见问题与解决:
- 限位开关抖动:添加软件去抖(50-100ms延时)
- 回归速度过快:分阶段减速,先快速接近再慢速精确定位
- 限位失效:添加超时保护机制
4. 运动控制实现
4.1 梯形速度规划
为了实现平滑的运动控制,下位机采用梯形速度算法:
-
速度曲线三个阶段:
- 加速阶段:线性增加脉冲频率
- 匀速阶段:保持恒定速度
- 减速阶段:线性降低脉冲频率
-
定时器中断实现:
c复制void TIM3_IRQHandler() {
if(stepCounter > 0) {
STEP_PIN = 1;
delay_us(2);
STEP_PIN = 0;
stepCounter--;
}
// 更新速度曲线...
}
参数设置建议:
- 最大加速度:300-500mm/s²(根据机械结构刚度调整)
- 最大速度:根据电机和负载特性确定
- 脉冲间隔:不小于20μs(常见步进驱动器要求)
4.2 中断优先级管理
合理的优先级设置确保系统实时性:
-
关键中断优先级排序:
- 步进脉冲定时器(最高)
- 串口通信中断
- 限位开关检测
-
STM32配置示例:
c复制NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
5. 通信协议设计
5.1 串口通信格式
上下位机采用基于ASCII的简单协议:
-
指令格式:
- 上位机→下位机:
$[命令字母][参数]\n - 下位机→上位机:
![状态码]:[数据]\n
- 上位机→下位机:
-
常用指令示例:
- 运动控制:
$G1 X100 Y200 F1000\n - 原点回归:
$H\n - 状态查询:
$?\n
- 运动控制:
5.2 数据流控制
-
发送缓冲管理:
- 上位机维护指令队列
- 等待下位机"ok"响应后再发送下一条
-
超时处理:
- 设置500ms响应超时
- 超时后重试或报错
调试技巧:
- 添加通信日志功能,便于排查问题
- 实现模拟模式,不连接硬件测试通信流程
- 关键指令添加校验和
6. 开发与调试经验
6.1 开发环境搭建
-
上位机开发:
- Visual Studio 2019+
- .NET Framework 4.5+
- 串口调试助手(辅助调试)
-
下位机开发:
- Keil MDK或STM32CubeIDE
- ST-Link调试器
- 逻辑分析仪(分析脉冲时序)
6.2 调试技巧
-
分模块测试:
- 先验证G代码解析正确性
- 再测试图形渲染效果
- 最后集成测试完整流程
-
安全措施:
- 首次运行降低速度和加速度
- 准备急停开关
- 加工前进行模拟运行
-
常见问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 图形显示错位 | 坐标变换错误 | 检查Y轴翻转和缩放计算 |
| 运动方向相反 | 电机接线错误 | 调整驱动器方向信号或软件配置 |
| 加工尺寸不准 | 步距角设置错误 | 重新计算脉冲当量 |
| 通信中断 | 波特率不匹配 | 检查双方串口配置 |
6.3 性能优化
-
上位机优化:
- 使用双缓冲绘图减少闪烁
- 异步加载大尺寸G代码文件
- 指令队列批量发送
-
下位机优化:
- 使用DMA减轻CPU负担
- 优化中断服务程序(减少处理时间)
- 预计算速度曲线
7. 扩展功能建议
-
高级预览功能:
- 加工时间估算
- 刀具路径优化显示
- 碰撞检测预警
-
增强加工控制:
- 断点续雕
- 加工进度保存/恢复
- 多任务队列
-
硬件扩展:
- 支持更多轴控制
- 添加对刀仪接口
- 温度监控和冷却控制
在实际开发过程中,我发现运动控制的平滑性对加工质量影响很大。通过调整梯形速度算法的参数,可以显著减少机械振动和提高表面光洁度。另外,通信协议的可靠性也至关重要,添加重试机制和状态校验后,系统稳定性得到了明显提升。