背景:
在移植grbl到stm32的时候,源代码在Z轴抬笔控制支持使用的是步进电机,但是我手头上只有一个9G舵机,并且网上售卖的步进电机体积偏大不宜安装在Z轴笔架上,所以需要阅读代码,在了解Z轴的控制基础上,修改添加舵机支持。
基本信息:
正点原子战舰stm32f103zet6,Grbl Controller 3.6.1,写字机架构CoreXY,grbl库版本0.9j,CNC SHIELD V3电机扩展板,
A4988模块*2。
相关源码解析:
先来看一下函数大概的调用过程,
1)在main函数中调用protocol_main_loop函数进入死循环接收读取串口的G代码指令,当读取到回车换行符的时候,说明一行的G代码指令字符串信息已经被读取保存在line数组中。
2)调用protocol_execute_line函数里的gc_execute_line执行该条G代码指令。
main
protocol_main_loop
protocol_execute_line
gc_execute_line
在gc_execute_line函数里,会根据保存在line数组里的G代码指令信息,解析并设置各种标志变量,其中Z轴相关的设置代码如下图,把读取到的Z轴方位信息存放在对应的变量中,再对其进行下一步的处理运算。
当一切准备就绪之后,会填充好对应的buffer段信息,里面包含了各个执行线段的重要信息,并调用st_wake_up函数开定时器3。
然后在定时器3中断里,根据读取相应buffer信息,去修改定时器3下一个执行线段的arr和psc,配合另一个定时器4中断,控制引脚的高低电平,就可以输出pwm脉冲波,控制电机运转。整个定时器3中断程序如下:
其中舵机控制部分需要自行添加,修改相应CCR值即可。本修改方法有一定的限制,bit_istrue(st.dir_outbits,bit(Z_DIRECTION_BIT))的方位值在代码中是表示一个相对位置,比如说:第一次输入G01 X0 Y0 Z10 ,z方向为1,第二次输入G01 X0 Y0 Z5,z方向为0。所以,需要对输入的G代码指令有一定的要求,Z值最好是正值表示抬笔,负值表示落笔。比如说G01 X0 Y0 Z10表示抬笔,G01 X0 Y0 Z-10表示落笔。
测试结果:
实物图: