PWM und Potentiometer

Hallo :slight_smile:

Ich bin dabei einen Motor über PWM zu steuern und dieses klappt auch soweit.
Leider hänge ich ein wenig bei dem Versuch, den Motor in verschiedene Stellungen zu bewegen mittels eines Poti.
Also der Poti dreht sich mit dem Motor mit und soll bei bestimmten Werten stehen bleiben.
So möchte ich verschiedene Positionen abdecken können.
Hoffe ich habe es verständlich beschrieben.

Variablen und Pin ist schon deklariert, ich weiß nur nicht wie ich den Wert in die For Schleife mit einbinde.
Habe schon viel gesucht aber irgendwie keinen entscheidenden Hinweis gefunden.

Ihr habt doch bestimmt wieder einen Tipp für mich :slight_smile:

for (int i=150; i<150; i++)
   {
    analogWrite(MOTORplus, i);
}

Danke im Voraus und Gruß

Warum nimmst du nicht statt des Motors einen Servo?
Damit hast du die Funktion, die du benötigst.

Ist das an Getriebemotor? Ohne entsprechende Untersetzung wirst du da kein Glück haben. Je nach Motormodell hat ein Motor ein paar Vorzugsstellungen. Ein Gleichstrommotor mit dreigeteiltem Anker hat 6 Vorzugsstellungen, auf denen er "einrastet". Je nach Technologie sind das unterschiedlich viele Stellungen. Erst mit entsprechender Untersetzung multipliziert sich diese Zahl mit der Anzahl der Vorzugsstellungen.

Es handelt sich um einen 12V Motor mit einem Getriebe vorweg. Dieser unterstützt auch PWM und das funktioniert auch einwandfrei.
Nun dreht die Welle vom Motor eben einen Poti mit und soll bei bestimmten Werten stehen bleiben, oder eben weiterdrehen.
Das mit dem Servo ist eine gute Idee, aber für das Projekt nicht zu gebrauchen leider :wink:

Grüße

Habe noch ein wenig geschaut und vielleicht etwas gefunden.

Könnte das so funktionieren?

   for (int i=150; i<200; i++)
   {
    analogWrite(MOTORplus, i);
    delay(20);

      if(potiwert == 60)
      {
        void stop();
       }
    }

void stop()
{
  analogWrite(MOTORplus, 0);
}

Wird hier der Wert vom Poti auch als Bedingung gesehen wenn der Arduino neu gestartet wird?
Aber wahrscheinlich muss ich ihm auch noch die Bedingung über und unter 60 geben, so dass der Motor immer wieder auf 60 zurückfährt wenn sich der Pott im ausgeschalteten Zustand verstellt hat!? Sehe ich das richtig?

Danke und Gruß

for ist keine gute Idee, loop() ist schon eine Schleife, die Du nutzen kannst.

PanTau78:
Aber wahrscheinlich muss ich ihm auch noch die Bedingung über und unter 60 geben, so dass der Motor immer wieder auf 60 zurückfährt wenn sich der Pott im ausgeschalteten Zustand verstellt hat!? Sehe ich das richtig?

Siehst Du richtig :slight_smile:

agmue:
for ist keine gute Idee, loop() ist schon eine Schleife, die Du nutzen kannst.Siehst Du richtig :slight_smile:

Danke :wink:

Also könnte das z.B. für eine Stufe so ausschauen?

void stufe0 ()
{
  if (potiwert < 60)
  {
  analogWrite (MOTORplus, 150);           // Motor dreht sich nach rechts 
  }
    else if (potiwert == 60);
    {
    void stop();
    }

      if (potiwert > 60)
      {
      analogWrite (MOTORminus, 150);   // Motor dreht sich nach links
      }
        else if (potiwert == 60);
        {
        void stop();
        }
}

void stop()
{
analogWrite (MOTORplus, 0);
analogWrite (MOTORminus, 0);
}

Kürzer...

void stufe0 ()
{
  if (potiwert < 60)
  {
  analogWrite (MOTORplus, 150);           // Motor dreht sich nach rechts 
  }
    else if (potiwert > 60);
    {
    analogWrite (MOTORminus, 150);     //Motor dreht sich nach links
    }
      else if (potiwert == 60)
      {
        void stop();
      }
}

void stop()
{
analogWrite (MOTORplus, 0);
analogWrite (MOTORminus, 0);
}

Noch kürzer:

analogWrite (MOTORplus, (analogrRead(Poti)/konstante)- 60);

Die konstante mußt Du selbst finden.

Aber wahrscheinlich brauchst Du keine lineare Beziehung zwischen Fehlwinkel und Geschwindigkeit sondern einen gewissen Minimalwert damit der Motor sich dreht und eine kleine Hysterese damit der Motor nicht dauernd hin und her vibriert.

Grüße Uwe

uwefed:
Noch kürzer:

analogWrite (MOTORplus, (analogrRead(Poti)/konstante)- 60);

Die konstante mußt Du selbst finden.

Aber wahrscheinlich brauchst Du keine lineare Beziehung zwischen Fehlwinkel und Geschwindigkeit sondern einen gewissen Minimalwert damit der Motor sich dreht und eine kleine Hysterese damit der Motor nicht dauernd hin und her vibriert.

Grüße Uwe

Vielen Dank Uwe für deine Antwort.
Ich kann Dir leider nicht ganz folgen :frowning:
Du teilst den Potiwert durch eine Zahl oder wie ist das gemeint.
wie ist die -60 zu verstehen?

Gruß

Du hast 60 als Grenzwert geschrieben.

if (potiwert < 60)

Grüße Uwe

uwefed:
Du hast 60 als Grenzwert geschrieben.

if (potiwert < 60)

Grüße Uwe

Ok und wie ist das mit der Konstante gemeint?

Danke und Gruß

PanTau78:
Ok und wie ist das mit der Konstante gemeint?

Vergleiche mal die Wertebereiche von analogWrite() und analogRead(). Der Rest wird in der Schule als Dreisatz gelehrt. Alternativ zur Division ginge auch map().