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


von Mathias Z. (matziz198)


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
  }

von Bernhard S. (b_spitzer)


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

von Mathias Z. (matziz198)


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

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.