arduino pwm 50KHz

Gast #3788205
Lesenswert?

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
#3788254
Lesenswert?

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 #3788337
Lesenswert?

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 #3788352
Lesenswert?

/*       _     __     _
/*      |  |   |  |   |  |
/*    __|  |___|  |___|  |__
/*         !   !
/*         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 #3788377
Lesenswert?

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
#3788438
Lesenswert?

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 #3788777
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren