Ich arbeite neu mit einem arduino micro und brauche dort einen 50KHz/50% DutyCycle PWM. Bei den Beispielen hab ich leider nichts mit einem PWM gefunden. Gibt es eine "einfache" möglichkeit mit dem arduino einen PWM zu erzeugen, oder muss ich die Register des Kontrollers direkt setzen? Hab mir das etwa so vorgestellt: SetPWM(Pin, Frequenz, DutyCycle); Danke & Gruss Paul
CC schrieb: > Das sagt Arduino zu PWM: http://arduino.cc/en/Tutorial/PWM Das Beispiel das dort erwähnt wird, ist aber kein richtiger PWM. Ich kann/will die Pins nicht immer selbst setzen da das Programm anderes zu tun hat.
http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM analogWrite macht so 490 Hz bzw. 980 Hz je nach Board (kann man nicht selbst beeinflussen). Wenn du selbst die Frequenz beeinflussen willst musst du digitalWrite in Verbindung mit delayMicroseconds nehmen, welches aber glaub ich auch nicht wirklich schnell ist (etwas über 100 kHz), zudem blockt es den µC durch den delay. Besser ist es direkt mit dem Hardware PWM zu arbeiten wie im o.g. Artikel beschrieben (muss man halt das Datenblatt des µCs zu lesen), oder wenn du ein passendes Board hast gibt es wohl auch noch die Timer1 Lib: http://playground.arduino.cc/code/timer1
:
Bearbeitet durch User
Den µC will ich eben nicht blockieren, darum wäre sowas wie diese Timer1 Lib schon gut. Ist aber für den falschen Chip. :( Dann muss ich mir die Funktionen halt selber schreiben.
capaxi schrieb: > Hab mir das etwa so vorgestellt: SetPWM(Pin, Frequenz, DutyCycle); Beliebige Pins geht nur mit hoher CPU-Last (SW-PWM). HW-PWM geht nur mit ganz bestimmten Pins (siehe Datenblatt).
Wenn dein Arduino sowas wie nen Capture&Compare-Modul hat kannst du mit dem Compareinterrupt und dem dazugehörigen timer eine PWM auf interruptbasis erzeugen. Bei übereinstimmen des timerwertes mit dem comparewert wird ein compare interrupt generiert. damit kannst du deinen ersten flankenwechsel generieren. den timer lässt du weiterlaufen bis er überläuft und schon hast du nen timer interrupt bei dem du nochmal den pin togglest. fertig ist die pwm. :) Gruß Frank
/* _ __ _ /* | | | | | | /* __| |___| |___| |__ /* ! ! /* CCP Timer /* ISR ISR Für PIC-µC sieht das so aus: #INT_TIMER1 //feuert wenn timer überläuft void isr_timer1(void) { PIC_REG_CCPR2=u16_compare_val2; //timer vergleichswert setzen set_timer1(u16_period_pwm2); //timer startwert setzen output_low(PIN_C2); } #INT_CCP2 // feuert bei timer1=comparewert void isr_ccp2(void) { output_high(PIN_C2); }
Hi >Wenn dein Arduino sowas wie nen Capture&Compare-Modul hat kannst du mit >dem Compareinterrupt und dem dazugehörigen timer eine PWM auf >interruptbasis erzeugen. Der arduino micro (ATMega32U4) hat 3 Timer die CTC können. Warum der Krampf mit PWM? Und in Assembler besteht die komplette Interruptroutine zum Togglen eines beliebigen Pins aus genau zwei Befehlen. MfG Spess
Ich probiers jetzt mal mit diesen Timer Interrupts. Den PWM ganz genau einzustellen ist viel aufwendiger als die CTC Lösung :)
capaxi schrieb: > Ich probiers jetzt mal mit diesen Timer Interrupts. Du weißt aber schon, daß 10µs Interruptrate sportlich sind. Da ist kaum Luft für noch andere Interrupts, bzw. es jittert dann wie Sau. capaxi schrieb: > Den PWM ganz genau > einzustellen ist viel aufwendiger als die CTC Lösung :) Einfacher als HW-PWM gehts nun wirklich nicht. Die wird einmal initialisiert und das wars.
Peter Dannegger schrieb: > Einfacher als HW-PWM gehts nun wirklich nicht. Die wird einmal > initialisiert und das wars. Allerdings kommt er damit auf einem Arduino Board nicht auf die 50kHz PWM Frequenz, da diese eigentlich immer einen 16MHz Quarz haben.
Hi >Allerdings kommt er damit auf einem Arduino Board nicht auf die 50kHz >PWM Frequenz, da diese eigentlich immer einen 16MHz Quarz haben. Wieso nicht? MfG Spess
spess53 schrieb: > Hi > >>Allerdings kommt er damit auf einem Arduino Board nicht auf die 50kHz >>PWM Frequenz, da diese eigentlich immer einen 16MHz Quarz haben. > > Wieso nicht? > > MfG Spess Hi, oh sollte wohl doch möglich sein, mit dem 16Bit Timer. Mit den 8Bit Timern geht es aufjedenfall nicht. Gruß
Hi >Hi, >oh sollte wohl doch möglich sein, mit dem 16Bit Timer. Mit den 8Bit >Timern geht es aufjedenfall nicht. Selbstverständlich reicht ein 8-Bit-Timer: 16MHz - Prescaler 1 - OCR-Wert 0x9F gibt eine CTC mit 50kHz. MfG Spess
Philipp N. schrieb: > Mit den 8Bit > Timern geht es aufjedenfall nicht. Aber natürlich geht das. Z.B. Mode 2, OCR0A = 159, toggle Pin on compare match. Oder Mode 5 Oder Mode 7 mit Vorteiler 8
spess53 schrieb: > Selbstverständlich reicht ein 8-Bit-Timer: > > 16MHz - Prescaler 1 - OCR-Wert 0x9F > > gibt eine CTC mit 50kHz. > > MfG Spess Hi, tatsächlich, hab ich einfach überscrollt im Datenblatt, ist sogar ein schönes Bild dazu drin ;) Gruß
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.