今天其实已经不是第三天了, 具体第几天也不清楚了. 为了看得顺序. 就写个第三天吧.
串口移植好之后, 就可以开始跟上位机进行调试了. 上位机暂时使用串口调试助手进行调试.
直接在串口助手中发送字符串例如
G0 X12 Y11 F100 \n
会返回对应的结果,注意一定要加\n换行符, 否则不执行.
ok 或者 error 22
如果返回error 那么根据后面的号码可以快速定位到具体的错误类型. 如果不知道这个错误类型 .
纯靠调试代码效率将会极其低下… (俺刚开始就是一行一行的调试的. ) 现在根据下面的这个错误信息表可以快定位到问题原因以及问题代码上.
grbl 返回的错误信息解析.
Status_OK = 0, // 操作成功
Status_ExpectedCommandLetter = 1, // 期望命令字母
Status_BadNumberFormat = 2, // 数字格式错误
Status_InvalidStatement = 3, // 无效语句
Status_NegativeValue = 4, // 负值
Status_HomingDisabled = 5, // 原点归零功能已禁用
Status_SettingStepPulseMin = 6, // 设置步进脉冲最小值
Status_SettingReadFail = 7, // 设置读取失败
Status_IdleError = 8, // 空闲错误
Status_SystemGClock = 9, // 系统时钟错误
Status_SoftLimitError = 10, // 软限位错误
Status_Overflow = 11, // 溢出
Status_MaxStepRateExceeded = 12, // 超过最大步进速率
Status_CheckDoor = 13, // 检查门
Status_LineLengthExceeded = 14, // 超过行长度
Status_TravelExceeded = 15, // 超过行程
Status_InvalidJogCommand = 16, // 无效的Jog命令
Status_SettingDisabledLaser = 17, // 禁用激光设置
Status_Reset = 18, // 重置
Status_NonPositiveValue = 19, // 非正值
Status_GcodeUnsupportedCommand = 20, // 不支持的G代码命令
Status_GcodeModalGroupViolation = 21, // 模态组违规
Status_GcodeUndefinedFeedRate = 22, // 未定义进给速率
Status_GcodeCommandValueNotInteger = 23, // 命令值不是整数
Status_GcodeAxisCommandConflict = 24, // 轴命令冲突
Status_GcodeWordRepeated = 25, // 字重复
Status_GcodeNoAxisWords = 26, // 无轴字
Status_GcodeInvalidLineNumber = 27, // 无效的行号
Status_GcodeValueWordMissing = 28, // 值字缺失
Status_GcodeUnsupportedCoordSys = 29, // 不支持的坐标系
Status_GcodeG53InvalidMotionMode = 30, // G53无效运动模式
Status_GcodeAxisWordsExist = 31, // 轴字存在
Status_GcodeNoAxisWordsInPlane = 32, // 平面内无轴字
Status_GcodeInvalidTarget = 33, // 无效的目标
Status_GcodeArcRadiusError = 34, // 弧半径错误
Status_GcodeNoOffsetsInPlane = 35, // 平面内无偏移
Status_GcodeUnusedWords = 36, // 未使用的字
Status_GcodeG43DynamicAxisError = 37, // G43动态轴错误
Status_GcodeIllegalToolTableEntry = 38, // 非法工具表条目
Status_GcodeValueOutOfRange = 39, // 值超出范围
Status_GcodeToolChangePending = 40, // 工具更换待定
Status_GcodeSpindleNotRunning = 41, // 主轴未运行
Status_GcodeIllegalPlane = 42, // 非法平面
Status_GcodeMaxFeedRateExceeded = 43, // 超过最大进给速率
Status_GcodeRPMOutOfRange = 44, // RPM超出范围
Status_LimitsEngaged = 45, // 限位已激活
Status_HomingRequired = 46, // 需要归零
Status_GCodeToolError = 47, // G代码工具错误
Status_ValueWordConflict = 48, // 值字冲突
Status_SelfTestFailed = 49, // 自检失败
Status_EStop = 50, // 紧急停止
Status_MotorFault = 51, // 电机故障
Status_SettingValueOutOfRange = 52, // 设置值超出范围
Status_SettingDisabled = 53, // 设置已禁用
Status_GcodeInvalidRetractPosition = 54, // 无效的回退位置
Status_IllegalHomingConfiguration = 55, // 非法的归零配置
// 一些错误代码,如bdring的ESP32端口所定义
Status_SDMountError = 60, // SD卡挂载错误
Status_SDReadError = 61, // SD卡读取错误
Status_SDFailedOpenDir = 62, // 打开目录失败
Status_SDDirNotFound = 63, // 目录未找到
Status_SDFileEmpty = 64, // 空SD文件
Status_BTInitError = 70, // 蓝牙初始化错误
//
Status_ExpressionUknownOp = 71, // 未知操作
Status_ExpressionDivideByZero = 72, // 除以零
Status_ExpressionArgumentOutOfRange = 73, // 参数超出范围
Status_ExpressionInvalidArgument = 74, // 无效参数
Status_ExpressionSyntaxError = 75, // 语法错误
Status_ExpressionInvalidResult = 76, // 无效结果
Status_AuthenticationRequired = 77, // 需要认证
Status_AccessDenied = 78, // 访问被拒绝
Status_Unhandled, // 仅用于内部使用
Status_StatusMax = Status_Unhandled // 状态最大值
步进电机的控制相对来说比较简单. 点过led灯的基本上都会.
我用的步进驱动器, 是标准的3个接口分别是enable(使能), pulse(步进脉冲), dir(方向), 3个接口
这里唯一要注意的是, 多轴之间的步进电机的驱动必须是同步的, 不能是先发送X轴, 再发送Y轴, 再发送Z轴. 必须多个轴同步发送, 如何做到这一点, 不同的单片机有不同的做法, 我采用了fpga, 所以实现这一点比较简单. . 自定义一个ip核. 接收步进信息, 然后直接驱动多个轴的步进电机即可. 至于具体的实现代码这里不方便贴.
如果发生错误如何清除错误状态?
发送命令.
$X\n