Forum: Mikrocontroller und Digitale Elektronik Sinus aus R2R filtern


von Heinz peter P. (poschi8)


Angehängte Dateien:

Lesenswert?

Hallo,
ich erzeuge mit einem Arduino und einer R2R Leiter ein Sinus Signal.
Diese Signal wird verstärkt und über einen Transformator 
hochtransformiert (100V-300V)

Nun ist es so das beim Erzeugen des Sinus mittels der R2R Leiter einiege 
Ausbrüche am Signal entstehen (siehe Anhang), und auch durch das 
Verstärken und Hochtransformieren wird das Signal am ende sehr unsauber 
und hat ein hässliches rauschen.

Meine Frage nun: reicht ein einfacher Tiefpass aus um dieses Signal am 
Ausgang zu Filtern?

Grenzfrequenz wäre bei ca 70Hz
Daraus habe ich folgendes errechnet: R=2,2k Ohm und C=1uF
Der Kondesnsator muss natürlich die dementsprechende Spannungsfestigkeit 
haben..

Vielen Dank für eure Anworten und Vorschläge.

lg,
poschi8

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Heinz peter P. schrieb:
> Meine Frage nun: reicht ein einfacher Tiefpass aus um dieses Signal am
> Ausgang zu Filtern?

Das hängt vom Verhältnis der Abtastrate zur maximal auszugebenden
Frequenz ab.

Allerdings wäre die erwartete Kurvenform erstmal eine Art Treppe, nicht
so ein Dingens mit so vielen Spikes.  Das riecht nach schlechter
Abblockung des Controllers und/oder Masseführung.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Da scheint ein systematisches Problem vorzuliegen, denn die Peaks sind 
immer an der gleichen Stelle im Wellenzug. Ich schlage dir vor, die 
Software erstmal sauber zu machen, dann hat sich das Filterproblem 
darauf reduziert, die Umschalttreppchen zu glätten.

von Baldrian (Gast)


Lesenswert?

Kann es sein, dass in der Tabelle fehlerhafte Sinuswerte abgelegt 
wurden?

von Heinz peter P. (poschi8)


Lesenswert?

Ich werde mal meinen Code überprüfen ob das sicherlich so passt, danke 
für den Hinweis :)

lg,
poschi8

von Falk B. (falk)


Lesenswert?

@Heinz peter Posch (poschi8)

>Nun ist es so das beim Erzeugen des Sinus mittels der R2R Leiter einiege
>Ausbrüche am Signal entstehen (siehe Anhang),

Das sind möglicherweise Meßfehler. Oder Programmierfehler bei deiner 
DAC-Ausgabe.

> und auch durch das
>Verstärken und Hochtransformieren wird das Signal am ende sehr unsauber
>und hat ein hässliches rauschen.

Außerdem fehlt dir der Rekonstruktionsfilter, den eigentlich jeder DAC 
braucht.

>Meine Frage nun: reicht ein einfacher Tiefpass aus um dieses Signal am
>Ausgang zu Filtern?

Ja, wenn man ihn richtig dimensioniert.

>Grenzfrequenz wäre bei ca 70Hz

Nö. Der Filter orientiert sich an der DAC-Samplingfrequenz, nicht deiner 
Ausgabefrequenz.

>Daraus habe ich folgendes errechnet: R=2,2k Ohm und C=1uF

Das Problem ist aber, daß der Filter am Ausgang mit einem OPV entkoppelt 
werden muss.

von Falk B. (falk)


Lesenswert?

@Heinz peter Posch (poschi8)

>ich erzeuge mit einem Arduino und einer R2R Leiter ein Sinus Signal.

Zeig mal deine Software. Wenn du auf dem normalen Arduino-Framework 
aufbaust, spuckt dir ggf. der 1ms Timer0 dazwischen.

von M.A. S. (mse2)


Lesenswert?

Baldrian schrieb:
> Kann es sein, dass in der Tabelle fehlerhafte Sinuswerte abgelegt
> wurden?

Um das zu verifizieren würde ich vorschlagen, einmal höherauflösend zu 
oszillogrfieren, sprich: so einen Spike mal genauer darzustellen, so 
dass man sieht, ob hier eine komplette Stufe den falschen Wert hat oder 
ob es sich nur um einen kurzen Störimpuls handelt (kürzer als die 
Stufenweite, meine ich damit).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
>> Grenzfrequenz wäre bei ca 70Hz
>
> Nö. Der Filter orientiert sich an der DAC-Samplingfrequenz, nicht deiner
> Ausgabefrequenz.

Am Verhältnis beider.

Wenn du mit sehr vielen Stützstellen nur langsame Signale ausgeben
willst, kommst du mit einem deutlich einfacher gestrickten Filter
hin, als wenn du kurz vor der „Erbrechensgrenze“ fast an der
Nyquist-Grenze arbeiten willst.

von M.A. S. (mse2)


Lesenswert?

Ergänzung:
Du schreibst, das Signal wird mittels R2R-Leiter erzeugt. Ist evtl. die 
Übernahme der Bit-Werte an den einzelnen Ausgängen nicht synchron?

Hier wäre nun tatsächlich ein Blick in die Firmware interessant...

von holger (Gast)


Lesenswert?

>Ist evtl. die
>Übernahme der Bit-Werte an den einzelnen Ausgängen nicht synchron?

Bzw. ist die R2R Leiter auf mehrere Ports verteilt?

von Duck&Wech (Gast)


Lesenswert?

Matthias S. schrieb:
> Da scheint ein systematisches Problem vorzuliegen, denn die Peaks sind
> immer an der gleichen Stelle im Wellenzug.

Vielleicht ist auch nur der Dimmer der Arbeitsplatzbeleuchtung schuld.

von Peter D. (peda)


Lesenswert?

Heinz peter P. schrieb:
> Nun ist es so das beim Erzeugen des Sinus mittels der R2R Leiter einiege
> Ausbrüche am Signal entstehen (siehe Anhang)

Du setzt nicht einen Port, sondern die Pins einzeln nacheinander. Das 
ergibt dann Zwischenwerte (Glitches).

von c-hater (Gast)


Lesenswert?

Falk B. schrieb:

> Außerdem fehlt dir der Rekonstruktionsfilter, den eigentlich jeder DAC
> braucht.

Ja, allerdings kann man in in diesem Fall wohl sehr gut auf ein 
dediziertes Rekonstruktionsfilter verzichten.

Es gibt nämlich nach der Beschreibung des TO gleich zwei Baugruppen nach 
dem DAC, die sich förmlich dafür anbieten, gleichzeitig auch 
Rekonstruktionsfilter zu sein (oder zumindest ein Teil davon).

Als erstes wäre da der Verstärker. Wie auch immer der aufgebaut ist: es 
dürfte sehr leicht und billig umzusetzen sein, seinen Frequenzgang nach 
oben dramatisch zu beschränken.

Und danach kommt dann auch noch der Trafo. Auch der schreit geradezu 
danach, mit einem Kondensator (und evtl. einem Widerstand) zu einem 
Resonator ergänzt zu werden.

Das eigentliche Problem des TO wird allerdings beides nicht lösen: die 
extremen Glitches im Signal stammen entweder von einem Programmierfehler 
oder von massiven Mängeln in der Konstruktion. Oder auch von beidem...

[Implizierte Beleidigung gelöscht - Mod.]

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Duck&Wech schrieb:
> Matthias S. schrieb:
>> Da scheint ein systematisches Problem vorzuliegen, denn die Peaks sind
>> immer an der gleichen Stelle im Wellenzug.
>
> Vielleicht ist auch nur der Dimmer der Arbeitsplatzbeleuchtung schuld.

Wenn der R2R DAC bereits mit der Beleuchtung synchron läuft, hat der TE 
meinen Respekt :-P Sieht allerdings doch mehr nach einem 
Portschreib-Problem aus.

von Falk B. (falk)


Lesenswert?

Für einen 70 Hz Sinus braucht man auch keinen R2R DAC, da tut es ein 
EINZELNER PWM-Ausgang locker. Den füttert man mit ein paar kHz, fertig.

Siehe DDS

Beitrag "Re: SPWM auf Atmega8, bitte um Feedback hinsichtlich Optimierung"

von Jobst M. (jobstens-de)


Lesenswert?

Das Stichwort 'Glitches' wurde schon genannt. Man bekommt sie mit einer 
SampleHold Stufe weg. Dazu wird, nachdem alle Bits korrekt am DAC 
anliegen und sich die Ausgangsspannung beruhigt hat, diese mit einer S&H 
gesamplet.

Gruß
Jobst

von Heinz peter P. (poschi8)


Lesenswert?

Hi,

ich habe das Problem bereits gefunden es werden bei mir 2 Ports 
verwendet, geht leider nicht anders..

Wie bekomme ich das den nun am besten in den Griff?

LG,
poschi8

von Peter D. (peda)


Lesenswert?

Heinz peter P. schrieb:
> Wie bekomme ich das den nun am besten in den Griff?

Man kann die beiden Ausgaben so schreiben, daß sie direkt nacheinander 
erfolgen. Bei 16MHz wäre dann der Glitch nur 63ns breit, d.h. bei 1ms 
Zeitbasis nicht mehr sichtbar.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du kannst auch beide Ports zusammen auf einen z.B. 74HC574 führen und 
dann mit einem einzigen Latch Impuls auf den R2R legen. Kostet aber 
einen Pin extra für den Latchpuls.

Heinz peter P. schrieb:
> ich habe das Problem bereits gefunden es werden bei mir 2 Ports
> verwendet, geht leider nicht anders.

Klassischer Planungsfehler, wenn ich das mal so sagen darf.

: Bearbeitet durch User
von Heinz peter P. (poschi8)


Lesenswert?

Peter D. schrieb:
> Heinz peter P. schrieb:
>> Wie bekomme ich das den nun am besten in den Griff?
>
> Man kann die beiden Ausgaben so schreiben, daß sie direkt nacheinander
> erfolgen. Bei 16MHz wäre dann der Glitch nur 63ns breit, d.h. bei 1ms
> Zeitbasis nicht mehr sichtbar.

Meinst du damit das ich die beiden Werte als byte abspeichere und dann 
nacheinander auf die Ports schreibe?

Der Grund warum ich 2 Ports hab ist das ich nur einen Arduino Nano zur 
Verfügung habe (http://www.pighixxx.com/test/pinouts/boards/nano.pdf)

Dort ist das etwas schwierig..
Ich verwende PD5,PD6,PD7 und PB0-PB4.
Den Port D kann ich nicht verwenden da ich eine serielle Kommuniaktion 
verwende und die Ports PD0 und PD1 dafür benötige.

LG,
Poschi8

von Bernd K. (prof7bit)


Lesenswert?

Matthias S. schrieb:
> Du kannst auch beide Ports zusammen auf einen z.B. 74HC574 führen und
> dann mit einem einzigen Latch Impuls auf den R2R legen. Kostet aber
> einen Pin extra für den Latchpuls.

Und ein zusätzliches Bauteil auf der Platine. Und wenn man sich schon zu 
einem weiteren Bauteil auf der Platine durchgerungen hat dann kann man 
auch gleich einen fertigen externen DAC mit SPI-Interface nehmen, dann 
spart man sich auch gleich die ganze Batterie an Widerständen und viele 
Portpins.

Oder gleich einen µC mit DAC nehmen.

Oder wenns auf Biegen und Brechen dieses eine Arduino-Board sein muss 
und kein anderes dann vielleicht mal über einen Delta-Sigma DAC 
nachdenken, da gibts auch simple Codebeispiele (kaum mehr als ein 
Dutzend Zeilen C-Code), auch hier im Forum wurde das schon diskutiert 
und das spart gegenüber R2R dramatisch Hühnerfutter und Portpins.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Heinz peter P. schrieb:
> Ich verwende PD5,PD6,PD7 und PB0-PB4.
1
void output( uint8_t val )
2
{
3
  uint8_t pb, pd;
4
  pb = PORTB & 0b11100000 | val & 0b00011111;   // PB4..0
5
  pd = PORTD & 0b00011111 | val & 0b11100000;   // PD7..5
6
  PORTB = pb;
7
  PORTD = pd;
8
}

von Falk B. (falk)


Lesenswert?

@Heinz peter Posch (poschi8)

>ich habe das Problem bereits gefunden es werden bei mir 2 Ports
>verwendet, geht leider nicht anders..

>Wie bekomme ich das den nun am besten in den Griff?

Nimm PWM. Damit machen andere sogar eine Audioausgabe mit mehreren kHz 
Bandbreite.

Beitrag "Re: Sinus aus R2R filtern"

von H.Joachim S. (crazyhorse)


Lesenswert?

Lösungsmöglichkeiten sind ja nun genug aufgezeigt...
Unabhängig von allem wäre trotzdem mal die Software interessant. Ich 
verstehe nicht, wieso da glitches von 2,5V auftreten, d.h. 1MSB. Das 
kann doch gar nicht passieren? Es sei denn, man beschreibt die Portbits 
einzeln :-)

von Falk B. (falk)


Lesenswert?

@H.Joachim Seifert (crazyhorse)

> Es sei denn, man beschreibt die Portbits einzeln :-)

Das ist keineswegs abwegig, schon gar nicht im Arduino-Universum :-0

von H.Joachim S. (crazyhorse)


Lesenswert?

Genau das befürchte ich :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Das ist keineswegs abwegig, schon gar nicht im Arduino-Universum :-0

Aber selbst da dürfte deine PWM-Idee völlig problemlos umsetzbar
sein – und spart sogar noch Bauteile.  Allerdings ist das
Rekonstruktionsfilter dafür ein wenig aufwändiger.

von H.Joachim S. (crazyhorse)


Lesenswert?

Naja, nun ist die Hardware einmal da. Und wenn die Software im Rahmen 
des möglichen richtig gemacht wird, genügt es ja vielleicht.

von Heinz peter P. (poschi8)


Lesenswert?

H.Joachim S. schrieb:
> Naja, nun ist die Hardware einmal da. Und wenn die Software im Rahmen
> des möglichen richtig gemacht wird, genügt es ja vielleicht.

Genau das ist das Problem..
Die Platine ist eigentlich schon vorgegeben.
Ich kann nur mehr den Code verändern, aber ich werde einfach die beiden 
Ports beschreiben dann sollte das schon laufen.

Vielen Dank für die zahlreichen Antworten :)

LG,
poschi8

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Heinz peter P. schrieb:
> Die Platine ist eigentlich schon vorgegeben.

Und dein Rekonstruktionsfilter?  Das wirst du ja wohl oder übel
irgendwo unterbringen müssen.  Da könntest du es auch gleich auf
einen PWM-Pin hängen.

Die Arduino-Nano-Dok meint:

„PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the 
analogWrite() function.“

von ich trinke ein Bit (Gast)


Lesenswert?

Falk B. schrieb:
> @Heinz peter Posch (poschi8)
>
>>ich habe das Problem bereits gefunden es werden bei mir 2 Ports
>>verwendet, geht leider nicht anders..
>
>>Wie bekomme ich das den nun am besten in den Griff?

Nicht tragisch.
Einfach von einem Ausgabewert zum nächsten nur jene Bits kippen welche 
Wertänderung in die gewünschte Richtung verursachen aber in sinnvoller 
Reihenfolge.
So mögen immernoch Zwischenwerte rauskommen, aber nur welche Ni < zw < 
Ni+1.
Ja: das erfordert etwas mehr als bloss 2 aufeinanderfolgende 
Portoperationen, geht aber auch in der "Arduinowelt" (ist ja auch bloss 
C/C++).

von Jobst M. (jobstens-de)


Lesenswert?

ich trinke ein Bit schrieb:
> Einfach von einem Ausgabewert zum nächsten nur jene Bits kippen welche
> Wertänderung in die gewünschte Richtung verursachen aber in sinnvoller
> Reihenfolge.

Na dann:
Von 64 auf 32. Welche Änderung schlägst Du vor? zuerst auf 96 oder auf 
0?
Oder von 64 auf 63. Welches Bit bringt hier Annäherung?

ich trinke ein Bit schrieb:
> geht aber auch in der "Arduinowelt"

Das geht sogar in der nicht-Arduinowelt nicht.


Heinz peter P. schrieb:
> Wie bekomme ich das den nun am besten in den Griff?

Patch oder Redesign. Entweder ein Busregister oder die 
Sample&Hold-Schaltung. Oder einen externen DAC, der keine Glitches 
erzeugt. PWM wurde ja auch schon genannt.

Gruß
Jobst

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Bernd K. schrieb:
> ... dann vielleicht mal über einen Delta-Sigma DAC
> nachdenken,

Das wuerd' ich auch. Aber in Tateinheit mit z.B. den 4 Bits eines 
Ports, an denen der R2R Wandler haengt und die gleichzeitig beschrieben 
werden koennen. Man kann auch mehrbittige SD-DACs bauen. Mit R2R 
Netzwerken sind eh' nicht mehr als 4..6Bit vernuenftig zu realisieren. 
Was drueber hinausgeht sind eh' Hausnummern.
Am Ausgang eines R2R Wandlers hat man uebrigens auch eine ziemlich genau 
definierte Impedanz, d.h. da kann man z.b. prima mit einem C nach Masse 
gehen und hat einen TP 1. Ordnung. Oder entsprechend Richtung OpAmp oder 
einzelner Transistor fuer TP 2..3 Ordnung.

Gruss
WK

von Michael W. (Gast)


Lesenswert?

Da scheint wohl programmiertechnisch etwas zu bremsen. Die R2R müssen 
natürlich voll parallel geschaltet werden. Im Rahmen dieser Genauigkeit 
des höchsten Bits packt man das in der Tat auch mit einer PWM.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Markus W. schrieb:
> Da scheint wohl programmiertechnisch etwas zu bremsen.

Eher vom Hardwaredesign des Nano.

Wenn der die PWM aber schon unter Analog-Ausgabe sortiert, dann liegt
es nahe, sie genau dafür zu nehmen.

von J. S. (engineer) Benutzerseite


Lesenswert?

Am Besten einen vordefinierten PDM-Datenstrom wie sowas in der Abbildung 
unten:
[Pulsdichtemodulation].

Damit kommt man auch bei einem einfachen RC-Filter mit einem overhead 
von 10 Oktaven aus und hat trotzdem an die 60dB sfdr für die volle 
Bandbreite nach unten. Wenn es nur 70Hz fest sein sollen, wäre ein 
Sperrfilter noch besser und es reichen 5 Oktaven. Ein selbsschwingendes 
24dB-Resonanz-Filter kann man sogar fast mit einem Rechteck ansteuern. 
Kommt alles auf die Präzisionsanforderung an.

von Falk B. (falk)


Lesenswert?

@Jürgen S. (engineer)

>Am Besten einen vordefinierten PDM-Datenstrom wie sowas in der Abbildung
>unten:
>[Pulsdichtemodulation].

>Damit kommt man auch bei einem einfachen RC-Filter mit einem overhead
>von 10 Oktaven aus und hat trotzdem an die 60dB sfdr für die volle
>Bandbreite nach unten. Wenn es nur 70Hz fest sein sollen, wäre ein
>Sperrfilter noch besser und es reichen 5 Oktaven. Ein selbsschwingendes
>24dB-Resonanz-Filter kann man sogar fast mit einem Rechteck ansteuern.
>Kommt alles auf die Präzisionsanforderung an.

Wollen wir wetten, daß diese Lösungen den OP um mindesten 40dB 
überfordern . . .?

von Heinz peter P. (poschi8)


Lesenswert?

So ich hab das Problem jetzt gelöst :)
Hab den Code noch mal angeschaut und überarbeitet, zusätzlich habe ich 
noch einen Tiefpass am Ausgang nachgeschalten, jetzt schaut mein Sinus 
wie gezeichnet aus ;)

Vielen Dank für eure Hilfe!!
Ihr seid spitze :))

LG,
poschi8

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.