-
Hallo,
Ich habe beschlossen, dass ich PWM nun intensiever forschen werde...
Es gibt nämliche mehrere PWM-Betriebsarten....
Eventuell kann man auch das PWM signal erzeugen, welches mit einem RC-Sender übermittelt wird!
Wenn man einen RC-Empfänger betrachtet, dann kommen beispielsweise bei einem 8Kanal-Empfänger sämtliche Servo-stellungen in einem einzigen PWM signal.
Das sog. PPM-Signal ( http://www.mftech.de/ppm.htm
man würde nur einen PWM-Kanal benötigen...
Ob es nun tatsächlich geht weiss ich jetzt noch nicht genau.
Aber Antworten folgen.....
Gruß Kaiser
-
Irgentwie komme ich einfach nicht mir der Formel klar von Atmel:
Die schreiben dass die PWM Fraquent Folgende ist:
f(PWM) = F(CLK) / ( 2* N*TOP)
Mit N ist der prescaler
TOP ist die Obergranze
Mit f(CLK) = 8000000
N = 64
TOP= 1023
ergibt sich: f(PWM) = 61,09 Hz (= 16,35ms)
Wenn ich das Laufen lasse, dann messe ich im Oszi jedoch für f(PWM) = 8,33333333 Hz ( 120 ms )
WARUUUUUUUUMMMMM???????????????????????
-
Wo hast du denn die Formel gefunden? Wenn das ein Druckfehler war, gibts vielleicht auf der AVR-Freaks-Homepage schon ein korrigiertes Datenblatt. Die veroeffentlichen da immer so Errata...
Nils
-
Gefunden hab ich die Formel im ATMEGA8535 Datenblatt auf Seite 104
"The PWM frequency for the output when using phase correct PWM can be calculatet by the following equation":
Die PWM Fraquenz für den Ausgang bei "phase correct" PWM kann durch folgende Gleichung berechnet werden:
f(OCnxPCPWM) = f(clk_IO) / ( 2*N*TOP);
Im Datenblatt des ATMEGA128 steht aber das Selbe....
Vielleicht hab ich irgendwas übersehen... aber die Formel ist ja eindeutig.....
Mein Code stimmt normalerweise auch:
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1A0); // 10Bit PWM, invertiert
TCCR1B = (1<<CS11)|(1<<CS10); //Prescaler = 64
OCR1A = 500; // Testwert... spielt für Fraquenzmessung keine rolle
-
Hm. Das Datenblatt hab ich zwar nicht, weil ich diesen Chip nicht benutze, aber die Formel ist ja die gleiche, die ich mir oben zusammengereimt habe. Wird also stimmen ;-)
Wenn deine Bits korrekt gesetzt sind, fällt mir eigentlich bloß noch ein, daß die CPU-Frequenz falsch ist. Bist du sicher, daß du die Fuses auf 8MHz umprogrammiert hast? Wenn der AVR nämlich mit den voreingestellen 1MHz des internen Oszillators läuft, würde das erklären, warum du erstens etwa ein Achtel des erwarteten Wertes mißt und zweitens nicht GENAU ein Achtel mißt. Der interne Oszillator ist ja recht ungenau...
Nils
Mir faellt grad auf, das wuerde ja auch erklaeren, warum deine fruehere Einstellung mit den 100 us alle 2ms so halbwegs funktioniert hat. Das waeren dann naemlich in Wirklichkeit 0,8ms alle 16ms gewesen, was einem normalen Servosignal schon ziemlich nahe kommt... Ich taete mal die Fuses checken :-b
-
Servus Kaiser-F,
hab mich grad mal hingesetzt und mein Oszi abgestaubt.
Bei mir hat das PWM-Signal ungefähr den von dir errechneten Wert (16,35ms). Verwende einen AT90S2313, einen Fehler habe ich aber noch korregieren müssen, und zwar musste ich
TCCR1A = (1<<PWM11)|(1<<PWM10)|(1<<COM1A1);
anstatt von
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
verwenden. Du hast es ja genau andersrum... Liegt das am verwendeten Controller, oder an der Programmierumgebung- ich verwende WinAVR. Weis da jemand bescheid?
gruss Siggi
-
Das liegt am verwendeten Controller. Schaut doch mal eure inlcude Datei des jeweiligen Controllers an. In der iom32.h ist es WGM in der io8535.h PWM. Aber ihr müsst eigentlich nur mal reinschaun.
Gruß Muraad
-
Moin moin!
Nachdem ich jetzt mein neues PC-USB-Digi-Oszi-Teil hab *freu*, hab ich eure Methode, PWMs zu erzeugen, auch mal probiert. Mit ATmega8, da heissen die Bits ebenfalls WGM... Und siehe da:Es geht. Ich messe bei CPU=8MHz und Prescaler=64 eine Periode von 15,6ms, was recht nah an den rechnerischen 16,35 liegt. Und bei einem Vergleichswert von 64 komme ich rechnerisch und messtechnisch auf ungefaehr 1ms fuer die Pulsdauer (nicht invertierend).
Wieder was gelernt :-)
Kaiser-F, klappts bei dir inzwischen auch?
Nils
-
Hallo Nils,
Ich hab irgendwie noch mit kleineren Problemen zu kämpfen...
Würdest du mir den Gefallen tun, und mal deinen Versuch nochmal messen,
Aber mit invertierten PWM? Dann müsstest du deinen Vergleichswert von 64 auf "OBERGRENZE - 64" legen.... dann müsste rein theoretisch das selber Ergebnis rauskommen....
Das wär ne super Sache!
MfG,
Kaiser
-
Yups, gerade gemessen. Kommt genau das gleiche raus. Mit COM1A1 und COM1A0 gesetzt, und 1024-64=960 als Vergleichswert.
Hast du deine CPU-Frequenz gecheckt?
Nils
Code:
#include <avr\io.h>
int main(void) {
DDRB = 0xFF;
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1A0);
TCCR1B = (1<<CS11)|(1<<CS10);
OCR1A = 1024-64;
}