PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM mit Atmega uC



KrosseKrabbe
11.10.2011, 10:04
Habe einen Artikel auf mikrocontroller.net gefunden indem Anfängern ein paar Beispiele gezeigt werden. Ich brauche die PWM siehe Link ganz unten:
http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte

N (http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte)un zur Frage. Wenn ich das richtig verstanden habe wird an PC0 ein Analoger Wert eingelesen (durch Poti einstellbar). mit diesem analogen wert wird dann im programm gerechnet. Der Wert durch 4 geteilt und dann für die PWM genutzt um eine LED zum Leuchten zu bringen.

Ich möchte nun keine LED zum leuchten bringen sondern einen Servo Motor anschliessen. Hierfür benötige ich ja ein Rechtecksignal mit einer Frequenz von 50Hz sowie einer Pulsbreite von 1ms (linksanschlag) bis 2ms (rechtsanschlag). Wie genau bekomme ich das hin das wenn der Poti bei 0 Ohm steht der Motor am linksanschlag ist und bei 1000 Ohm am rechtsanschlag oder umgekehrt. Mit dem Programm was dort vorgegeben ist habe ich ja nicht unbedingt exakt die Werte die ich haben möchte. Es soll ja auch funktional sein also nach Möglichkeit wirklich Anschlag Poti = Anschlag Motor und nicht nen Bereich mittendrin.

Ich hoffe ihr versteht mein Anliegen :), wenn ihr jetzt für den Fall noch bedenkt das ich ein Vollidiot und gnadenloser Anfänger mit dem Zeug bin und dementsprechend die Antworten formuliert bin ich euch wirklich SEHR dankbar.

Danke

Ceos
11.10.2011, 12:01
du musst nur ein wenig rechnen, du brauchst eine andere pulsfrequenz und ein anderen tastverhältnis, bei der LED geht das tastverhältnis von 0 zu 100% bei einer Frequenz im kHz-Bereich damit es nicht flimmert, der Servo braucht 50Hz, also Pulsabstand 20mS ... die Pulsbreite liegt zwischen 2ms und 1ms jetzt kannst du dir das Tastverhältnis ausrechnen bzw. iss ja recht simpel 5-10% das wird bei der Auflösung der Timer aber sehr ungenau, besser du machst 500Hz und Tastverhältnis 50-100% ABER du darfst nur jeden 10ten Impuls an den Servo schicken!

Richard
11.10.2011, 12:04
Habe einen Artikel auf mikrocontroller.net gefunden indem Anfängern ein paar Beispiele gezeigt werden. Ich brauche die PWM siehe Link ganz unten:
http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte

(http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte)hierfür benötige ich ja ein Rechtecksignal mit einer Frequenz von 50Hz sowie einer Pulsbreite von 1ms (linksanschlag) bis 2ms (rechtsanschlag).


Du brauchst keine PWM (Pulsweiten Modulation) sondern PPM (Puls Pausen Modulation) und das ist ein klein wenig anders. Gelöst wird das meistens mittels Timer realisiert. Auf das jeweilige Servo müssen die Pulszeiten empirisch ermittelt werden, da jeder Servo etwas anders reagiert, diese 1...2 ms sind nur Richtwerte. Mit PWM Regelt man normale Gleichstrom Motore oder halt Lampen. Im RN Wissen Bereich sind beides PWM PPM mit Beispielen beschrieben. :-)

Gruß Richard

Che Guevara
11.10.2011, 12:09
Hallo,

es wäre sehr hilfreich, wenn du uns sagst, mit welcher Sprache du programmierst und wie deine Hardware aussieht?! Hast du einen Quarz, wenn ja, welche Frequenz? Wo ist der Servo angeschlossen? usw...
Dann solltest du ersteinmal ein Programm schreiben, welches den Servo von einen Anschlag zum anderen fahren lässt, damit du weißt, welche Minimal/Maximal Werte du hast. Dann ist das ganze ganz einfach ;)
Hier die Formel:
servopos=servomin+(servomax-servomin)*poti/1024 (Zitat von Radbruch!)

Gruß
Chris

Ceos
11.10.2011, 12:14
Du brauchst keine PWM (Pulsweiten Modulation) sondern PPM (Puls Pausen Modulation) und das ist ein klein wenig anders. Gelöst wird das meistens mittels Timer realisiert. Auf das jeweilige Servo müssen die Pulszeiten empirisch ermittelt werden, da jeder Servo etwas anders reagiert, diese 1...2 ms sind nur Richtwerte. Mit PWM Regelt man normale Gleichstrom Motore oder halt Lampen. Im RN Wissen Bereich sind beides PWM PPM mit Beispielen beschrieben. :-)

Gruß Richard Aber mit PWM geht das genauso ... nur die Wiederholrate bleibt fix!

oberallgeier
11.10.2011, 12:52
Du brauchst keine PWM ... sondern PPM ... und das ist ein klein wenig anders ...
Aber mit PWM geht das genauso ... nur die Wiederholrate bleibt fix!Auf die Gefahr hin dass ich als Klugsch...er dastehe. Ich möchte nicht, dass der Kollege KK als Anfänger, der Servos steuern möchte, ungenau oder falsch informiert wird.

Servos werden durch PWM angesteuert. (http://www.rn-wissen.de/index.php/Servo) Die RC-Fuzzies übertragen ihre Informationen zwischen Steuerung und Empfänger in PPM, ABER daraus macht dann der RC-Empfänger für den Servo ne PWM. Korrekt wird ein Servo mit PWM angesteuert - obwohl es meist auch mit konstanten Pausen zwischen den Pulsen sosolala funktioniert.

Kurz. PWM hat variable Pulse und variable Pausen bei konstanter Periodenlänge. (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung) Die Information liegt genaugenommen im Puls. PPM hat konstante Pulse (http://de.wikipedia.org/wiki/Puls-Pausen-Modulation) und variable Pausen, also eine variable Periodenlänge, die Information liegt in der Pause.

KrosseKrabbe
11.10.2011, 13:07
Danke für die Antworten.

Da gefragt wurde mit welcher SPrache ich programmiere und wie die Hardware aussieht.

Programmiersprache: C (Benutze als Programm AVR Studio)
Hardware: STK500 mit einem Atmega48-20PU dort hatte ich dann vor einfach die Ports über ein Flachbandkabel auf die Platine zu bringen und dann an PD6 die Signalleitung vom Servo anklemmen. Was mir auch eingefallen ist. Es ist nicht notwendig das ich den Motor über den Poti regeln kann. Noch lieber wäre mir eine Möglichkeit das PWM Signal direkt am PC Live zu ändern das macht das ganze eventuell etwas einfacher da ich nicht auf die Werte vom Poti angewiesen bin.

Brauche ich dafür Software? Was für ein Signal muss ich am Ausgang ausgeben wenn ich 2ms Pulsbreite Bei periodendauer von 20ms haben will.

(Ich habe den Schaltplan mal drangehangen damit nicht jeder auf den Link muss)
Danke :)

radbruch
11.10.2011, 13:32
Hallo

Unter den vielen möglichen Ansteuerarten für Servos drängt sich dies nahezu auf: Impulserzeugung mit dem ADC-Interrupt.

Dazu wird der ADC im Freerunnig-Modus gestartet, dessen Prescaler bildet zusammen mit dem Systemtakt die kleinste Zeiteinheit für die Servoimpulsbildung. In der ADC-ISR werden klassisch (wie im RN-Wiki (http://www.rn-wissen.de/index.php/Servos#Ansteuerung:_Signalform_und_Schaltung) beschrieben) die Aufrufe der ISR gezählt und die Impulse ausgegeben.

Wirklich trickreich wird es jedoch, wenn man das an einem analogen Pin macht, denn dann kann man in der Impulspause am selben Pin eine Spannung messen und so ein Poti oder einen Taster auswerten. So funktioniert übrigends auch der Servo-Sensor:
https://www.roboternetz.de/community/threads/33909-Minimallösung-Servo-Sensor

Oder mein Tiny-CD-Racer. Hier werden die Servos zusammen mit Fotodioden am selben Pin betrieben:
http://www.youtube.com/watch?v=XTYzLqgKMLM
https://www.roboternetz.de/community/threads/38220-Servo-Drehweite?p=364346&viewfull=1#post364346

Gruß

mic

KrosseKrabbe
11.10.2011, 13:43
Hallo

Unter den vielen möglichen Ansteuerarten für Servos drängt sich dies nahezu auf: Impulserzeugung mit dem ADC-Interrupt.

Dazu wird der ADC im Freerunnig-Modus gestartet, dessen Prescaler bildet zusammen mit dem Systemtakt die kleinste Zeiteinheit für die Servoimpulsbildung. In der ADC-ISR werden klassisch (wie im RN-Wiki (http://www.rn-wissen.de/index.php/Servos#Ansteuerung:_Signalform_und_Schaltung) beschrieben) die Aufrufe der ISR gezählt und die Impulse ausgegeben.

Wirklich trickreich wird es jedoch, wenn man das an einem analogen Pin macht, denn dann kann man in der Impulspause am selben Pin eine Spannung messen und so ein Poti oder einen Taster auswerten. So funktioniert übrigends auch der Servo-Sensor:
https://www.roboternetz.de/community/threads/33909-Minimallösung-Servo-Sensor

Oder mein Tiny-CD-Racer. Hier werden die Servos zusammen mit Fotodioden am selben Pin betrieben:
http://www.youtube.com/watch?v=XTYzLqgKMLM
https://www.roboternetz.de/community/threads/38220-Servo-Drehweite?p=364346&viewfull=1#post364346

Gruß

mic

Ich bin zu blöd um soetwas zu verstehen :-). Wiegesagt Absoluter Anfänger.

Richard
11.10.2011, 13:43
Auf die Gefahr hin dass ich als Klugsch...er dastehe. Ich möchte nicht, dass der Kollege KK als Anfänger, der Servos steuern möchte, ungenau oder falsch informiert wird.

Servos werden durch PWM angesteuert. (http://www.rn-wissen.de/index.php/Servo) Die RC-Fuzzies übertragen ihre Informationen zwischen Steuerung und Empfänger in PPM, ABER daraus macht dann der RC-Empfänger für den Servo ne PWM. Korrekt wird ein Servo mit PWM angesteuert - obwohl es meist auch mit konstanten Pausen zwischen den Pulsen sosolala funktioniert.

Kurz. PWM hat variable Pulse und variable Pausen bei konstanter Periodenlänge. (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung) Die Information liegt genaugenommen im Puls. PPM hat konstante Pulse (http://de.wikipedia.org/wiki/Puls-Pausen-Modulation) und variable Pausen, also eine variable Periodenlänge, die Information liegt in der Pause.

Danke für die Richtigstellung. :-)

Gruß Richard

oberallgeier
11.10.2011, 13:57
... lieber wäre mir eine Möglichkeit das PWM Signal direkt am PC Live zu ändern das macht das ganze eventuell etwas einfacher da ich nicht auf die Werte vom Poti angewiesen bin ...Und am PC? Ein Poti am PC?

Der Empfang von Daten vom PC und das Umsetzen dieser Daten zu entsprechenden Ansteuerwerten im Controller ist nicht so simpel. Auch nicht schwer, aber vermutlich erstmal deutlich aufwendiger als Poti auslesen und den Wert im Controller weiter verrechnen.

KrosseKrabbe
11.10.2011, 14:51
Und am PC? Ein Poti am PC?

Der Empfang von Daten vom PC und das Umsetzen dieser Daten zu entsprechenden Ansteuerwerten im Controller ist nicht so simpel. Auch nicht schwer, aber vermutlich erstmal deutlich aufwendiger als Poti auslesen und den Wert im Controller weiter verrechnen.

Damit meine ich einfach das ich den Wert im programm einfach live änder. Der uC ist ja aufm STK500 verbaut da geht ja soweit ich weiß sowas.

Richard
11.10.2011, 15:03
Damit meine ich einfach das ich den Wert im programm einfach live änder. Der uC ist ja aufm STK500 verbaut da geht ja soweit ich weiß sowas.

Im Prizip brauchst Du nur die entsprechenden PWM Werte für rechts,links, mitte per z.B. Hyperterm oder ähnlich zum µC senden und in das PWM Register schreiben.
Es gibt auch PC Programme mit denen eine Fernsteuerung simuliert werden kann oder man greift auf z.B. so etwas zurück http://www.shop.robotikhardware.de/shop/catalog/index.php?cPath=87&osCsid=cc19cb8d2f9acfe966a9ce059e8c6063




'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
$regfile = "2313def.dat"

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
'as an option you can use TIMER1
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1


'we use 2 servos with 10 uS resolution(steps)

'we must configure the port pins used to act as output
Config Portb = Output

'finally we must turn on the global interrupt
Enable Interrupts

'the servo() array is created automatic. You can used it to set the
'time the servo must be on
Servo(1) = 10 '10 times 10 = 100 uS on
'Servo(2) = 20 '20 times 10 = 200 uS on
Do
Loop

Dim I As Byte
Do
For I = 0 To 100
Servo(1) = I
Waitms 1000
Next

For I = 100 To 0 Step -1
' Servo(1) = I
Waitms 1000
Next
Loop
End


Gruß Richard