Drehmomentabschaltung

Schönen Guten Tag, ich arbeite aktuell an meiner Drehmomentabschaltung weiter, bei der mir hier schon einmal im Forum geholfen wurde:
Forum
Hierbei wird eine Spannung über einen Widerstand in der Motorleitung abgegriffen und über einen Analog Eingang ausgewertet. Ohne Belastung liegt der Wert bei ca 0.35 und erhöht sich Motorbelastung. Bei 0.5 soll der Motor dann abgeschaltet werden. Mein Problem ist das ich es nicht hinbekomme denn Motor beim anlaufen, also während der for loop zu überprüfen und falls der Schwellwert zu hoch ist, abzuschalten. Das hier ist mein aktueller Stand bei dem sobald die Loop zu Ende ist über die nächste if Abfrage(das mit "drehmoment zu hoch" ) die Abschaltung bei zu hoher Belastung funktioniert. Aber leider nicht während der Loop. Versucht habe ich bisher vieles, aber anscheinend noch nicht alles. Und falls doch anscheinend falsch :smiley: . Ich hoffe ihr wisst was ich meine/ will und könnt mir helfen.

float Abschaltung = 0.5;

void setup()
{
Serial.begin(9600);
pinMode(6, OUTPUT); // Pin schaltet ein L298N Board mit DC Motor
pinMode(4, INPUT); // Enschalter, startet den Motor
}

void loop()
{
float Shuntwert = analogRead(A0);
float Spannung = Shuntwert * (5.0 / 1023.0);

if (digitalRead(4) == LOW){ // Taster wurde betätigt, Motor startet
    for (float x = 1; x < 255; x+=0.01) {
        analogWrite(6, x);
    if (Spannung > Abschaltung){
        digitalWrite(6, LOW);
        break;}
}
}

if (Spannung > Abschaltung){
    Serial.println("drehmoment zu hoch");
    digitalWrite(6, LOW); // Schaltet den Motor ab
}
}

analogWrite() " Erlaubte Datentypen: int."

    for (int x = 1; x < 255; x+=1) {
        analogWrite(6, x);
1 Like

Danke schonmal dafür. Also addiert der Arduino permanent die 0.01 bis .51 und rundet dann auf? Denn die float kann ich beliebig verändern was den Motor entweder schneller oder langsamer anlaufen lässt.
Dennoch schaffe ich es nicht das die if Abfrage in der for loop, die loop abbricht sobald ich Abschalung = 0.5 überschritten habe. Kann es sein das die loop die Berechnung für den Wert Spannung unterbricht und erst nachdem die loop fertig ist der Wert errechnet wird?

Dein Wert für die Variable Spannung wird vor der For-Schleife errechnet. Solange die For-Bedingung erfüllt ist (x < 255) wird nur der Code in der For-Schleife ausgeführt. Also bei dir 25.400 Durchläufe. Und dort gibst du der Variable Spannung keinen neuen Wert. Erst nach dem Durchlaufen der 25.400 gibst du oben im Loop der Variable einen neuen Wert.

Nein, int schneidet einfach die Kommastellen ab. Ist im Grunde wie abrunden.
Dein x beginnt bei 1 und zählt dann in 0,01 Schritten bis 1,99 was als int auch noch 1 ist. Beim nächsten Durchlauf wird x = 2,00 was als int dann 2 ist.

Du suchst nach

  • einer Schrittkette
  • einer Zeitverzögerung

Ungetesteter Vorschlag:

const float Abschaltung = 0.5;

void setup()
{
  Serial.begin(9600);
  pinMode(6, OUTPUT); // Pin schaltet ein L298N Board mit DC Motor
  pinMode(4, INPUT); // Enschalter, startet den Motor
}

void loop()
{
  uint32_t jetzt = millis();
  static uint32_t vorhin = jetzt;
  const uint32_t intervall = 100;
  static int pwmWert = 0;
  static byte schritt = 0;

  switch (schritt)
  {
    case 0:
      if (digitalRead(4) == LOW) { // Taster wurde betätigt, Motor startet
        schritt++;
      }
      break;
    case 1:
      int Shuntwert = analogRead(A0);
      float Spannung = Shuntwert * (5.0 / 1023.0);
      if (Spannung > Abschaltung) {
        Serial.println("drehmoment zu hoch");
        digitalWrite(6, LOW); // Schaltet den Motor ab
        schritt++;
      } else {
        if ( (pwmWert < 255) && (jetzt - vorhin >= intervall) )
        {
          vorhin = jetzt;
          pwmWert++;
          analogWrite(6, pwmWert);
        }
      }
      break;
    case 2:
      break;
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.