标题:
Arduino多轴步进电机联动进行直线圆弧插补 源程序
[打印本页]
作者:
fbn20050523
时间:
2022-4-28 23:45
标题:
Arduino多轴步进电机联动进行直线圆弧插补 源程序
电机驱动兼容市面上大多数脉冲控制器。
这个程序的初衷是用来学习3d打印机的运动原理,理论上可以实现n轴联动,通过bresenham实现直线插补再采用直线来逼近圆弧,
更多细节大家可以自行百度科普,程序主要思路如下,通过定时器1来实现步进电机发送脉冲,主程序实现缓冲区写入,这样后台的电机可以不间断运动,且少量阻塞主程序。速度控制可以通过改变定时器频率,目前程序中未实现。
实验结论:
bresenham对于小内存芯片非常友好,但会造成步进脉冲不均匀,还有一个办法就是求脉冲的最小被公倍数然后进行时间的插补。
向其他芯片移植只需更改io操作命令即可->
#ifndef _BUFFER_HPP_
#define _BUFFER_HPP_
#include <Arduino.h>
#include "motor.hpp"
#define BLOCK_BUFFER_SIZE 18
#define N_ARC_CORRECTION 25
#define MM_PER_ARC_SEGMENT 2
#define N_AXIS 4
#define E_AXIS 1
#define X_AXIS 0
#define Y_AXIS 1
#define Z_AXIS 2
#define E0_AXIS 3
typedef struct
{
unsigned long step_event_count; //完成这个block所需走的步数,steps_x, steps_y, steps_z, steps_e的最大值
long accelerate_until; //梯形曲线中的加速距离,单位steps
long decelerate_after; //加速和匀速的距离,单位steps
long acceleration_rate; //加速率,用来计算加速度
long steps[N_AXIS]; //每个坐标轴所需走的步数
bool motor_dir[N_AXIS]; //这个block的方向位,“1”反向,“0”正向,每一个位代表一个轴的方向
unsigned char active_extruder; //所用到的有效的挤出头
float nominal_speed; //额定速度,即梯形曲线的匀速阶段的速度
float entry_speed; //进入速度,即从上一个block进入到这个block的速度
float max_entry_speed; //最大进入速度,进入速度不能超过这个值
float millimeters; //总路程,单位mm
float acceleration; //加速度,单位mm/sec^2
unsigned char recalculate_flag; //连接处重新计算梯形速度曲线的标志
unsigned char nominal_length_flag; //能达到额定速度的标志
// Settings for the trapezoid generator梯形速度曲线产生器的设置参数
unsigned long nominal_rate; //这个block的单位为steps/sec的额定速度
unsigned long initial_rate; //梯形曲线的初始速度/进入速度,单位steps/sec
unsigned long final_rate; //梯形曲线的退出速度,单位steps/sec
unsigned long acceleration_st; //单位为steps/sec^2的加速度
unsigned long fan_speed; //风扇速度
//volatile char busy;//正在处理这个block的标志位,“1”表示正在执行这个block
} block_t;
uint8_t plan_next_block_index(uint8_t block_index);
uint8_t plan_check_full_buffer();
bool plan_can_read();
void plan_reset();
void plan_write_block(double *target, long fan_speed);
void plan_read_block();
#endif
复制代码
#include "main.hpp"
void setup()
{
Serial.begin(115200);
motor_init_x_pin();
motor_init_y_pin();
motor_init_z_pin();
motor_init_e0_pin();
MOTOR_X_ENABLE;
MOTOR_Y_ENABLE;
MOTOR_Z_ENABLE;
MOTOR_E0_ENABLE;
plan_reset();
timer_init();
double step1[4]={ 100.0, 20.0, 50.0, 100.0, };//XYZE绝对坐标
mc_line(step1,200);
double positionc[4]={30, 0, 0, 0}; //圆弧起点坐标
double tragetc[4]= {0, 30, 0, 400}; //圆弧终点坐标
double offsetc[3]= {-30, 0, 0}; //圆心距离起点向量
mc_arc(positionc, tragetc, offsetc, X_AXIS,Y_AXIS,Z_AXIS, 10, 30,true,E0_AXIS);
//起点对应指针,终点对应指针,约等于半径,进给速率,半径,正逆插补,挤出机挤出量
}
void loop()
{
// put your main code here, to run repeatedly:
}
复制代码
文件结构.JPG
(38.24 KB, 下载次数: 66)
下载附件
2022-4-29 00:04 上传
代码下载:
2021_6_18 stepmotor_control.zip
(677.86 KB, 下载次数: 56)
2022-4-28 23:29 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1