找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3641|回復(fù): 0
收起左側(cè)

Arduino多軸步進(jìn)電機(jī)聯(lián)動(dòng)進(jìn)行直線圓弧插補(bǔ) 源程序

[復(fù)制鏈接]
ID:276685 發(fā)表于 2022-4-28 23:45 | 顯示全部樓層 |閱讀模式
電機(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操作命令即可->

  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; //完成這個(gè)block所需走的步數(shù),steps_x, steps_y, steps_z, steps_e的最大值

  17.     long accelerate_until; //梯形曲線中的加速距離,單位steps

  18.     long decelerate_after; //加速和勻速的距離,單位steps

  19.     long acceleration_rate; //加速率,用來計(jì)算加速度

  20.     long steps[N_AXIS];     //每個(gè)坐標(biāo)軸所需走的步數(shù)
  21.     bool motor_dir[N_AXIS]; //這個(gè)block的方向位,“1”反向,“0”正向,每一個(gè)位代表一個(gè)軸的方向

  22.     unsigned char active_extruder; //所用到的有效的擠出頭

  23.     float nominal_speed; //額定速度,即梯形曲線的勻速階段的速度

  24.     float entry_speed; //進(jìn)入速度,即從上一個(gè)block進(jìn)入到這個(gè)block的速度

  25.     float max_entry_speed; //最大進(jìn)入速度,進(jìn)入速度不能超過這個(gè)值

  26.     float millimeters; //總路程,單位mm

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

  28.     unsigned char recalculate_flag; //連接處重新計(jì)算梯形速度曲線的標(biāo)志

  29.     unsigned char nominal_length_flag; //能達(dá)到額定速度的標(biāo)志

  30.     // Settings for the trapezoid generator梯形速度曲線產(chǎn)生器的設(shè)置參數(shù)

  31.     unsigned long nominal_rate; //這個(gè)block的單位為steps/sec的額定速度

  32.     unsigned long initial_rate; //梯形曲線的初始速度/進(jìn)入速度,單位steps/sec

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

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

  35.     unsigned long fan_speed; //風(fēng)扇速度

  36.     //volatile char busy;//正在處理這個(gè)block的標(biāo)志位,“1”表示正在執(zhí)行這個(gè)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
復(fù)制代碼
  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絕對(duì)坐標(biāo)
  16. mc_line(step1,200);
  17. double positionc[4]={30, 0,  0,  0};   //圓弧起點(diǎn)坐標(biāo)
  18. double tragetc[4]=  {0,  30, 0,  400}; //圓弧終點(diǎn)坐標(biāo)
  19. double offsetc[3]=  {-30, 0, 0};       //圓心距離起點(diǎn)向量

  20. mc_arc(positionc,  tragetc,     offsetc, X_AXIS,Y_AXIS,Z_AXIS, 10, 30,true,E0_AXIS);
  21. //起點(diǎn)對(duì)應(yīng)指針,終點(diǎn)對(duì)應(yīng)指針,約等于半徑,進(jìn)給速率,半徑,正逆插補(bǔ),擠出機(jī)擠出量



  22. }


  23. void loop()
  24. {
  25.   // put your main code here, to run repeatedly:
  26. }
復(fù)制代碼
文件結(jié)構(gòu).JPG
代碼下載:
2021_6_18 stepmotor_control.zip (677.86 KB, 下載次數(shù): 56)



評(píng)分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表