查看: 223|回复: 8

[资料] 3D打印运动控制系统源码分享

[复制链接]

主题

好友

1万

积分

翰林

  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-7-13 16:02:54 |显示全部楼层
    开源的3D打印系统(marlin)主要是基于8位arduino控制板板卡。无法支持彩色触摸屏。为此本人花了为时3个月的时间,将marlin从arduino移植到STM32。并命名为Dlion。
    3D打印运动系统的核心主要是步进电机驱动子系统,是由中断响应函数实现的。如果是恒定速度的步进电机驱动,实现就和这句话一样简单。不过对于3D打印机系统,x,y轴的运动往往速度变化非常频繁:不仅在每次更新位置的速度不同,而且每一段位移的速度也需要经历加速,恒速和减速阶段。这是由机械系统的惯性特征决定的:如果不同动作之间的速度衔接不好,会对电路系统造成强大的电流冲击。特别是3D打印过程,这种速度的变化每次打印任务都数以万计,这就意味着电路寿命将大打折扣。
    步进电机驱动子系统系统的速度衔接,基于leibRamp Algorithm,这是一个支撑步进电机速度和控制器计数器频率关系的算法理论,由IBM的工程师于1994年发表并于2004年在控制器内实现。这里算法实现的关键在于路径规划器(planner)。路径规划器的设计意味着,程序在执行步进电机的动作之前,就已经计算好了整个过程的速度曲线。后面就只是Stepper模块准确地执行。在机器层面,这样的设计减少了中断响应函数中的运算量,这对于单片机来说非常友好。同时3D打印机的机械运动相比控制器的16M主频来说要慢很多,路径规划器相比直接驱动,增加了一个运动缓存。这样就能够有效的利用控制器的高频率,里面蕴藏着“空间换取时间”的思想。
    在代码层面,planner的本质在于对于一个FIFO的管理。使用C的结构体指针数据结构能够非常优雅的实现这个缓存的创建和管理:
    planner.h:
    • typedef struct {
    •   // Fields used by the bresenham algorithm for tracing the line
    •   long steps_x, steps_y, steps_z, steps_e;  // Step count along each axis
    •   unsigned long step_event_count;           // The number of step events required to complete this block
    •   long accelerate_until;                    // The index of the step event on which to stop acceleration
    •   long decelerate_after;                    // The index of the step event on which to start decelerating
    •   long acceleration_rate;                   // The acceleration rate used for acceleration calculation
    •   unsigned char direction_bits;             // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
    •   float nominal_speed;                               // The nominal speed for this block in mm/sec
    •   float entry_speed;                                 // Entry speed at previous-current junction in mm/sec
    •   float max_entry_speed;                             // Maximum allowable junction entry speed in mm/sec
    •   float millimeters;                                 // The total travel of this block in mm
    •   float acceleration;                                // acceleration mm/sec^2
    •   unsigned char recalculate_flag;                    // Planner flag to recalculate trapezoids on entry junction
    •   unsigned char nominal_length_flag;                 // Planner flag for nominal speed always reached
    •   // Settings for the trapezoid generator
    •   unsigned long nominal_rate;                        // The nominal step rate for this block in step_events/sec
    •   unsigned long initial_rate;                        // The jerk-adjusted step rate at start of block
    •   unsigned long final_rate;                          // The minimal rate at exit
    •   unsigned long acceleration_st;                     // acceleration steps/sec^2
    •   unsigned long fan_speed;
    •   #ifdef BARICUDA
    •   unsigned long valve_pressure;
    •   unsigned long e_to_p_pressure;
    •   #endif
    •   volatile char busy;
    • } block_t;leibRamp Algorithm
    • block_t block_buffer[BLOCK_BUFFER_SIZE];            // A ring buffer for motion instfructions
    • volatile unsigned char block_buffer_head;           // Index of the next block to be pushed
    • volatile unsigned char block_buffer_tail;

    [color=rgb(51, 102, 153) !important]复制代码

    volatile 关键字确保了队列头和队列尾被不同函数访问过程中,编译器不会因为优化和丢失更改行为。block_t类型的指针可以方便的方位结构体内任何元素。在后面的planner规划动作plan_buffer_line()中,代码可以用非常优雅的结构体指针来完成。





         每当3D打印机解析到位移指令的时候,plan_buffer_line()函数就被调用。在里面新的block_t首先被创建,并且排入队列的队尾;然后执行calculate_trapezoid_for_block(),计算新的block_t的关键速度节点及其对应的step数目;接着更新队列里面所有block_t的连接速度:之前队尾的block_t的收尾速度和相关速度节点会被更新。最后调用st_wake_up()保证stepper执行的中断打开。





        而在%steppper中,ISR函数负责在主循环之外,执行队列里可能存在的所有block_t。在ISR中,首先由plan_get_current_block()读取队列首的block_t,然后按照结构成员的step数,调用STEP_ADDSTEP_IF_COUNTER两个宏来执行x,y,z三轴的运动。ISR每执行一次,三路各发出一个脉冲,并通过lamp ramp算法更新,根据下一个速度值来更新OCR1A寄存器来设定下一次中断响应的周期。
    消化一段代码的最有效方法是对其移植或者重写。换言之,仅仅是走马观花的浏览一遍,除非自己曾经编写过类似程序,很难能透彻的领会固件代码的精髓。所以这里我决定把它分享出来给大家

    游客,如果您要查看本帖隐藏内容请回复



    回复

    使用道具 举报

    主题

    好友

    175

    积分

    童生

    该用户从未签到

    发表于 2020-7-14 09:04:57 来自手机 |显示全部楼层
    谢谢分享!
    回复

    使用道具 举报

    主题

    好友

    1316

    积分

    进士

  • TA的每日心情
    开心
    昨天 08:19
  • 签到天数: 29 天

    连续签到: 23 天

    [LV.4]偶尔看看III

    发表于 2020-7-14 09:04:57 |显示全部楼层
    感谢分享
    回复

    使用道具 举报

    主题

    好友

    2034

    积分

    进士

  • TA的每日心情
    开心
    2020-1-28 07:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-7-16 08:57:34 |显示全部楼层

    感谢楼主分享。。。
    回复

    使用道具 举报

    主题

    好友

    2034

    积分

    进士

  • TA的每日心情
    开心
    2020-1-28 07:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-7-16 08:57:34 |显示全部楼层
    感谢楼主分享。。。。。。。。
    回复

    使用道具 举报

    主题

    好友

    310

    积分

    秀才

  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 23 天

    连续签到: 10 天

    [LV.4]偶尔看看III

    发表于 2020-7-16 13:03:22 |显示全部楼层
       查看求教
    回复

    使用道具 举报

    主题

    好友

    176

    积分

    童生

    该用户从未签到

    发表于 2020-7-16 13:03:22 |显示全部楼层
    感谢楼主分享。
    回复

    使用道具 举报

    主题

    好友

    1988

    积分

    进士

    该用户从未签到

    发表于 2020-7-20 10:38:32 |显示全部楼层
    感谢分享
    回复

    使用道具 举报

    主题

    好友

    60

    积分

    童生

  • TA的每日心情
    奋斗
    2015-4-30 08:42
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-7-28 14:18:39 |显示全部楼层

    感谢楼主分享。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|电路城

    GMT+8, 2020-8-5 10:10 , Processed in 0.089587 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部