Ich bin gerade am Herumspielen an Mikrocontrollern. Ich versuche gerade herauszufinden wie ich mit C die PWM-Funktion des Mikrocontrollers(AT90S8535 bei 8MHz) aktiviere. Ich hab mich gerade durch das Datenblatt gelesen und hab mal die Einstellungen gemacht(hoffentlich richtig). . . . OCR1AL=0x7F; OCR1AH=0x00; TCCR1A=0x82; TCCR1B=0x03; . . . Jetzt stellt sich mir aber die Frage wie ich die Pulsweitenmodulation jetzt starte. Leider stehe ich irgendwie auf der Leitung. Kann mir da bie jemand helfen einen Schritt zur Seite zu machen?
Guck dir mal den Compare-Mode an. Wenn du den Portpin nur ausschaltest, kann da nichts passieren. Rein von der initialisierung her, müsste was passieren. Übrigens unterstützen Kommentare die Lesbarkeit...
Hallo Fritz. Das habe ich für den ATtiny2313 geschrieben. Das kannst du für den 8535 anpassen: // PWM mit dem Tiny2313. PWM-Ausgang an OC1A(PB3) #include <iot2313v.h> #include <macros.h> void port_init(void) { PORTB = 0xFF; DDRB = 0xFF; } void timer1_init(void) { TCCR1B = 0x00; // stop Timer // TC1 arbeitet im PWM-Modus und zählt von 0 bis 2^N -1 und wieder zurück // N = 8..10 ( in diesem Beispiel 10Bit PWM ist N=10) // TC1 zählt also von 0 bis 1023 und zurück von 1023 bis 0. OCR1A=512; // 50% High 50% Low // das gilt für nichtinvert. PWM // OCR1A = 256; // 25% H 75% L // OCR1A = n (n=1...1023) ==> n/1024 *100% H und der Rest Low TCCR1A = (1 << WGM11) | (1 << WGM10) | (1 << COM1A1); // nicht inv. 10Bit PWM TCCR1B = (1<<CS11); // Counterfrequenz = Taktfrequenz = 4MHz // f(TC1) = 4MHz // f(PWM) = f(TC1) /((2^(N+1)-2) = 4MHz / (2^11 -2) = 1955 Hz // T(PWM) = 1/f(PWM) = 511,5us // bei OCR1A=512 ==> THigh(PWM) = 255,75ms und TLow(PWM) = 255,75ms // Tein = 255,75ms // Taus = 255,75ms // und mit Uein = 5V und Uaus = 0V ergibt sich ein Mittelwert von // Um = Uaus + (Uein - Uaus)*(Tein/Tpwm) = 0V + (5V - 0V)*255,75/511,5 // Um = 2,5V // Da Uaus = 0V ist, gilt die vereinfachte Formel: // Um = 5V * Tein/Tpwm // Um = 5V * n/1024 (n= 1...1023); n ist der Inhalt des Registers OCR1A // Möchte man eine bestimmte Spannung Um einstellen, muss man OCR1A mit dem // Wert n = Um * 1024/5 laden. // Beispiel: Um = 3V ==> OCR1A = 3*1024/5 = 614 } void init_devices(void) { CLI(); //disable all interrupts port_init(); timer1_init(); } void main(void) { init_devices(); while(1); }
@Rahul Klar ist Dokumentation Hilfreich. Da das Ganze aber noch nicht gelaufen ist, habe ich nur meine eigene Schnell-Dokumentation im Code damit ich mich noch auskenne wenn ich alles richtig dokumentiere. Aber du hast recht. Ich hätte vor dem Veröffentlichen des Code-Schnipsels eine ordentliche Dokumentation machen sollen. @ Hilel Dass ist ja der absulute Überwahnsinn. Vielen vielen Dank. Diesen Code solltest du in der Codesammlung veröffenlichen. Ich werde mich gleich darauf stürzen und den Code anpassen. (Sowie's aussieht muß ich nur den Port umstellen.) Schönes Wochenende wünsche ich allen. Und denen die noch nicht alle Weihnachtsgeschenke gekauft haben: Macht euch nicht all zu viel Stress.
// bei OCR1A=512 ==> THigh(PWM) = 255,75ms und TLow(PWM) = 255,75ms // Tein = 255,75ms // Taus = 255,75ms Tippfehler: Es muss alles us und nicht ms heissen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.