www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu PWM unter C


Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hilel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hilel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.