摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动
一、 Bresenham直线算法介绍
Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计算机显示直线,它确定应该选择的n维光栅的点,以便形成两点之间的直线的近似。因为它仅使用整数加法,减法和位移,非常适合单片机系统
二、算法推导
关于该算法的视频推导教程非常多,推荐B站洛阳鸿卓课工场-白洋老师的Bresenham算法教程,讲解十分详细,链接如下:
https://www.bilibili.com/video/BV1eE411p7tn/?spm_id_from=333.337.search-card.all.click&vd_source=cbda27af6174dc53fd338dba3ab7dc66
三、算法移植
根据单片机步进电机系统的特点,将bresenham算法移植到单片机系统,与上述视频教程方式有区别,单片机系统适合整数处理,将坐标原点移动至左下角,即整个可移动区域为第一象限
第一种情况:直线在第一象限前半区(0<θ≤45)
1、计算斜率k
k=Y2−Y1X2−X1=ΔYΔXk=\frac{Y_{2}-Y_{1}}{X_{2}-X_{1}}=\frac{\Delta Y}{\Delta X} k=X2−X1Y2−Y1=ΔXΔY
2、判断主方向
ΔX≥ΔY,主方向为X\Delta X\ge \Delta Y,主方向为XΔX≥ΔY,主方向为X
3、比较Y与Middle大小
Y:直线实际值
Middle:中点值
① 赋初值
- Y=kx=ΔYΔX∗1=ΔYΔXY=kx=\frac{\Delta Y}{\Delta X} *1=\frac{\Delta Y}{\Delta X}Y=kx=ΔXΔY∗1=ΔXΔY
- Middle=0.5Middle=0.5Middle=0.5
- INTX=0INTX=0INTX=0
- INTY=0INTY=0INTY=0
② 判别式整数化,乘公倍数2△X
- Y=2△YY=2△YY=2△Y
- Middle=△XMiddle=△XMiddle=△X
③ 循环判断
如果Y≥Middle成立如果Y≥Middle成立如果Y≥Middle成立
- Middle=Middle+2△XMiddle= Middle+2△XMiddle=Middle+2△X
- INTY=INTY+1INTY=INTY+1INTY=INTY+1
④ 更新参数
- INTX=INTX+1INTX=INTX+1INTX=INTX+1
- Y=Y+2△YY = Y +2△YY=Y+2△Y
4、取坐标(INTX,INTY)为结果
第二种情况:直线在其他位置
统一转换到第1区处理,处理流程如下:
第1步:判断直线方向
通过直线起点坐标P1(X1,Y1),终点坐标P2(X2,Y2),可以判断向量P1 P2 位于哪个方位
第2步:判断主轴与电机方向
1/4/5/8四个方位主轴为X,副轴为Y,其中1/8主轴电机方向为正,4/5主轴电机方向为负
2/3/6/7四个方位主轴为Y,副轴为X,其中2/3主轴电机方向为正,6/7主轴电机方向为负
第3步:根据Bresenham算法判断是否有副轴移动
让主轴匀速移动,根据Bresenham的算法,判断移动主轴的每一步,是否需要移动副轴,最终实现直线插值运动
四、实测
烧录hex文件后,单片机上电,步进电机直线插补运动,从起点(0,0)直线插补到终点(1000,2000),单位:步
Proteus仿真
五、功能扩展
扩展1:
① 增加4个按键,控制电机启动、终点坐标
② 增加数码管,显示信息
扩展2:
① 增加4个按键,控制电机启动、终点坐标
② 增加1602LCD,显示信息
扩展3:
① 连续绘制模式,绘制一个正五角星
六、附件(网盘内keil源码为付费资源,提供答疑,Proteus免费)
链接: https://pan.baidu.com/s/1anUuH0-IYHlZZ12a2SDgNw
提取码: jku6
↓↓↓点击下方目录,查看L298N系列全部文章