Forum: Mikrocontroller und Digitale Elektronik 250 kHz PWM -> ¿Filter? -> micro speaker


von Fragesteller (Gast)


Lesenswert?

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...)?

von Fragesteller (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

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".

von Dyson (Gast)


Lesenswert?

Fragesteller schrieb:
> ¿

Was soll das denn? Dies ist ein seriöses Forum. Hier werden keine 
Fragezeichen umgedreht.

von Harald (Gast)


Lesenswert?

Kennst Du dieses berühmte Projekt hier?
http://elm-chan.org/works/sd8p/report.html
Da steht auch etwas zur Hardware.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Dergute W. (derguteweka)


Lesenswert?

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

von Fragesteller (Gast)


Lesenswert?

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"

von Fragesteller (Gast)


Angehängte Dateien:

Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von Fragesteller (Gast)


Lesenswert?

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.

von Fragesteller (Gast)


Lesenswert?

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... 
:-(

von Dergute W. (derguteweka)


Lesenswert?

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

von Fragesteller (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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...

von Fragesteller (Gast)


Lesenswert?

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!

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Sind denn die 250kHz PWM Frequenz und die 40kHz PWM-Update-Frequenz 
irgendwie phasenstarr miteinander verkoppelt?

Gruss
WK

von Fragesteller (Gast)


Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Fragesteller (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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?

von Fragesteller (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Jens U. (Gast)


Lesenswert?

Spiegelfrequenzen?

Zur Frage des TO: Sollte man dort nicht ein konventionelles 24db-Filter 
einsetzen? Ich meine, wozu haben wir die Frequenzweichen-Designer?

von c-hater (Gast)


Lesenswert?

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...

von Fragesteller (Gast)


Lesenswert?

c-hater schrieb:
> Grausam. Die Software. Das Spektrum? Keine Ahnung, schwer zu erkennen...

Ich hätte gerne etwas besseres! Was benutzt du denn?

von Dergute W. (derguteweka)


Lesenswert?

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

von Fragesteller (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von Fragesteller (Gast)


Angehängte Dateien:

Lesenswert?

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 
:-)

von c-hater (Gast)


Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von Fragensteller (Gast)


Lesenswert?

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.

von Fragesteller (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Ja stimmt, mit höherer Zeitauflösung der Tabelle ist da nix mehr zu
                                                         ^allein

Da fehlte noch ein Wort.

von Jens U. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.