Forum: Mikrocontroller und Digitale Elektronik Frage zu PWM unter C


von Fritz (Gast)


Lesenswert?

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?

von Rahul (Gast)


Lesenswert?

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...

von Hilel (Gast)


Lesenswert?

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);
}

von Fritz (Gast)


Lesenswert?

@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.

von Hilel (Gast)


Lesenswert?

// 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
Noch kein Account? Hier anmelden.