INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schrittmotor Geschwindigkeit steuern!!!!
19.12.2020, 16:50
Beitrag #1
Schrittmotor Geschwindigkeit steuern!!!!
Habe eine Schrittmotorsteuerung geschrieben (Rechts-Linkslauf/ Geschwindigkeit) und alles funktioniert bis auf die Geschwindigkeitssteuerung von Motor 2-4 (Motor eins funzt).
Hier der Code:

Code:
//ISR(TIMER1_COMPA_vect) {
//  STEPPER (Stepper10, Stepper11, Stepper12, Stepper13, Stepper1A, Stepper1R, Stepper1L, 1);
//}

ISR(TIMER3_COMPA_vect) {
  STEPPER (Stepper20, Stepper21, Stepper22, Stepper23, Stepper2A, Stepper2R, Stepper2L, 3) ;

}

//ISR(TIMER4_COMPA_vect) {
//  STEPPER (Stepper30, Stepper31, Stepper32, Stepper33, Stepper3A, Stepper3R, Stepper3L, 4) ;
//
//}
//
//ISR(TIMER5_COMPA_vect) {
//  STEPPER (Stepper40, Stepper41, Stepper42, Stepper43, Stepper4A, Stepper4R, Stepper4L, 5);
//}

void STEPPER (int ST0, int ST1, int ST2, int ST3, int STA, int R, int L, int SS) {
  Serial.print("TEST");
  N[SS]++;
  Serial.print(N[SS]);

  if (N[SS] == 20) {
    Serial.print("X");

    speedx[SS] = analogRead(STA);
    Serial.print(speedx[SS]);
    Serial.print("-");

    sprung[SS] =  speedx[SS];

    if (sprung[SS] != sprungm[SS]) {
      // if ((sprung[SS] != sprungm[SS]) || (sprung[SS] != sprungm[SS] + 1) || (sprung[SS] != sprungm[SS] - 1) || (sprung[SS] != sprungm[SS] + 2) || (sprung[SS] != sprungm[SS] - 2)) {
      // if ((sprung[SS] > sprungm[SS] - 3 ) || (sprung[SS] < sprungm[SS] + 3 )) {
      Serial.print("SPRUNG");


      delayx[SS] = map(speedx[SS], 0, 1023, 5, 62499);
      Serial.print(delayx[SS]);
      if (SS == 0) {
        cli(); // disable interrupts
        Serial.print("SS0");
        TIMSK0 |= (0 << OCIE0A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR0A = delayx[SS]; // set compare match register
        TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      } else if (SS == 1) {
        cli(); // disable interrupts
        Serial.print("SS1");
        TIMSK1 |= (0 << OCIE1A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR1A = delayx[SS]; // set compare match register
        TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      } else if (SS == 2) {
        cli(); // disable interrupts
        Serial.print("SS2");
        TIMSK2 |= (0 << OCIE2A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR2A = delayx[SS]; // set compare match register
        TIMSK2 |= (1 << OCIE2A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      } else if (SS == 3) {
        cli(); // disable interrupts
        Serial.print("SS3");
        TIMSK3 |= (0 << OCIE3A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR3A = delayx[SS]; // set compare match register
        TIMSK3 |= (1 << OCIE3A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      } else if (SS == 4) {
        cli(); // disable interrupts
        Serial.print("SS4");
        TIMSK4 |= (0 << OCIE4A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR4A = delayx[SS]; // set compare match register
        TIMSK4 |= (1 << OCIE4A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      } else if (SS == 5) {
        cli(); // disable interrupts
        Serial.print("SS5");
        TIMSK5 |= (0 << OCIE5A); // enable timer compare interrupt        } else if (SS == 4) {

        OCR5A = delayx[SS]; // set compare match register
        TIMSK5 |= (1 << OCIE5A); // enable timer compare interrupt        } else if (SS == 4) {
        sei();
      }
    }
    N[SS] = 0;

  }


  if (digitalRead (R) == 0) {
    _step[SS]++;
    Serial.print("Step++");
    Serial.print(_step[SS]);

  } else if (digitalRead (L) == 0) {
    _step[SS]--;
    Serial.print("Step--");
    Serial.print(_step[SS]);

  } else if ((digitalRead (L) == 1) && (digitalRead (R) == 1)) {
    _step[SS] = 9;
    Serial.print("Step0");
    Serial.print(_step[SS]);
  }
  if (_step[SS] > 7) {
    _step[SS] = 0;
    Serial.print("Step0");

  }
  if (_step[SS] < 0) {
    _step[SS] = 7;
    Serial.print("Step7");

  }

  switch (_step[SS]) {
    case 0:
      Serial.print("ST0");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, HIGH);
      break;
    case 1:
      Serial.print("ST1");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, HIGH);
      digitalWrite(ST3, HIGH);
      break;
    case 2:
      Serial.print("ST2");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, HIGH);
      digitalWrite(ST3, LOW);
      break;
    case 3:
      Serial.print("ST3");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, HIGH);
      digitalWrite(ST2, HIGH);
      digitalWrite(ST3, LOW);
      break;
    case 4:          Serial.print("ST4");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, HIGH);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, LOW);
      break;
    case 5:
      Serial.print("ST5");

      digitalWrite(ST0, HIGH);
      digitalWrite(ST1, HIGH);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, LOW);
      break;
    case 6:
      Serial.print("ST6");
      digitalWrite(ST0, HIGH);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, LOW);
      break;
    case 7:
      Serial.print("ST7");

      digitalWrite(ST0, HIGH);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, HIGH);
      break;
    case 9:
      Serial.print("ST9");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, LOW);
      break;
    default:
      Serial.print("STD");

      digitalWrite(ST0, LOW);
      digitalWrite(ST1, LOW);
      digitalWrite(ST2, LOW);
      digitalWrite(ST3, LOW);
      break;
  }

  sprungm[SS] = sprung[SS];

  Serial.println("FERTIG");
}

Hatt irgendeiner eine Idee.

Es wurden vier Timer aufgerufen und dort wird immr die gkleiche Funktion aufgerufen.

Das ganze läuft mit einem Mega 2560.

Gruß

Fürst
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.12.2020, 17:00
Beitrag #2
RE: Schrittmotor Geschwindigkeit steuern!!!!
Ich würde Deine ISR als zu lang ansehen. Außerdem haben serielle Ausgaben in einer ISR nichts zu suchen. cli() und sei() machen in einer ISR auch nicht das, was Du Dir vorstellst. Tipp: In der ISR sind die Interrupts bereits gesperrt.

Hast Du Dir schon mal die MoBaTools angeschaut? Damit kannst Du Stepper einfacher steuern. Der Author ist auch hier im Forum vertreten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2020, 08:43
Beitrag #3
RE: Schrittmotor Geschwindigkeit steuern!!!!
Aber warum funzt es beim ersten und bei zwei-vier nicht??? die MoBaTools sin schon gut aber ich hätte halt gerne das ganze aus eigener Überlegung geschafft (Denksportaufgabe). Die seriellen Ausgaben sind auch nur zum debuggen, ich muß ja wissen ob es korrekt läuft und laut der seriellen ausgaben durchläuft das Programm den ganzen Code.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2020, 08:51
Beitrag #4
RE: Schrittmotor Geschwindigkeit steuern!!!!
Sooooo falsch kann ich doch nicht liegen!!!!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2020, 09:19
Beitrag #5
RE: Schrittmotor Geschwindigkeit steuern!!!!
Du berücksichtigst nicht, dass eine Interruptroutine KEINE normale Funktion ist. Da gelten nunmal ein paar besondere Randbedingungen, die man unbedingt einhalten muss. Auch zum debugging darf man in eine ISR keine seriellen Ausgaben einbauen. Ob das funktioniert oder nicht, ist da eher zufällig. ISR sind auch zeitkritisch - auch und gerade wenn sie im Zusammenhang mit Timern genutzt werden. Da können die sich schonmal selbst überholen - wenn der nächste Trigger kommt, bevor die ISR durch ist.
Mir scheint schon, dass dir ein wenig Hintergrundwissen fehlt, um mit Interrupts zu arbeiten.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2020, 10:03
Beitrag #6
RE: Schrittmotor Geschwindigkeit steuern!!!!
Habs verstanden, aber gibt es nun irgendeine Möglichkeit die Geschwindigkeit eines Steppers in meinem Program zu regeln oder bin ich da total auf dem Holzweg????
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2020, 13:54 (Dieser Beitrag wurde zuletzt bearbeitet: 20.12.2020 13:54 von MicroBahner.)
Beitrag #7
RE: Schrittmotor Geschwindigkeit steuern!!!!
Also so wie die ISR jetzt ist kann sie nicht bleiben - das haben wir ja schon erklärt.
Ob das Prinzip überhaupt funktioniert, kann man anhand des Fragements nicht sagen, dazu bräuchte man einen kompletten Sketch aus dem auch die Definition der Variablen, und die Initiierung des Timers hervorgeht. So ist das nur raten, was Du da treibst.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 21:44
Beitrag #8
RE: Schrittmotor Geschwindigkeit steuern!!!!
Der Programmcode vom ersten Beitrag ist falsch. Die Programmlogic stimmt nicht.

Ein Beispiel:

Code:
if (SS == 0) {
          cli(); // disable interrupts
          Serial.print("SS0");
          TIMSK0 |= (0 << OCIE0A); // enable timer compare interrupt
        } else if (SS == 4) {

          OCR0A = delayx[SS]; // set compare match register
          TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt
        } else if (SS == 4) {
          sei();
        }


Nach einem "if (SS == 4)" wird im Else-Zweig danch die nächste IF-Abfrage auf SS== 4 nicht mehr ausgeführt.

vielleicht etwas deutlicher und besser zu verstehen, dass so etwas nicht funktioniert:
Code:
if(a==1){
  tue was für a==1
}else if(a==1){
  tue noch was für a==1: is nich, weil vorher schon ein Block für die Bedingung "a==1" ausgeführt wurde
}

wenn, gehört das so:

Code:
if(a==1){
  tue was für a==1;
  tue noch was für a==1;
}else if(a==2){
  tue was für a==2;
  tue noch was für a==2;
}

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 722 21.02.2021 15:22
Letzter Beitrag: gutschy
  Arduino mit Schrittmotor und Lichtschranken hanebambel 33 1.896 28.01.2021 21:42
Letzter Beitrag: MicroBahner
  Labornetzteil mit Arduino steuern Dieter_T 30 3.109 04.09.2020 20:30
Letzter Beitrag: Dieter_T
  Beschattung fuer Glasdach steuern Ecki 4 880 31.08.2020 17:32
Letzter Beitrag: hotsystems
  Neo-Pixel über Mail-Inhalte steuern weserjunge 7 1.093 21.07.2020 19:24
Letzter Beitrag: Tommy56
  Geschwindigkeit messen mit Arduino Uno nimmzwei 20 2.615 30.06.2020 23:19
Letzter Beitrag: nbk83
  Accelstepper libary und Schrittmotor Lothileinchen 11 3.185 22.01.2020 21:30
Letzter Beitrag: Lothileinchen
  Webserver soll 2 Servos (Schwenk-Neiger) steuern - Winkelauswahl aus Radiobutton kiximek 19 2.939 06.01.2020 23:13
Letzter Beitrag: kiximek
  wie kann ich ausgangspins aus einem array steuern? uwe.z 4 1.357 04.11.2019 21:46
Letzter Beitrag: Holzauge
Photo Technisat Receiver mit Arduino steuern Beans 0 966 29.09.2019 15:39
Letzter Beitrag: Beans

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste