Mit Timer 0 PWM Frequenz einstellen AT89C51ED2

OP #2011238
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:
1
#include <at89c51xd2.h>
2

3

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

7
/*-----------------------------------------------------------------------
8
Zusatzfunktionen
9
------------------------------------------------------------------------*/
10

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

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

30
/*--------------------------------------------------------------------
31
Hauptprogramm
32
----------------------------------------------------------------------*/
33
void main(void)
34

35
{  
36
  
37
  T0_Mode1_INI(); // Timer 0 Initialisierung
38
  PWM_INI();    // PWM-Initialisierung
39
  CR=1;      // PWM starten
40
  CCAP0H=128;    // Startwert der PWM 0
41
  CCAP1H=128;    // Startwert der PWM 1
42

43
  while(1)     // Endlosschleife
44
  {   
45
  }
#2024177
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

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.