PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Möglichkeiten der AVR/Arduino PWM?



ichbinsisyphos
21.02.2013, 22:41
Ich überlege im Moment eine Art Quadcopter zu bauen, dazu brauch ich vier separate Motorenregelungen. Am einfachsten wärs natürlich, wenn ich gleich die im Arduino eingebaute PWM verwenden könnte. Ich hab mich etwas mit den Spezifikationen dieser brushless Motoren und -regler beschäftigt. Die Grundfrequenz die diese Regler brauchen liegt im Bereich von 50Hz (genau glaub ich 22.5ms Periode). Die PWM-Grundfrequenz am Arduino ist da standardmäßig weit daneben, aber die kann ich offenbar verändern, indem ein paar Register überschreibe.

Ein großes Problem bleibt aber: der gesamte Drehzahlbereich wird anscheinend angewählt mit einer HIGH-Dauer von ungefähr zwischen 1-1.5 in die eine, bzw 1.5-2ms in die andere Richtung. Ich bräuchte eine Möglichkeit, die 8bit-Zahl die ich der analogWrite()-Funktion übergebe auf einen anderen Zeitbereich zu mappen, sonst bleiben da nur eine handvoll Abstufungen übrig, womit ich das Ding kaum gerade halten kann ;)

Geht das? Kann ich irgendwie einstellen, dass "0" eine Dauer des positiven Pulses von ungefähr 1.5ms und "255" von 2ms in einer 22.5ms-Periode entspricht?

Che Guevara
21.02.2013, 22:58
Hi,

50Hz sind für Kopter im allgemeinen eher ungeeignet! Alle Projekte, die ich kenne, betreiben ihre Regler mit 500Hz (genauer: 490Hz). Es gibt darüber auch viele Infos im Netz, welche Modellbauregler diese Frequenz verarbeiten können ;)
Dann solltest du evtl. auf 16Bit PWM umsatteln, bei 8Bit hast du sonst dein o.g. Problem. Eine Art Map-Funktion für die PWM gibt es nicht (zumindest nicht in Hardware)!

Gruß
Chris

ichbinsisyphos
21.02.2013, 23:41
Hi,

50Hz sind für Kopter im allgemeinen eher ungeeignet! Alle Projekte, die ich kenne, betreiben ihre Regler mit 500Hz (genauer: 490Hz).
Das glaub ich gar nicht. Ich meinte nur, dass die Regler die mir untergekommen sind mit der Frequenz arbeiten. Ich hab aber in der letzten Stunde auch welche mit 8kHz gefunden. Ich bin mir nicht sicher, aber ich denke dass sie sich bei manchen Reglern auch auf den gewünschten Wert einstellen lässt, die sind ja alle irgendwie programmierbar.

490Hz wären perfekt, das ist ja die Arduino-Standardfrequenz, aber ich hab bisher keine Regler gefunden, die eine solche Frequenz angeben.



Dann solltest du evtl. auf 16Bit PWM umsatteln, bei 8Bit hast du sonst dein o.g. Problem. Eine Art Map-Funktion für die PWM gibt es nicht (zumindest nicht in Hardware)!

Gruß
Chris16-bit PWM gibts auch? Ist das einigermaßen bequem gelöst? Werd ich mir gleich mal ansehen.

Che Guevara
21.02.2013, 23:52
Hi,

ich hab selbst schon mehrere Kopter von Grund auf selbstgebaut! Die Hersteller der Regler geben meistens 50Hz an, das ist aber bei weitem nicht die größtmögliche Frequenz.
Hier ist unter anderem eine Liste von kompatiblen Reglern: http://fpv-community.de/showthread.php?4532-%DCbersicht-Regler-f%FCr-MultiWiiCopter
Die 8kHz beziehen sich glaub ich eher auf die Frequenz des Reglers intern ;)
Ja, 16Bit-PWM ist bei den meisten (oder allen??) AVRs hardwaremässig dabei. Die Frage ist nur, ob dein AVR eine genügend große Anzahl an solchen Kanälen bereitstellt. Zur Not ginge aber auch Soft-PWM, wird teilweise bei Multiiwii verwendet.

Gruß
Chris

ichbinsisyphos
22.02.2013, 01:23
Ok, der ATMega hat mehrere 16bit timer. Damit wirds was. Ob es diese Funktionalität auch bei einem Arduino-Modell gibt, find ich morgen raus, wenn die Homepage wieder erreichbar ist. Was ich so lese, gibts da meist nur 2 16bit-PWM pins.

Danke für die Hilfe.

m.a.r.v.i.n
22.02.2013, 10:50
Hallo,


Das klingt doch für mich als ob diese Regler wie normale Servos angesteuert werden. Für Arduino gibt es dafür die Servo Library, die genau das tut, was du benötigst. Eine Pulsdauer von 1-2ms bei 50Hz, bzw. zwischen 0..180Grad. 90Grad entspricht 1.5ms. Einige Beispiele sind in der Arduino IDE bereits enthalten.

ichbinsisyphos
23.02.2013, 00:16
Das klingt doch für mich als ob diese Regler wie normale Servos angesteuert werden.Ja, davon geh ich aus. Im klassischen Modelbau werden die direkt an den Empfänger angeschlossen und drehen rauf, wenn der Hebel an der Fernsteuerung nach vorne geht.

edit: 180 verschiedene Werte? Nicht gerade üppig, aber könnt gehen.

wkrug
23.02.2013, 08:21
180 verschiedene Werte? Nicht gerade üppig, aber könnt gehen
Es war die Rede von 0 bis 180°.
Bei einem 8MHz Quarz sind für die Werte von 1ms bis 2ms immerhin 1000Werte möglich.
Das bei einem 16Bit Timer und einem Prescaler von 8.
Mit dem Comparematch Interrupt und ein wenig Software ist die Ansteuerung von bis zu 8 Servos möglich.
Nutzt man zusätzlich noch den Comparematch B sind es bis zu 16 Kanäle mit einem 16 Bit Timer.

ichbinsisyphos
23.02.2013, 08:30
Die Arduino Servo Lib nimmt ints von 0 bis 180, also genau Gradschritte. Ich würd mir lieber sparen, zuviel selbst herumzuschreiben, Mikrocontrollerprogrammierung ist Chinesisch für mich.

Verdammt, mir fällt jetzt erst auf, dass das wieder nur 90 Werte pro Richtung sind ... muss ich wohl doch selbst ran.

edit: aso, nein, da gibts ja mehr als eine Funktion ;)
http://arduino.cc/en/Reference/ServoWriteMicroseconds

Untere und obere Grenzen für die Pulslänge kann man auch einstellen, damit man keine Genauigkeit verschwendet. Nur die Frequenz ist scheinbar unveränderlich.

Picojetflyer
23.02.2013, 08:54
edit: 180 verschiedene Werte? Nicht gerade üppig, aber könnt gehen.

Mit 8Bit Hardware PWM bekommt man bei Ca 490Hz nur Ca 120 Schritte. mehr geht nicht. aber das fliegt auch sehr gut. Sollte arduino mehr Auflösung schaffen muss mir das mal einer erklären. Edit: bei 16MHz
Gruß
Matthias

ichbinsisyphos
23.02.2013, 09:03
Die Frequenz der Servo Lib ist diese standardmäßigen ~50Hz. Mit der oben verlinken Funktion hat man damit Mikrosekunden-Auflösung und 1000 Einzelschritte (beide Richtungen gezählt).

Wie das in dieser Bibliothek gelöst ist, weiß ich nicht.