ich habe hier ein problem. ich möchte mit dem attiny24 die Hardware-PWM benutzen. ich möchten den internen RC oszillator mit 8 MHz benutzen. es soll ein PWM-signal mit 50 KHz rauskommen. ti- und to-Anteil von dem signal sollen nicht 50/50% sein, sondern möglichst frei einstellbar sein (z.B. 70/30 oder 90/10). gleichzeitig benötige ich zu dem PWM-output einen zusätzlichen output, der den ersten output invertiert ausgibt, also immer auf low ist, wärend der normale output auf high ist. das mit dem zusätzlichen invertierten output kann ich, so wie ich das verstanden habe, aktivieren, wenn ich einen phase-correct PWM mode auswähle. das problem ist aber, so wie ich das richtig verstehe, daß ich bei einem phase-correct PWM mode nur PWM frequenzen bis ca. 31 khz machen kann. will ich eine höhere frequenz, muß ich fast-PWM (mode 7) auswählen, wo ich auswählen kann, daß der Timer früher als 256 zurückgesetzt werden kann, aber dann halt es eben akzeptieren muß, daß der 2. timer-output nicht als phase-correct benutzt werden kann. Ich habe auch noch einen 2. timer. wenn ich für den einen PWM den 1. 8bit timer benutze, könnte den 2. 16bit timer für das invertierte signal benutzen. aber kriege ich den 16bit timer so eingestellt, daß er genau syncron zu dem 8bit timer läuft? was sind da eure vorschläge? kriege ich den phase-correct mode doch so eingestellt, daß er eine 50KHz frequenz mit variablem ti/to verhältnis ausspuckt, oder kriege ich der pwm im fast pwm mode doch ein zusätzliches invertiertes signal entlockt, oder muß ich den 2. 16bit timer zusätzlich benutzen und dafür sorgen, daß 8bit und 16bit timer irgendwie syncron laufen?
du könntest die PW natürlich auch extern invertieren, mit einem Inverter oder einem Transistor.
Hallo Friedrich, der Timer1 im Tiny 24 macht das kpl. so wie du willst. // Target : T24 // Crystal: 8.0000Mhz #include <iot24v.h> #include <macros.h> void port_init(void) { PORTB = 0x00; DDRB = 0x00; PORTA = 0x00; DDRA = 0x60; //PA5 PA6 Ausgang } //TIMER1 initialize - prescale:1 // desired value: 50KHz // actual value: 50,000KHz (0,0%) void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0xFF TCNT1L = 0x60 OCR1AH = 0x00; OCR1AL = 0xA0; // PWM-Wert A OCR1BH = 0x00; OCR1BL = 0xA0; // PWM-Wert B TCCR1A = 0xB0; TCCR1B = 0x00; //start Timer //Add TCCR1C } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer1_init(); MCUCR = 0x00; TIMSK0= 0x00; //timer interrupt sources TIMSK1= 0x00; //timer interrupt sources GIMSK = 0x00; //interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... } Die Auflösung beträgt bei den 50kHz nur Werte von 0-160. Deine Werte trägst du in OCR1A und OCR1B ein. Deine Ausgabe hast du auf den PINS PA6 PWMA und PA5 PWMB. Bei 8Bit Auflösung sind es nur 31,2... kHz gruß hans
ah ok danke. moment mal, warum wird TCCR1B am ende nach der setz-prozedur wieder auf 0x00 gesetzt? dann müßte er doch gestoppt sein oder?
Hi
>Bei 8Bit Auflösung sind es nur 31,2... kHz
Nein, bei Phase Correct nur 15,69kHz
MfG Spess
hm moment ganz kapier ich das trotzdem noch nicht. wenn du den Timer TCNT1 auf -160 vor dem überlauf-maximum setzt, dann läuft er einmal nach 160 über und fängt dann ganz bei 0 an. es sei denn, etwas anderes hindert ihn am überlaufen oder setzt ihn bei jedem neu-durchlauf neu auf -160 vor dem überlauf, aber welchen sinn macht es dann, den TCNT1 auf FF-60 zu setzen? wie zählt der jetzt überhaupt?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.