Forum: FPGA, VHDL & Co. Sinc3 Filter von VHDL in Bit Logik umsetzen


von Marc (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Aktuell bastel ich gerade an einer Schaltung mit einem AMC3306 ADC, mein 
erster Kontakt zu einem Sigma-Delta ADC. Mein Problem ist das ich keinen 
blassen Schimmer von VHDL, FPGA und dem nötigen Filter habe.
Mit hilfe der Bilder Sinc3.png 
(https://www.ti.com/lit/an/sbaa094/sbaa094.pdf, Seite 14, VHDL Code auf 
Seite 17) und sinc3.jpg 
(https://www.dsprelated.com/showarticle/1171.php) meine ich nun zu 
wissen das es sich hier um einen CIC Decimation Filter handelt. Die ALU 
mit den zwei + an a und b habe ich als Addierer interpretiert (?) und 
die ALU mit + und - habe ich mit Bild sinc3.jpg als Addierer mit vor B 
geschaltetem Not interpretiert (?).
Daraus ist die Schaltung "Filter_mit_ALU.png" entstanden.
Die Verwendung des Not statt des D Inverse beruht auf der Idee das ganze 
mal mit zwei Hex D Flip-Flop aufzubauen.
Da ich nicht identifizieren konnte wie der Carry genutzt wird ging ich 
davon aus das er gar nicht genutzt wird und dachte mir das ich das ganze 
dann ja auch einfach als XOR umsetzen kann "Filter_mit_XOR.png".
Bei einer ersten Simulation verhielten sich beide identisch 
"waveform.png".
Meine Frage ist jetzt ob ich da jetzt völlig auf dem Holzweg bin oder 
das richtig umgesetzt habe?
Einen FPGA nur für den einen Filter zu verwenden erscheint mir wenig 
sinnvoll daher noch die Frage nach einer allgemeinen Einschätzung ob bei 
fClkin von 10MHz in den ACM3306 eine einfach Schaltung mit 74er nicht 
auch ausreicht? Da ich noch einen Core auf dem MCU habe der mit seinen 
240 MHz nicht sonderlich viel zu tun hat werde ich wohl erstmal 
versuchen das ganze auf diesem umzusetzen sollte meine Umsetzung des 
Sinc3 denn richtig sein.
Danke vorab für alle die sich das hier durchlesen und ich bitte um 
Verzeihung wenn ich das ganze hier etwas umständlich ausgedrückt haben 
sollte.

Gruß Marc

von -gb- (Gast)


Lesenswert?

https://www.ti.com/lit/an/sbaa094/sbaa094.pdf
(Da ist auch VHDL Code mit dabei.)

Beitrag "Delta-Sigma-Modulator und SINC3 Filter"

Für den Anfang kannst du auch mal einen gleitenden Mittelwert bauen. Z. 
B. ein langes Schieberegister und einen Zähler. Zum Zählerstand addierst 
du immer den Wert der ins Schieberegister rein geht und subtrahierst den 
Wert der aus dem Register hinten rausfällt.
Der Zählerstand ist dann quasi dein Analogsignal. Und das kannst du noch 
mit einem Tiefpass filtern.

FPGA halte ich da auch überzogen, das sollte ein uC schon schaffen.

von Logiker (Gast)


Lesenswert?

-gb- schrieb:
> Für den Anfang kannst du auch mal einen gleitenden Mittelwert bauen. Z.
> B. ein langes Schieberegister und einen Zähler. Zum Zählerstand addierst
> du immer den Wert der ins Schieberegister rein geht und subtrahierst den
> Wert der aus dem Register hinten rausfällt.

.. und das Ganze dann 3x hintereinander und man hat den Integrator des 
SINC-Filters. Dann das Ganze rückwärts und man hat den Differentiator 
und damit den kompletten SINC.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Marc schrieb:
> Meine Frage ist jetzt ob ich da jetzt völlig auf dem Holzweg bin oder
> das richtig umgesetzt habe?
Ich wuerd' mal nicht handisch versuchen durch Inverter oder sowas einen 
Subtrahierer zu basteln. Das kann VHDL schon alleine.

> Einen FPGA nur für den einen Filter zu verwenden erscheint mir wenig
> sinnvoll daher noch die Frage nach einer allgemeinen Einschätzung ob bei
> fClkin von 10MHz in den ACM3306 eine einfach Schaltung mit 74er nicht
> auch ausreicht?
In deinen Bildern fehlt eine wichtige Groesse: Die Breite der Busse. Das 
wird dir bei 74er Implementierungen den Hals brechen. Auch mit 
Addierern/Subtrahierern siehts 74maessig eher mau aus. Wuerd' ich nicht 
machen.

> Da ich noch einen Core auf dem MCU habe der mit seinen
> 240 MHz nicht sonderlich viel zu tun hat werde ich wohl erstmal
> versuchen das ganze auf diesem umzusetzen sollte meine Umsetzung des
> Sinc3 denn richtig sein.
Aufm Prozessor kanns gut sein, dass du mit einer anderen Filterstruktur 
besser faehrst als mit CIC. Je nach Prozessor tun Multiplikationen nicht 
so weh' und man muss sie evtl. nicht unbedingt vermeiden.

Gruss
WK

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Genau, Du hast dass alles noch nicht ausprobiert, verdrahtest aber 
Deinen Entwurf dann fest mit 74'ern und es funktioniert auf Anhieb? Bei 
FPGA programmierst Du neu, bei 74'er  braucht es schnell ein neues 
Design...

von Michael W. (Gast)


Lesenswert?

Dazu muss man eben wieder so bauen, wie man das in den 80ern gemacht 
hat: Denken, malen und den Kollegen drüberschauen lassen. Dann kommt die 
Platine. Wer das nicht konnte, baute Lochraster.

Heute würde man das sicher mit in einem FPGA "prototypen".

von Tim  . (cpldcpu)


Lesenswert?

SINC-Filter kann man aber auch sehr effizient auf einer MCU 
implementieren. (Addieren, Substrahieren)

Wenn die Datenrate nicht zu hoch ist, wäre das sicherlich der beste Weg. 
In der Standardbeschaltung des AMC3306 wird ja auch eine MCU verwendet.

von Marc (Gast)


Lesenswert?

Hallo und vielen Dank für die ganzen Antworten!

Mir wird erschreckend bewusst das ich null Ahnung von digitalen Filtern 
und eine Menge Mathematikdefiziete habe.
Ich werde mir wohl erstmal etwas Lektüre zulegen und mich mit der 
digitalen Signalverarbeitung beschäftigen aber dafür bin ich hier dann 
im falschen Forum.

Für Interessierte:
Als Mikrocontroller kommt ein ESP32-S3 zu Einsatz. Dieser soll mit einer 
DSP Library auch einige Filter zur Verfügung stellen daher werde ich 
mich damit auseinander setzen. (https://github.com/espressif/esp-dsp)

-gb- schrieb:
> Für den Anfang kannst du auch mal einen gleitenden Mittelwert bauen.
Danke für den Vorschlag ich werde mich mal mit dem gleitenden Mittelwert 
beschäftigen!

Dergute W. schrieb:
> In deinen Bildern fehlt eine wichtige Groesse: Die Breite der Busse.
Da ich am ADC nur einen digitalen Pin als Datenausgang und einen 
Clockeingang habe nehme ich an das es sich um eine Busbreite von einem 1 
Bit handelt!?

Dergute W. schrieb:
> Aufm Prozessor kanns gut sein, dass du mit einer anderen Filterstruktur
> besser faehrst als mit CIC. Je nach Prozessor tun Multiplikationen nicht
> so weh' und man muss sie evtl. nicht unbedingt vermeiden.
Werde ich im Hinterkopf behalten vielen Dank!

Uwe B. schrieb:
> Genau, Du hast dass alles noch nicht ausprobiert, verdrahtest aber
> Deinen Entwurf dann fest mit 74'ern und es funktioniert auf Anhieb?
Die Fragestellung war ja in erster Linie ob ich den Schaltplan mit den 
ALU richtig gedeutet habe und die Umsetzung in "reine" Logik so richtig 
ist. Die Wahl das ins VHDL Forum zu posten begründete sich darauf das zu 
dem Schalt auch die Implementierung in VHDL mit in der PDF stand.
Da ich aber noch keinen Schimmer von VHDL habe nutzt mir dieser noch 
nicht all zu viel.
Platinen mache ich hier in unter einer Stunde mit Laserdrucker, 
Laminiergerät und Eisen3 fertig und aus Faulheit zu bohren hau ich da 
SMD Bauteile drauf und dann wird mal geguckt was dabei raus kommt.

M. W. schrieb:
> Dazu muss man eben wieder so bauen, wie man das in den 80ern gemacht
> hat: Denken, malen und den Kollegen drüberschauen lassen. Dann kommt die
> Platine. Wer das nicht konnte, baute Lochraster.

Leider fehlt mir der Kollege der drüberschauen kann aber ansonsten ist 
das meine Vorgehensweise. Kleine Sachen werden auf die schnelle in 
SprintLayout zusammen geknüppelt und komplexere Sachen in KiCad, da das 
Auge mit lötet scheue ich Lochrasterplatinen und mach lieber auf die 
schnelle ein passende Platine fertig.

Tim  . schrieb:
> SINC-Filter kann man aber auch sehr effizient auf einer MCU
> implementieren. (Addieren, Substrahieren)
Die Aussage macht mir Mut, ich werd mein bestes geben mir das nötige 
Wissen anzueignen!

Tim  . schrieb:
> Wenn die Datenrate nicht zu hoch ist, wäre das sicherlich der beste Weg.
> In der Standardbeschaltung des AMC3306 wird ja auch eine MCU verwendet.
Interessant wäre für mich alles unterhalb von 5kHz, nach meiner Rechnung 
wären bei einem Takt von 20MHz, Oversampling von 64 und 16 Bits per 
Sample eine Samplerate von ~19500 Samples pro Sekunde drin. Halbe 
Abtastfrequenz nach Nyquist-Shannon sind dann noch 9,750kHz also sollte 
ich mit meinen 5kHz locker hinkommen.

Danke nochmal an alle für ihre Beiträge, meine Idee da auf die schnelle 
etwas hinzuschludern werde ich nun begraben und mir die nötige Zeit zum 
lernen nehmen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Jetzt wuerd' ich mal mutmassen, dass das mit der Filterei dann wohl erst 
interessant wird, wenn klar ist, wie du deinen Bitstrom aus dem ADC mit 
dann z.b. 20MBit/sec irgendwie in den Bereich der CPU schaufeln 
kannst...
Gibts da irgendwelche HW-Unterstuetzung?

Gruss
WK

von Tim  . (cpldcpu)


Lesenswert?

Marc schrieb:
> Tim  . schrieb:
>> Wenn die Datenrate nicht zu hoch ist, wäre das sicherlich der beste Weg.
>> In der Standardbeschaltung des AMC3306 wird ja auch eine MCU verwendet.
> Interessant wäre für mich alles unterhalb von 5kHz, nach meiner Rechnung
> wären bei einem Takt von 20MHz, Oversampling von 64 und 16 Bits per
> Sample eine Samplerate von ~19500 Samples pro Sekunde drin. Halbe
> Abtastfrequenz nach Nyquist-Shannon sind dann noch 9,750kHz also sollte
> ich mit meinen 5kHz locker hinkommen.

Wenn das ein single level quantizer ist, dann kommt nur ein bit pro 
sample heraus. Hast Du Dir den Filter-Berechner auf der TI-website zum 
AMC3306 mal angeschaut?

Ein ESP32 hat mehr als Genug Rechenleistung. Da kannst Du einen 
SINC-Filter auch einfach im FIR-Ansatz implementieren:

Ein SINC1 ist einfach ein Mittelwertsfilter. Daher für die Länge n 
summierst Du die n letzten Eingangswerter und teilst sie durch n.

Für einen SINC2 Filter machst Du das zweimal sequentiell (Ausgang der 
ersten Stufe ist Eingang der zweiten). Für SINC3 dreimal.

Alternativ berechnet man sich die Filtercoeffizienten vorher und faltet 
diese einach mal dem Bitstream. Da der nur aus einsen und nullen 
besteht, geht das auch ohne Multiplikation.

Wenn Du etwas darüber nachdenkst, wie man das Optimiert, kommt man recht 
schnell beim CIC heraus. Den kann man sich auf viele Arten herleiten.

https://de.wikipedia.org/wiki/Cascaded-Integrator-Comb-Filter

: Bearbeitet durch User
von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Tim  . schrieb:
> SINC-Filter kann man aber auch sehr effizient auf einer MCU
> implementieren. (Addieren, Substrahieren)

Nur, wenn man SINC mit CIC gleichsetzt.

von Marc (Gast)


Lesenswert?

Dergute W. schrieb:
> Gibts da irgendwelche HW-Unterstuetzung?

Das steht noch nicht zu 100% aber ich werde wohl die auf die LEDC (LED 
Control) Funktion des ESP32 setzen um ein PWM mit 50% und bis zu 40 MHz 
zu erzeugen. 
(https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html#supported-range-of-frequency-and-duty-resolutions)
Ich habe den ESP32-S3 leider noch nicht auf dem Tisch aber das sollte 
den saubersten Takt ergeben. Sobald er hier ist werd ich das mit dem 
Oszi testen. Ich bin noch nicht sicher ob ich mit LEDC auch einen 
internen Interrupt triggern kann, ansonsten würde ich die CLK für den 
AMC3306 auch auf einen anderen PIN legen um so den Interrupt über den 
Pin zu triggern.
Der hat dann 12 Takte Zeit den Pin Status auszulesen und im RAM 
abzulegen

Hier mal eine Beschreibung was ich da überhaupt vor habe:
Die Hauptaufgabe des AMC3306 ist die Strommessung über einen Shunt.
Aktuell erfolgt das ganze über ein Drehspulinstrument mit 250uA und 
einem LC Filter davor (ein Klotz mit 2k Henry und 1uF) um Störungen 
größer 5Hz zu filtern. Da es sich um ein mobiles Gerät handelt bereiten 
mir die Drehspulinstrumente regelmäßig Sorgen, da sie sich durch ihren 
filigranen Aufbau nicht gut für den mobilen Einsatz eignen. Zu dem 
ganzen kommen nun noch Qualitätsprobleme. Statt der bezahlten +/-1% 
Tolleranz bekommen wir Instrumente mit bis zu 15% Abweichung.

Das machbare Ziel:
Drehspulinstrument durch Shunt, ADC und TFT zu ersetzen.

Meine Träumerei:
Den LC Filter durch digitale Filterung ersetzen oder wenigstens die 
Grenzfrequenz anheben zu können um von der teuer angefertigen 2k Henry 
Spule auf eine standartisierte Spule wechseln zu können.
Eine "grobe" Anzeige des Frequenzspektrums um für den Bediener einen 
Mehrwert bei der Störungssuche zu bieten.

Das ganze wird ein Proof of Concept, da mir definitiv die Expertise 
fehlt ein sicheres Endkundengerät zu entwickeln.

Tim  . schrieb:
> Hast Du Dir den Filter-Berechner auf der TI-website zum
> AMC3306 mal angeschaut?

Zu meiner Schande muss ich gestehen das ich von dem gar keine notiz 
genommen habe. Er ist jetzt aber runtergeladen und ich werde ihn mir 
anschauen. Danke für den Hinweis und für die anschauliche Erklärung zu 
den Sinc Filtern! Jetzt habe ich im Ansatz verstanden wohin die Reise 
bei den Sinc Filtern geht.

Tim  . schrieb:
> Alternativ berechnet man sich die Filtercoeffizienten vorher und faltet
> diese einach mal dem Bitstream.
Da hört es bei mir dann leider schon wieder auf.

Der AMC3306 bekommt jetzt erstmal ein Testboard und dann Teste ich mit 
dem "normalen" ESP32 was ich da unter kontrollierten Bedingungen an 
Werten erhalte.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Marc schrieb:
> Ich bin noch nicht sicher ob ich mit LEDC auch einen
> internen Interrupt triggern kann, ansonsten würde ich die CLK für den
> AMC3306 auch auf einen anderen PIN legen um so den Interrupt über den
> Pin zu triggern.
> Der hat dann 12 Takte Zeit den Pin Status auszulesen und im RAM
> abzulegen

Hm - ich bin mir ziemlich sicher, dass du mit 40e6 Interrupts pro 
Sekunde nicht gluecklich wirst. Also braeuchtest du irgendeine 
Hardwareunterstuetzung an deinem ESP, damit du nicht jedes Bit vom ADC 
einzeln per Software reinbitten musst. Also irgendsowas wie ein 
I2S/SPI/USART Hardwareinterface, was sich entsprechend zurechtbiegen 
laesst. Vorher musst du dir ueber Filteranforderungen und -realisierung 
ueberhaupt keinen Kopf machen.

Hast du den AMC3306 schon in echt bei dir rumfliegen? "Not available" 
bzw. "out of stock" waere jetzt fuer mich kein Ansporn sowas 
einzudesignen...

Gruss
WK

von Marc (Gast)


Lesenswert?

Dergute W. schrieb:
> Hm - ich bin mir ziemlich sicher, dass du mit 40e6 Interrupts pro
> Sekunde nicht gluecklich wirst. Also braeuchtest du irgendeine
> Hardwareunterstuetzung an deinem ESP, damit du nicht jedes Bit vom ADC
> einzeln per Software reinbitten musst. Also irgendsowas wie ein
> I2S/SPI/USART Hardwareinterface, was sich entsprechend zurechtbiegen
> laesst. Vorher musst du dir ueber Filteranforderungen und -realisierung
> ueberhaupt keinen Kopf machen.

Ja da ist viel wahres dran danke für den Denkanstoß!
Das I2S wird bereits vom LCD in Beschlag genommen aber das SPI ist noch 
frei.
Mit bis zu 80MHz ist es auch schnell genug. Ich muss mich nochmal durchs 
Datenblatt und die online Dokumentation graben um es zu verifizieren 
aber das SPI sollte auch DMA beherrschen.

Dergute W. schrieb:
> Hast du den AMC3306 schon in echt bei dir rumfliegen? "Not available"
> bzw. "out of stock" waere jetzt fuer mich kein Ansporn sowas
> einzudesignen...

Ja, ich habe bereits im Juli jeweils zwei mal den AMC3306M25 und den 
AMC3336 geordert als sie noch am Lager waren. Die Isolierten AMC ADCs 
mit integriertem DC/DC Wandler sind noch nicht lange auf dem Markt und 
daher hoffe ich das sie noch eine Weile zu haben sind.

von -gb- (Gast)


Lesenswert?

Dergute W. schrieb:
> Also braeuchtest du irgendeine
> Hardwareunterstuetzung an deinem ESP, damit du nicht jedes Bit vom ADC
> einzeln per Software reinbitten musst.

Richtig, aber sein ESP hat ja echt viele IOs. Da reicht es vielleicht 
schon den seriellen Datenstrom nach parallel zu wandeln. Dafür gibt es 
seriell zu parallel Schieberegister die die man gleich auch mit dem 20 
MHz Takt füttern kann. Wenn man dann ein z. B. 16 Bit Schieberegister 
nimnmt muss man den Takt auch noch durch 16 Teilen (das geht mit ein 
paar FFs) und mit diesem niedrigeren Takt wird dann das Ausgangsregister 
der Schieberegister gelatcht und gleichzeitig im ESP die Daten 
gelesen/Interrupt ausgelöst/...

von Dergute W. (derguteweka)


Lesenswert?

Moin,

-gb- schrieb:
> Richtig, aber sein ESP hat ja echt viele IOs. Da reicht es vielleicht
> schon den seriellen Datenstrom nach parallel zu wandeln.
Jepp, waere auch eine Moeglichkeit; braucht halt extra HW,etc.
Kann aber wahrscheinlich auch keine Wunder wirken, es sei denn, man 
koennte da auch per DMA Puffer fuellen.

Marc schrieb:
> Das I2S wird bereits vom LCD in Beschlag genommen aber das SPI ist noch
> frei.
I2S != I2C

> Mit bis zu 80MHz ist es auch schnell genug. Ich muss mich nochmal durchs
> Datenblatt und die online Dokumentation graben um es zu verifizieren
> aber das SPI sollte auch DMA beherrschen.
Ja, guck' mal.
Schick waer's wenn der Takt dann auch permanent rauskaeme. Und eben 
moeglichst grosse Mengen an Daten an der CPU vorbei (also z.b. per DMA) 
in irgendwelchen Buffern (RAM) landen koennten.
Je seltener die "ich hab' Daten, mach Downsampling"-IRQs auftreten und 
je groesser dann die zu verarbeitende Menge an Daten ist, desto 
guenstiger fuer Software.

Gruss
WK

von J. S. (engineer) Benutzerseite


Lesenswert?

Marc schrieb:
> Das I2S wird bereits vom LCD in Beschlag genommen aber das SPI ist noch
> frei.
Meinst du I2S oder I2C?

I2S ließe sich in der Tat gut zweckentfremden, wenn man die Takte mit 
dem Controller hinbekommt.

Dergute W. schrieb:
> I2S/SPI/USART Hardwareinterface,
oder habt ihr das jetzt beide verwechselt?

Wenn keine schnellen Eingänge da sind, dann vlt ein PLD vorschalten?

Beitrag #6903053 wurde von einem Moderator gelöscht.
von Marc (Gast)


Angehängte Dateien:

Lesenswert?

-gb- schrieb:
> Richtig, aber sein ESP hat ja echt viele IOs. Da reicht es vielleicht
> schon den seriellen Datenstrom nach parallel zu wandeln. Dafür gibt es
> seriell zu parallel Schieberegister die die man gleich auch mit dem 20
> MHz Takt füttern kann. Wenn man dann ein z. B. 16 Bit Schieberegister
> nimnmt muss man den Takt auch noch durch 16 Teilen (das geht mit ein
> paar FFs) und mit diesem niedrigeren Takt wird dann das Ausgangsregister
> der Schieberegister gelatcht und gleichzeitig im ESP die Daten
> gelesen/Interrupt ausgelöst/...

Die Idee mit dem Schieberegister ist gut, das würde den Core mehr Zeit 
geben.

Dergute W. schrieb:
> I2S != I2C
Jürgen S. schrieb:
> Meinst du I2S oder I2C?

Ich meine I2S, wobei sich da wohl etwas getan hat vom ESP32 zum 
ESP32-S3.
Beim ESP32 war das LCD Interface noch mit dem I2S verknüpft nun scheinen 
der S2 und der S3 aber ein eigenständiges Interface zu besitzen. Das 
muss ich noch weiter ergründen. Damit ist I2S aber wieder im rennen.

Dergute W. schrieb:
> Schick waer's wenn der Takt dann auch permanent rauskaeme.

Im angehängten Bild sind die mit LEDC erzeugten Takte zusehen, das 
Ergebnis bei 20MHz ist etwas entäuschend aber das sollte sich mit nem 
flotten Schmitt-Trigger richten lassen. Bei SPI und I2S ist mir noch 
kein Weg bekannt einen permanenten Takt zu generieren aber ich bleibe 
dran.

Dergute W. schrieb:
> Je seltener die "ich hab' Daten, mach Downsampling"-IRQs auftreten und
> je groesser dann die zu verarbeitende Menge an Daten ist, desto
> guenstiger fuer Software.

Das ist gerade für die Batterie/Akkulaufzeit ein wichtiges Argument. Je 
länger ich den Kern schlafen schicken kann desto besser. Ich werde da 
dran bleiben.

Jürgen S. schrieb:
> I2S ließe sich in der Tat gut zweckentfremden, wenn man die Takte mit
> dem Controller hinbekommt.

Warum eignet sich i2s gut?
hinbekommen bzgl. der Geschwindigkeit der Takte oder diesen permanent zu 
erzeugen?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Marc schrieb:
> Das ist gerade für die Batterie/Akkulaufzeit ein wichtiges Argument. Je
> länger ich den Kern schlafen schicken kann desto besser.

Deinen Optimismus moecht' ich auch mal haben :-)
Du kannst froh sein, wenn du mit deiner Filterei hinterherkommst. Kann 
mir noch nicht so recht vorstellen, dass du da lange schlafen kannst.

Marc schrieb:
> Warum eignet sich i2s gut?
> hinbekommen bzgl. der Geschwindigkeit der Takte oder diesen permanent zu
> erzeugen?

Beides. Bei I2S haste auch ein Schieberegister mit 32..64 bit Tiefe; und 
der Takt laeuft im Gegensatz zu I2C und SPI durch.

Gruss
WK

von Marc (Gast)


Lesenswert?

Dergute W. schrieb:
> Deinen Optimismus moecht' ich auch mal haben :-)

Tja das Ergebnis einer Ansammlung von Unkenntnis. Erstmal träumen und 
dann mit Fakten drauf knüppeln und gucken was übrig bleibt.
Erstmal möchte ich mich hier aber mal für eure geduldigen und 
ausführlichen Antworten bedanken. Ist noch viel zu tun aber ich bin und 
bleib optimistisch gestimmt.

Die Boards ESP32-S3-DevKitC-1-N8R2 und ESP32-S3-DevKitC-1-N8R8 liegen 
jetzt hier auf dem Tisch und ein frischer Liter Eisen3 ist auch 
angekommen.
Als erstes bekommt der AMC jetzt ein Testboard.

Dergute W. schrieb:
> Beides. Bei I2S haste auch ein Schieberegister mit 32..64 bit Tiefe; und
> der Takt laeuft im Gegensatz zu I2C und SPI durch

Und wieder etwas gelernt sobald das Board läuft schaue ich mir an wie 
ich die Daten per I2S in den RAM bekomme.

Im TRM des ESP32-S3 bin ich noch auf etwas gestoßen.
Der S3 besitzt einen Pulse Count Controller mit vier Einheiten, jeweils 
zwei Kanäle wovon jeder einen Pulse und einen Control Eingang besitzt.
(https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf#section.24)

Die primitivste art den Sigma-Delta ADC auszulesen ist ja das zählen der 
"1er". Das kann der Pulse Count ohne Probleme und ein Sinc1 Filter ließe 
sich so auch problemlos umsetzen. Bei 64fachem Oversampling und 16bit je 
Sample ergibt das 1024bit. Wenn ich die Anzahl der "1er" dann durch 64 
teile ergibt das den Mittelwert der 64 Sample. Nach 1024 Takten triggert 
der Counter dann einen Interrupt und der Wert aus dem Register wird in 
den RAM geschoben.

Leider fehlen in der TRM noch das LCD und das Camera Interface.
Das Camera Interface könnte in Verbindung mit dem Schieberegister eine 
Möglichkeit bieten 16 Pins per DMA in den RAM zu bekommen. 
Vorrausgesetzt LCD und Camera Interface lassen sich parallel nutzen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Marc schrieb:
> Der S3 besitzt einen Pulse Count Controller mit vier Einheiten, jeweils
> zwei Kanäle wovon jeder einen Pulse und einen Control Eingang besitzt.

Das hoert sich vielversprechend an.

Marc schrieb:
> Die primitivste art den Sigma-Delta ADC auszulesen ist ja das zählen der
> "1er". Das kann der Pulse Count ohne Probleme und ein Sinc1 Filter ließe
> sich so auch problemlos umsetzen.

Yep, seh' ich auch so. Wahrscheinlich wird man's auch hinkriegen, dann 
per Software die beiden anderen Integratoren nachzubilden, obwohl man ja 
dann im Gegensatz zur reinen CIC-Lehre schon nach dem ersten Integrator 
die Samplerate dezimiert hat. Bin mir so ad. hoc. nicht sicher, koennte 
aber schon klappen.

Marc schrieb:
> Das Camera Interface könnte in Verbindung mit dem Schieberegister eine
> Möglichkeit bieten 16 Pins per DMA in den RAM zu bekommen.
Da wuerd' ich jetzt weniger Hoffnung draufsetzen. Als Camera Interface 
ist wohl MIPI-CSI bei SoCs gaengig - das laesst sich nicht mit 
vernuenftigem Aufwand missbrauchen.

Gruss
WK

von Michael W. (Gast)


Lesenswert?

Marc schrieb:
> Kleine Sachen werden auf die schnelle in
> SprintLayout zusammen geknüppelt

Ah ... das klingt wirklich nach einer sehr koordinierten und stabilen 
Entwicklung. Arbeitst du zufällig bei einem Zulieferer?

von Marc (Gast)


Lesenswert?

Dergute W. schrieb:
> Das hoert sich vielversprechend an.

Habe bei Mouser jetzt noch das offizielle Devboard AMC3306EVM geordert 
damit ich meinen Selbstbau gegen das "Original" antreten lassen kann. So 
sollte ich das Risiko vermindern können mir auf diesem Wege zusätzliche 
Fehler an Land zu ziehen.

Dergute W. schrieb:
> Yep, seh' ich auch so. Wahrscheinlich wird man's auch hinkriegen, dann
> per Software die beiden anderen Integratoren nachzubilden, obwohl man ja
> dann im Gegensatz zur reinen CIC-Lehre schon nach dem ersten Integrator
> die Samplerate dezimiert hat. Bin mir so ad. hoc. nicht sicher, koennte
> aber schon klappen.

Na das freut mich ja schon mal das ich da nicht ganz auf dem Holzweg 
bin.
Ich bin gerade drauf und dran mich von der "Echtzeit" Verarbeitung der 
Daten zu verabschieden. Die ESP32-S3 Module gibt es mit 8/16MB PSRAM 
angebunden per Octal SPI, die 8MB Variante habe ich hier auf dem 
DevBoard.
Ich denke es wäre sinnvoller die Samples erstmal im PSRAM abzulegen und 
nach der Messung zu verarbeiten.

M. W. schrieb:
> Ah ... das klingt wirklich nach einer sehr koordinierten und stabilen
> Entwicklung. Arbeitst du zufällig bei einem Zulieferer?

Die Aussage gilt für meine privaten Projekte. Arbeiten tue ich als 
ausgebildeter Industriemechnaniker in der Firma und helfe ab und an im 
Bereich der Elektrotechnik aus. Die Elektrotechnik ist seit 12 Jahren 
ein Hobby das ich immer weiter ausbaue und mich an Dingen versuche die 
mich interessieren.

von HF-Techniker (Gast)


Lesenswert?

Dergute W. schrieb:
> Marc schrieb:
>> Die primitivste art den Sigma-Delta ADC auszulesen ist ja das zählen der
>> "1er". Das kann der Pulse Count ohne Probleme und ein Sinc1 Filter ließe
>> sich so auch problemlos umsetzen.
>
> Yep, seh' ich auch so.
Die Nullen müssen aber schon auch mitgezählt werden und dass dieses 
"Sinc1"-Filter übelste Oberwellen hat, ist sicher auch bekannt.

> Wahrscheinlich wird man's auch hinkriegen, dann
> per Software die beiden anderen Integratoren nachzubilden, obwohl man ja
> dann im Gegensatz zur reinen CIC-Lehre schon nach dem ersten Integrator
> die Samplerate dezimiert hat.
Wenn er die einmal dezimierte Datenmenge mit einem kleinen FIR 
bearbeitet, kommt er sicher weiter, als mit dem armseeligen CIC3. Gerade 
in einem Microcontroller sind Koeffizientenmultiplikationen doch kein 
Problem.

Wenn es an der Performance fehlt, eben ein biquad-IIR.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

HF-Techniker schrieb:
> Die Nullen müssen aber schon auch mitgezählt werden und dass dieses
> "Sinc1"-Filter übelste Oberwellen hat, ist sicher auch bekannt.

Das Nullenzaehlen kann man sich sparen, wenn der "Einser"-Zaehler 
regelmaessig zb. alle 65536 Takte zurueckgesetzt wird. Dann sind die 
Anzahl der Nullen eben 65536-Einser-Zaehlerstand.
Klar ist ein sinc() kein rect(), der waere natuerlich besser fuer den 
Frequenzverlauf eines idealen Tiefpassfilters. Aber: Lebben is nix 
Ponyhof.

HF-Techniker schrieb:
> Wenn er die einmal dezimierte Datenmenge mit einem kleinen FIR
> bearbeitet, kommt er sicher weiter, als mit dem armseeligen CIC3.
Wenns erstmal dezimiert ist, muss man's nicht mehr filtern. Ist wie beim 
Baeren - die Reihenfolge ist wichtig: Immer 1.) erlegen und dann 2.) 
Fell verteilen. Nicht umgekehrt.
Genauso beim Dezimieren: Immer 1.) Tiefpassfiltern und dann 2.) 
dezimieren.
Nicht umgekehrt.
Wie der Tiefpass konkret realisiert wird: ob fir,iir, gedoens ist 
prinzipiell voellig wurscht. Nur muss der halt mit der hohen 
Eingangssamplerate zurechtkommen...(Und man kann bei manchen Topologien 
ausnutzen, dass man durch's Dezimieren eh' viele der Ausgangswerte des 
Tiefpasses nicht braucht. Sprich: Evtl. ggf. auch nicht ausrechnen 
muss). Und dass das Filter zwar hurtig sein muss, aber die 
Eingangssamples nur 1bit breit sind...

Gruss
WK

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Dergute W. schrieb:
> Ist wie beim
> Baeren - die Reihenfolge ist wichtig: Immer 1.) erlegen und dann 2.)
> Fell verteilen. Nicht umgekehrt.

Hihi. Der Vergleich war nett.

Aber mal im Ernst: Es gibt tausende von Beiträge zu Hogenauers CIC im 
Internet, aber wenn man die ersten drei Dutzend gelesen hat, dann merkt 
man, daß die alle nur voneinander abgeschrieben haben und auch das 
berüchtigte Bild (siehe Anhang) voneinander abgekupfert haben - ohne daß 
auch nur einer den eigentlichen Dezimier-Algorithmus wirklich verstanden 
hat. Ist immer nur die gleiche Gebetsmühle. Auch ich kann dazu nur mir 
meine eigenen Gedanken machen, ohne wirklich zu wissen, ob Hogenauer 
sich das eben genau SO gedacht hat.

W.S.

von J. S. (engineer) Benutzerseite


Lesenswert?

Wenn man sich das in einer Simulation mal ansieht, was da passiert, ist 
es eigentlich einleuchtend: Es erfolgt eine lineare Interpolation zweier 
Punkte mit einer Geraden, deren Steigung nach jeder Aktualisierung des 
Eingangs neu nachgeregelt wird. Nur ist die Gerade mit der Zahl der 
Stufen skaliert und daher nicht direkt durch draufgucken ablesbar. Die 
Skalierung wird aber die gleiche Anzahl von Stufen wieder zurückgedreht.

Man muss eben die Interpolation und Dezimation verstanden haben und im 
Hinterkopf behalten, dass jede Form von Subtraktion oder Addition den 
Endwert um eine Differentiationstufe verschiebt. Daher braucht man immer 
dieselbe Anzahl von Kaskaden-Stufen, also eben z.B. 3:3 - es sei denn, 
es wird irgendwo wirklich ein Differenzial gebraucht.

Anders sieht es bei den Tastverhältnissen aus: Ich verwende z.B. einen 
8:4:4 zu 5:5:5 - Filter um von DVD auf 49152 zu übersetzen. Da kommt 
dann ein zu hoher Faktor raus, der korrigiert werden muss. Die 
Differenzialstufe stimmt natürlich. Wo man aufpassen muss, ist die 
Handhabung der Überläufe: Ein komplett binär formulierter CIC kann ohne 
Überlaufbehandlung auskommen, wenn man es richtig macht. Bei 5ern geht 
das natürlich nicht.

Was eben von der Theorie interessant ist, ist die Betrachung warum es 
eben ein 3stufiger Filter sein muss und nicht etwa einer mit 2 Kaskaden. 
(Oder einer mit 4en?)

: Bearbeitet durch User
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.