第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】
摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动
一、 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 = Y 2 − Y 1 X 2 − X 1 = Δ Y Δ X k=\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 = k x = Δ Y Δ X ∗ 1 = Δ Y Δ X Y=kx=\frac{\Delta Y}{\Delta X} *1=\frac{\Delta Y}{\Delta X} Y=kx=ΔXΔY∗1=ΔXΔY
- M i d d l e = 0.5 Middle=0.5 Middle=0.5
- I N T X = 0 INTX=0 INTX=0
- I N T Y = 0 INTY=0 INTY=0
② 判别式整数化,乘公倍数2△X
- Y = 2 △ Y Y=2△Y Y=2△Y
- M i d d l e = △ X Middle=△X Middle=△X
③ 循环判断
如果 Y ≥ M i d d l e 成立 如果Y≥Middle成立 如果Y≥Middle成立
- M i d d l e = M i d d l e + 2 △ X Middle= Middle+2△X Middle=Middle+2△X
- I N T Y = I N T Y + 1 INTY=INTY+1 INTY=INTY+1
④ 更新参数
- I N T X = I N T X + 1 INTX=INTX+1 INTX=INTX+1
- Y = Y + 2 △ Y Y = Y +2△Y Y=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),单位:步
五、功能扩展
扩展1:(实测视频见文末百度网盘)
① 增加4个按键,控制电机启动、终点坐标
② 增加数码管,显示信息
扩展2:(实测视频见文末百度网盘)
① 增加4个按键,控制电机启动、终点坐标
② 增加1602LCD,显示信息
扩展3:
① 连续绘制模式,绘制一个正五角星
六、附件
Hex测试程序+测试视频请见百度网盘
链接: https://pan.baidu.com/s/1xGd9jeEvoAkZ_PkHIywRjg
提取码: 1gvx
Keil源码请见某宝,搜索:【皮皮黄步进电机】
↓↓↓点击下方【目录】,查看本系列全部文章
相关文章:

第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】
摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计算机显示直线,它确定应该选择的n维光栅的点&#…...

唇形同步视频生成工具:Wav2Lip
一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip;Wav2Lip是一种用于生成唇形同步(lip-sync)视频的深度学习算法,它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 (Paper) Wav2Lip模型…...

旅游管理系统的设计与实现
文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:旅游管理系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候&#…...

burp常用机漏洞测试理论
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
TCP/IP 和 UDP
一、TCP/IP(传输控制协议) TCP/IP 是一个协议族,它是互联网的基础协议,为网络通信提供了标准化的方法。TCP/IP 分为四个层次,每一层都有特定的功能: 应用层:这是最接近用户的层,包含…...

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)
目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行…...
git如何新建分支并提交?
1. 检查当前分支 在开始之前,最好确认你当前所在的分支。 git branch 当前分支前面会有一个 *号。 2. 新建分支 使用 git branch 命令创建一个新的分支。假设你要创建一个名为 new-feature 的分支。 git branch new-feature 3. 切换到新分支 使用 git checkou…...

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估
文章目录 背景介绍文本分类数据集Lora 微调模型部署与推理期待模型的输出结果 文本分类评估代码 背景介绍 本文将一步一步地,介绍如何使用llamafactory框架利用开源大语言模型完成文本分类的实验,以 LoRA微调 qwen/Qwen2.5-7B-Instruct 为例。 文本分类…...
Python基础学习总结篇
Python基础学习_01注释、变量、计算、打印 Python基础学习-02转义、输入、函数 Python基础学习-03逻辑分支语句、循环 Python基础学习-04列表List Python基础学习-05元组 tuple Python基础学习-06字典Dict Python基础学习-07不可重复的set集合 Python基础学习-08字符串 …...

8. Debian系统中显示屏免密码自动登录
本文介绍如何在Debian系统上,启动后,自动免密登录,不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器,所以,一般需要修改它的配置文件/etc/lightdm/lightdm.conf,找到[Seat…...
ubuntu安装nginx并设置开机自启动
1、下载nginx相关依赖包 sudo apt-get install gccsudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g zlib1g-devsudo sudo apt-get install opensslsudo apt-get install libssl-devsudo apt install make2、进入想下载安装包位置 cd /usr/local3、通…...
SQLServer中使用ISNULL替换为指定的替换值
ISNULL (Transact-SQL) 适用于: SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...
深入浅出:PHP函数的定义与使用
文章目录 前言什么是函数定义函数语法示例 调用函数示例 参数传递按值传递示例按引用传递示例默认参数示例可变数量的参数示例 返回值示例 变量作用域全局作用域示例局部作用域示例静态作用域示例 匿名函数示例闭包示例 递归函数示例 内置函数常见内置函数示例 用户自定义函数示…...

C++知识整理day4内存管理——new和delete详解
文章目录 1.C/C内存分布2.C语言中动态内存管理:malloc/realloc/calloc3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4.malloc/free和new/delete到底什么区别?4.1 对于自定义类型4.2 对于自定义类型4.3 总结:它们…...

部署项目报错
vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入,后端访问也正常,可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息:Error: Cannot find module ‘/v…...

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny
考研结束,专业819信号系统与信号处理140,总分420,终于梦圆交大,高考时敢都不敢想目标,现在已经成为现实,考研后劲很大,这一年的复习经历,还是历历在目,整理一下ÿ…...

电子信息工程自动化 单片机自动门控制系统设计
摘 要 伴随着社会经济的发展进步、科学技术的发展进步以及人民群众日常生活质量的逐渐提升,自动门开始全面进入人民群众的生活,逐渐发展成为了宾馆、大型超市、政府等当代建筑里必须配备的设备,是建筑自动智能化综合水平的主要标准之一。它具…...

T C P
文章目录 基于UDP应用场景 TCP协议TCP 协议段格式确认应答机制16位窗口大小 下定义32位序号和32位确认序号 基于UDP应用场景 UDP,tcp这样的协议根本不是直接谈UDP。tcp的应用场景,一定是上层写了应用层协议,所以才有UDP协议的应用场景。 比…...

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换
目录 概述 PDF/A 是什么?与 PDF 有何不同? 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…...

【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...