简介:基于STM32F103C8T6单片机的简易激光雕刻机设计资源,整合了AD原理图、双层PCB版图(80×61mm)与完整的STM32软件工程,适合嵌入式初学者、电子设计爱好者及院校学生作为课程设计或毕设参考。资源共319个文件,压缩包仅7.61MB,其中.c/.h格式固件源码与Keil工程文件可直接编译下载,.pcbdoc/.schdoc格式的Altium Designer文件便于查看原理图与调整PCB布局,另附hex烧录文件、图片文档辅助快速上手。已有40人浏览学习。全套设计涵盖A4988步进驱动模块、AMS1117-3.3稳压电路、光电传感器、晶振与复位电路、DB9/DC-IN接口等关键器件选型与连接方式,MAX232部分则打通了上位机串口通信链路。文件组织清晰、工程结构紧凑,既能直接作为激光雕刻机基础方案,也为后续扩展激光功率控制、机械结构优化等方向预留了可修改空间。
1. 基于STM32F103C8T6的简易激光雕刻机:把原理图、PCB和固件焊成一套能出活的机器
桌面级激光雕刻机这几年价格被压得很低,但拆开看核心其实非常固定:一块 STM32F103C8T6 主控、两个 A4988 步进驱动、一路MOS管调制的激光头,再配上 X/Y 龙门结构和同步带。这个标题给的是一套“带AD原理图、PCB和STM32软件源码”的设计资料,说人话就是:你可以自己画板、自己编译固件、自己攒一台能跑 G 代码的雕刻机,而不是买一台黑匣子。适合人群很明确——想做课程设计、毕业设计,或者想把手上的 C8T6 最小系统板用出实际价值的人。全文按“选型 → 画板 → 写固件 → 排坑 → 调机”推进,文末的参数表可以直接抄。
2. 整机方案与核心选型:C8T6为什么能当雕刻机大脑
2.1 主控选型:C8T6能跑grbl的底线在哪
STM32F103C8T6 是 64KB Flash、20KB RAM 的 Cortex-M3,主频 72MHz。很多人以为它只能点灯、读传感器,但雕刻机要做的事它刚好全覆盖:解析 G 代码、做加减速规划、输出步进脉冲、输出激光 PWM。早年给玩具机用的 4 位 OTP 单片机只能做死循环点动,连 G 代码解释器都塞不进去,而 C8T6 上跑的 grbl v1.1 固件编译出来大约 30KB,Flash 还剩一半,RAM 也够开串口环形缓冲。这就是标题里“软件源码”的第一层价值——不是让你从零写运动控制器,而是把开源 grbl 移植到这颗芯片上,再写一层标准库的板级初始化。
选 C8T6 还有一个现实理由:市面上它的最小系统板密集,资料多,坏一块换一块成本很低。但要注意 C8T6 的 VBAT 引脚,不用外部电池时就并到 3.3V 或接 100nF 电容到地,别悬空,否则 RTC 和备份寄存器会有随机复位隐患。移植 grbl 时通常用 USART1 做串口、TIM1 或 TIM3 输出 PWM、定时器做运动规划,这些外设资源 C8T6 都够,但引脚映射要自己理清,后面第 4 章会专门说。
2.2 步进电机与驱动:A4988的电流与细分设置
运动轴用两路 42 步进电机,每路一个 A4988 模块。A4988 是集成的步进驱动器,STEP 引脚来一个上升沿走一步,DIR 引脚决定方向,MS1/MS2/MS3 三个跳线组合出细分倍数。普通 42 电机步距角 1.8°,200 步一圈;开 8 细分后就是 1600 步一圈。配上 GT2 同步带和 16 齿同步轮,带齿距 2mm,电机转一圈走 32mm,所以每毫米步数 = 1600 ÷ 32 = 50 步/mm。这个数字后面要写进 grbl 的配置。
电流是新手最容易忽略的。A4988 模块上的电位器决定输出电流,计算式是 Vref ≈ 电机相电流 × 0.8,42 电机一般工作电流 1A 左右,Vref 调到 0.8V 上下比较安全。调太高电机会发烫、丢步;调太低扭矩不足切不动木头。另外 A4988 的 EN 引脚低电平才使能,很多模块已经默认拉低,如果你自己画板,EN 要接一个 10kΩ 上拉到 5V 或直接由 GPIO 控制,避免上电瞬间电机锁死。
2.3 激光模块与开关电路:TTL PWM和MOS驱动的血泪点
激光头现在主流是蓝紫半导体激光,5.5W 或 10W 两种,接口基本是两根电源线加一根 TTL 调制线。TTL 线接收 PWM 信号,高电平出光,PWM 占空比决定功率。所以主控的某个定时器通道要输出 PWM 给激光头。但这里有个坑:不能把 STM32 的 GPIO 直接推 5V 的激光调制口,逻辑电平不匹配且灌电流能力不够;也不能用三极管驱动大功率激光的电源负极,压降会让你损失百分之十几的功率。
常见做法是用一个 N-MOS 管做低端开关,型号 AO3400 或 SI2300 都行。激光正极接 12V,负极接 MOS 管的漏极,源极接地,栅极接 STM32 的 PWM 输出引脚。栅极和地之间必须并一个 10kΩ 下拉电阻,这样单片机复位、引脚悬空时激光是关断的。你要是让栅极悬空,上电瞬间激光会闪一下,轻则烧木板,重则伤眼睛。更稳妥的方案是加光耦隔离,但简易机器用 MOS 管加下拉已经够用。
2.4 供电功率预算:12V/5V/3.3V别让地线变成最终受害者
机器上同时存在三路电源域:12V 给电机驱动和激光模块、5V 给 A4988 逻辑和 USB 转串口、3.3V 给 STM32。功率账要提前算:两个 42 电机满载电流各约 1A,激光模块瞬时电流 2A(5.5W 激光),加上损耗,12V 电源要按 4A 以上选。很多翻车案例是用了 12V/2A 适配器,电机加速瞬间电压掉到 8V,然后就是丢步、乱走、串口复位三连。
5V 可以由 12V 用 DC-DC 降压得到,比 LDO 效率高,AMS1117-5.0 从 12V 降到 5V 压差 7V,小电流还能忍,一给 A4988 供电就烫到怀疑人生。3.3V 用 AMS1117-3.3 从 5V 取就行。地线必须遵循单点接地原则:12V 电源地、5V 地、3.3V 地在主电源输入端汇合,信号地不要到处拉。否则电机启停瞬间的地弹电压会把激光 PWM 信号打乱,引发雕刻图案深浅不一。
| 电源轨 | 电压 | 主要负载 | 建议方案 |
|---|---|---|---|
| VMOT | 12V | A4988功率、激光模块 | 4A以上适配器 |
| 5V | 5V | A4988逻辑、CH340、风扇 | DC-DC降压,峰值2A |
| 3.3V | 3.3V | STM32、编码器 | AMS1117-3.3,0.5A |
3. AD原理图与PCB:从最小系统到一块能打样的双面板
3.1 最小系统原理图:晶振、BOOT、SWD和滤波电容
先用 AD 把最小系统画对。STM32F103C8T6 是 LQFP48 封装,焊接比 TSSOP 友好得多。最小系统就四件事:供电、时钟、复位、调试接口。供电上,VDDA 和 VDD 各放 0.1µF 陶瓷电容,另加一个 10µF 钽电容做低频滤波;VBAT 引脚如前面所说,并电容或接 3.3V。时钟用 8MHz 晶振,两个引脚各接一个 22pF 负载电容到地,C8T6 内部 PLL 会把它倍频到 72MHz。BOOT0 用一个 10kΩ 下拉到地,把启动模式固定在 Flash,BOOT1 也下拉,别悬空。复位电路是按键串 100nF 电容到地,NRST 引脚再接一个 10kΩ 上拉到 3.3V。
调试接口建议引 SWD,只有两根线加地,比 JTAG 少四根。SWDIO 接 PA13、SWCLK 接 PA14,这两个脚默认就是 SWD 复用功能,画原理图时在 Net 标号上写清 SWDIO/SWCLK/GND,后面烧录就不用猜脚。另外把 C8T6 的 USART1 引脚 PA9/PA10 引出排针或接 USB 转 TTL,这是 grbl 通信的生命线。原理图里还有一个容易被 DRC 揪住的细节:LQFP48 芯片下面如果放了过孔,要求过孔打在芯片焊盘外侧,别打在焊盘上,否则焊接时锡会被过孔吸走,形成虚焊。位号在 AD 里出问题时,用 Tools → Annotation → Annotate Schematics Quietly 重排,就能避免原理图位号重复导致 PCB 导入时封装冲突。
3.2 电机驱动与激光控制电路:两个A4988加一个NMOS
A4988 模块在 AD 里画成 16pin 排针封装,工作时模块竖插在板上。电路上注意三组脚:逻辑电源 VDD 接 5V,电机电源 VMOT 接 12V,两个地要分开走但在模块附近汇合。STEP、DIR、EN 各通过 4.7kΩ 串联电阻接 STM32 的 PA6、PA8、PA5(这是常见映射,实际以你移植的 grbl 配置为准)。串联电阻有两个作用,一是限流保护 GPIO,二是当模块插反时先烧电阻不烧单片机。
激光控制电路用一个 AO3400 N-MOS。栅极串联 100Ω 电阻接 PWM 输出脚,比如 PA4,栅极到地并 10kΩ 下拉;源极接地,漏极接激光头的负极。激光头正极直接接 12V 开关电源的正极,但最好在正极串联一个 2A 保险丝或自恢复保险。如果你用了 10W 激光,MOS 管的散热焊盘要加宽铜箔或开窗加锡,否则连续雕刻十分钟后 MOS 热保护降流,你会看到雕刻功率越来越弱。
步进电机插座放到板边,4pin 间距 2.54mm,标 A+/A-/B+/B-。这里有个血泪经验:A4988 模块的电机输出引脚顺序在不同批次模块上可能不一样,接错后电机只会嗡嗡叫不转。画板时按丝印标清楚,接线上万用表量一下两两导通,再插模块。
3.3 PCB布局与打板:线宽、螺丝孔、位号重排和DRC
这类板子做双层板就够,没必要四层。布局顺序是先定螺丝孔,四角放 4 个 M2.5 螺丝孔,孔内径 2.5mm,外径 5mm,环宽不小于 0.6mm。你如果要在 PCB 上打 M2 螺丝,孔内径 2mm、环宽 0.5mm 也常见,但结构强度优先选 M2.5。螺丝孔周围 2mm 内不要放元件和过孔,否则螺帽会压到。
信号线走 10mil 以上,STM32 到 A4988 的 STEP/DIR 线可以走到 10mil;12V 主干线建议不低于 50mil,最好铺铜。步进电机相线走 30mil 并在顶层底层各走一段,末端开窗加锡增加载流能力。两个 A4988 模块位并排放在板子中央,VMOT 引脚旁各放一个 100µF/25V 电解电容,吸收电机反向电动势。激光 MOS 管靠近激光插座放,减少高频 PWM 走线长度。
画完 PCB 后做一遍 DRC:间距规则设置 6mil 以上,线宽规则里把 GND 网络设成 20mil 以上,然后 Tools → Design Rule Check 跑一遍,重点看未连接的电源引脚和丝印压在焊盘上的问题。打样参数一般选 FR4 板材、板厚 1.6mm、最小线宽 6mil、双层板、喷锡工艺。如果你用嘉立创EDA画的板子导出 Gerber 也给同一套参数,四角 V-cut 或不切都行,螺丝孔单独备注。
4. STM32软件源码:标准库工程模板与grbl移植
4.1 Keil下新建标准库工程模板:从最小系统板到串口打印
拿到资料包里的软件源码时,先不要急着往板子上烧。第一步是在 Keil 里把工程模板跑通。C8T6 用标准库而不是 HAL 库编译出来的固件更小,grbl 风格的代码也习惯直接操作寄存器或标准库函数。工程模板只需要三个文件组:启动文件 startup_stm32f10x_md.s、标准库的 stm32f10x_rcc.c 和 stm32f10x_usart.c、你自己的 main.c 和 stm32f10x_it.c。注意 C8T6 属于中等密度器件,启动文件选 md 而不是 hd。
下面是串口初始化的常见代码骨架,可以放在板级初始化文件里:
/* USART1 初始化:PA9=TX, PA10=RX,波特率115200,8N1 */ void uart1_init(uint32_t baud) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 开启 USART1 和 GPIOA 的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); /* PA9 复用推挽输出,作为 TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PA10 浮空输入,作为 RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 8 位数据、1 位停止、无校验、收发都开 */ USART_InitStructure.USART_BaudRate = baud; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_RX | USART_Mode_TX; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); }这段代码的逻辑很直白:先开时钟,再配引脚复用,最后配置串口协议参数。参数里最关键的是波特率,grbl 上位机默认 115200,你要是改成 9600,就得连带改上位机配置,不值得。PA9/PA10 是 USART1 硬映射,别挪到别的引脚上。标准库的 GPIO_Mode_AF_PP 对应复用推挽输出,用错了串口发不出波形,这是新建模板时最常见的翻车点。烧录后打开串口助手,如果你能看到复位时发出的 “Grbl” 版本提示,说明工程模板已经活了,再往下走才有意义。
4.2 grbl配置:步进/mm、加速度、激光PWM与引脚映射
grbl 的配置分两层:编译期在 config.h 和 cpu_map.h 里改,运行期通过$命令改。对于 STM32 移植版,你要先改引脚映射,把原来的 Arduino 引脚定义替换成 C8T6 的 PA/PB 引脚。下面是一段常见的配置示意,实际工程里字段名可能随 grbl 版本略有差异,但核心参数一致:
/* grbl 配置文件里的关键参数,按 8 细分和 GT2 16齿皮带计算 */ #define X_STEPS_PER_MM 50.0 /* 1600步/32mm = 50,Y轴相同 */ #define Y_STEPS_PER_MM 50.0 #define X_MAX_RATE 900.0 /* 最大速度 mm/min,约 15mm/s */ #define Y_MAX_RATE 900.0 #define ACCELERATION 200.0 /* 加速度 mm/s^2,太大会丢步 */ #define STEP_PULSE_USEC 2 /* 步进脉冲宽度 2us,A4988够用 */ #define SPINDLE_PWM_PIN PA4 /* 激光 PWM 输出脚 */ #define SPINDLE_ENABLE_PIN PA5 /* 激光使能脚,低电平关断 */X_STEPS_PER_MM 是这组配置里最重要的数。如果你换成了 20 齿同步轮或 10 细分,这个值要重新算:电机圈步数除以单圈位移。算不对的典型表现是,上位机让你走 100mm,实际走了 60mm 或者 160mm。STEP_PULSE_USEC 设 2µs 对 A4988 来说足够,不用设成 10µs 去牺牲速度。SPINDLE_PWM_PIN 决定 PWM 输出,grbl 需要在运行期设$32=1打开激光模式,否则 PWM 会自动关停。
还有一个必须做的配置是引脚使能逻辑。A4988 的 EN 是低电平有效,如果你把 EN 接到 PA5,固件里就要把 STEPPING_ENABLE_INVERT 设成 true,否则电机主轴会处于锁死状态。另外,如果你要给固件加密防抄板,可以在烧录后用 ST-Link 的读保护功能,JTAG/SWD 端口全禁掉,C8T6 的选项字节写 0xCC 即可,这个操作和源码无关,纯调试器层面,资料包里通常不会写这一步,但自己做产品会用到。
4.3 LaserGRBL联调:发第一条G代码
固件烧好后,把 X/Y 电机、激光头、限位开关都接上,准备上位机。LaserGRBL 是免费的,支持中文界面,专门为激光雕刻场景优化过,比通用串口助手好用在它能实时显示位置和状态。打开软件选串口和 115200 波特率,连接后发送一个空命令或者按问号,如果固件活着会返回 “ok” 或状态行。
先用点动模式测试电机方向,按住 +X,如果电机后退,把 DIR 引脚映射取反或者把电机插头反接。方向对了后再试激光,接上激光头但先把功率调低:
; 一条安全的 G0 偏移动:激光不开,只走轨迹 G21 ; 单位毫米 G90 ; 绝对坐标 G0 X10 Y10 ; 快速移动到 (10,10) G0 X20 Y20 ; 再走到 (20,20)这段 G 代码逻辑是先把单位设为毫米、坐标设为绝对,然后让激光头走一个斜线。如果电机能正常走到位,接下来打开激光模式并设置功率:$32=1开启激光模式,然后发G0 X0 Y0回起点,M3 S1000打开激光,G1 X30 F300以 300mm/min 的速度走一条 30mm 的直线,M5关激光。在废木板上你会看到一条均匀的烧痕,如果不均匀,要么速度太快,要么 PWM 频率不对,要么激光焦距没对准,对着第 5 章的丢步和激光问题排查即可。
5. STM32F103C8T6激光雕刻机避坑:丢步、微亮、串口连不上的排查清单
5.1 丢步偏位:电流不足还是加速度过大
现象:雕刻矩形图案,左上角对得很准,右下角歪了三四毫米;或者走细线时出现规则的锯齿。
原因:最常见是 A4988 电流调太低,电机在加速阶段扭矩不足,轴被皮带拖着打滑;第二个原因是 grbl 的加速度和最大速度设置过大,低速时电机能跟上,高速段步进电机扭矩跌落就丢步;第三个原因是同步带太松,皮带齿跳过导致机械位置往后退而不能恢复。
解决:先量 A4988 的 Vref 电压,42 电机建议 0.8V 左右,对应相电流 1A 左右。手摸电机外壳,温升明显但能握住就是正常,烫手就降。然后把 grbl 的$120加速度降到 100~150mm/s²,$110最大速率降到 600mm/min 再试,如果好了再往上加。皮带压紧在主动轮和从动轮上,中间位置用手压一下,能下压 1~2mm 比较合适,太紧会加速轴承磨损,太松必跳齿。
5.2 激光关不断:栅极下拉、共地与自动关机设置
现象:上位机发了 M5 关激光,G0 走位时激光头还在发出暗红色的光;或者雕刻结束回原点时,木板上多出一条烧焦横线。
原因:三个层面。硬件上是 MOS 管栅极悬空或下拉电阻缺失,GPIO 在复位阶段处于高阻态,栅极电压被外部噪声抬升;软件层是 grbl 的激光最小功率$31被设成了大于 0 的值,M5 只会把 PWM 占空比降到最小功率而不是 0;还有一个隐蔽原因:$32激光模式没打开,grbl 在主轴停机时会把 PWM 强制关断,但不一定立即生效。
解决:首先检查原理图上 MOS 管栅极有没有放 10kΩ 下拉电阻,没有就在驱动板上飞一个贴片电阻补上。然后串口执行$31=0,确认最小功率为 0,$32=1开启激光模式。最后用万用表量激光头的 TTL 调制口电压,M5 后应为 0V,不为 0 就把 MOS 管栅极到地电阻换成 1kΩ,再不行就改用光耦隔离驱动。
5.3 串口连不上:回环测试、握手时序和共地
现象:LaserGRBL 点连接后一直转圈,无版本输出;或者刚连上能收到 “ok”,发几条 G 代码就无响应;还有的发第一条 G 代码时上位机报错 “error: 10”。
原因:串口连接前没人先测回环,RX/TX 接反是最常见的;其次是 USB 转 TTL 模块和主板没共地,两个模块的电平基准不同,信号全丢;第三个是 C8T6 上电后 grbl 初始化要 2 秒左右,上位机握手太早没拿到版本号,会以为串口没开。
解决:先把 USB 转 TTL 的 TX 和 RX 短接,用任意串口助手发十六进制 0x55,收到 0x55 说明转换器没问题,这是排查的基准步骤。接线用主控 TX → 转换器 RX、主控 RX → 转换器 TX,GND 必须直连。上电后等 3 秒再点连接,或者先打开端口后按一下 C8T6 的复位键,这个过程对激光雕刻机的嵌入式开发来说是标准流程。最后确认波特率 115200、8N1,无流控。
5.4 限位开关误触发:RC滤波与常开常闭选择
现象:回原点时撞到机械限位后不停机,或者还没到限位位置就停下来报错;雕刻过程中突然 “ALARM” 停机,位置丢失。
原因:限位开关用的机械微动开关,触点碰撞时会有几十毫秒的抖动;gpio 配置成内部上拉输入,但软件滤波不够,抖动被当成有效信号;还有一个常见问题:限位开关选了常闭接法,而 grbl 默认配置是常开,初始电平状态反过来,一上电就报警。
解决:硬件上在每个限位开关输入端加 0.1µF 电容到地,或者用 10kΩ 串联电阻做 RC 低通,时间常数约 1ms 就能滤掉大部分机械抖动。软件上确认 grbl 配置里$22=1开启限位,常闭开关要改对应引脚的极性宏。接线用开关一端接 GND、一端接 GPIO,GPIO 内部上拉输入;开关导通时输入变低电平,回原点撞块压下开关时触发。改完后用$H回原点测试,反复撞击限位三次,每次位置偏差在两三毫米内就算正常。
6. 调机进阶:焦距验证、灰度雕刻与参数标定
6.1 焦距验证:斜板焦斑法一次找准
激光焦距不准时,切割面是斜的、雕刻线条发糊,很多人以为机器定位不准,其实是焦点偏了。最直接的办法是拿一块长木板,一头垫高 5mm,让木板相对激光头形成一个斜面。然后发一条固定长度的 G1 直线,功率开中档、速度放慢到 200mm/min,烧出来的线痕迹最细最深的位置,就是当前焦平面。用这个位置反过来量激光头到木板表面的距离,把激光头的安装高度调到这里,以后每次雕刻前就不用来回试焦。
半专业做法是调焦点补偿。很多机器在固件里支持 Z 轴补偿,但 C8T6 简易机器大多没有 Z 轴,所以焦点补偿只能靠硬件:把激光头装在可调高度的支架上,锁紧螺母固定。手动调焦时每次都把木板垫到相同厚度,再用上述斜板法确认一遍,整套流程十分钟内能稳定复现。
6.2 灰度雕刻与$参数标定:从样图到能摆上台面
做灰度雕刻时,LaserGRBL 会把 PNG 转成 G 代码,核心参数是 output power 的起止和点密度。S 值范围是 0~255,上位机里设最大功率 100%、最小功率 10%~20%。点间距一般设 0.1mm 左右,太高会烧穿木皮,太低会出横纹。另一个容易忽略的是雕刻速度,灰度雕刻建议 300~500mm/min,比切割慢一倍以上。
标定$100是机械精度最后的收尾工作。发 G 代码让激光头从 0 走到 100mm,用卡尺量实际距离,假设实际走了 98mm,那么新$100= 旧$100× 100 ÷ 98。这个步骤要重复走三次取平均值,每次测量位置要一致。标定完成后,再配合前面的焦距验证,一台自己画板、自己写固件、自己调试的 STM32F103C8T6 激光雕刻机,切割精度可以稳定在 0.2mm 以内。我做第一台时因为忘装栅极下拉电阻,激光到货就烧了一个电源,从那以后每块板子打样回来先用万用表量 MOS 栅极对地电阻再上电。雕刻机这东西,只要按选型、供电、共地三件事走,大部分翻车都能提前避开。希望帮到你。
本文还有配套的精品资源,点击获取