mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Poti mit Schrittmotor


Autor: Xob Teab (milirp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich habe ein Problem mit dem Potentiometer u. dem Schrittmotor:



Stepper per(SPMU, 2,3,4,5);



void setup()

{

  pinMode (2, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (4, OUTPUT);

  pinMode (3, OUTPUT);
  potiwert = analogRead (Analogpin);





}



void loop() {
  potiwert = analogRead (Analogpin);



 if (potiwert < 342){
     per.setSpeed(400);
 per.step(100);

 }
 if (potiwert > 684){
    per.setSpeed(400);

  per.step(-100);

 }
 else
 per.step(0);
}


Mit diesem Code ändere ich die Drehrichtung des Schrittmotors u. in wenn 
ich das Poti mittig ausrichte ist der Motor aus.
Mein Plan war, dass ich so die Richtung festlege in die sich der Motor 
drehen soll, wenn ein bestimmter Zustand beim Poti erreicht wird. Aber 
dann noch die Geschwindigkeit, je weiter ich das Poti in die Richtung 
drehe, sich erhöht oder mindert.
Je nachdem.
Sozusagen wenn ich das Poti genau mittig einricht, soll nichts 
geschehen.
Wenn ich es in die eine Richtung drehe soll die Geschwindigkeit 
proportional bis zu einem Wert von 400 bei per.setSpeed haben.
Und genau dasselbe in die andere Richtung.

Ich wäre sehr dankbar für Hilfe oder Tipps.

Mili.

Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habt gedult M. schrieb:
> else
>  per.step(0);

Das else gilt nur für die 2. Abfrage. D.h. wenn der Wert < 342 ist, wird 
zwar per.step (100) ausgeführt, aber sofort danach per.step(0).

Georg

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So simpel, wie es Dein Programm erledigen soll, geht es nicht.

Es sieht auf den ersten Blick für Dich übertrieben aus, aber hier kannst 
Du sehen, wie man einen Schrittmotor per Poti steuern kann. Weiter unten 
sind auch Beispiele für Arduino (.ino-Dateien): 
http://mino-elektronik.de/Generator/takte_impulse.htm#bsp3

Vielleicht gelingt es Dir die Beispiele zu verstehen. Selbst wenn nicht, 
wären sie ein erster funktionsfähiger Ansatz.

Autor: Joe F. (easylife)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
if (potiwert < 400) 
{
  speed = 400-potiwert;
  step = 100;
} 
else if (potiwert > 623) 
{
  speed = potiwert-623;
  step = -100;
}
else
{
  speed = 0;
  step = 0;
}

if (speed < 0) speed = 0;
if (speed > 400) speed = 400;

per.setSpeed(speed);
per.step(step);

: Bearbeitet durch User
Autor: EGS (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

sehe ich das richtig, das er die Werte vom Analogeingang direkt 
verarbeiten will? Da hat er zwar schön 0-1023 als Wertebereich aber 
neuen Skalierung.

Ich würde den Wert skalieren:

RawPotiVal=AnalogRead(AnalogPin)

PotiVal=map(RawPotiVal, 0, 1023, -400, 400)

So kann auch ganz gut mit den Werten erkennbar weitergearbeitet werden. 
Und alles was dann zwischen -10 und 10 liegt ist aus.

Auch würde ich die Abfrage des ADC nicht so oft machen, lieber alles 
200-500 ms, so schnell ändert sich das Poti meistens nicht. Und den 
Potiwert nur bei Wertänderungen größer Wert x  am Analogpin neu 
schreiben...

Gruß EGS

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habt gedult M. schrieb:
> Ich wäre sehr dankbar für Hilfe oder Tipps.

Wenn du den Quellcode sauber formatierst, ist die Programmstruktur 
wesentliche einfacher zu erfassen.

Habt gedult M. schrieb:
> if (potiwert < 342){
>      per.setSpeed(400);
>  per.step(100);
>
>  }
>  if (potiwert > 684){
>     per.setSpeed(400);
>
>   per.step(-100);
>
>  }
>  else
>  per.step(0);
> }

Bei der Formatierung blickt doch keiner durch.

Guck mal, ob deine Entwicklungsumgebung über ein Werkzeug für 
automatische Formatierung verfügt?
Das ist allemal besser als diese völlig widersprüchlische Mischung aus 
Einrückungen und geschweiften Klammern.

Autor: Xob Teab (milirp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal.
Ich habe den Sketch umgeschrieben und im Seriellen Monitor wird mir 
erfolgreich je nach Position eine Skala von 400 bis -400 angezeigt.
Doch als ich in set.Speed den Potiwert vorgab blieb der Motor still und 
es wurde auch nichts mehr im Seriellen Monitor angezeigt.
Hier mal der Sketch :


....
void loop() {
int RawPoti=analogRead(Analogpin);

potiwert=map(RawPoti, 0, 1023, -400, 400);
Serial.println (potiwert);
 if (potiwert < - 50){
     per.setSpeed(potiwert);
 per.step(100);

 }
 if (potiwert >= 50){
    per.setSpeed(potiwert);

  per.step(-100);

 }
 else
 per.step(0);
}


Vg. MILI

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiere doch einfach mal den (funktionierenden) Code aus, den man dir 
schon geliefert hat. Das geht ja mit copy&paste recht schnell.
Beitrag "Re: Poti mit Schrittmotor"

Dann übst du Source-Code formatieren.

Und dann versuchst du mal zu verstehen was Georg gesagt hat:
Georg schrieb:
> Das else gilt nur für die 2. Abfrage.

Und wenn dann noch Zeit ist, guckst du mal nach, ob man per.setSpeed() 
negative Werte übergeben sollte.

: Bearbeitet durch User
Autor: Xob Teab (milirp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das letztere habe ich auch gerade gemerkt aber ja ich werde mal 
schauen.
Trotzdem vielen Dank

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, der Code ist nicht gut, da step(100) nach setSpeed(1) eine Minute 
blockiert.
Bei langsamen Drehzahlen dürfen also auch nur wenige Schritte gemacht 
werden, damit die Schleife nicht zu lange hängen bleibt.

Es muss also so aussehen:
if (potiwert < 400) 
{
  speed = 400-potiwert;
  per.setSpeed(speed);
  per.step(speed);
} 
else if (potiwert > 623) 
{
  speed = potiwert-623;
  per.setSpeed(speed);
  per.step(-speed);
}

Im Fall der Mittenstellung muss eigentlich nichts gemacht werden, denn 
so lange kein per.step() Aufruf erfolgt, steht der Motor.

: Bearbeitet durch User
Autor: Xob Teab (milirp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Giebt es auch eine andere Möglichkeit das per.step() zu umgehen weil da 
das Programm auf nicht reagieren und so ist set.speed() immer 
zeiverzögert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.