Forum: Mikrocontroller und Digitale Elektronik 10bit PWM aus 8 bit Timer


von HaPe (Gast)


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

von Ulrich (Gast)


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.

von HaPe (Gast)


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();

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.