Znaleziono 2 wyniki

autor: tuxcnc
09 lis 2024, 21:59
Forum: Mach 2 / 3 / 4 (ArtSoft software)
Temat: pozycjonowanie wrzeciona tokarki
Odpowiedzi: 18
Odsłony: 4643

Re: pozycjonowanie wrzeciona tokarki

kszumek pisze:
09 lis 2024, 20:35
podpowiem coś , linuxcnc cały czas zna pozycję wrzeciona jeśli jest podpięty enkoder
Tyle tylko, że wrzeciono i oś obrotowa to logicznie dwa odrębne urządzenia, sterowane w inny sposób.
Ponadto jesteśmy w dziale "Mach 2 / 3 / 4 (ArtSoft software)"...
autor: tuxcnc
09 lis 2024, 12:27
Forum: Mach 2 / 3 / 4 (ArtSoft software)
Temat: pozycjonowanie wrzeciona tokarki
Odpowiedzi: 18
Odsłony: 4643

Re: pozycjonowanie wrzeciona tokarki

andrzej31-91 pisze:
07 lis 2024, 17:36
Bawiłem się właśnie w taki sposób gdzie serwo jest sterowane za pomocą sygnału krok/kierunek.
I problem jest taki że gdy serwo pracuje jako 4ta oś mach wie w jakiej jest pozycji (kąt) natomiast gdy przejdziemy na toczenie to mach przestaje "zliczać" o jaki kąt oś została obrócona.
To jest typowy problem i w Linuxcnc miałem to samo.
Ale teraz przyszło mi do głowy, żeby w trybie wrzeciona sterować serwo pełnymi obrotami...
Czyli bierzemy jakiś mikrokontroler, wykonujemy rampę startową, potem kręcimy o pełne obroty dopóki mamy sygnał sterujący, a po jego zaniku robimy rampę hamującą.
Takie sterowanie gwarantowało by, że serwo kończyło by w tym samym położeniu, w jakim zaczęło.
To się wydaje skomplikowane, ale program byłby dość krótki i prosty.
Odradzam Arduino Uno/Nano itp. bo to już historia.
Płytkę z ESP32-C3 (160 MHz) lub ESP32-S2 (240 MHz) idzie kupić poniżej 10 PLN, a przy takim zegarze to nawet nie warto bawić się w przerwania.
Jak pisałem, to tylko pomysł którego nie testowałem, ale musi to zadziałać.
Gdyby się komuś chciało tym zająć, to wklejam poniżej mój program realizujący dość podobne zadanie - silnik krokowy udaje wrzeciono z enkoderem.
Trzeba by go trochę poprawić i dodać brakujące funkcje, mi to nie było potrzebne, bo służyło tylko do testowania sterowników CNC, a konkretnie gwintowania.

Kod: Zaznacz cały

#define forward_pin 5
#define reverse_pin 6
#define dir_pin     3
#define step_pin    4
#define encA_pin    0
#define encB_pin    1
#define encZ_pin    2
#define steplen     8 //increase for lower rpm
#define microstep   16 //as at driver
#define cpr         200*microstep
uint8_t dir = 0;
uint8_t speed = 0;
uint8_t cmd = 0;
uint8_t enc = 0;
int16_t enc_count = 0;
bool enc_A[4] = {0,0,1,1};
bool enc_B[4] = {0,1,1,0};


void setup() {
  pinMode(forward_pin, INPUT_PULLDOWN);
  pinMode(reverse_pin, INPUT_PULLDOWN);
  pinMode(dir_pin, OUTPUT);
  pinMode(step_pin, OUTPUT);
  pinMode(encA_pin, OUTPUT);
  pinMode(encB_pin, OUTPUT);
  pinMode(encZ_pin, OUTPUT);
}

void loop() {
  while (speed == 0){
    if (digitalRead(forward_pin)){
      dir = 1;
      speed = 1;
      digitalWrite(dir_pin, 1);
    }
    if (digitalRead(reverse_pin)){
      dir = 2;
      speed = 1;
      digitalWrite(dir_pin, 0);
    }
  }
  digitalWrite(step_pin, 1);
  delayMicroseconds(steplen);
  digitalWrite(step_pin, 0);
  delayMicroseconds((256*steplen) - (steplen*speed));
  if (dir == 1) {
    enc++;
    enc_count++;
    if (enc_count > (cpr - 1)) {enc_count = 0;}
    digitalWrite(encA_pin, enc_A[(enc & 3)]);
    digitalWrite(encB_pin, enc_B[(enc & 3)]);
  }
  if (dir == 2) {
    enc--;
    enc_count--;
    if (enc_count < 0) {enc_count = (cpr - 1);}
    digitalWrite(encA_pin, enc_A[(enc & 3)]);
    digitalWrite(encB_pin, enc_B[(enc & 3)]);
  }
  if (enc_count < 2) { digitalWrite(encZ_pin, 1);}
  else { digitalWrite(encZ_pin, 0);}  
  if (((digitalRead(forward_pin)) && (dir == 1)) || ((digitalRead(reverse_pin)) && (dir == 2))) {
    if (speed < 255){ speed++;}
  }
  else {
    if (speed > 0){ speed--;}
  }
}

Wróć do „pozycjonowanie wrzeciona tokarki”