www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mit Timer 0 PWM Frequenz einstellen AT89C51ED2


Autor: Mathias Z. (matziz198)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

die PWM-Frequenz kann bei diesem µC über den Timer0 überlauf gesteuert 
werden. Als Quarz verwende ich 22.1184 MHz und die PWM funktioniert 
bereits mit LEDs an P1.3 und P1.4. Nun versuche ich den Timer0 im Mode 1 
zu betreiben und eine Frequenz von ca. 200 Hz auf die PWM zu geben. Mit 
dem  Timer im Mode0 (13bit) blinkt die LED 2 mal /sek.. Dann habe ich 
den Timer im Mode 1 ohne Reloadwert betrieben und die LED blinkt alle 5 
sek. auf.

Nun zum (Verständniss)problem:
Die Blinkfrequenz erscheint mir ein wenig niedrig. Sollte sie nicht, bei 
diesem Qaurz, bei mind. ca. 28 Hz liegen?
Wenn ich mit Reloadwerten arbeite verändert sich das Blinken auch nicht.

Hier der Code:
#include <at89c51xd2.h>


sbit pulsweite_pca0=P2^2;  // Tasten für Pulsweiten
sbit pulsweite_pca1=P2^5;

/*-----------------------------------------------------------------------
Zusatzfunktionen
------------------------------------------------------------------------*/

void T0_Mode1_INI(void)
{
  TR0 = 0;                // Timer stoppen
  TMOD = 0x01;      // Timer 0 im Mode 1 aktivieren
  TH0 = 100;      // wird um 1 inkrementiert wenn TL0 überläuft
  TL0 = 0;      // wird alle Fosz/12 um 1 inkrementiert bis 256 dann überlauf
  TF0 = 0;      // Timer0 Überlaufflag löschen
  //ET0 = 1;                // Interrupt für Timer 0 aktivieren
  //EA=1;                   // Interrupts aktivieren
  TR0 = 1;                // Timer 0 run
}

void PWM_INI(void)
{  CMOD=0x05; // PCA-Clock = Timer 0 überlauf
  CCON=0x00; // PCA steht still
  CCAPM0=0x42; // ECOM0-Bit und PWM0-Bit werden gesetzt
  CCAPM1=0x42; // ECOM1-Bit und PWM1-Bit werden gesetzt
}

/*--------------------------------------------------------------------
Hauptprogramm
----------------------------------------------------------------------*/
void main(void)

{  
  
  T0_Mode1_INI(); // Timer 0 Initialisierung
  PWM_INI();    // PWM-Initialisierung
  CR=1;      // PWM starten
  CCAP0H=128;    // Startwert der PWM 0
  CCAP1H=128;    // Startwert der PWM 1

  while(1)     // Endlosschleife
  {   
  }

Autor: Bernhard Spitzer (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast Timer0 Overflow als Taktgeber für den PCA initialisiert. Der 
Timer 0 ist aber im 16-Bit Mode und Du machst keinen Reload. Daher läuft 
der Timer alle 65536*542ns = 35,5ms über. Der PCA macht daraus ein PWM 
mit einer Periodendauer von 256*35,5ms = 9,1s.
Die Puls/Pausendauer des PCA hat keinen Einfluss auf die erzeugte 
Frequenz.
Daher ist die Blinkfrequenz konstant, nur die Einschaltdauer ist mal 
länger und mal kürzer. (bei Dir ist das Tastverhältnis aber bei 
CCAP0H=128 gleich 50%)

unn tschuess
Bernhard

Autor: Mathias Z. (matziz198)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, alles klar. Ich habe die 8 bit des PCA nicht bedacht und war 
verwirrt. Dann werde ich mal den Timer im Mode 2 (8bit 
Autoreload)testen. Bei TH0=226 Reloadwert müsste ich eine Frequenz von 
240 Herz bekommen.

//Matze

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.