Ein ATtiny85 bei 3V gibt mit 8kHz Audiosamples an die 250 kHz, 8-bit PWM an OC1A/#OC1A. Dort soll ein fingernagelgroßer Lautsprecher (Spulenwiderstand 8 Ohm) dran, und zwar möglichst direkt, d.h. kein Verstärker. Aber eine Strombegrenzung und einen (passiven) Filter werde ich vermutlich benötigen? Wie ist das weitere Vorgehen? Vorverarbeitung der Samples (Low-pass für 8 kHz / 2? "bass-boost"?) Impedanz des Lautsprechers von DC-8 kHz ermitteln? Leistung bzw. Strom begrenzen auf die max. 20 mA (0.75 V drop)? Sind Filter für die 250 kHz bzw. 8 KHz erforderlich? Wie steht's mit der Effizienz (Ich brauche was kleines...)?
Mhh, es ist ja eigentlich ein Class-D Amplifier: https://duckduckgo.com/?q=class+d+output+filter https://www.eetimes.com/understanding-output-filters-for-class-d-amplifiers/ https://www.maximintegrated.com/en/design/technical-documents/app-notes/6/624.html https://www.ti.com/lit/an/slyt198/slyt198.pdf > The second-order Butterworth low-pass filter is themost common filter used in Class-D amplifier applica-tions. This filter uses two inductors and three capacitorsfor a bridged-tied-load (BTL) output, https://passive-components.eu/optimizing-class-d-audio-amplifier-output-filters/ http://www.irf.com/product-info/audio/classdtutorial2.pdf http://www.wictronic.ch/Downloads/CDAMP/Application_Notes/Reducing_And_Eliminating_The_Class-D_Output_Filter.pdf https://www.we-online.com/web/en/electronic_components/news_pbs/blog_pbcm/blog_detail-worldofelectronics_72577.php "full-bridge output" "bridge-tied load (BTL)" Ich versuch's mal mit 22 uH und 100nF.
Fragesteller schrieb: > Ich versuch's mal mit 22 uH und 100nF. Das kannste dir sparen. Das wäre allenfalls nützlich, um die (elektromagnetische) Abstrahlung der PWM-Frequenz und ihrer Oberwellen zu unterdrücken. > Wie steht's mit der Effizienz Lausig. Wenn du einigermaßen effizient sein willst, sollte der Speaker bei der geplanten Schaltung ca. 100 Ohm haben. Wenn du beide PWM-Kanäle benutzt, dann ca. 50 Ohm. Vergleiche z.B. Beitrag "Westminster Soundgenerator mit ATtiny85" Das ist allerdings für 15,6kHz Samplefrequenz dimensioniert und enthält außerdem einen kräftigen "bass-boost".
Fragesteller schrieb: > ¿ Was soll das denn? Dies ist ein seriöses Forum. Hier werden keine Fragezeichen umgedreht.
Kennst Du dieses berühmte Projekt hier? http://elm-chan.org/works/sd8p/report.html Da steht auch etwas zur Hardware.
Fragesteller schrieb: > Dort soll ein fingernagelgroßer Lautsprecher (Spulenwiderstand 8 Ohm) > dran, und zwar möglichst direkt, d.h. kein Verstärker. Und was passiert, wenn du den Lautsprecher einfach dort anschließt? > Aber eine Strombegrenzung und einen (passiven) Filter werde ich > vermutlich benötigen? Strombegrenzung: für einen kurzen Test nicht. Und Filter: einen C zur Entkopplung des DC-Anteils würde ich mal vorsehen. Und wenn dann zufällig herauskommt, dass es hinreichend gut funktioniert und der µC nicht zu heiß wird, bist du schon fertig. Fragesteller schrieb: > Wie steht's mit der Effizienz Vergiss es. Effizient wäre ein Class-D Brückenverstärker. > (Ich brauche was kleines...)? In Zahlen? Und kannst du "das Kleine" auch verarbeiten? Den hier gibt es auch in recht kleiner Bauform: https://www.maximintegrated.com/en/products/analog/audio/MAX98314.html Allerdings musst du die 9 Kugeln im 0,3mm Pitch erst mal verlötet bekommen...
:
Bearbeitet durch Moderator
Moin, Man koennte da schon einen LC-Filter basteln, der in einem Band auch eine Impedanztransformation hinkriegt. Aber die Spulen dafuer werden so irgendwo im 0.33..3.3mH Bereich liegen, also mechanisch auch nicht ganz klein+billig. Irgendsone Endstufe und davor ein RC Tiefpass werden wohl schon kleiner aufbaubar und lauter sein. Gruss WK
Harald schrieb: > http://elm-chan.org/works/sd8p/report.html Ja, auch seine Spieluhr: http://elm-chan.org/works/mxb/report.html (http://elm-chan.org/works/mxb/mg.png - Serienwiderstände) Diese Schaltungen des Players nutzen 100 uF in Serie: h ttp://elm-chan.org/works/sd8p/rc/sd8p_mo.png h ttp://elm-chan.org/works/sd8p/rc/sd8p_st.png h ttp://elm-chan.org/works/sd8p/rc/sd8p_hr.png Diese hier ist direkt angeschlossen: http://elm-chan.org/works/sd8p/rc/sd8p_oc.png Was heisst OCL? Lothar M. schrieb: > Effizient wäre ein Class-D Brückenverstärker. Ist es das nicht? Ich habe zwei IO (H-Brücken), die im Gegentakt schalten. Der [PAM8302](https://www.diodes.com/assets/Datasheets/PAM8302A.pdf) arbeitet auch mit 250 kHz, und braucht offenbar keine Ausgangsfilter. Mit und ohne obigen Filter höre ich ja auch was, aber es gibt ein gräßliches Pfeifen/Piepen/Fiepen - ich weiß nicht, woher das kommt. Die 250 kHz werden es nicht sein, aber ich weiß nicht, was der Lautsprecher daraus macht. Dann sind's schon eher die 8 kHz sample / update rate. Ich weiß leider auch nicht, wie ich das messen könnte. Wenn der Lautsprecher mechanisch filtert, lässt sich das Resultat ja nur über ein Mikrofon messen, und da habe ich nichts brauchbares, d.h. nur eine Elektret-Kapsel die ich an den PC hängen könnte oder per Handy aufnehmen und dann mit Audacity o.ä. das Spektrum ansehen. Ich denke, ich sollte zuerst einen Sinus erzeugen um unterschiedliche Frequenzen und Sample-Rates testen zu können. Bis das programmiert ist, habt ihr mich ja evtl. schon messtechnisch beraten... :-) Verwandt: Beitrag "D-Verstärker AVR ATmega8 Assembler" Beitrag "Digitalverstärker" Beitrag "[Attiny45] Audio über ADC und PWM laufen lassen" Beitrag "ATTiny13: Lautsprecher PWM-Anbindung" Beitrag "Sound Experimente ATmega AVR ADC PWM Assembler"
Leider bekomme ich nach wie vor viele nervige Oberwellen, die den Ohren weh tun. Im Anhang mal eine Handy-Aufnahme einiger Frequenzen (1-8). Mein "DDS-Sinus": jeder i. Wert aus einer 256 Byte Wertetabelle ausgegeben mit nunmehr ca. 40 kHz (Update der PWM) gibt mir für 4 ca. 660 Hz (rechnerisch 16.5e6/8/47/(256/4)=685,67). Man hört schön, dass eine fingernagel-große Membran keine niedriegen Frequenzen schafft... Der AVR läuft mit ca. 3 V und hat den o.g. Filter. Wenn ich immer denselben Wert aus dem Flash lade (0x80), ist Ruhe - Nebeneffekte meines Programms sind also nicht unbedingt schuld. Was ist das Problem / die Ursache? Was kann ich noch tun? Den Frequenzgang vom Lautsprecher aufnehmen und dann in den PCM-Audiodaten kompensieren? Wie?
Fragesteller schrieb: > Leider bekomme ich nach wie vor viele nervige Oberwellen, die den Ohren > weh tun. > > Im Anhang mal eine Handy-Aufnahme einiger Frequenzen (1-8). > Mein "DDS-Sinus": jeder i. Wert aus einer 256 Byte Wertetabelle > ausgegeben mit nunmehr ca. 40 kHz (Update der PWM) gibt mir für 4 ca. > 660 Hz (rechnerisch 16.5e6/8/47/(256/4)=685,67). 660Hz bei 40kHz Samplerate sollte eigentlich kein Problem sein, auch ohne Hardwarefilter am Ausgang. Zeig mal deine Sinustabelle und deinen Code. Irgendwo in diesen Sachen muss ein Fehler stecken. Aus der Hardware können diese Oberwellen nicht stammen. > Man hört schön, dass > eine fingernagel-große Membran keine niedriegen Frequenzen schafft... Doch, das kann sie. Nicht gerade effizient, klar, aber das kann sie. Allerdings wirst du davon nix hören, da akustischer Kurzschluss, solange du nur das reine LP-Chassis betreibst. Diesen Kurzschluss musst du beseitigen, wenn du tiefe Töne hören willst. Hast du den von mir verlinkten Artikel angeschaut? Insbesondere das Foto "Akustischer Testaufbau"? Die Klopapierrolle darin ist kein reiner Joke (Joke ist halt nur, dass es eine Klopapapierrolle ist), sie erledigt jedenfalls dort genau diesen Job. Die Zigarettenschachtel dient als zusätzliches Gewicht, um die Rolle schalldicht auf den Membranrand zu pressen. In einer realen Anwendung würde der Aufbau natürlich durch ein geeignetes Gehäuse ersetzt werden. Der springende Punkt ist der Weg, den der Schall zwischen der Oberseite und der Unterseite der Membran zurücklegen muss. Der muss umso länger sein, je tiefer die Frequenzen sind, die man abzustrahlen gedenkt. Google-Futter zu deiner Aufschlauung: "unendliche Schallwand". > Der AVR läuft mit ca. 3 V und hat den o.g. Filter. Wie schon gesagt: dieser Filter ist allenfalls geeignet, um die elektromagnetische Abstrahlung der PWM-Frequenz zu vermindern. Am Schallereignis selber ändert er so gut wie garnix. Bei 40kHz Samplerate kannst du ihn komplett weglasssen. Bei den ursprünglich von dir angegeben 8 kHz sieht das natürlich ganz anders aus, da braucht man einen Hardwarefilter unbedingt, wenn etwas halbwegs brauchbares rauskommen soll. > Wenn ich immer denselben Wert aus dem Flash lade (0x80), ist Ruhe - > Nebeneffekte meines Programms sind also nicht unbedingt schuld. Völlig unlogische Beweiskette. > Was ist das Problem / die Ursache? Was kann ich noch tun? > Den Frequenzgang vom Lautsprecher aufnehmen Das ist unnötig. Es gibt in diesem Frequenzgang nur eine wirklich kritische Sache, die Resonanzfrequenz. Die kann aber bei deinem Problem kaum die Ursache sein, weil sie sehr wahrscheinlich deutlich über 660Hz liegt. Ich würde mal schätzen, irgendwo bei 1..1,5kHz. Aber, viel wichtiger: selbst wenn sie exakt auf deiner Nutzfrequenz läge, würde sie nicht diese Oberwellen produzieren, sondern halt nur dafür sorgen, dass die 660Hz deutlich lauter würden. Aber bei dem lausigen Wirkungsgrad deiner 8 Ohm Lautsprecher an AVR-Ausgängen wäre die Leistung sehr sicher immer noch deutlich unterhalb dessen, was die Speaker abkönnen. Ähem, was können die eigentlich ab? Das hast du bisher nicht spezifiziert. Typisch wäre aber was im Bereich 0.5..2 W, also sehr, sehr weit über dem, was du mit 8 Ohm Last an einem AVR-Gegentaktausgang erreichen kannst.
Danke, ich kann evtl. So. damit weitermachen und Infos bzw. das Testprogramm nachreichen. Dass es bei der Größe keinen Bass geben kann ist mir klar, ich möchte die vermeintlichen Oberwellen eliminieren.
Der Lautsprecher stammt vermutlich aus einem alten Handy. Durchmesser 15 mm, Höhe 4 mm. Aufdruck: "WBN 8Ω 0.5 W". Hier mal das Testprogramm:
1 | #define F_CPU 16500000
|
2 | |
3 | #include <stdint.h> |
4 | #include <avr/io.h> |
5 | #include <avr/pgmspace.h> |
6 | //#include <avr/sleep.h>
|
7 | #include <avr/interrupt.h> |
8 | #include <avr/wdt.h> |
9 | #include <util/delay.h> |
10 | |
11 | const uint8_t PROGMEM sine[256] = { |
12 | 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, |
13 | 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, |
14 | 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, |
15 | 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8, |
16 | 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, |
17 | 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, |
18 | 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, |
19 | 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, |
20 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, |
21 | 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, |
22 | 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB, |
23 | 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, |
24 | 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, |
25 | 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3, |
26 | 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, |
27 | 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, |
28 | 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A, |
29 | 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, |
30 | 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C, |
31 | 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, |
32 | 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, |
33 | 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C, |
34 | 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, |
35 | 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, |
36 | 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, |
37 | 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, |
38 | 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, |
39 | 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, |
40 | 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, |
41 | 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, |
42 | 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, |
43 | 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D |
44 | };
|
45 | |
46 | volatile uint8_t reload = 47-1; |
47 | volatile uint8_t step = 1; |
48 | |
49 | int main(void) { |
50 | |
51 | MCUSR = 0; |
52 | GIFR = 0xFF; |
53 | wdt_disable(); |
54 | |
55 | while (!(PLLCSR & ((1 << PLLE) | (1 << PLOCK)))) {}; |
56 | PLLCSR |= (1 << PCKE); |
57 | TCCR1 |= (1 << PWM1A) | (1 << COM1A0) | (1 << CS10) ; |
58 | OCR1A = 127-1; |
59 | OCR1C = 255; |
60 | DDRB |= (1 << PB0 ) | (1 << PB1 ); |
61 | |
62 | TCCR0B |= (1<<CS01); |
63 | OCR0B = 255-1; |
64 | TIMSK |= (1<<OCIE0B); |
65 | |
66 | sei(); |
67 | for(;;){ |
68 | _delay_ms(500); |
69 | step = step < 8 ? step+1 : 1; |
70 | };
|
71 | }
|
72 | |
73 | |
74 | ISR(TIM0_COMPB_vect) { |
75 | static uint8_t i = 0; |
76 | OCR0B = TCNT0 + reload; |
77 | OCR1A = pgm_read_byte(&sine[i]); |
78 | i += step; |
79 | }
|
Als nächstes nehm ich mir nochmal den Testaufbau und den Filter vor. Ggf. auch einen Resonanzkörper, aber dafür ist eigentlich kein Platz... :-(
Moin, Sieht fuer mich so aus, als ob du eine Zeit lang einen 250kHz Rechteck mit 0x80/256 Tastverhaeltnis ausgibst, dann eine Zeit lang mit 0x83/256, dann mit 0x86/256 bzw. noch groesseren Spruengen bei hoeheren Frequenzen. Da waer's natuerlich besser fuer's Nichtvorhandensein von Oberwellen, wenn da interpoliert werden wuerde - also nicht von 0x80 direkt auf 0x83, sondern in 3 Schritten. Braucht halt mehr CPU Bumms. Gruss WK
Ja, die Updaterate der Sinusausgabe liegt hier testweise bei 40 kHz, im Gegensatz zu den 8 kHz Audiodaten, die ich eigentlich ausgeben will. Ich wollte ausschließen, die Updatefrequenz hören zu können. Trotzdem piept's nicht sauber. Aber es ist eine gute Idee, auch das mal zu testen; den Speicher für eine entsprechend größere Tabelle müsste ich eigentlich haben. Oder ich finde ein gutes Beispiel für eine DDS, das ich mit meiner Hardware ausprobieren kann.
Fragesteller schrieb: > Ja, die Updaterate der Sinusausgabe liegt hier testweise bei 40 kHz, im > Gegensatz zu den 8 kHz Audiodaten, die ich eigentlich ausgeben will. > Ich wollte ausschließen, die Updatefrequenz hören zu können. Das war erstmal der absolut korrekte Ansatz. So liegt die Samplefrequenz selber und ihre Mischprodukte mit dem Nutzsignal sicher außerhalb des Hörbereiches. > Trotzdem piept's nicht sauber. Das ist eigenartig. Dein Programm scheint mir soweit passend zu sein (ich habe allerdings nicht jedes einzelne Bit der Initialisierung der beiden Timer geprüft). Vielleicht schaue ich mir das morgen nochmal genauer an, heute habe ich wenig Zeit. Wenn man voraussetzt, dass bei der Initialisierung alles stimmt, dann bleibt da echt nicht mehr viel, was da noch schräg piepen könnte. Mir fallen da nur noch zwei mögliche Ursachen ein: 1) Lautsprecher beschädigt. Um das zu klären, wäre die Gegenprobe mit irgendeinem anderen Verstärker empfehlenswert. 2) Das Programm ist nicht das ganze Programm. Da hacken noch konkurrierende ISRs oder Interruptsperren in main() mit rum. Mit sowas kann man natürlich beliebigen Frequenzmüll an die Ausgänge bekommen, da die Ausgabe der Nutzfrequenz ja nunmal interuptgesteuert erfolgt. Die Frage wäre also hier: Ist das gezeigte Programm wirklich das ganze Programm? > Aber es ist eine gute Idee, auch das mal zu testen; den Speicher für > eine entsprechend größere Tabelle müsste ich eigentlich haben. Das wird vermutlich nix bringen. Das was durch diese Sache an den Ausgabe kommt, ist ja "nur" die Samplefrequenz und in der Folge ihre Mischprodukte mit dem Nutzsignal. Durch Erhöhung der Auflösung der Sinustabelle (zeitlich wie "räumlich") kann man die Menge an Energie senken, die davon am Ausgang ankommt. Aber: das ändert effektiv nix, weil das halt bei 40kHz Samplefrequenz das alles weit oberhalb des Hörbereiches ist. Bei 8 KHz Samplefrequenz sieht das dann natürlich ganz anders aus...
Ja, das gepostete Programm bzw. die Sinus-Ausgabe mit 40 kHz ist getestet und klirrt auch, wenn auch nicht so schrecklich wie meine ursprünglichen 8 kHz Samples. Den Lautsprecher zu testen ist eine gute Idee, das werde ich machen. Womöglich überanspruche ich ihn bereits bei 3 V? Leider weiss ich nicht, wie das abzuschätzen ist. Den Gegentest mit einem größeren Lautsprecher werde ich auch machen. Besten Dank für die Hilfsbereitschaft!
Moin, Sind denn die 250kHz PWM Frequenz und die 40kHz PWM-Update-Frequenz irgendwie phasenstarr miteinander verkoppelt? Gruss WK
Dergute W. schrieb: > Sind denn die 250kHz PWM Frequenz und die 40kHz PWM-Update-Frequenz > irgendwie phasenstarr miteinander verkoppelt? Nein, der schnelle Timer mit PWM wird von der asynchronen 64 MHz PLL getaktet: > Timer/Counter1 and the prescaler allow running the CPU from any > clock source while the prescaler is operating on the fast 64 MHz > (or 32 MHz in Low Speed Mode) PCK clock in the asynchronous > mode. Note that the system clock frequency must be lower than > one third of the PCK frequency. The synchronization mechanism of > the asynchronous Timer/Counter1 needs at least two edges of the > PCK when the system clock is high. If the frequency of the > system clock is too high, it is a risk that data or control > values are lost. Ich versuche jetzt erstmal, einen "Messaufbau" zu improvisieren, damit Vergleiche ansatzweise machbar sind.
Moin, Fragesteller schrieb: > Nein, der schnelle Timer mit PWM wird von der asynchronen 64 MHz PLL > getaktet: Na, das find' ich hochverdaechtig. Da koennen ja alle moeglichen Mischprodukte aus 250kHz und 40kHz und ihren Harmonischen entstehen; da sind sicher auch welche im Hoerbereich dabei... Gruss WK
Dergute W. schrieb: > Na, das find' ich hochverdaechtig. Da koennen ja alle moeglichen > Mischprodukte aus 250kHz und 40kHz und ihren Harmonischen entstehen; da > sind sicher auch welche im Hoerbereich dabei... Sicher. Aber die haben nur noch recht wenig Energie. Es fängt ja erst bei der 7. Harmonischen der Samplefrequenz an, in den Hörbereich zu rutschen. Und die Samplefrequenz selber kommt ja auch schon relativ "leise". Hörbar ist das möglicherweise (messbar auf jeden Fall), sollte aber, wahrnehmungsphysiologisch bedingt, eigentlich vom sehr viel stärkeren Nutzsignal komplett überdeckt werden. Nunja, wenn es denn tatsächlich sehr viel stärker ist und nicht durch akustischen Kurzschluss nahezu vollständig abwesend... Der entscheidende Punkt ist aber: Die Sache war als DDS geplant. Eine typische Eigenschaft von DDS ist halt, dass die Samplefrequenz gerade nicht phasenstarr an die PWM-Frequenz gekoppelt sein kann, nur deshalb funktioniert DDS als solches. Da führt leider kein Weg dran vorbei... Er hat das hier nur etwas anders als üblich gelöst. Solange der Interrupt für die Samplerate aber nicht durch irgendwelche Konkurrenz ernsthaft gestört wird, sollte das mindestens genausogut funktionieren wie die übliche Implementierung mit Phasenakku und bezüglich des Rechenzeitbedarfs sogar deutlich weniger "auftragen" als diese. Ich befürchte allerdings: es gibt Konkurrenz. Deswegen auch meine diesbezügliche Frage, die er aber nicht beantwortet hat... Ach so, eine Sache ist mir noch aufgefallen: OCR0B = TCNT0 + reload; Macht echt überhaupt keinen Sinn. Das müsste natürlich sinnvollerweise heißen: OCR0B += reload; Das hat gleich zwei Vorteile: erstens ist dann die Samplefrequenz wenigstens konstant und zweitens geht die variable Latenz nur einfach als Störung ein, nicht doppelt, was sogar dafür reichen könnte, dass sie als Störung am Ausgang komplett verschwindet und nur der übliche DDS-Kram überbleibt. Das aber eben nur, wenn es keine Konkurrenz gibt.
c-hater schrieb: > Ich befürchte allerdings: es gibt Konkurrenz. Deswegen auch meine > diesbezügliche Frage, die er aber nicht beantwortet hat... Keine Konkurrenz! Das ist der komplette Code: c-hater schrieb: > Ist das gezeigte Programm wirklich das ganze > Programm? Fragesteller schrieb: > Ja, ... Zugegeben, das ist keine eindeutige Antwort. Die "DDS" ist nur der Versuch, ein messbares, harmonisches Signal auf den Lautsprecher zu bringen, anstelle von irgendwelchen Audiodaten, damit die vermeintliche Störfrequenzen besser zu "sehen" sind. c-hater schrieb: > OCR0B += reload; Ja, das habe ich auch schon angezweifelt. Ich höre aber keinen Unterschied.
Fragesteller schrieb: > Zugegeben, das ist keine eindeutige Antwort. War es definitiv nicht. Weil der Bezug zur Frage fehlte. Lerne, ordentlich zu zitieren! > Die "DDS" ist nur der Versuch, ein messbares, harmonisches Signal auf > den Lautsprecher zu bringen Natürlich. Das haben wohl offensichtlich alle verstanden, die antworteten. > Ja, das habe ich auch schon angezweifelt. Ich höre aber keinen > Unterschied. Das wäre gut. Würde deine Aussage bestätigen, dass es keine Konkurrenz für die ISR gibt. Bleibt also nur der Lautsprecher selber als Ursache. Was ist also beim Crosscheck desselben rausgekommen?
c-hater schrieb: > Was ist also beim Crosscheck desselben rausgekommen? Das dauert noch. Im Anhang ein mit Elektret-Mikrofon und Speclab erzeugtes Spektrum des kleinen Lautsprechers. Gut zu sehen die Resonanz bei ca. 1.2 kHz, aber auch gegenläufige Frequenzen bei knapp über 10 kHz, die ich auch hören kann - was ist das? Resultat d. o.g. Mischens? Morgen schaffe ich hoffentlich einen stabileren Aufbau für Vergleichsaufnahmen mit anderen Wandlern und Signalgenerator (einen Verstärker bräuchte ich wohl auch noch). Guten Abend!
Spiegelfrequenzen? Zur Frage des TO: Sollte man dort nicht ein konventionelles 24db-Filter einsetzen? Ich meine, wozu haben wir die Frequenzweichen-Designer?
Fragesteller schrieb: > Im Anhang ein mit Elektret-Mikrofon und Speclab erzeugtes Spektrum des > kleinen Lautsprechers. Grausam. Die Software. Das Spektrum? Keine Ahnung, schwer zu erkennen... Gibt es in dieser Software keine tatsächlich sinnvolle Anzeigeoption? Hint: nicht das, was besonders bunt ist, ist die sinnvollste Option. Das kommt nur der Smartphone-Generation so vor...
c-hater schrieb: > Grausam. Die Software. Das Spektrum? Keine Ahnung, schwer zu erkennen... Ich hätte gerne etwas besseres! Was benutzt du denn?
Moin, Wenn ich das bunte Bildchen richtig interpretiere, sieht das ja garnicht soooo schlecht aus ;-) Wenn da ein Tiefpass mit 4kHz Grenzfrequenz vieles von "weiter oben" abschneiden taete... Wo die Obertoene des Sinuses herkommen, also 2,3,4 fache Grundfrequenz waer' halt noch die Frage - Kanns sein, dass da die Ausgaenge des µC in die Strombegrenzung gehen, wenn die den Lautsprecher treiben oder sowas? Gruss WK
Dergute W. schrieb: > Wenn da ein Tiefpass mit 4kHz Grenzfrequenz vieles von "weiter oben" > abschneiden taete... Wenn sich das (später für Audiodaten) nicht vermeiden lässt, OK. https://rf-tools.com/lc-filter/ sagt: 2nd order Butterworth lowpass (4 kHz: 243 uH und 7.3 uF). 3x3 mm: "Festinduktivitäten 1212 250uH 20% 110mA 9.6ohms" Dergute W. schrieb: > Wo die Obertoene des Sinuses herkommen, also 2,3,4 fache Grundfrequenz > waer' halt noch die Frage - Kanns sein, dass da die Ausgaenge des µC in > die Strombegrenzung gehen, wenn die den Lautsprecher treiben oder sowas? Ich hoffe, die baldigen "Messungen" bringen darüber Aufschluss.
Moin, Ja - bloed sind halt die Impedanzverhaeltnisse. Wenn du da tatsaechlich einen 100 Ohm Widerstand in Reihe schaltest, wird sich der AVR freuen, aber es wird ziemlich leise sein. Ohne Widerstand wird der AVR ordendlich abkotzen, wenn er so eine kapazitive Last sieht, die dann monstermaessigen Strom zieht. Gruss WK
Oje! Anbei die gleiche Tonfolge, allerdings mit entbeultem Lautsprecher (Käfig drückte auf Membran...), und 2x 100 Ohm in Serie (-> ca. 10 mA und 400 mV Offset an den Ausgängen); den Filter habe ich entfernt. Außerdem habe ich mir meine Sounddaten angesehen und feststellen müssen, dass dort auch schon störende Oberwellen enthalten sind. Mit Vorbehandlung durch Tiefpass und bei jetzt ca. 40 kHz Samplerate klingt es deutlich besser. Die Widerstände lassen sich wohl auch noch reduzieren. Das Gehäuse kommt zum Schluss, evtl. ergeben sich dann noch etwas bessere Tiefen. Vielen Dank für die Hilfsbereitschaft! Das heisst - könnte mir bitte noch jemand die "Spiegelfrequenzen" um 11 kHz erklären? Ist das die o.g. Harmonische (256-40.8*6 = 11.2)? Wie kann man die wegbekommen? Und einen Tipp zu einer guten Spektrogrammsoftware hätte ich auch gerne :-)
Fragesteller schrieb: > Das heisst - könnte mir bitte noch jemand die "Spiegelfrequenzen" um 11 > kHz erklären? Ist das die o.g. Harmonische (256-40.8*6 = 11.2)? Das wäre zumindest plausibel. > Wie kann > man die wegbekommen? Da würde dann der Vorschlag von Dergute W. greifen: zeitliche Auflösung der Sinustabelle erhöhen. Und/oder: "räumliche" Auflösung erhöhen. Das allerdings braucht ein Ausgabegerät mit mehr "Raum". So etwa das 10Bit-Teil, was ich realisiert habe... Beides führt jedenfalls tendenziell dazu, dass die Samplefrequenz (und damit all ihre Mischprodukte) einen kleineren Fußabdruck hinterläßt. > Und einen Tipp zu einer guten Spektrogrammsoftware hätte ich auch gerne Für Sachen im Audiobereich nehme ich ganz einfach erstmal Audacity. Bei der Filterentwicklung dann natürlich LTSpice.
Moin, Naja, es hat wohl Gruende, warum richtige 1bit Audio-DACs nicht unbedingt mit PWM und 250kHz Takt arbeiten. Will sagen: Irgendwann biste mit der Hardware/Softwarekombi am Anschlag - wahrscheinlich schneller, als dir lieb ist ;-) Gruss WK
Ja, mehr Sinuswerte bringen bei nur 40 kHz wahrscheinlich schon nichts mehr, weil für höhere Frequenzen als 150 Hz bereits Werte ausgelassen werden müssen. Und viel schneller als 40 kHz geht es so ohne weiteres nicht, da die CPU sonst ausgelastet ist und praktisch nur noch im Interrupt arbeitet (die delays in main brauchen dann deutlich länger). Es gibt einen informativen thread zu dds, in dem handoptimierter Assembler ohne Interrupt kontinuierlich Daten an einen DAC schreibt.
Die Mitte der "Spiegelfrequenzen" steigt mit der Samplefrequenz. Schätzwerte: 34 kHz -> 8,7 kHz 103 kHz -> 13,7 kHz Kein konstanter Faktor, eher nichtlinear.
Fragensteller schrieb: > Ja, mehr Sinuswerte bringen bei nur 40 kHz wahrscheinlich schon nichts > mehr, weil für höhere Frequenzen als 150 Hz bereits Werte ausgelassen > werden müssen. Ja stimmt, mit höherer Zeitauflösung der Tabelle ist da nix mehr zu wollen, das habe ich tatsächlich übersehen. Was als einziges bleibt: höhere "räumliche" Auflösung, sprich: mehr Bits. Damit das irgendeinen Sinn macht, brauchst du natürlich auch ein Ausgabegerät für mehr Bits. In C und bei nur 8MHz MCU-Takt kannst das aber praktisch knicken. Also: Ende der Fahnenstange. Jedenfalls in C... Weiter hilft nur: Asm (und ein etwas anderes Konzept der Anwendung). Und natürlich Hardware-Filter. Die erfordern aber wiederum recht hohe Induktivitäten. Also groß. Aber das wurde im Thread ja bereits erwähnt und kannst du auch in meiner Lösung sehen.
c-hater schrieb: > Ja stimmt, mit höherer Zeitauflösung der Tabelle ist da nix mehr zu ^allein Da fehlte noch ein Wort.
Dergute W. schrieb: > Ja - bloed sind halt die Impedanzverhaeltnisse. Wenn du da tatsaechlich > einen 100 Ohm Widerstand in Reihe schaltest, wird sich der AVR freuen, > aber es wird ziemlich leise sein. Ohne Widerstand wird der AVR > ordendlich abkotzen, wenn er so eine kapazitive Last sieht, die dann > monstermaessigen Strom zieht. und wahrscheinlich binnen kürzester Zeit abkacken!
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.