Hallo Ich möchte mit PWM einen Ton erzeugen. Dazu habe ich amAtmega bei 0c1B einen kleinen LS angeschlossen und folgenden Code geschrieben: #include <stdio.h> #include <avr/io.h> #include <util/delay.h> #include <pwm_init.c> void long_delay(uint16_t ms) { for(; ms>0; ms--) _delay_ms(1); } int main(void) { unsigned char i = 0; pwm_init(); USARTInit(); while(1) { for (i=0; i<255; i++) { OCR1B = i; long_delay(10); } } } weiß vielleicht jeamnd warum das nicht klappt? Sebastian
1 | for(; ms>0; ms--) _delay_ms(1); |
1. ist das erlaubt? 2. nimm doch while 3. Lautsprecher an PWM... 3a bitte mit verstärker sons kanns nix werden, 3b PWM hört sich sicher nicht toll an aber brummen oder pfeifen wirds bestimmt. 4. krasses Projekt
5. nimm doch noch besser
1 | _delay_ms(10); |
statt der ganzen Funktion long_delay()
#include <pwm_init.c> Sowas macht man nicht. Und nun wird es laut: WOHER ZUM GEIER SOLL JEMAND WISSEN WAS DU IN PWM_INIT.C VERBROCHEN HAST? Etwas leiser: Lautsprecher direkt am Portpin ist keine gute Idee. Wenn der nur so 8 Ohm hat ist der Port vieleicht schon tot.
danke schon mal Ich hab den LS natürlich über einen Widerstand (1KO) angeschlossen. Ein kurzer Test mit: DDRB=255; while (1) { PORTB=64; long_delay(1); PORTB=0; long_delay(1); } brachte nun außerdem die Bestätigung, dass der Port an sich einwandfrei funktioniert. Allerdings nur als Mückenschreck ist mir der AVR zu schade... :) nun zu pwm_init.c: void pwm_init (void) { DDRB = (1<<PB1) | (1<<PB2); PORTB = ~(1<<PB1) & ~(1<<PB2); TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) |(1<<COM1B1) | (1<<COM1B0); TCCR1B = (1<<CS10) | (1<<WGM12); }
ok, hab herausgeunden, dass mit eingeschaltetem CKDIV8 Fusebit ein Ton zu höhren ist, etwa 15KHz würd ich mal sagen (hab kein Oszi). Allerdings ändert sich die Frequenz nicht, sondern die Lautstärke. Mit dem Messgerät kann man eine schwankende Spannung zwischen 0 und ~5V messen....
Ist ja auch klar das sich der Ton nicht ändert. Wie auch? Die Frequenz bleibt ja konstant, lediglich der effektivwert ändert sich und somit auch die Lautstärke bzw deine gemessenen 0 bis 5V.
Hallo, auch wenn PWM scheinbar das Schalgwort für alles zu sein scheint... Um einfach irgendeinen Ton zu erzeugen, den Timer in den CTC-Mode, das Cpomapre-Pin auf Toggle, nun noch Vorteiler auf einen sinnvollen Wert und den Comparewert setzen. Der bestimmt dann auch die Tonhöhe. Die Zeit, die sich aus Vorteiler und Comparewert ergibt, ist der Wert für die Länge einer Halbwelle. Bei 1MHz AVR-Takt und z.B. 1kHz Ton muß als die Zeit 1ms für eine Schwingung, damit 500µs (2kHz) für den Timer sein. Vorteiler auf 16 ergibt 62500, also rund 32kHz am Timer. Compare jetzt auf 32 sollte ca. 1kHz ergeben. Genaue Berechnung ist im Datenblatt. Gruß aus Berlin Michael
Danke Michael erstmal. Ich habs nun auf CTC umgestellt. Meine Settings sind nun folgende: TCCR1A = (1<<COM1B0); // Toggle OCnA/OCnB/OCnC on compare match. TCCR1B = (1<<CS10) | (1<<CS12) |(1<<WGM12); // clk/1024, WGM Mode 4 Die Formel für den CTC mode ist: fclk FOC = ------ 2*N*(1+OCR) fclk = 16.000.000, N ist ja bereits auf 1024 gestellt, das heißt, wenn ich OCR nun auf 2 stelle, müsste ich etwa 2,6KHz erhalten. Ist das richtig? Gruß Sebastian
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.