电机驱动兼容市面上大多数脉冲控制器。
这个程序的初衷是用来学习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:
- }
复制代码
代码下载:
2021_6_18 stepmotor_control.zip
(677.86 KB, 下载次数: 56)
|