10bit PWM aus 8 bit Timer

Gast #2174285
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin gerade dabei einen Kaskadenregler für eine Drehzahlsteuerung zu 
programmieren. Dazu nutze ich einen Atmega 8.

Nun meine Frage. Ich nutze den 16Bit Timer um die Drehzahl via 
incrementalem Drehzahlgeber zu messen. Leider muss ich dafür Timer 1 
nutzen da nur dieser den ICP (Input Caputer Pin) nutzen kann.

Timer 2 nutze ich um meine Abtastzeit konstant zu halten.

Timer 0 generiert mir mein PWM Signal...nun sind mir die 8bit aber doch 
zu ungenau und ich möchte am besten 1023 Schritte haben.

Ich habe überlegt die Überläufe bis max. 4 zu Zählen und dann z.B. bei 
einem PWM Wert von 400 einfach den ersten Durchlauf auf High zu belassen 
und den zweiten dann bei 400 - 255 auf low zu togglen( die Folgenden 
dann natürlich auch low).

Das ist leider nicht so optimal weil ich dann einen dritten Interrupt im 
Spiel hätte der mir evtl meine Abtastzeit ruiniert.

Was haltet ihr grundsätzlich von der Idee bzw kann man Timer 1 parallel 
zum ICP auch als 10 bit Timer nutzen?

(Es währe unheimlich schön wenn nicht auf das Datenblatt verwiesen 
wird^^)

Danke für eure Hilfe
Gast #2174574
Lesenswert?
• ▲
▼
ICP und 10 Bit PWM sollte auch gehen, macht aber ggf. die Umrechnung der 
Zeiten etwas komplizierter.

Wenn es nur um die Auflösung geht, könnte man ggf. 8 Bit PWM nehmen und 
dann noch mal bei den 8 Bit PWM Werten zwischen 2 Stufen hin und her 
schalten. Sozusagen 8 Bit von der Harware + 2 Bits in Software. Es hängt 
aber von der Anwendung ab, die damit relativ hohe PWM Frequenz gewünscht 
ist oder gerade nicht.
Gast #2175140
Lesenswert?
• ▲
▼
das Letzte verstehe ich nicht so ganz...

Hab gestern den ganzen Tag probiert ICP und FastPWM gleichzeitig zu 
nutzen aber irgendwie hängt er sich dabei auf.

Hier ist mal die Initialisierung von Timer 1 evtl findet Ihr ja einen 
Fehler


TCCR1A=(1<<WGM10)+(1<<WGM11)+(1<<COM1A0)+(1<<COM1A1);
TCCR1B =  (1<< ICNC1)  + (1 << ICES1) +(1<<CS10) + (1<<WGM12); 
OCR1A = 512;

TIMSK  = (1<<TOIE1) + (1<<TICIE1) + (1<<TOIE0)   + (1<<OCIE1A);

sei();

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.