|
電機(jī)驅(qū)動(dòng)兼容市面上大多數(shù)脈沖控制器。
這個(gè)程序的初衷是用來學(xué)習(xí)3d打印機(jī)的運(yùn)動(dòng)原理,理論上可以實(shí)現(xiàn)n軸聯(lián)動(dòng),通過bresenham實(shí)現(xiàn)直線插補(bǔ)再采用直線來逼近圓弧,
更多細(xì)節(jié)大家可以自行百度科普,程序主要思路如下,通過定時(shí)器1來實(shí)現(xiàn)步進(jìn)電機(jī)發(fā)送脈沖,主程序?qū)崿F(xiàn)緩沖區(qū)寫入,這樣后臺(tái)的電機(jī)可以不間斷運(yùn)動(dòng),且少量阻塞主程序。速度控制可以通過改變定時(shí)器頻率,目前程序中未實(shí)現(xiàn)。
實(shí)驗(yàn)結(jié)論:
bresenham對(duì)于小內(nèi)存芯片非常友好,但會(huì)造成步進(jìn)脈沖不均勻,還有一個(gè)辦法就是求脈沖的最小被公倍數(shù)然后進(jìn)行時(shí)間的插補(bǔ)。
向其他芯片移植只需更改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; //完成這個(gè)block所需走的步數(shù),steps_x, steps_y, steps_z, steps_e的最大值
- long accelerate_until; //梯形曲線中的加速距離,單位steps
- long decelerate_after; //加速和勻速的距離,單位steps
- long acceleration_rate; //加速率,用來計(jì)算加速度
- long steps[N_AXIS]; //每個(gè)坐標(biāo)軸所需走的步數(shù)
- bool motor_dir[N_AXIS]; //這個(gè)block的方向位,“1”反向,“0”正向,每一個(gè)位代表一個(gè)軸的方向
- unsigned char active_extruder; //所用到的有效的擠出頭
- float nominal_speed; //額定速度,即梯形曲線的勻速階段的速度
- float entry_speed; //進(jìn)入速度,即從上一個(gè)block進(jìn)入到這個(gè)block的速度
- float max_entry_speed; //最大進(jìn)入速度,進(jìn)入速度不能超過這個(gè)值
- float millimeters; //總路程,單位mm
- float acceleration; //加速度,單位mm/sec^2
- unsigned char recalculate_flag; //連接處重新計(jì)算梯形速度曲線的標(biāo)志
- unsigned char nominal_length_flag; //能達(dá)到額定速度的標(biāo)志
- // Settings for the trapezoid generator梯形速度曲線產(chǎn)生器的設(shè)置參數(shù)
- unsigned long nominal_rate; //這個(gè)block的單位為steps/sec的額定速度
- unsigned long initial_rate; //梯形曲線的初始速度/進(jìn)入速度,單位steps/sec
- unsigned long final_rate; //梯形曲線的退出速度,單位steps/sec
- unsigned long acceleration_st; //單位為steps/sec^2的加速度
- unsigned long fan_speed; //風(fēng)扇速度
- //volatile char busy;//正在處理這個(gè)block的標(biāo)志位,“1”表示正在執(zhí)行這個(gè)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
復(fù)制代碼- #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絕對(duì)坐標(biāo)
- mc_line(step1,200);
- double positionc[4]={30, 0, 0, 0}; //圓弧起點(diǎn)坐標(biāo)
- double tragetc[4]= {0, 30, 0, 400}; //圓弧終點(diǎn)坐標(biāo)
- double offsetc[3]= {-30, 0, 0}; //圓心距離起點(diǎn)向量
- mc_arc(positionc, tragetc, offsetc, X_AXIS,Y_AXIS,Z_AXIS, 10, 30,true,E0_AXIS);
- //起點(diǎn)對(duì)應(yīng)指針,終點(diǎn)對(duì)應(yīng)指針,約等于半徑,進(jìn)給速率,半徑,正逆插補(bǔ),擠出機(jī)擠出量
- }
- void loop()
- {
- // put your main code here, to run repeatedly:
- }
復(fù)制代碼
代碼下載:
2021_6_18 stepmotor_control.zip
(677.86 KB, 下載次數(shù): 56)
2022-4-28 23:29 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|