Hm hat jemand eine Idee: Ohles fpga-board (Spartan3an) soll einen Sinus erzeugen, 48-52 kHz Ausgangsfrequenz, Amplitude möglichst gleich über den kompletten Ausgangsbereich. Leider ist die maximale Samplingrate des DAC's auf dem Board ca. 125kHz, das wären also nur knapp 3 Samples pro Periode... What should I do? - Square Wave erzeugen + RCRCRC ergibt einen netten Sinus, allerdings unterschiedliche Ampliduten. - PWM + Filterung + AGC (siehe Anhang) funktioniert fast, allerdings scheint die Regelung bei knapp 51kHz auszusetzen... Hm... Oder einfach einen externen schnelleren DAC besorgen... Irgendwelche Ideen?
Moin, Vielleicht ist hier: Jonas B. schrieb: > RCRCRC noch etwas Potential fuer ein besseres Filter? Gruss WK
Wenn du nur diesen schmalen frequenzbereich abdecken musst würde ich ganz einfach ein Rechteck der entprechenden frequenz (sprich exakt 2 saples pro Periode) ausgeben und tiefpass filtern... Bei einem sauberen 50% duty cycle muss sich das filter dann primär um die Unterdrückung der ungeraden Oberwellen kümmern, was die nötige Filterordnung im Rahmen hält. Ein normaler GPIO pin würde es dann übrigens auch tun.
>Wenn du nur diesen schmalen frequenzbereich abdecken musst würde ich >ganz einfach ein Rechteck der entprechenden frequenz (sprich exakt 2 >saples pro Periode) ausgeben und tiefpass filtern... >Bei einem sauberen 50% duty cycle muss sich das filter dann primär um >die Unterdrückung der ungeraden Oberwellen kümmern, was die nötige >Filterordnung im Rahmen hält. >Ein normaler GPIO pin würde es dann übrigens auch tun. Also quasi die erste Stufe des RCRCRC Filters "simulieren"? Gute Idee...werd ich mal testen.
Jonas B. schrieb: > Ohles fpga-board (Spartan3an) soll einen Sinus erzeugen, 48-52 kHz > Ausgangsfrequenz, Amplitude möglichst gleich über den kompletten > Ausgangsbereich. > - PWM + Filterung + AGC (siehe Anhang) funktioniert fast, allerdings > scheint die Regelung bei knapp 51kHz auszusetzen... Wozu AGC? Man nimmt 1.) nicht PWM sondern einen Sigma Delta Wandler, damit vereinfacht sich der Ausgangsfilter deutlich und man braucht keine exorbitanten PWM-Takte. 2.) Bei PWM und Sigma Delta ist bei korrekter Filterdimensionierung die Amplitude konstant, keinerlei Regelbedarf.
Was haltet ihr davon? hab ich gerade durch Zufall gefunden, sieht ganz vielversprechend aus.
Viel Zuviel Aufwand, PWM bzw. Sigmal Delta ist einfacher und liefert bessere Ergebnisse.
>Wozu AGC? Man nimmt >1.) nicht PWM sondern einen Sigma Delta Wandler, damit vereinfacht sich >der Ausgangsfilter deutlich und man braucht keine exorbitanten >PWM-Takte. >2.) Bei PWM und Sigma Delta ist bei korrekter Filterdimensionierung die >Amplitude konstant, keinerlei Regelbedarf. Yes man :D Danach hab ich gesucht. Vielen Dank!!
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.all; |
3 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
4 | |
5 | entity PWM is |
6 | port ( |
7 | clk : in std_logic; |
8 | PWM_in : in std_logic_vector (7 downto 0) := "00000000"; |
9 | PWM_out : out std_logic |
10 | );
|
11 | end PWM; |
12 | |
13 | architecture PWM_arch of PWM is |
14 | signal PWM_Accumulator : std_logic_vector(8 downto 0); |
15 | begin
|
16 | process(clk, PWM_in) |
17 | begin
|
18 | if rising_edge(clk) then |
19 | PWM_Accumulator <= ("0" & PWM_Accumulator(7 downto 0)) + ("0" & PWM_in); |
20 | end if; |
21 | end process; |
22 | |
23 | PWM_out <= PWM_Accumulator(8); |
24 | end PWM_arch; |
So ich werd mal den Code testen, das jetzt viel einfachere Ausgangsfilter sollte doch ein Tiefpass sein. Wie hoch wähle ich die Grenzfrequenz, First order sollte ja reichen oder? vielen dank.
Jonas B. schrieb: > Was haltet ihr davon? hab ich gerade durch Zufall gefunden, sieht > ganz vielversprechend aus. Die Idee gefällt mir trotzdem ganz gut. Statt 8 Flip-Flöpse hintereinander zu schalten, könnte man auch einen einzigen CD4020 oder CD4040 einsetzen. Es werden dann lediglich noch die 7 Widerstände und ein Kondensator benötigt.
>Die Idee gefällt mir trotzdem ganz gut. Statt 8 Flip-Flöpse >hintereinander zu schalten, könnte man auch einen einzigen CD4020 oder >CD4040 einsetzen. Es werden dann lediglich noch die 7 Widerstände und >ein Kondensator benötigt. Die haben ja reichlich FlipFlöpse in das fpga reingefercht. Auf Anhieb wüsste ich aber nicht wie ich der alten ISE, die in dieser Konfiguration abkaufen könnte... Das gäb wieder zähe Verhandlungen :D Deswegen beherzige ich erstmal Falks Tip :D
Ach Du grüne Neune schrieb: > Statt 8 Flip-Flöpse > hintereinander zu schalten, könnte man auch einen einzigen CD4020 oder > CD4040 einsetzen. Nee, das sind keine Ripplezaehler sondern Schieberegister. Aber da musste dann sicherstellen, dass die z.b. nach dem Einschalten auch immer "das richtige" schieben. Das sind so Schaltungen, die vor 30 Jahren mal hip waren. Wenn eh' schon ein FPGA da ist, dann kann man das gut entweder mit einem Rechteckausgang und entsprechendem Tiefpass (hoeherer Ordnung, Cauer, etc.) machen, oder mit einem simpleren Tiefpass und z.b. 1...x Bit SigmaDelta oder PWM oder whatever. Kommt halt drauf an, was man braucht, was man kann und was man will... Gruss WK
Jonas B. schrieb: > So ich werd mal den Code testen Das, was da zu sehen ist, ist eine https://de.wikipedia.org/wiki/Deltamodulation > Wie hoch wähle ich die Grenzfrequenz Kann man ausrechnen. So hoch wie nötig, um die niedrigste Frequenz, die von der FPGA-Taktfrequenz abhängt und mit den Eingangswerten 00000001 und 11111110 auftritt ausreichend zu dämpfen. > First order sollte ja reichen oder? Hängt vom Ergebnis der obigen Rechnung ab. Ich würde das etwa so anfangen: http://www.lothar-miller.de/s9y/categories/31-DDFS Ein Schritt weiter ist dann, das daraus gewonnene Sinussignal in eine PWM einzuspeisen und mit einem RC-Glied zu filtern: http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html Alternativ könntest du da natürlich statt der PWM auch deinen Deltamodulator dranhängen...
Jonas B. schrieb: > o ich werd mal den Code testen, Das ist aber erstmal KEIN Sigma-Delta-Wandler, nur der DDS-Zähler. > das jetzt viel einfachere > Ausgangsfilter sollte doch ein Tiefpass sein. Ja. > Wie hoch wähle ich die > Grenzfrequenz, Naja, wenn wir mal von 60dB Unterdrückung ausgehen, sollte dein Filter vielleicht 200kHz Grenzfrequenz haben und dein Sigma Delta Wandler mit mindestens 20 MHz getaktet sein. >First order sollte ja reichen oder? Ja.
Falk B. schrieb: > Jonas B. schrieb: >> o ich werd mal den Code testen, > Das ist aber erstmal KEIN Sigma-Delta-Wandler, nur der DDS-Zähler. Habe ich auch erst gedacht und habs vorsorglich mal nichts gesagt und das Ding simuliert... ;-) Der "Akku" sieht zwar aus wie ein DDFS-Akku, ist aber dafür zu kurz und zeitig deshalb das PDM-Signal. Putzige Sache, muss ich mir merken.
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Der "Akku" sieht zwar aus wie ein DDFS-Akku, ist aber dafür zu kurz und > zeitig deshalb das PDM-Signal. Putzige Sache, muss ich mir merken. Sachen gibt's 8-0
>Ich würde das etwa so anfangen: >http://www.lothar-miller.de/s9y/categories/31-DDFS >Ein Schritt weiter ist dann, das daraus gewonnene Sinussignal in eine >PWM einzuspeisen und mit einem RC-Glied zu filtern: >http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html >Alternativ könntest du da natürlich statt der PWM auch deinen >Deltamodulator dranhängen... Ich wünschte ich könnte dir meinen bisherigen Projektverlauf aufzeigen... aber ziemlich genauso wie du beschrieben hast bin ich vorgegangen XD Leider bin ich auch nur mit der halben Wahrheit rausgerückt... Die Erzeugung des Signals ist nur der Anfang. Das Sinussignal soll ein DUT speisen und anschließend wieder zurück zum FPGA-Board auf die vorhandenen AD-Wandler. Dann würde ich gerne das Spektrum analysieren. Ein FFT-Core dafür hab ich sogar erzeugen können, erstaunlicher weise läuft der sogar, in der Testbench die ich erzeugt habe. Ich hab ihn dafür einfach gestartet und immer den gleichen Wert (imäginarteil auf null gesetzt) in den real teil geschrieben. sobald "done" auf high geht seh ich nur im dc band einen wert. das macht wieder mut :D. Eigentlich muss ich die ganzen Teile nur zusammenfügen. Wenn es ja wirklich nur so einfach wäre.. >Naja, wenn wir mal von 60dB Unterdrückung ausgehen, sollte dein Filter >vielleicht 200kHz Grenzfrequenz haben und dein Sigma Delta Wandler mit >mindestens 20 MHz getaktet sein. >>First order sollte ja reichen oder? >Ja. Ok. Also 82ohm und 10nF. Danke.
Jonas B. schrieb: > Also 82ohm und 10nF. Danke. Die Grenzfrequenz wird tatsächlich niedriger ausfallen, weil da die Bahnwiderstände der Ausgangs-FET noch mit reinkommen. Ich würde das hochohmiger auslegen...
:
Bearbeitet durch Moderator
Jonas B. schrieb: > Danke für den Tip, meinst du 820ohm und 1nF ist gut? Ja, denn so ein FPGA-Ausgang ist kein 1A Leistungstreiber.
Hm bei mir kommt immer nur 'X' und auch eine Fehlermeldung: Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es). ISim> Kannst du mal deinen Code posten, oder sagen was du geändet hast? :D Danke
Ich hab das nur so geändert, das die doofe Sensitiv-Liste keine Rolle mehr spielt. War das falsch?
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.all; |
3 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
4 | |
5 | entity sigmadeltadac is |
6 | port ( |
7 | clk : in std_logic; |
8 | PWM_in : in std_logic_vector (7 downto 0) := "00000000"; |
9 | PWM_out : out std_logic |
10 | );
|
11 | end sigmadeltadac; |
12 | |
13 | architecture PWM_arch of sigmadeltadac is |
14 | signal PWM_Accumulator : std_logic_vector(8 downto 0):="000000000"; |
15 | begin
|
16 | process begin |
17 | wait until rising_edge(clk); |
18 | PWM_Accumulator <= ("0" & PWM_Accumulator(7 downto 0)) + ("0" & PWM_in); |
19 | |
20 | end process; |
21 | |
22 | PWM_out <= PWM_Accumulator(8); |
23 | end PWM_arch; |
Könnte man mir bitte erklären, wodas Problem ist, lumpige 52kHz bei 125kHz Abtastrate zu erzeugen? Das sind weit unterhalb der 50%. In Relation 18kHz mit 44,1 und das macht jede 80er-Jahre-Technik erfolgreich.
>Könnte man mir bitte erklären, wodas Problem ist, lumpige 52kHz bei >125kHz Abtastrate zu erzeugen? Ein sauberer Sinus benötigt mehr als 2 Abtastpunkte bei der Ausgabe...ganz einfach.
Audiomann schrieb: > Könnte man mir bitte erklären, wodas Problem ist, lumpige 52kHz bei > 125kHz Abtastrate zu erzeugen? Das sind weit unterhalb der 50%. In > Relation 18kHz mit 44,1 und das macht jede 80er-Jahre-Technik > erfolgreich. Das ist wirklich etwas knapp. Man darf bei der Betrachtung nicht vergessen, dass bei Audio immer mitschwingt, dass der obere Teil des Bandes energetisch nicht so stark besetzt ist. Gleichwohl lässt sich gerade ein einzelner Sinus damit sehr gut herstellen. Klassische DDS-Aufgabe. Bis 40% ist das sehr gut machbar. Allerdings u.U. mit Regelung oder Kalibrierung der Amplitude. Das mit dem gefilterten Rechteck ist sicher nicht besser, als den Weg über den DAC. Wenn der DAC das nicht kann oder der Filter wirklich zu schwierig ist, würde ich per PDM aus dem FPGA rausgehen. Mit einem 100MHz-System kriegt man bei 100kHz Grenzfrequenz (-3dB) mit einem normalen einstufigen R-C-Filter auf 60dB sfdr und das bei einer ungeregelten linearen PDM-Integration. 200 MHz, geregelte PDM mit Doppel-T und Präsenzanhebung in der SV, laufen bei mir bis 3dB@200kHz (Analogsynth-Modellierung) mit >90dB Signalgüte. Für 50kHz sind da mindestens 16 Bit drin. Für externe Nutzung einen OP, der das niederohmig macht, bzw ein Audio-Amp-Modul.
>200 MHz, geregelte PDM mit Doppel-T und Präsenzanhebung in der SV,
:D What?
Bin auch schon ein Stück weiter. Hab die ampere mal hochgeskillt :D
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.all; |
3 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
4 | |
5 | entity PWM is |
6 | port ( |
7 | clk : in std_logic; |
8 | PWM_in : in std_logic_vector (15 downto 0) := "0000000000000000"; |
9 | PWM_out : out std_logic |
10 | );
|
11 | end PWM; |
12 | |
13 | architecture PWM_arch of PWM is |
14 | signal PWM_Accumulator : std_logic_vector(16 downto 0):= "00000000000000000"; |
15 | begin
|
16 | process(clk, PWM_in) |
17 | begin
|
18 | if rising_edge(clk) then |
19 | PWM_Accumulator <= ("0" & PWM_Accumulator(15 downto 0)) + ("0" & PWM_in); |
20 | end if; |
21 | end process; |
22 | |
23 | PWM_out <= PWM_Accumulator(16); |
24 | end PWM_arch; |
Dann nutz ich einen cordic ip-core un berechne mir einfach von einem zähler den passenden sinus. Funktioniert. Sehr schön. Jetzt muss ich eigentlich nur noch die FFT passend zum ADC "synchronisieren". Moment, wenn ich die solange anhalte bis ein neuer Wert vom ADC verfügbar ist und nur wenn alle Werte einmal eingetragen (also für jedes Band ein Sample) lass ich sie loslaufen und nutze die Ergebnisse... Könnte funktionieren
Jonas B. schrieb: > Leider ist die maximale Samplingrate des DAC's auf dem > Board ca. 125kHz, das wären also nur knapp 3 Samples pro Periode... Wo ist dein Problem? Knapp 3 ist immer noch deutlich größer als 2. Die Physik wird also keine Einwände erheben. Alles, was du brauchst, ist also ein analoges Rekonstruktionsfilter hinter dem DAC. Aber das braucht man sowieso meistens, eigentlich fast immer...
>Wo ist dein Problem? Ich bin nicht Elon Musk. >Knapp 3 ist immer noch deutlich größer als 2. Die >Physik wird also keine Einwände erheben. Es funktioniert ja auch alles. Im freien Fall. Im Vakuum mit Hühnern... >Alles, was du brauchst, ist also ein analoges Rekonstruktionsfilter >hinter dem DAC. Aber das braucht man sowieso meistens, eigentlich fast >immer... Ja dann schwankt mir aber die Amplitude zu stark, oder das Filter wird zu kompliziert für mich. Außerdem skaliert das nicht so schön. Wenn ich noch weitere Ausgänge benötige...
:
Bearbeitet durch User
Moin, Jonas B. schrieb: > oder das Filter wird > zu kompliziert für mich. Außerdem skaliert das nicht so schön. Klaro. Und die fuer den Fuchs zu hoch haengenden Trauben sind eh' bestimmt viel zu sauer. Was brauchste denn fuer einen Ausgangspegel fuer deinen Sinus und bei welcher Impedanz brauchst du den? Was haste FPGA intern als Takt rumfliegen? Wie hoch ist die IO-Spannung an der FPGA-Bank? Wie sauber muss der Sinus sein -Klirrfaktor, Stoerabstand, etc.? Je mehr Antworten du auf solche Fragen geben kannst, die konkrete Zahlen und Einheiten enthalten und nicht sowas wie "moeglichst", desto hoeher wird deine Chance ausfallen, dass hier eine konkrete Schaltung rauspurzelt. Gruss WK
Jonas B. schrieb: >>200 MHz, geregelte PDM mit Doppel-T und Präsenzanhebung in der SV, > > :D What? 1) Taktfrequenz der PDM 2) geregelt auf den Ausgang, also NACH dem Reko-Filter 3) Versteilerung des Frequenzgangs in der Signalverarbeitung zur Kompensation dessen Absenkung durch Reko-Filter
>Was brauchste denn fuer einen Ausgangspegel fuer deinen Sinus und bei >welcher Impedanz brauchst du den? Was haste FPGA intern als Takt >rumfliegen? -0,3 Vpp , die Impendanz ist unbekannt und unter anderem gemessen werden. -50MHz, per DCM geht auch mehr >Wie hoch ist die IO-Spannung an der FPGA-Bank? Gute Frage, ich denke irgednwas zwischen 3.3 und 1.5V... muss ich ins Datenblatt schauen... >Wie sauber muss der Sinus >sein -Klirrfaktor, Stoerabstand, etc.? 0,01% , > 90db >1) Taktfrequenz der PDM >2) geregelt auf den Ausgang, also NACH dem Reko-Filter >3) Versteilerung des Frequenzgangs in der Signalverarbeitung zur >Kompensation dessen Absenkung durch Reko-Filter :D Ah ok..danke.
:
Bearbeitet durch User
Moin, Jonas B. schrieb: >>Wie sauber muss der Sinus >>sein -Klirrfaktor, Stoerabstand, etc.? > > 0,01% , > 90db Da biste jetzt natuerlich etwas gekniffen. Denn 90dB S/N wirst du niemals aus einen naggischen Ditital-IO erwarten koennnen. Spezifiziert ist da natuerlich nix, erwarten kannste vielleicht 40dB, wenn da nicht von Nachbarpins oder aus der Spannungsversorgung irgendwas tierisch reinpfeift. Also: externer DAC - wenn der DAC, den du hast, hoechstens 125ksamples macht, dann brauchst du ein entsprechend steilflankigen Tief/Bandpass. Der also 52kHz moeglichst ungedaempft durchlaesst, aber bei 125-52 = 73KHz schon 90dB sperrt. Das wird mehr als 2x RC ;-) Jonas B. schrieb: > 0,3 Vpp , die Impendanz ist unbekannt und unter anderem gemessen > werden. Hm, ich glaub' das wird fuer dich die groesste Baustelle, wenn das irgendwas werden soll: Die analoge Signalverarbeitung/Messung. Und damit eben auch, wie der Tief/Bandpass dann entgueltig aussehen muss. Der Pegel ist noch gut zu handeln, da koennte man sicherlich was mit passiven LC-Filtern machen. Aber man muss halt wissen was - und obacht geben, nicht dass einem da von irgendwoher 10µV reinpfeifen und schon ist's Essig mit den 90dB. Gruss WK
>Denn 90dB S/N wirst du >niemals aus einen naggischen Ditital-IO erwarten koennnen. Selbst wenn, ich hätte eh Probleme das irgendwie messtechnisch zu erfassen, da beißt sich der Hund selbst in den Schwanz...im Moment probiere ich die Werte die aus dem Cordic rauspurzeln selbst in einem zweiten Kanal der FFT als Referenzspektrum zu nutzen, allerdings scheitert es im Moment noch an der mehr als umständlichen Bedienung. Das macht kein Spaß, daran muß ich erst arbeiten, also Ausgabe vom Fpga-Board direkt auf den Monitor. Ein Vga Signal kriege ich sogar schon erzeugt, jetzt brauch ich ein Kurvenmalalgorithmus in vhdl... >Hm, ich glaub' das wird fuer dich die groesste Baustelle, wenn das >irgendwas werden soll: Die analoge Signalverarbeitung/Messung. Und damit >eben auch, wie der Tief/Bandpass dann entgueltig aussehen muss. Der >Pegel ist noch gut zu handeln, da koennte man sicherlich was mit >passiven LC-Filtern machen. Aber man muss halt wissen was - und obacht >geben, nicht dass einem da von irgendwoher 10µV reinpfeifen und schon >ist's Essig mit den 90dB. Mit Spulen steh ich gerade auf Kriegsfuß, nachdem mein Frequenzgenerator(8165A) beim Ausschalten peng gemacht hat...rate mal was am Ausgang dran war... Ich hab noch eine Soundkarte die kann 192kHz, also vielleicht kann ich da was mit "messen"...allerdings hab ich kein USB-Isolator und mein PC brauch ich dann schon irgendwie. VG Jonas
Moin, also ich wuerd' da mal empfehlen, langsam die Hosen runterzulassen: Was genau willst du da eigentlich als Gesamtkunstwerk machen? Cordic mit PWM auf VGA...hmmmm...Nixfuerungut, aber du erscheinst mir doch etwas uebersteuert mit dem Projekt. Gruss WK
Nagut, du hast mich zwar falsch verstanden, aber nun gut ich hab mich auch auch ungut ausgedrückt - bitte um Gnade ich bin kein Profi, mir macht Basteln nur Spaß. Ich baue ein Scanning-Tunnenling-Microscope. Und die Schaltung soll dazu dienen automatisch die parasitäre Kapazität der Cantilever-Spitze zu kompensieren, siehe Anhang. Sie soll auch die xy Position Stage steuern, den PDIC auswerten, die Samples aufbereiten, quasi alles. Ach ist schwer in Worte zu fassen, obwohl ich da gar nicht so schlecht drinne bin. Ich hau hier einfach mal ein paar Links rein, vielleicht wird es dann klarer. https://github.com/rwb27/openflexure_block_stage/tree/master/stl https://dberard.com/home-built-stm/ https://www.nanoandmore.com/AFM-Probe-Akiyama-Probe (Hab nett nachgefragt, Daniel hat mir Samples geschickt :D, hab Schokolade für die ganze Abteilung zurückgeschickt)
Jonas B. schrieb: > Nagut, du hast mich zwar falsch verstanden, aber nun gut ich hab mich > auch auch ungut ausgedrückt Ungut? Willkommen in Orwells Welt! https://de.wikipedia.org/wiki/Neusprech#Präfigierung > - bitte um Gnade ich bin kein Profi, mir > macht Basteln nur Spaß. Und das Träumen. >>Wie sauber muss der Sinus >>sein -Klirrfaktor, Stoerabstand, etc.? >0,01% , > 90db" Und das allen mal nebenbei mit einem einfachen FPGA-IO bzw vorher noch mit einem handgestrickten R2R DAC. Jaja.
>> - bitte um Gnade ich bin kein Profi, mir >> macht Basteln nur Spaß. >Und das Träumen. Tut mir leid für dich, wenn du das verlernt hast. Deine Beiträge in den letzten Jahren klingen immer mehr verbittert. Ich hoffe echt bei dir ist alles in Ordnung? >Und das allen mal nebenbei mit einem einfachen FPGA-IO bzw vorher noch >mit einem handgestrickten R2R DAC. Ich sehe das ja ein, das da viel Unsinn auch da bei ist, aber deswegen frage ich ja nach. Hast du den einen konkreten Tip für einen passenden DAC? vg jonas
Jonas B. schrieb: > Leider ist die maximale Samplingrate des DAC's auf dem > Board ca. 125kHz, das wären also nur knapp 3 Samples pro Periode... > > What should I do? So, du hast also ein FPGA zur Verfügung. Dann verzichte doch einfach auf die ominösen DAC's und mache das Ganze diskret. Wie? Im FPGA natürlich. Du implementierst einen Zähler nebst einem Dekoder (oder ein Schieberegister, ist vielleicht einfacher), der eine Halbwelle, z.B. sin(-pi/2..+pi/2) abbilden soll. Den läßt du einfach vor- und zurücklaufen. Alternativ ein Bit mehr für nen Vollkreis und etwas mehr Dekodieraufwand, dann kannst du ihn einfach durchlaufen lassen. Wird ja wohl genug Platz dafür im FPGA sein. So, und die n Ausgänge des Dekoders versiehst du mit n Widerständen, die du sinnvoll abstufst. Immer nur einen Ausgang aktiv, die anderen hi-Z, das rechnet sich für dich am einfachsten. Theoretisch kannst du auch die Hälfte der Widerstände einsparen, indem du den aktiven Ausgang je nach Halbwelle auf hi oder lo legst. Und das Ganze kannst du mit fast beliebiger Frequenz rennen lassen, so daß du einen Vollkreis für deine ca. 50 kHz in 32 oder 64 Slots aufteilen kannst. Entsprechend entspannt wird dann das LC-Filter am Ausgang. Ich hab sowas vor gefühlten 100 Jahren mal mit einfacher CMOS-Logik aufgebaut und der Sinus war gut genug für weitaus weniger als 1% Klirrfaktor. W.S.
>Du implementierst einen Zähler nebst einem Dekoder (oder ein >Schieberegister, ist vielleicht einfacher), der eine Halbwelle, z.B. >sin(-pi/2..+pi/2) abbilden soll. Den läßt du einfach vor- und >zurücklaufen. Alternativ ein Bit mehr für nen Vollkreis und etwas mehr >Dekodieraufwand, dann kannst du ihn einfach durchlaufen lassen. Wird ja >wohl genug Platz dafür im FPGA sein. Die inflationäre Nutzung des Wortes einfach macht mir Mut XD. Aber soweit, waren wir schon. http://www.lothar-miller.de/s9y/categories/31-DDFS >So, und die n Ausgänge des Dekoders versiehst du mit n Widerständen, die >du sinnvoll abstufst. Immer nur einen Ausgang aktiv, die anderen hi-Z, >das rechnet sich für dich am einfachsten. Theoretisch kannst du auch die >Hälfte der Widerstände einsparen, indem du den aktiven Ausgang je nach >Halbwelle auf hi oder lo legst. Auch dafür habe ich bereits mehr als ein Schaltplan gepostet... >Ich hab sowas vor gefühlten 100 Jahren mal mit einfacher CMOS-Logik >aufgebaut und der Sinus war gut genug für weitaus weniger als 1% >Klirrfaktor. Ohja, ich habe noch ein komplettes Sortiment 4000er IC's... Spaß. Danke für deinen Beitrag :D
Moin, Jonas B. schrieb: > Ich > hau hier einfach mal ein paar Links rein, vielleicht wird es dann > klarer. Umpf, das sieht ja anstrengend aus. Tldr. Nur soviel: Das kommt mir irgendwie so vor, also ob ein Blinder mit seinem Stock den Weg vor sich scannt (hier also mit 50kHz), um so Hindernisse zu bemerken. Seh' ich das richtig? Und so wie der Blinde dann auch laeuft, gibts noch irgendwas, was dann den Sensor in die andere Dimension bewegt? Naja, wurscht. Aus deinem schematic_cantilever.png seh' ich, dass da also nicht so besonders niederohmig der Sinus von Noeten ist. Um den ominoesen Ableich mit VR auch noch elektronisch gestalten zu koennen, koennt' man auf die Idee kommen aus dem FPGA gleich 2 Sinuesse mit gleicher Frequenz und 180° +/- epsilon Phasenverschiebung und voneinander unabhaengig einstellbarem Pegel zu generieren, der eine kommt dann ggf. via R7 oder direkt an den Sensor, der andere direkt an C2. Ausm Bauch raus schaetz' ich mal, dass der Sinus dafuer nicht ganz die 90dB S/N brauchen wird, da pfeift noch so viel anderes in die Schaltung des OpAmps um R4 rum rein... Also koennte man ggf. drandenken den Sinus tatsaechlich via naggischer FPGA-IOs, R2R-Netzwerk und einem als Impedanztransformator (und Pegelanpassung) geschalteten LC-Tiefpass zu erzeugen. Also insgesamt 2x mit jeweils identischen Schaltungen, via FPGA kann man dann evtl. den Pegel und die Phasenlage der beiden Signale so abgelichen, dass halt irgendwas wissenschaftliches passiert, die Kurve schoen wird, wasweissich... Problem: Ich wuerd' mit nicht mehr als vielleicht 4..5Bit Aufloesung beim R2R Netzwerk rechnen, ob man dann den Rest noch per Ueberabtastung und n-Bit (Bandpass-)Sigma/Delta Wandler hinkriegt, muesst' man mal gucken. Aber Impedanzmaessig sollte das hinhauen: Wenn man 3.3V IOs hat, hat der Sinus aus dem R2R Netzwerk dann max. vielleicht 3Vpp - bei Leistungsanpassung also 1.5Vpp; wenn man das R2R Netzwerk mit z.B. 1..5k Widerstaenden nimmt, und per Tiefpass runtertransformiert, kommt man auf 0.3Vpp bei 40...200 Ohm Impedanz, wenn man die stumpf mit einem entsprechenden R abschliesst, dann sollte sich das durch den Sensor und C2 nicht mehr gross aendern. Problem wird nur sein, ob man da die Amplitude fein genug einstellen kann, ohne dass der Sinus zu fies wird. Wenn nicht, sollt' man auf richtige DACs umsteigen. Aber fuer Analogphobiker sieht das alles garnicht gut aus... Gruss WK
>Nur soviel: Das kommt mir irgendwie so vor, also ob ein Blinder mit >seinem Stock den Weg vor sich scannt (hier also mit 50kHz), um so >Hindernisse zu bemerken. Seh' ich das richtig? Ja. >Und so wie der Blinde dann auch laeuft, gibts noch irgendwas, was dann >den Sensor in die andere Dimension bewegt? Ja oder das Sample, je nach Kontruktion. Nanometergenau positionierbare Tische, kann ich tatsächlich drucken: https://github.com/rwb27/openflexure_block_stage Erklärung: https://www.youtube.com/watch?v=PaypcVFPs48&t=279s >... >Aber fuer Analogphobiker sieht das alles garnicht gut aus... Einfach wirds sicher nicht :D VG Jonas
Moin, So koennt' das z.B. ausschauen, wenn man aus dem FPGA per R2R Netzwerk und LC-Filter zur Signalverschoenerung und Impedanz/Pegelanpassung rausgeht und einen nur ein Band um 50kHz herum interessiert:
1 | FPGA 3V3-IO |
2 | |
3 | 2k2 680uH 680uH 270uH |
4 | MSB ---/\/\/\---+--------+--MMMM---MMMM-+-MMMM-+------+--- sine out |
5 | | | | | | <0.3Vpp |
6 | / | | | \ |
7 | \ | 8n2 56n | | 68n / |
8 | 1k1 / --- --- --- \ 47R |
9 | \ --- --- --- / |
10 | / | | | \ |
11 | \ | | | | |
12 | 2k2 | --- --- --- --- |
13 | ---/\/\/\---+ |
14 | | |
15 | ... usw. |
Gruss WK
Dergute W. schrieb: > wenn man aus dem FPGA per R2R Netzwerk > und LC-Filter zur Signalverschoenerung Angesichts deiner Kenntnisse und sonstiger Beiträge - gerade in Signalverarbeitung - bin ich sehr erstaunt über diesen Vorschlag :-) Ich lasse mal offen, inwieweit ausgerechnet dieser Filter das Signal noch weiter "verschönert" und wie sehr das sinnvoll ist, angesichts der katastrophalen Oberwellen, die ein R2R mit so einem Aufbau abgibt. Das Problem sind dabei bekanntlich nicht etwas die "Treppen", die glatt zu bügeln wären, sondern die Unsymmetrie solcher Wandler. Wenn alle das MSB nur um 1% falsch dimensioniert wird, hat man ein tieffrequentes, eben mit dem MSB schwingenden Rechteck im Signal, gegen das der Filter kaum oder garnicht hilft. Wenn R2R, dann muss das sehr feinstufig sein und abgeglichen werden, d.h. eine Kalibrierung mit Vorverzerrung in der SV. Sowas wird auch gemacht, übertrifft aber Delta-Sigma-DACs nur mit sehr großem Aufwand. Diese beträgt bei "normalen" 1-Promille-Rs wenigstens 20 Bit = Rs für ein 16 Bit System und 32 Rs für ein 24 Bit System inklusive Echtzeitkalibrierung und thermischer Nachregelung. Die DIY Audio-Seite hat da Beispiele. Zudem hat der o.g. Filter starkes IIR-Verhalten und ist sehr hochohmig. Über dessen Impulstreue muss ich dir nichts erklären, denke ich. Entweder liegt die Grenzfrequenz ausreichend hoch, dann ist die Filterwirkung auf die NF zu schwach oder sie liegt im Bereich der Zielfrequenz, dann ist die Trägheit zu hoch und es gibt Dämpfung und starke Abhängigkeit vom Ausgang. ---- Ich verstehe einfach nicht, warum man beim Audio immer wieder so umherpopelt! Statt es als Sonderthema zu behandeln, wäre es nötig, es genau so aufzufassen und zu behandeln, wie jede andere Mess- und Steuertechnik. Ich hatte oben eine PDM vorgeschlagen, die sehr einfach zu lösen ist: Beitrag "Re: einstellbaren 48-52kHz Sinus erzeugen," Wie gesagt, geht das mit 2R und 2C und liefert einen supersauberen Sinus, weit jenseits eines einfach abgelichenen R2R. Ich erinnere daran, dass man mit einer 64Bit PDM x Abtastfrequenz immerhin Audio-CDs bespielt und abhört und deren Qualität kennen wird. Die Anforderung hier liegt um einen Faktor höher, also postuliere ich als Minimum einen Datenstrom von 96kHz. Da die Soundkarten-Wandler-Chips seit wenigstens 10 Jahren serienmässig mit 192kHz arbeiten, braucht man nur einen entsprechenden AA-Filter. Den würde ich aber ohne Induktivitäten aufbauen. Ist phasentechnisch einfacher zu steuern. Weitere Sinusliteratur bis zum Abwinken mit Bezug zu höhren Frequenzen: Beitrag "Lautsprecher mit Frequenz ansteuern" Beitrag "Ultraschallmikro f. Fledermäuse?" Beitrag "PWM Audio Signal" Beitrag "Sinus aus R2R filtern" Beitrag "1Bit Audio als Alternative zu PWM" Beitrag "Verrückter R-2R Abschwächer (Audio)" Beitrag "R2R-Wandler mit einem PLD" Beitrag "Wie DSD512 erzeugen?" Beitrag "Sinus über DDS erzeugen" Beitrag "Sinus Generator" Beitrag "iir Filter als Sinusgenerator"
Moin, Mach's halt besser. Ich schrub nicht, dass das das Ultimo an Qualtitaet ist. Aber da soll auch kein sauerstoffarmes-kupferkabel-Audio rauskommen, sondern ein Sinus um die 50kHz. Sonst nix. Es ist supersimpel, braucht keine eigene Spannungsversorgung, keine komischen Niederspannungs-Rail-2-Rail-OpAmps, rauscht kaum und kost' fast nix. :-) Und bevor du so umfassend und kompetent ueber das Filter staenkerst, guck's dir halt mal an. Das sollte eine Durchlassdaempfung von < 20dB bei 50kHz haben (soooo vieeel eben wegen der Impedanzanpassung, das soll so) und bei 150kHz irgendwo bei mehr als 100dB Sperrdaempfung(zumindest "auf'm Papier"). Da kann der R2R Wandler ruhig schlecht sein und das MSB krumm und schief. Und wenn da ein 50kHz Sinus drueber gehen soll, wen kratzt da das Impulsverhalten? Gruss WK
Jonas B. schrieb: > What should I do? Eine SPI Schnittstelle stricken und darüber einen AD9833 steuern. Der lacht über einen 50kHz Sinus, es sei denn, du hast außer der Frequenzeinstellbarkeit noch andere Ansprüche.
Dergute W. schrieb: > Problem: Ich wuerd' mit nicht mehr als vielleicht 4..5Bit Aufloesung > beim R2R Netzwerk rechnen, Dergute W. schrieb: > Aber fuer Analogphobiker sieht das alles garnicht gut aus... Tja, eben nicht bloß eins können. Ich halte an dieser Stelle einen stupiden R2R DAC für die verkehrte Lösung. Da kommt man eben nur als "Analogphobiker" drauf. Nee, es geht weitaus besser und sparsamer so: Stell dir einen invertierenden OpV vor, dessen E+ an VCC/2. OK soweit? Im Gegenkopplungszweig einen 1 k Widerstand (nur als abstraktes Beispiel). Jetzt stelle dir vor, du würdest den Vollkreis in 36 Schritte aufteilen und dir einen cos machen wollen. Das erste hierfür verwendete Pin des CPLD hat einen 1 K Widerstand zum E- des OpV. OK, ist beim Zustand Nr. 0 eben quasi +1, also Vollausschlag, wenn das Pin aktiviert ist (also kein hi-Z) und auf low liegt. Beim Zustand 18 (entspricht Pi) ist das selbe Pin wieder aktiviert, nun aber auf hi liegend. Macht also quasi -1. In allen übrigen Zuständen (1..17, 19..35) ist es hi-Z. Alle anderen verwendeten Pins werden nicht 2x, sondern 4x benutzt: das für 10° auch bei 170° und 190° und 350° und dessen Widerstand ist 1k/cos(10°) und so weiter. Dann 20° und 160°, 30° und 150° usw. Und das für 90° kann ersatzlos entfallen. Hehe. Wenn ich mich jetzt nicht verzählt habe, dann braucht man nur 9 Pins und 9 Widerstände, die allerdings sauber abgeglichen sein wollen. Und natürlich eine Logik dazu im FPGA. Dafür hat man dann aber 36 Stützstellen pro Ausgangsperiode und die mit Präzision, was das Filtern doch sehr erleichtert. Und wem das nicht gefällt, der kann die Pinanzahl nach seinem Gusto erhöhen oder reduzieren. W.S.
W.S. schrieb: > Wenn ich mich jetzt nicht verzählt habe, dann braucht man nur 9 Pins und > 9 Widerstände, die allerdings sauber abgeglichen sein wollen. Das sieht auf den ersten Blick besser aus, weil jeder Fehler nur linear eingeht, allerdings ist es im Vergleich nicht unbedingt so, denn mit den 9 Bits ließe sich ein deutlich feinerer Sinus erzeugen, als mit den 36 Punkten, wenn man ihn entsprechend dithered und damit das zunächst größere Störspektrum verteilt. Wenn du dir die Formeln dafür ansiehst oder es in der Simulation durchspielst, dann wird das evident. Dergute W. schrieb: > ach's halt besser. I Habe ich ja. :D Eine lineare PDM ist bei ausreichender Frequenz (ca 12MHz) locker besser und einfacher zu realisieren. >audio Wenn sich das erprobte System / die Methode fürs Audio eignet, dann sicher auch für das hiesige System. und es ist j anicht so, dass hier große Aufwände zu leisten wären. Dergute W. schrieb: > 150kHz irgendwo bei mehr als 100dB Sperrdaempfung Die helfen dir aber bei den tieffrequenten Störungen des MSB nicht. Ein einfaches doppelt T hat mit dem Abstand der 12M gegen 50k eine mehr als ausreichende Dämpfung. Gerechnet, gebaut, getestet und in Kundensystemem (Ultraschall verbaut).
>Eine SPI Schnittstelle stricken und darüber einen AD9833 steuern. >Der lacht über einen 50kHz Sinus, es sei denn, du hast außer der >Frequenzeinstellbarkeit noch andere Ansprüche. Der ist mir ja auch schon mal über den Weg gelaufen. Werd ich mal im Hinterkopf behalten...danke! >Und wem das nicht gefällt, der kann die Pinanzahl nach seinem Gusto >erhöhen oder reduzieren. Müssen die Widerstände dann nicht immer weniger Toleranz haben? Also ich bin weiter gekommen. Sinusausgabe mit 50MHz PDM und einfacher Tiefpass 3.8k und 200pF (ergibt ne Gf von ca. 190kHz), läuft. Siehe Bilder, da gab es erst noch ein signed /unsigned Problem, aber ich hab das tatsächlich einfach lösen können in dem ich auf die Werte die aus der DDFS kommen noch 128 addiere. 127 hab ich auch probiert, ich war mir nicht sicher. Bei 128 sehe ich keine kleine Treppe. Dann hab ich endlich den ADC zum laufen bekommen, an dem SPI_CLOCK von einem vorgeschalteten PGA hängt auch der Flash. Und direkt nach dem Reset spuken da noch Signale rum. Boah das war echt kniffelig rauszukriegen. Aber nun rennt er. Auch hab ich ein Arduino Due über rs232 angestöpselt, Linien malen in vhdl ist echt uncool. Ich denke das macht Sinn, das lässt sich doch viel leichter aus dem Ärmel schütteln. Allerdings wäre natürlich ein performante Live-Anzeige mit 75Hz des Scans fantastisch. Eventuell baue ich naher mal meine Soundkarte auseinander und mache die Eingangskondensatoren brückbar. Wenn ich dann mit der Frequenz auf sagen wir mal 20kHz oder 25kHz runter gehe, müsste ich gut die SNR ermitteln können. Ich mag das irgendwie Zahlen zu haben und vergleichen zu können. Die Audioeingänge müssten ja gepuffert sein, also sollte doch ein hochomiger Spannungsteiler zu Anpassung ausreichen, oder? Danke für eure Nachrichten, ich hab alles gelesen. Vg Jonas
Jonas B. schrieb: > 127 hab ich auch probiert, ich war mir nicht sicher. Bei 128 sehe ich > keine kleine Treppe. Eine Simulation des Ganzen bringt Gewissheit in die Ratestunde...
>Eine Simulation des Ganzen bringt Gewissheit in die Ratestunde...
Ja bei 50/50 kann man auch mal ausprobieren...das geht viel schneller -
in dem Fall zu mindest. Bei dem Problem mit dem geteilten Pin des
Flashes, hätte man das auch in der Simulation/Reports etc. irgendwo
sehen können?
vg jonas
Sag mal Lothar, wie viele Warnungen (gefühlt) kann man ignorieren? Oder anders ausgedrückt, bekommt man das überhaupt warnungsfrei synthesiert? Ich kann die ganz bösen Purschen schon erkennen, aber manchmal ist das merkwürdig. Zum Beispiel kommt kein Fehler, wenn das TOP Modul Netze aus dem ucf nicht definiert. Das ist ganz böse, wobei das bestimmt bei den Warnungen dabei war... Ach ja...
Jonas B. schrieb: > Bei dem Problem mit dem geteilten Pin des > Flashes, hätte man das auch in der Simulation/Reports etc. irgendwo > sehen können? Das steht im Schaltplan. Ich finde das Zusammenlegen der SPI von ADC, PGA und DAC auf dem Board nicht sehr anfängerfreundlich. Damit wird das VHDL-Design m.E. recht umständlich. Duke
Jonas B. schrieb: > wie viele Warnungen (gefühlt) kann man ignorieren? Einige bis viele. > Oder anders ausgedrückt, bekommt man das überhaupt warnungsfrei synthesiert? Nein. Ich schaue inzwischen nur noch nach: - Unassigned signals (871) - Unwanted Latches (737) - Unassigned signals (653) - Internal tristates (2042) - Combinatoric loops (2170) - Vector null range (3350) - Gated clocks (372) und dem Timing Score. Duke
>Das steht im Schaltplan. Ja aber da ist kein Timingdiagram was den Datenschmutz auf der Leitung, kurz NACH DEM RESET kenntlich macht. Ich warte jetzt einfach ne viertel Sekunde und schalte dann erst den AMP ein. Aber du hast recht, auf irgendeiner Seite steht dazu was (kann mich dunkel errinnern). >Ich schaue inzwischen nur noch nach: >- Unassigned signals (871) >- Unwanted Latches (737) >- Unassigned signals (653) >- Internal tristates (2042) >- Combinatoric loops (2170) >- Vector null range (3350) >- Gated clocks (372) >und dem Timing Score. Danke ich dachte schon ich bin wirklich bekloppt. Oh ja Latches hab ich auch gezeugt wie ein Großer... XD Ach ich muss mal bissel aufräumen im Code...
Jonas B. schrieb: > Ja aber da ist kein Timingdiagram was den Datenschmutz auf der Leitung, > kurz NACH DEM RESET kenntlich macht. Ich warte jetzt einfach ne viertel > Sekunde und schalte dann erst den AMP ein Ja, ok. Mit dem Oszi habe ich nicht nachgemessen, in meinem Code steht eine Wartezeit von 10 µs drin, wobei 5 µs auch reichen sollten. Duke
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.