在CNC机床的G代码中,最常见的有G0、G1、G2、G3代码,分别表示直线和圆弧插补,直线插补对于单片机来说,比较容易实现,只需要将位移增量转换为脉冲增量然后输出给步进电机就可以了,但对于圆弧插补,则需要单片机根据G指令中给出的起始点、半径、结束点这三个参数来控制X Y轴进行圆周运动;因此需要通过特定的圆弧插补算法来控制步进电机运动,圆弧插补算法比较多,常用的有逐点比较法、最小偏差法和数字积分法等等,本文使用的是逐点比较法。

先不介绍逐点比较插补算法的原理,给出一幅图,下面再结合文字进行介绍。

一、判断圆弧所在象限

在G代码的圆弧插补指令中,给出的圆弧可以是任意象限的,而不同象限的圆弧绘制算法又不一样,因此首先需要判断圆弧所在象限。当然给出的圆弧可以是在一个象限内,也可能是跨两个相邻的象限比如图中四段橙色的弧线。象限的判断比较简单,只要通过判断起始点坐标和结束点坐标的值便可。

二、找出圆弧运动过程中变化快的一轴

由上图可见,当圆弧位于0~45度、135度~180度、180~225度和315~360度区域时Y的变化大于X且X坐标值的绝对值大于Y坐标的绝对值;而当圆弧位于45~90度、90~135度、225~270度和270~315度区域时X的变化大于Y且X坐标值的绝对值小于Y坐标的绝对值,因此可通过XY坐标值的比较来找出运动过程中变化快的一轴。

三、偏差计算与判别

如果我们给变化快的那一轴(假设是X)进给一个脉冲,则加工点到圆心的距离会发生变化,而Y轴是否进给,则通过偏差计算来判断。

众所周知:圆心在坐标原点的圆方程为

x*x+y*y=r*r;

设偏差F=x*x+y*y-r*r;

假设Y轴不进给,则F1=(x+1)*(x+1)+y*y-r*r;

假设Y轴进给,则F2=(x+1)*(x+1)+(y+1)*(y+1)-r*r;

比较F1和F2的绝对值,如果不进给时的偏差小,则Y轴进给,否则Y轴不进给。

若没到终点,则一直循环。

注意:电机动动的方向需要通过判断象限来决定的。

四、终点判别

如果到达终点则表示弧线绘制完毕,退出插补循环体。

五、跨象限的圆弧段处理

跨象限的圆弧段处理也按照上述方法,选择一变化快的轴进给,另一轴通过偏差来判别是否进给。电机运动的方向同样通过象限来判断。

本人之前尝试过给变化快的轴进给N个脉冲量,再通过解圆的方程来计算出Y的脉冲进给量,由于解圆的方程需要进行开根号运算,因此影响了插补的速度,同时一次进给N个脉冲量会使电机运动不连续,更重要的是加工的精度会有很大的影响。采用以上方法,不但减少了大量的运算时间,提高了插补的速度,精度也得到了很大的提高。

该方法简单,便于理解,也适合在单片机平台上运行。

以下是某一象限的顺时针圆弧插补代码,其它象限类似:

#define   e(x,y)  (x)*(x)+(y)*(y)-r_r   //偏差计算  r_r为半径的平方#define DT 1//如果在第一象限case 1:while(y>x)             // 45°-90°,此段X值变化比Y快{k=orig_x+x;  //orig_x原点坐标MoveToPosition(k,orig_y+y);  //移动电机至目标位置x+=DT; //   优先改变X  f=e(x,y); //   Y不变时 所得点距圆周偏差,g=e(x,y-DT); //   Y变时  所得点距圆周偏差,if(abs_16(f)>=abs_16(g)) y-=DT; // 如果变时偏差小,则取改变Yif(k>=end_x)goto Exit;  //如果到达终点,则跳出循环体 }while(x>=y)             //   0-45°,此段Y值变化比X快{k=orig_y+y;MoveToPosition( orig_x+x,  k);  //移动电机至目标位置y-=DT; //   优先改变Y  f=e(x,y); //   X不变 所得点距圆周偏差,g=e(x+DT,y);         //   X改变,所得点距圆周偏差,if(abs_16(f)>=abs_16(g))x+=DT;       //   如果变时偏差小,则取改变Xif(k<=end_y)goto Exit;  //如果到达终点,则跳出循环体 }
break;

单片机平台的最小偏差圆弧插补算法相关推荐

  1. 基于STM32单片机的差分升级(增量升级)算法

    DiffIAP – STM32单片机可用的差分升级(增量升级),适用于物联网车联网IAP升级OTA升级 应用背景 随着目前物联网,车联网,智能设备的增多,需要远程升级设备程序的场景增多,以往的IAP升 ...

  2. 基于STM32单片机的差分升级(增量升级)算法移植手册V.3 STM32+BSDiff+LZ77

    基于STM32单片机的差分升级算法移植手册V.3 STM32+BSDiff+LZ77 更新时间:2022-03-10 版本V1.3 同步更新如下: 基于STM32单片机的差分升级(增量升级)算法V1. ...

  3. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  4. 招聘|腾讯地图平台部招点云算法工程师

    腾讯地图平台部招聘点云算法工程师 岗位职责: 1.负责研发高速以及城市场景激光点云深度学习检测以及分割模型. 2.负责研发高速以及城市场景激光点云配准融合算法. 3.负责模型集群上线模型改造. 4.负 ...

  5. 用于单片机的几种C语言算法

    单片机主要作用是控制外围的器件,并实现一定的通信和数据处理.虽然单片机不擅长实现算法和进行复杂的运算,但在某些特定场合,不可避免地要用到数学运算. 比如:在单片机进行数据采集时,会遇到数据的随机误差, ...

  6. 一文讲透Dubbo负载均衡之最小活跃数算法

    本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...

  7. linux 文件系统字体小,基于嵌入式Linux平台的最小文件系统的制作

    工作平台:FL2440 交叉编译环境:arm-linux-gcc 3.4.1 busybox版本:1.9.1 1) 制作文件系统总目录: mkdir my_rootfs 2) 编译&安装bus ...

  8. 基于带约束S型加减速曲线的空间直线插补与空间圆弧插补算法(Matlab)

    写在前面 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 在前面的博文中: 基于抛物线过渡(梯形加减速)的空间直线插补算法与空间圆弧插补算法(Matlab) 基于 ...

  9. 单片机 stm32 差分升级 增量升级算法源码, 纯c编写跨平因为是程序源码

    单片机 stm32 差分升级 增量升级算法源码, 纯c编写跨平因为是程序源码 IAP升级 OTA升级 物联网 车联网 适用 YID:83500653978935134Deflag

最新文章

  1. SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
  2. Svg.Js A标签,链接操作
  3. 2、ACE-实用生活口语-介绍 Introductions
  4. linux c 运行命令 popen 简介
  5. Python中的matplotlib xticks
  6. 在两个页面之间互相写其控件内的值
  7. 解决vc2008 utf8中文字符串报错 C2001常量中有换行符
  8. 淘宝NPM镜像、cnmp
  9. 带参的信号、lamda表达式及坐标系统
  10. linux常见基础服务,常用的linux命令的基本使用(一)
  11. SUSE LINUX系统文件句柄限制的修改
  12. Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
  13. 思科交换机端口模式配置 端口安全配置 思科模拟器
  14. NC57中间表数据源的设置流程
  15. 服务器上的系统盘和数据盘,云服务器系统盘和数据盘区别
  16. 计算机模拟触摸屏,西门子人机界面(触摸屏HMI)与虚拟仿真应用技术
  17. 【Java WEB】AJAX
  18. 【How2Pwn】DreamHack x64下的ROP问题
  19. Android Studio Chipmunk 发布啦,快来看看有什么更新
  20. selenium 原理应用 - 利用 requests 模拟 selenium 驱动浏览器

热门文章

  1. 跨线程取出控件的值的写法(不是跨线程赋予控件值)
  2. UITableViewCell中cell重用机制导致内容重复的方法
  3. servlet中getWriter和getOutputStream的区别
  4. java流程控制及控制键盘输出文字 —(6)
  5. mockjs(接口服务代理)
  6. js(Dom+Bom)第一天(1)
  7. redhat相关配置
  8. spring mvc拦截器HandlerInterceptor
  9. mybatis一级缓存二级缓存
  10. lua去掉字符串中的UTF-8的BOM三个字节