Forum: Mikrocontroller und Digitale Elektronik arduino pwm 50KHz


von capaxi (Gast)


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

von CC (Gast)


Lesenswert?

Das sagt Arduino zu PWM: http://arduino.cc/en/Tutorial/PWM

von capaxi (Gast)


Lesenswert?

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.

von Timmo H. (masterfx)


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

: Bearbeitet durch User
von capaxi (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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).

von Frank the Tank (Gast)


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

von Frank the Tank (Gast)


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

von spess53 (Gast)


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

von capaxi (Gast)


Lesenswert?

Ich probiers jetzt mal mit diesen Timer Interrupts. Den PWM ganz genau 
einzustellen ist viel aufwendiger als die CTC Lösung :)

von Peter D. (peda)


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.

von Philipp N. (philoepp)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Philipp N. (philoepp)


Angehängte Dateien:

Lesenswert?

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ß

von spess53 (Gast)


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

von Peter D. (peda)


Lesenswert?

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

von Philipp N. (philoepp)


Lesenswert?

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
Noch kein Account? Hier anmelden.