Forum: Mikrocontroller und Digitale Elektronik Leidige Thema Timer und PWM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Geo M. (geoman)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich arbeite mich gerade mit Hilfe eine PIC 18F458 Entwicklungsboard in 
die µC Thematik ein und bin jetz dabei ein 50 kHZ PWM Signal für einen 
PWM Modulator zu erstellen. Es gibt da viel Möglichkeiten und ich habe 
jetzt mal 2 realisiert.

Einmal über die SETUP_CCP Funktion und einmal über einen Timer 
Interrupt. Das funktioniert soweit, nur bei der Methode mit dem 
Interrupt erhalte ich nicht die berechnete Frequenz. Ich habe wie immer 
schon in diesem Forum und bei Tante Google gesucht aber nichts gefunden 
was mir weiter hilft.


#include <18f458.h>
#device ICD=TRUE
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=20000000)

void init_timers()
{
   SETUP_TIMER_1(T1_INTERNAL);
   SET_TIMER1(65436);
   SETUP_CCP1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 24, 1);
   set_pwm1_duty(1);
}

#INT_TIMER1
void timer0_isr()
{
   SET_TIMER1(65436);    //Einstellen der gewünschten Frequenz

   output_high(PIN_D1);  //Einstellen des gewünschten Pulsbreite
   output_high(PIN_D1);
   output_high(PIN_D1);

   output_low(PIN_D1);
}

void main()
{
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   SET_TRIS_D( 0x50 );
   SET_TRIS_C( 0x00 );

   init_timers() ;

   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   While(True);
}


Nach meinen Berechnungen müsste 20Mhz/4 => 0,2µs Tick ergeben. 50 kHz 
entsprechen 0,02 ms und somit ergeben sich 0,02ms/0,2µs = 100 Ticks.

Somit muss ich rechnerisch den Zähler des Interrupts auf 65536-100 = 
65436 einstellen um die gewünschte Frequenz zu erhalten, damit ergeben 
sich leider nicht 50 kHz sondern 33.79kHz.

Ich muss den Wert auf 65484 einstellen um 50 kHz zu erhalten, ich kann 
den Fehler in meiner Berechnung nicht finden?!

Kann mir jemand sagen was ich falsch mache oder falsch annehme/ 
verstanden habe?

: Bearbeitet durch User
von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Geo M. schrieb:
> damit ergeben
> sich leider nicht 50 kHz sondern 33.79kHz.

Die Interruptrate ist so hoch, daß die Ausführungszeit bis zum 
Timerreload schon ins Gewicht fällt.
Nimm einen Mode mit automatischem Reload.
Bzw. falls es einen Compareinterrupt gibt, kann man darin auch den 
Comparewert hochzählen.

: Bearbeitet durch User
von Geo M. (geoman)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort, dem kann ich soweit folgen. Wie ich jetzt einen 
automatischen Reload hinbekommen bzw. einen Comparewert hochzähle ist 
meine Aufgabe fürs WE ;-)

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]
  • [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.