找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2502|回复: 0
打印 上一主题 下一主题
收起左侧

Arduino多轴步进电机联动进行直线圆弧插补 源程序

[复制链接]
跳转到指定楼层
楼主
电机驱动兼容市面上大多数脉冲控制器。

这个程序的初衷是用来学习3d打印机的运动原理,理论上可以实现n轴联动,通过bresenham实现直线插补再采用直线来逼近圆弧,
更多细节大家可以自行百度科普,程序主要思路如下,通过定时器1来实现步进电机发送脉冲,主程序实现缓冲区写入,这样后台的电机可以不间断运动,且少量阻塞主程序。速度控制可以通过改变定时器频率,目前程序中未实现。

实验结论:

bresenham对于小内存芯片非常友好,但会造成步进脉冲不均匀,还有一个办法就是求脉冲的最小被公倍数然后进行时间的插补。

向其他芯片移植只需更改io操作命令即可->

  1. #ifndef _BUFFER_HPP_
  2. #define _BUFFER_HPP_

  3. #include <Arduino.h>
  4. #include "motor.hpp"

  5. #define BLOCK_BUFFER_SIZE 18
  6. #define N_ARC_CORRECTION 25
  7. #define MM_PER_ARC_SEGMENT 2

  8. #define N_AXIS 4
  9. #define E_AXIS 1

  10. #define X_AXIS 0
  11. #define Y_AXIS 1
  12. #define Z_AXIS 2
  13. #define E0_AXIS 3

  14. typedef struct
  15. {

  16.     unsigned long step_event_count; //完成这个block所需走的步数,steps_x, steps_y, steps_z, steps_e的最大值

  17.     long accelerate_until; //梯形曲线中的加速距离,单位steps

  18.     long decelerate_after; //加速和匀速的距离,单位steps

  19.     long acceleration_rate; //加速率,用来计算加速度

  20.     long steps[N_AXIS];     //每个坐标轴所需走的步数
  21.     bool motor_dir[N_AXIS]; //这个block的方向位,“1”反向,“0”正向,每一个位代表一个轴的方向

  22.     unsigned char active_extruder; //所用到的有效的挤出头

  23.     float nominal_speed; //额定速度,即梯形曲线的匀速阶段的速度

  24.     float entry_speed; //进入速度,即从上一个block进入到这个block的速度

  25.     float max_entry_speed; //最大进入速度,进入速度不能超过这个值

  26.     float millimeters; //总路程,单位mm

  27.     float acceleration; //加速度,单位mm/sec^2

  28.     unsigned char recalculate_flag; //连接处重新计算梯形速度曲线的标志

  29.     unsigned char nominal_length_flag; //能达到额定速度的标志

  30.     // Settings for the trapezoid generator梯形速度曲线产生器的设置参数

  31.     unsigned long nominal_rate; //这个block的单位为steps/sec的额定速度

  32.     unsigned long initial_rate; //梯形曲线的初始速度/进入速度,单位steps/sec

  33.     unsigned long final_rate; //梯形曲线的退出速度,单位steps/sec

  34.     unsigned long acceleration_st; //单位为steps/sec^2的加速度

  35.     unsigned long fan_speed; //风扇速度

  36.     //volatile char busy;//正在处理这个block的标志位,“1”表示正在执行这个block

  37. } block_t;

  38. uint8_t plan_next_block_index(uint8_t block_index);
  39. uint8_t plan_check_full_buffer();
  40. bool plan_can_read();
  41. void plan_reset();
  42. void plan_write_block(double *target, long fan_speed);
  43. void plan_read_block();

  44. #endif
复制代码
  1. #include "main.hpp"

  2. void setup()
  3. {
  4.   Serial.begin(115200);
  5.   motor_init_x_pin();
  6.   motor_init_y_pin();
  7.   motor_init_z_pin();
  8.   motor_init_e0_pin();

  9.   MOTOR_X_ENABLE;
  10.   MOTOR_Y_ENABLE;
  11.   MOTOR_Z_ENABLE;
  12.   MOTOR_E0_ENABLE;
  13.   plan_reset();

  14. timer_init();
  15. double step1[4]={ 100.0,  20.0,  50.0,  100.0, };//XYZE绝对坐标
  16. mc_line(step1,200);
  17. double positionc[4]={30, 0,  0,  0};   //圆弧起点坐标
  18. double tragetc[4]=  {0,  30, 0,  400}; //圆弧终点坐标
  19. double offsetc[3]=  {-30, 0, 0};       //圆心距离起点向量

  20. mc_arc(positionc,  tragetc,     offsetc, X_AXIS,Y_AXIS,Z_AXIS, 10, 30,true,E0_AXIS);
  21. //起点对应指针,终点对应指针,约等于半径,进给速率,半径,正逆插补,挤出机挤出量



  22. }


  23. void loop()
  24. {
  25.   // put your main code here, to run repeatedly:
  26. }
复制代码

代码下载:
2021_6_18 stepmotor_control.zip (677.86 KB, 下载次数: 53)



评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表