Im ersten Schritt bekommt der Lautsprecher ein symetrisches Rechtecksignal im Bereich von 1-6 kHz.
1 kHz bedeutet 500µs an und 500µs aus. 10 kHz bedeutet 50µs an und 50µs aus. Der Timer wird mit dem Systemtakt (1 MHz) getaktet.
1kHz erzeugen
Den Zähler auf 0 und der Ausgang auf 1 setzen.
Der Zähler zählt im µs Takt. Bei 500 wird der Ausgang auf 0 gesetzt.
Beim Wert 1000 gehe zu 1.
Die Timer/Zähler-Einheiten in dem µC können in verschiedene Modi eingestellt werden, für uns die die Betriebsart Fast PWM Mode siehe Seite 98ff. praktisch:
Der Timer zählt von 0 bis zu einem einstellbaren TOP Wert und springt dann wieder auf 0. Ein Ausgang kann beim Sprung von TOP auf 0 gesetzt und bei Erreichen eines einstellbaren Wertes OCR1A wieder rückgesetzt werden.
OCR1A als TOP stellt die Perodendauer des Signals ein.
OCR1B als Pulsweite stellt die Dauer der positiven Signals ein.
Ausgang ist PB4 (OC1B).
Zur Info: Konfiguration des Timers bei Initialisierung
Register
Bit
7
6
5
4
3
2
1
0
Beschreibung
TCCR1A
Bedeutung
COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
Ausgang OC1B bei 0 setzen und bei OCR1B löschen
Wert
0
0
1
0
0
0
1
1
Waveform Generation Mode: Fast PWM mit OCR1A als TOP
TCCR1B
Bedeutung
ICNC1
ICES1
-
WGM13
WGM12
CS12
CS11
CS10
Wert
0
0
0
1
1
0
0
1
Keine Vorteilung Timer mit CPU-CLK (No prescaling)
TIMSK
Bedeutung
TOIE1
OCIE1A
OCIE1B
-
ICIE1
OCIE0B
TOIE0
OCIE0A
Keine Interrups notwendig
Wert
0
0
0
0
0
0
0
0
Lautsprecher im Zylonenauge
Initialisierung 1 kHz Ton
#include <avr/io.h>
int main(){
DDRB = 0b00010000; // PB4 als Ausgang
TCCR1A = 0b00100011; // Ausgang OC1B bei 0 setzen und bei OCR1B loeschen
TCCR1B = 0b00011001; // Waveform Generation Mode: Fast PWM it OCR1A als Top, Timer mit CPU-CLK
OCR1A = 1000; // Timer 1ms
OCR1B = 500; // Impulslaenge 500us
while (1); // Endlosschleife
}
Messen des Signals mit einem (Speicher-) Oszilloskop
Kontrollieren Sie das Signal mit einem Oszilloskop. Messen Sie die Periodendauer und die Signaldauer mit einem Frequenzzähler bzw. mit der entsprechenden Funktion des Speicher-Oszilloskops.
Falls Sie eine Abweichung feststellen diskutieren Sie die möglichen Ursachen, liegt gar ein Denkfehler bei der Ermittlung der Werte für OCR1A und OCR1B vor?
Initialisierung und 1 kHz Pieps und etwas mehr
Alle meine Entchen spielen
Eine einfache Tabelle mit den Tonhöhen fanden wir hier auf Wikipedia. Fluchs wurde eine Tabelle erstellt:
Mittlwerweile ist das Thema so umfangreich vertreten, dass mein einfachster Link dieser ist : Gleichstufige_Stimmung
Trotz der const-Definition würden die Felder im Ram abgelegt und dieser wäre dadurch beinahe voll, deshalb wird mittels PROGMEM der Compiler angewiesen, die Daten im Flash zu speichern, zum Lesen braucht es dann spezielle Funktionen Programmspeicher (Flash), Data in Program Space.
Bei der Tonerzeugung wird eine Hüllkurve verwendet. Wenn in _delay_ms() keine Konstante eingetragen wird, steigt der RAM-Bedarf damatisch an, daher der Work-Around mit der For-Schleife.