Änderungen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche

ArduinoVariablePWMFrequenz

1.780 Byte hinzugefügt, 18:16, 15. Nov. 2017
Eingestellt werden können diese über das Register TCCRnB. Das n steht für den Timer. Also gehört das Register TCCR1B zum Timer 1.
[[Datei:TCCR1B.PNG|800px]]
Die wichtigen bits sind CS12, CS11 und CS10 die mit dem Ausdruck CSn2:0 zusammengefasst werden.
[[Datei:CSn2-0_ClockSelect.PNG|800px]]
Im Code schreibt man dann für eine Frequenz von 31372 Hz:
Teilen wir diese Auflösung durch die Takte der MCU pro Sekunde, haben wir eine Frequenz von 244.14 Hz. Die Periodendauer ist 1s / 244.14 Hz = 4.1 ms.
Wollen wir aber nur eine Auflösung von 265 Schritten pro Periode haben, ergibt sich eine Frequenz von 60.377,36 Hz mit einer Periodendauer von 16.5 nsµs..
Es gibt also eine Abhängigkeit zwischen der Auflösung und der Frequenz der PWM, die sich in folgender Formel beschreiben lässt:
<pre> Hz = clk/resolution </pre>
Timer haben verschiedene Modi.
 [[Datei:WaveformGenerationModeBitDescription.PNG|800px]] 
Wir entscheiden uns für den Modus 14 Fast PWM mit ICRn als TOP.
Eingestellt wird er über die Bits WGMn0:3 die sich über die Register TCCRnA und TCCRnB verteilen.
 [[Datei:TCCR1A.PNG|800px]] [[Datei:TCCR1B.PNG|800px]] 
Da können wir uns auch gleich den Rest des Registers TCCR1A anschauen.
Die bits COM1A0:1, COM1B0:1 und COM1C0:1 kontrollieren das Verhalten der Output Compare Pins OCnA, OCnB und OCnC (Stehen in den Pinoutdiagrammen) .
Stehen die bits auf 0, arbeitet der Port normal und unsere anderen Einstellungen haben keinen Effekt. Wir wählen hier 1 0 für inverting. Alles weitere später.
[[Datei:COMnx0-1.PNG|800px]]
Also pin OC1A (pin 11) auf inverting mode und am Ende WGM01:11.
Frequenz: 20.000 Hz
Auflösung: 800 Takte (16.000.000 / 20.000)
Periodendauer: 5 ns µs (1 / 20.000)
<pre>ICR1 = 800;</pre>
Der Duty Cycle wird über das Register OCRnx festgelegt.
<pre>OCR1A = 200;</pre>
 
Zu guter letzt können wir auch noch die Funktion pinMode(11, OUTPUT); über Register direkt einstellen.
Die I/O-Ports werden in A, B, C, ... aufgeteilt. Das steht im Kapitel 13.4.
Jeder Portregister fasst 8 pins zusammen.
Das Register DDRx ist das Data Direction Register, im Falle von DDRB das für den Port B.
Über die Pinbelegung sehen wir das der Pin 11 auch PB5 genannt wird.
[[Datei:DDRB.PNG|800px]]
Also müssen wir das Bit DDB5 setzen.
<pre>DDRB = DDRB | B00100000;</pre>
 
 
Und hier noch mal der ganze Code:
<pre>
DDRB = DDRB | B00100000; // pin 11 als OUTPUT konfigurieren
TCCR1A = 0b11000010; // Pin OC1A frei schalten
TCCR1B = 0b00011001; // Prescaler auf 01 setzen um ~31.000 Takte zu haben
ICR1 = 800; // TOP auf 800 fest legen, als besteht jeder Periode aus 800 Schritten
OCR1A = 200; // Dutycycle auf 200 von 800 Takte legen
</pre>
 
== Timer-Pins ==
 
Arduino Pro Mini
{| class="wikitable"
! timer
! bit
! pin
! register
|-
| timer0
| 8
| 5
| OC0B
|-
| timer0
| 8
| 6
| OC0A
|-
| timer1
| 16
| 9
| OC1A
|-
| timer1
| 16
| 10
| OC1B
|-
| timer2
| 8
| 3
| OC2B
|-
| timer2
| 8
| 11
| OC2A
|}
 
Arduino Mega2560
{| class="wikitable"
! timer
! bit
! pin
! register
|-
| timer0
| 8
| 4
| OC0B
|-
| timer0
| 8
| 13
| OC0A
|-
| timer1
| 16
| 11
| OC1A
|-
| timer1
| 16
| 12
| OC1B
|-
| timer2
| 8
| 9
| OC2B
|-
| timer2
| 8
| 10
| OC2A
|-
| timer3
| 16
| 2
| OC3B
|-
| timer3
| 16
| 3
| OC3C
|-
| timer3
| 16
| 5
| OC3A
|-
| timer4
| 16
| 6
| OC4A
|-
| timer4
| 16
| 7
| OC4B
|-
| timer4
| 16
| 8
| OC4C
|-
| timer5
| 16
| 44
| OC5A
|-
| timer5
| 16
| 45
| OC5B
|-
| timer5
| 16
| 46
| OC5C
|}
688
Bearbeitungen