Hallo, ich arbeite mit einem M16C/28 Prozessor und muss dringend mit PWM Töne erzeugen. Leider habe ich bisher keine gute Doku dazu gefunden und stehe im Moment echt auf dem Schlauch. Die Töne müssen aus Platz und Stromgründen nur durch den Controller erzeugt werden. Eigentlich sollen die Töne noch polyphon sein, aber ich wäre schon froh wenn ich überhaupt einen vernünftigen Ton erzeugen könnte. Nach langem experimentieren habe ich mithilfe zweier Timer schon etwas hörbares erzeugt, allerdings ist ständig in regelmässigen Abständen ein knacks zu hören, denn ich auch durch entkopplung durch einen Kondensator nicht wegbekommen habe. Hat jemand vielleicht ein Beispiel in C sodass ich die funktionsweise der Tonerzeugung besser verstehen kann ? Danke schon mal für eure Hilfe Thomas
Hi, vielleicht hilft Dir das Konzept eines Class-D Verstärkers weiter ? Ist zwr nicht in der Richtung, in der Du wahrscheinlich suchst, aber damit läßt sich einiges machen. Gruß ka-long
hab ich vor einiger zeit schonmal gepostet, so mach ich das.. vllt hilfts: music.h #define TONE_C 654 #define TONE_CIS 693 #define TONE_DES 693 #define TONE_D 734 #define TONE_DIS 778 #define TONE_ES 778 #define TONE_E 824 #define TONE_F 873 #define TONE_FIS 925 #define TONE_GES 925 #define TONE_G 980 #define TONE_GIS 1038 #define TONE_AS 1038 #define TONE_A 1100 #define TONE_AIS 1165 #define TONE_B 1165 #define TONE_H 1235 #define TONE_c 1308 #define TONE_cis 1386 #define TONE_des 1386 #define TONE_d 1468 #define TONE_dis 1556 #define TONE_es 1556 #define TONE_e 1648 #define TONE_f 1746 #define TONE_fis 1850 #define TONE_ges 1850 #define TONE_g 1960 #define TONE_gis 2077 #define TONE_as 2077 #define TONE_a 2200 #define TONE_ais 2331 #define TONE_b 2331 #define TONE_h 2469 #define TONE_c1 2616 #define TONE_cis1 2772 #define TONE_des1 2772 #define TONE_d1 2937 #define TONE_dis1 3111 #define TONE_es1 3111 #define TONE_e1 3296 #define TONE_f1 3492 #define TONE_fis1 3700 #define TONE_ges1 3700 #define TONE_g1 3920 #define TONE_gis1 4153 #define TONE_as1 4153 #define TONE_a1 4400 #define TONE_ais1 4662 #define TONE_b1 4662 #define TONE_h1 4939 #define TONE_c2 5233 #define TONE_cis2 5544 #define TONE_des2 5544 #define TONE_d2 5874 #define TONE_dis2 6223 #define TONE_es2 6223 #define TONE_e2 6593 #define TONE_f2 6985 #define TONE_fis2 7400 #define TONE_ges2 7400 #define TONE_g2 7840 #define TONE_gis2 8306 #define TONE_as2 8306 #define TONE_a2 8800 #define TONE_ais2 9324 #define TONE_b2 9324 #define TONE_h2 9878 #define TONE_c3 10465 #define TONE_cis3 11087 #define TONE_des3 11087 #define TONE_d3 11747 #define TONE_dis3 12445 #define TONE_es3 12445 #define TONE_e3 13185 #define TONE_f3 13969 #define TONE_fis3 14800 #define TONE_ges3 14800 #define TONE_g3 15680 #define TONE_gis3 16612 #define TONE_as3 16612 #define TONE_a3 17600 #define TONE_ais3 18647 #define TONE_b3 18647 #define TONE_h3 19755 music.c #include <avr/io.h> #include <avr/interrupt.h> #include "music.h" #define PAUSE 10 unsigned int speed = 1500; int pause = PAUSE; unsigned int count = 0; unsigned int pos = 0; unsigned int melody1[27][2] = { {TONE_g1, 8}, {TONE_g1, 8}, {TONE_a1, 4}, {TONE_g1, 4}, {TONE_c2, 4}, {TONE_h1, 2}, {TONE_g1, 8}, {TONE_g1, 8}, {TONE_a1, 4}, {TONE_g1, 4}, {TONE_d2, 4}, {TONE_c2, 2}, {TONE_g1, 8}, {TONE_g1, 8}, {TONE_g2, 4}, {TONE_e2, 4}, {TONE_c2, 8}, {TONE_c2, 8}, {TONE_h1, 4}, {TONE_a1, 4}, {TONE_f2, 8}, {TONE_f2, 8}, {TONE_e2, 4}, {TONE_c2, 4}, {TONE_d2, 4}, {TONE_c2, 2} }; unsigned int length = 27; void make_music(int freq, int time) { TCCR0 = 0; if(freq < 4910) { TCCR0 = (1<<COM00) | (1<<CS02) | (1<<WGM01); OCR0 = 312500 / freq; } else { TCCR0 = (1<<COM00) | (1<<CS00) | (1<<CS01) | (1<<WGM01); OCR0 = 1250000 / freq; } count = (speed / time) / 10; OCR2 = 156; TIMSK = (1<<OCIE2); TCCR2 = 0; TCCR2 = (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20); return; } ISR(TIMER2_COMP_vect) { count--; if(count == 0) { TCCR0 = 0; pause--; count++; if(pause == 0) { TCCR2 = 0; start_melody(melody1); pause = PAUSE; } } } void start_melody(int melody[16][2]) { if(pos >= length-1) return; make_music(melody[pos][0], melody[pos][1]); pos++; return; } int main (void) { DDRB = 0xFF; sei(); start_melody(melody1); while(1); return 0; }
ach ich Idiot das war ja ne Suche und kein aktueller Thread.. Ruhe in Frieden.
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.