電機驅動兼容市面上大多數脈沖控制器。
這個程序的初衷是用來學習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
|