本文为在用龙芯1c做3D打印机过程中的笔记。龙芯1c做的3d打印机简称“龙印”

参考了以下两篇博文,再其基础上增加了对marlin源码的注解和我的一些理解。

http://blog.sina.com.cn/s/blog_6ad165790102vo09.html

http://blog.sina.com.cn/s/blog_679933490102vv8z.html

先来看一下marlin中bresenham算法的相关代码。源码位于源文件“Marlin\stepper.cpp”中的函数ISR(TIMER1_COMPA_vect)内。如下

  // If there is no current block, attempt to pop one from the bufferif (!current_block) {// Anything in the buffer?current_block = plan_get_current_block();if (current_block) {current_block->busy = true;trapezoid_generator_reset();counter_x = -(current_block->step_event_count >> 1);counter_y = counter_z = counter_e = counter_x;step_events_completed = 0;#if ENABLED(Z_LATE_ENABLE)if (current_block->steps[Z_AXIS] > 0) {enable_z();OCR1A = 2000; //1ms waitreturn;}#endif// #if ENABLED(ADVANCE)//   e_steps[current_block->active_extruder] = 0;// #endif}else {OCR1A = 2000; // 1kHz.}}if (current_block != NULL) {// Update endstops state, if enabled#if ENABLED(HAS_Z_MIN_PROBE)if (check_endstops || z_probe_is_active) update_endstops();#elseif (check_endstops) update_endstops();#endif// Take multiple steps per interrupt (For high speed moves)for (int8_t i = 0; i < step_loops; i++) {#ifndef USBCONcustomizedSerial.checkRx(); // Check for serial chars.#endif#if ENABLED(ADVANCE)counter_e += current_block->steps[E_AXIS];if (counter_e > 0) {counter_e -= current_block->step_event_count;e_steps[current_block->active_extruder] += TEST(out_bits, E_AXIS) ? -1 : 1;}#endif //ADVANCE#define _COUNTER(axis) counter_## axis#define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP#define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN#define STEP_ADD(axis, AXIS) \_COUNTER(axis) += current_block->steps[_AXIS(AXIS)]; \if (_COUNTER(axis) > 0) { _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS),0); }STEP_ADD(x,X);STEP_ADD(y,Y);STEP_ADD(z,Z);#if DISABLED(ADVANCE)STEP_ADD(e,E);#endif#define STEP_IF_COUNTER(axis, AXIS) \if (_COUNTER(axis) > 0) { \_COUNTER(axis) -= current_block->step_event_count; \count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \_APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS),0); \}STEP_IF_COUNTER(x, X);STEP_IF_COUNTER(y, Y);STEP_IF_COUNTER(z, Z);#if DISABLED(ADVANCE)STEP_IF_COUNTER(e, E);#endifstep_events_completed++;if (step_events_completed >= current_block->step_event_count) break;
}

阅读这段代码的主要麻烦在宏STEP_ADD和STEP_IF_COUNTER。

符号“##”的作用是把前后的宏参数拼接在一起。

我们来分析“STEP_ADD(x,X)”

STEP_ADD(x,X)=_COUNTER(x) += current_block->steps[_AXIS(AXIS)]; \

if (_COUNTER(x) > 0) { _APPLY_STEP(X)(!_INVERT_STEP_PIN(X),0); }

其中,_COUNTER(x)=counter_x

_APPLY_STEP(X)=X_APPLY_STEP

_INVERT_STEP_PIN(X)=INVERT_X_STEP_PIN

_AXIS(AXIS)也类似,搜索源码会发现有“#define _AXIS(AXIS) AXIS ##_AXIS”。

宏STEP_IF_COUNTER也类似。

经过整理后bresenham算法可以表示为

这个代码很清晰了,可是怎么也看不出有个什么算法,哈哈。

bresenham算法是光栅化的画直线算法。直线光栅化是指用像素点来模拟直线,比如下图用蓝色的像素点来模拟红色的直线。

蓝色点是怎么得到的呢?取与理想中的红点最近的xy轴的交点作为蓝点。

算法是怎么与marlin源码结合的呢?

假设需要从点(0,0,0)到点(31,21,5),那么代码执行的详细情况如下

current_block->steps[X_AXIS] = 31;

current_block->steps[Y_AXIS] = 21;

current_block->steps[Z_AXIS] = 5;

current_block->step_event_count = 31;

counter_x = -(current_block->step_event_count>>1) = -15;

counter_y = counter_z = counter_e = counter_x;

第一步

Counter_x = counter_x + current_block->steps[X_AXIS] = -15 + 31 = 16;

因为条件counter_x > 0为true, 所以X电机向前走一步

counter_x = counter_x - current_block->step_event_count = 16 - 31; = -15;

counter_y = counter_y + current_block->steps[Y_AXIS] = -15 + 21 = 6;

因为条件counter_y > 0为true,所以Y电机向前走一步

counter_y = counter_y - current_block->step_event_count = 6 - 31 = -25;

counter_z = counter_z + current_block->steps[Z_AXIS] = -15 + 5 = -10;

因为条件counter_z > 0为false,所以Z电机不动

counter_z = -10;

第二步

Counter_x = counter_x + current_block->steps[X_AXIS] = -15 + 31 = 16;

因为条件counter_x > 0为true, 所以X电机向前走一步

counter_x = counter_x - current_block->step_event_count = 16 - 31 = -15;

counter_y = counter_y + current_block->steps[Y_AXIS] = -25 + 21 = -4;

因为条件counter_y > 0为false,所以Y电机不动

counter_y = -4;

counter_z = counter_z + current_block->steps[Z_AXIS] = -10 + 5 = -5;

因为条件counter_z > 0为false,所以Z电机不动

counter_z = -10;

第三步

同理

……

【龙印】3d打印固件Marlin中bresenham算法注解相关推荐

  1. 《安富莱嵌入式周报》第297期:开源生物医学成像系统,可肺部成像,C算法合集500例,突出极致运算速度,数值方法书籍,芯片级激光隔离,3D打印机固件Marlin

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  2. 3D打印机固件 Marlin 1.1.0 配置文件 说明

    本文关于marlin配置文件的翻译,如有错漏请多多指出,共同修正 感谢! 版本信息: Release Candidate -- Marlin 1.1.0-RC8 - 6 Dec 2016 /** * ...

  3. prusai3打印机使用教程_prusa i3 3D打印机固件Marlin配置初学者篇

    前边的教程已经给大家介绍了如何组装Prusa i3打印机,不知道各位小伙伴有没有get到,既然打印机已经有了躯体,那么就需要一个灵魂.这个灵魂就是Marlin固件,记得刚开始了解3D打印机的时候,经常 ...

  4. 【龙印】把龙芯1c的pwm用作定时器并产生中断

    本文为在用龙芯1c做3D打印机过程中的笔记.龙芯1c做的3d打印机简称"龙印" 3d打印机固件marlin巧妙运用定时器让整个固件不必依赖实时操作系统,即把对实时性要求较高的部分巧 ...

  5. 3d打印主要的切片参数类型_3D打印混凝土工艺参数对成型精度的影响

    3D打印混凝土技术作为新兴技术,由于其不需要模板,节省大量劳动力和可打印复杂造型的特点,得到了大家的关注.但是,利用3D打印技术建造想要的结构,成型精度是必须考虑的一个问题.成型精度受材料性能.打印设 ...

  6. 3D打印人体骨骼?这家哈佛大学孵化的公司要为中国医生开发自己的软件平台...

    作者:Yaling Hou 来源:硅谷洞察 我们每个人都是独一无二的.从瞳孔.指纹.牙齿,到深藏于身体的骨骼. 意外创伤.其他疾病引发的骨头坏死.甚至是因工作姿势不良等引起的颈椎.腰椎劳损等病痛长期折 ...

  7. 什么是3D打印?3D打印技术?

    3D打印技术或增材制造是从数字文件制作三维立体对象的过程.使用添加过程实现3D打印对象的创建.在3D打印添加过程中,通过铺设连续的材料层来创建对象,这些层中的每一层都可以看作最终对象的薄切片水平横截面 ...

  8. 3D打印开源软件Cura分析(1) 【转】

    http://www.sohu.com/a/236241465_100000368 Cura是Ultimaker公司开发的3D打印开源软件,在所有的3D打印开源软件中应属上乘之作,很有研究的价值.国内 ...

  9. Ultimaker不断为你解锁全新3D打印应用

    来自 BASF, Clariant, DSM, DuPont,和Owens Corning 材料公司的打印配置文件现已应用于Ultimaker Cura 3.6  法兰克福2018年11月13日电 / ...

最新文章

  1. 软件测试须知基于PostMan的接口自动化测试
  2. hexo博客配置阿里云oss对象存储
  3. javascript随堂练习(分支,循环语句)
  4. C++是一种糟糕的语言 Linux之父炮轰C++
  5. java 提交界面_使用javascript如何实现页面加载时自动提交表单
  6. JavaScript函数声明提升
  7. 关于适配器模式、装饰器模式、桥接模式和代理模式的总结
  8. 十九、Oracle学习笔记:行变量
  9. Atitit.加密算法ati Aes的框架设计
  10. Photoshop CS6 安装教程
  11. pycharm typo
  12. 4.2.5 Kafka集群与运维(集群的搭建、监控工具 Kafka Eagle)
  13. 《SysML精粹》学习记录--第七章
  14. KConfig、Makefile详解以及ARM平台Linux内核的编译
  15. Wireles Tools移植
  16. android简历!剖析Android开发未来的出路在哪里,Android篇
  17. 过来人经验:程序员怎么升职加薪,迎娶白富美...
  18. C#跑马灯抽签小程序
  19. python赋值法例子_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
  20. AI周报丨快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用

热门文章

  1. 小处着手, 细化产品
  2. u盘不能拷贝超过4g的大文件吗?
  3. 天价耶稣像是达·芬奇画的吗?美国夫妇开发AI程序,CNN检测艺术伪造
  4. 华硕主板氛围灯光设置成关机不亮的解决办法
  5. 【Vue.js】892- Vue 3.0 进阶之动态组件探秘
  6. 36.深度解密三十六:网络舆情监测之另类“免费监测”方法详解
  7. Excel ODBC导入器 驱动程序报错解决方式
  8. Django 框架 要点
  9. Hexo+Github+Vscode搭建个人博客内含添加图片和更换主题
  10. VSS服务器安装配置(比较完整的一篇VSS服务器配置的文章)