arduino pwm 50KHz

Gast #3788205
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
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
Gast
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.
Gast
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
Gast
/*       _     __     _
/*      |  |   |  |   |  |
/*    __|  |___|  |___|  |__
/*         !   !
/*         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);
}
Gast
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
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.
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.