Arduino Forum

International => Deutsch => Topic started by: FTE11 on May 15, 2011, 11:21 am

Title: Eingangsfrequenz
Post by: FTE11 on May 15, 2011, 11:21 am
Hallo Forum,

ich bin neu auf dem Gebiet Microcontroller, habe jedoch eine abgeschlossene Berufsausbildung als Elektroniker für Automatisierungstechnik und bin Momentan auf einer Technikerschule um mich weiter zu bilden.

Ich bastle momentan ein wenig mit einem UNO Board und versuche seit gestern einen Drehgeber auszuwerten.

Zu den Fakten:

Drehgeber --> 500 Pulse/Umdrehung
Motor --> 1300 1/min

Problem:

Drehe ich den Drehgeber von Hand genau um 360° bekomme ich exakt 500 Pulse. Sobald ich meinen Motor anhänge verschluckt er sich.

Daraus ergeben sich auch die Fragen:

Wie hoch ist die mögliche Eingangsrequenz der Eingänge des Arduino Uno Boards?
Ich zähle die Impulse und gebe sie per Serial auf den Rechner weiter. (115200)
Ist nun die Frequenz am Eingang zu hoch oder verschluckt er sich erst bei der Übertragung.

Vielen Dank im voraus für eure Antworten .

Title: Re: Eingangsfrequenz
Post by: uwefed on May 15, 2011, 11:56 am
Hallo FTE11

Die serielle Schnittstelle bremst den Controller aus.
Ca 11kHz müßten kein Problem für den Arduino sein. Das Problem liegt in Deinem Code.
Poste mal den Kode.

Viele Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: FTE11 on May 15, 2011, 12:16 pm

Hey Uwe,

dass ist ja schon mal beruhigend!
Anbei mein Code.

Weist du auch gerade die maximale Obergrenze der Eingagsfrequenz?

Grüße

Code: [Select]

int pin1 = 2;
int pin2 = 3;
int counter;
boolean goingUp = false;
boolean goingDown = false;
void setup()
{
  counter = 0;
 
  Serial.begin(115200);

 
  pinMode(pin1, INPUT); // Pin 2
  pinMode(pin2, INPUT); // Pin 4


  attachInterrupt(0, decoder, FALLING);

}

void loop()
{
 
  while(goingUp==1)
  {
    goingUp=0;
    counter ++;
    Serial.println(counter);
  }

  while(goingDown==1)
  {
    goingDown=0; // clear the flag
    counter --;
    Serial.println(counter);
  }
}

void decoder()

{
  if (digitalRead(pin1) == digitalRead(pin2))
  {
    goingUp = 1;
  }
  else
  {
    goingDown = 1;
  }
}
Title: Re: Eingangsfrequenz
Post by: uwefed on May 15, 2011, 02:05 pm
Interruptfunktionen sollen so kurz wie möglich sein!!
Code: [Select]
void decoder()
{
 if (digitalRead(pin1) == digitalRead(pin2))
 {
   goingUp = 1;
 }
 else
 {
   goingDown = 1;
 }
}


Da die Interruptroutine nur bei der fallenden Flanke von pin1 angesprungen wird hat diese Kontrolle wenig Sinn
Ich nehme mal an, daß der Motor in beide Richtungen drehen kann.
anstatt:
Code: [Select]
if (digitalRead(pin1) == digitalRead(pin2))
genügt:
Code: [Select]
if (digitalRead(pin2))
Außerdem würde ich nicht 2 Variablen für die Drehrichtung verwenden sondern nur eine; zB: 1 rechtsdrehend, 0 linksdrehend
dann vereinfacht sich alles auf:

Code: [Select]
void decoder()
{
drehrchtung = digitalRead(pin2);
}


oder noch einfacher:
Code: [Select]
void decoder()
{
counter --;
counter += 2*digitalRead(pin2);
}


Mußt Du bei jedem Impuls den Zählerstand an den PC übertragen?
Wenn Ja, auf diese Weise könntest Du Übertragungen verlieren aber keine Impulse.  

Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: FTE11 on May 15, 2011, 07:17 pm
Hey Uwe,

habe es gerade ausprobiert.
Sieht gut aus.
Ich übergebe jetzt nur noch jeden 500sten Puls an den Rechner. Also pro Umdrehung einen. Dann komme ich relativ genau hin!

Meinst das klappt auch noch bei 3000 1/min?

Grüße
Title: Re: Eingangsfrequenz
Post by: uwefed on May 15, 2011, 07:58 pm

Meinst das klappt auch noch bei 3000 1/min?

Locker
Muß der Motor sich in beide Richtungen drehen?
Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: udoklein on May 16, 2011, 06:26 pm
Davon abgesehen gehört vor die Variablen die in der ISR gesetzt werden bei der Deklaration ein "volatile". Ansonsten kann es unerwartet passieren, daß der Compiler Zugriffe auf die Variablen wegoptimiert. Das führt dann in der Regel zu langen verwirrenden Fehlersuchen.
Title: Re: Eingangsfrequenz
Post by: FTE11 on May 16, 2011, 08:05 pm


Locker



Auch wenn ich noch weitere Eingänge auslesen und zum Beispiel einen Analogausgang (um den Moto selbst an zu steuern) verwende?
Ja er muss in beide RIchtigen drehen können.

@Udo, danke gut zu wissen!
Title: Re: Eingangsfrequenz
Post by: uwefed on May 16, 2011, 08:19 pm
Was für ein Motor ist das?
Ein Aynchron-Drehstrom-Käfig-Läufer?
Mit Frequenzumrichter?
Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: udoklein on May 16, 2011, 10:25 pm
@FTE11: gerne, ich habe den Fehler schon mal selber gemacht und 2 Wochen wie doof gesucht ...
Title: Re: Eingangsfrequenz
Post by: FTE11 on May 18, 2011, 05:33 pm

Was für ein Motor ist das?
Ein Aynchron-Drehstrom-Käfig-Läufer?
Mit Frequenzumrichter?
Grüße Uwe


Gleichstrommtor(1A 24V 30001/min) über eine H-Brücke angesteuert.

Grüße
Title: Re: Eingangsfrequenz
Post by: uwefed on May 18, 2011, 10:40 pm
H Brücke und PWM?
Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: FTE11 on May 21, 2011, 06:39 pm

H Brücke und PWM?
Grüße Uwe


genau.
Title: Re: Eingangsfrequenz
Post by: FTE11 on Jul 08, 2011, 07:29 pm
Leider muss ich diesen Thread noch mal benutzen.

Bedingungen sind die gleichen geblieben:



Gebe ich der Regelung einen possitiven Sollwert funktioniert alles einwand frei.
Gebe ich der Regelung einen negativen Sollwert (Motor dreht in die andere Richtung) rasst der Motor leider los ohne die Pulse auszuwerten.

Mein bisheriges vorgehen:

Umdrehen der Drehgebereingänge
Hat zur Folge dass das ganze nun gerade umgekeht funktioniert. Also mit nagativen Sollwert ist alles ok, mit possitiven rasst der Motor

Flanken mittels Osszi beobachtet
Die Pulse kommen beide sauber, auch bei hoher Drehzahl

Verminderung der Spannung
Fällt die Versorgungsspannung des DC-Motors unter 20V funktioniert es.

Nun woran kann es liegen, meine erste Vermutung, die Frequenz an den Eingängen, die wird jedoch mit dem Versuch des Umdrehen der Drehgebereingänge wiederlegt. Momentan stehe ich ein wenig auf dem Schlauch.

Anbei noch mal den Code zu Auswertung der Impulse vom Drehgeber:

Code: [Select]
void decoder()
{
  counter --;
  counter += 2*digitalRead(pin2);
}
Title: Re: Eingangsfrequenz
Post by: uwefed on Jul 08, 2011, 08:02 pm
Ich steh auch etwas daneben.

Bitte Schaltbild; Modell des Drehgebers, des Motortreibers (H Brücke) und des gesamten Sketches.

Grüße Uwe
Title: Re: Eingangsfrequenz
Post by: FTE11 on Jul 08, 2011, 08:54 pm
Hey Uwe,

Der Drehgeber:
http://www.ifm.com/ifmde/web/dsfs!RB6015.html (http://www.ifm.com/ifmde/web/dsfs!RB6015.html)

H Brücke und Elektrische Übersicht, siehe Anhang.

Grüße
Title: Re: Eingangsfrequenz
Post by: uwefed on Jul 08, 2011, 10:20 pm
Was mir einfällt ist:
Quote
void decoder()
{
  counter --;
  counter += 2*digitalRead(pin2);
}

Das ist die Interruptroutine durch eine Flanke an Phase 1 des Drehgebers aufgerufen wird. Es könnte sein daß die Anweisung "counter --;" zuviel Zeit in Anspruch nimmt und die 2. Phase bereits wieder Status geändert hat bevor Du deren Zusatand in "counter += 2*digitalRead(pin2);" ausliest.
Bei 20V läuft der Motor dann langsam genug, daß es nicht passiert.

Versuch mal die Sache umzukehren:
Quote
void decoder()
{
    counter += 2*digitalRead(pin2);
    counter --;
}


Grüß Uwe
Title: Re: Eingangsfrequenz
Post by: udoklein on Jul 09, 2011, 02:49 pm
Einen Integer runterzuzählen kostet maximal 2-3 Takte. Bei 16 Mhz sollte man davon so gut wie nichts merken. digitalRead hingegen ist laaaaannnnngggsssaaaaaammmm. Wenn das wirklich unter Verdacht steht würde ich vorschlagen die Ports direkt auszulesen. Im Playground steht wie: http://www.arduino.cc/en/Reference/PortManipulation (http://www.arduino.cc/en/Reference/PortManipulation).

Und nur zur Sicherheit: ist der counter jetzt "VOLATILE" deklariert oder fehlt das noch? Zeig uns doch bitte mal das komplette Programm.
Title: Re: Eingangsfrequenz
Post by: volvodani on Jul 17, 2011, 12:27 pm
Ich denke wenn man auszüge aus dem Sketch hier verwendet:
Und die Funktion read_encoder anpasst an die Pins die man verwendet und die Funktion über einen Interrupt ausführt könnte das alles um einiges schneller werden
http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino