Frage zu PWM unter C

Gast #268594
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?
Gast #268595
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...
Gast #268596
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);
}
Gast #268597
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.