12 Bit ADC waarde omzetten naar LOG bereik

Op 16 november 2020 16:00:22 schreef deKees:
en dan blijkt dat Arduino de floating point support voor printf heeft uitgeschakeld

Als je een gewone printf van het internet plukt dan kost dat richting de 30k code... Dus ja dat schakel je uit als je primaire target maar 16k heeft.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

In Avrgcc op een AtMega32 ben je met 1K5 klaar.
Valt dus reuze mee. :)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
blackdog

Golden Member

Hi,

Vanavond heb ik een Teensy LC gekoppeld aan een AD9833 printje en ik heb de library van Bill Williams gebruikt.
Er is echt bijna niets nodig aan code om een signaal uit het printje te krijgen.

Deze twee regels heb ik alleen in de loop nodig voor het instellen van de signaalvorm en de frequentie:
De tweede regel is alleen om het signaal aan of uit te zetten.

c code:


    gen.ApplySignal(SINE_WAVE,REG0,1000000);                        // Set waveform + Frequency
   
    gen.EnableOutput(true);                                         // Turn ON the output - it defaults to OFF

Wat viel mij op...
Tot 1MHz plank rechte frequentie karakteristiek, daarna begint hij in te zakken, de belasting was op dat moment twee 1:10 probes, één voor de scoop en de andere voor de counter.
Bij het aanraken van de uitgang bij 3MHz zie ik ook het signaal een beenje inzakken, de rede zal ondermeer het terug lopen van de gain in het uitgangstapje zijn bij frequenties boven de 1MHZ.
De golfvorm bij 1 tot 3MHZ is niet slecht, maar bij 3MHZ is wel duidelijk de sample frequentie te zien, maar daar is mijn 9e order filter ook voor.
Als de AD9833 1MHz haalt bij minder dan 0,1dB dan vind ik het al mooi genoeg, beetje afval bij 3MHz vind ik geen probleem daar het ver voorbij mijn eis is.

In de audio frequenties heb ik de vervorming gemeten, die is wat hoger dan wat in de datasheet staat,
dat varieerd met de drie printjes die ik heb tussen 0,124% en de 0,16% en het lijkt het meeste 2e harmonische te zijn.
Om nu zeker te zijn of dit wel of niet normaal is, heb ik wat samples bij AD besteld om te zien of die beter zijn.

De vervorming is voor dit meetinstrument niet zo van belang, daar heb ik voldoende ander spul voor,
maar wel handig om te weten of op de China printjes de uitval van AD zit gemonteerd. :)
Geen idee af dat zo is, maar binnen een week weten we het.

De afwijking van de frequentie van de drie printjes zit beneden de 10PPM en twee rond de 5PPM, wat verder netjes is.
Ik kan bij Farnell geen oscilator bestellen die beter is en die goedkoper is dan het hele printje.
Misschien morgen de eerste stap van de encoder aansluiten om daarmee de frequentie te kunnen instellen met de Teensy-4.

Ik heb nog wel een probleem.
Mijn mooie snelle display heeft geen chipselect aansluiting, waardoor je niet meerdere devices op de eerste SPI bus kan setten.
De Teensy-4 heeft echter 3x een SPI bus ik heb alleen geen enkel idee hoe ik er voor zorg dat de goede code naar de goede SPI bus gaat.
Die vraag ga ik in ieder geval stellen op het Teensy forum.
Dit is namelijk niet zo goed gedocumenteerd voor de Teensy-4.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Ik keek net even op ebay voor de AD9833 printje en is inderdaad goedkoop. Ik denk bijna het goedkoopste onderdeel van heel je schakeling. :). En dan recht tot 1Mhz is ook niet slecht.

Ik zag ook deze is dat een verbetering?
https://www.ebay.com/itm/AD9833-DDS-Signal-Generator-Module-Sine-Squar…

Wat betreft je encoder knop en functies. Dat is op veel apparaten heel slecht geïmplementeerd. Ik kan mijn Rigol functiegenerator alleen maar per 1 digit per keer verstellen of ik moet direct de frequentie intoetsen. Met die enkle digit zit je of te grof of te klein en is echt niet ideaal. In een range heen en weer zie ik op geen enkel apparaat die ik in bezit heb. Zo zie je maar dat ontwerpers geen gebruiker zijn van het apparaat.

[Bericht gewijzigd door benleentje op dinsdag 17 november 2020 00:29:43 (42%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi benleentje, :)

Dat printje heeft wel wat voordelen, je kan een externe clock frequentie aanbieden, zodat je b.v. in de lage frequenties een veel hogere resolutie krijgt.
Verder heeft het printje een directe alsook een Low Pass filter uitgang, welke 5e of 6e order is.
Door de kleine componenten en vast ook standaard waarden van de componenten heb je kans dat de ripple van het filter aan de hoge kant is.

Daar kan je alleen maar achter komen door er een te proberen.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Door de kleine componenten en vast ook standaard waarden van de componenten heb je kans dat de ripple van het filter aan de hoge kant is.

Bedoel je daarmee dat je beter geen filter kan hebben dan een slecht filter?

PS ik had aan mijn vorige post nog wat toegevoegd.

[Bericht gewijzigd door benleentje op dinsdag 17 november 2020 00:35:55 (13%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi benleentje

Nou... ik bedoel er mee te zeggen dat het moeilijk in te schatten is.
Ik weet het kantelpunt niet van het toegepaste filter en ik geeft ook aan, dat een vlak filter wel wat eisen steld aan de filter componenten.

Ik heb hier nu de vier spoelen liggen die ik heb gewikkeld op Neosid kernen die ruim 30 jaar op voorraad hebben gelegen.
Ik ga ook nog een setje spoelen maken met Amidon kenrtjes waarschijnlijk materiaal-6 of materiaal-10 om te kijken of ik daarmeee een hogereQ voor de spoelen kan krijgen.

Dat van de spoelen en de frequentie karakteristiek komt wel goed bij mij, daar heb ik voldoende ervaring in.
Mijn problemen zitten in de software en daar doe ik nu kleine stapjes in, morgen dus wat van die kleine stapjes samenvoegen zodat ik wat kan laten zien aan jullie en
dan mij verder helpen met de log functie en de sprintf.

Nu tijd voor een tukkie!

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Mijn problemen zitten in de software en daar doe ik nu kleine stapjes in,

IK ben momenteel bezig met een C++ online cursus.
Ik weet niet of de link werkt omdat ikzelf ben ingelogd op die site

https://www.udemy.com/course/beginning-c-plus-plus-programming/learn/l…

IK moet zeggen als je het zo vanaf het begin volgt dus op de juiste volgorde en met de uitleg van de proffesor waarom dingen zo werken als ze doen ik al een stuk verder ben als ik zelf alles zelf had moeten uitvogelen. Zo een cursus is vele malen beter dan een tutorial waarin veel stappen worden overgeslagen en nog veel dingen onduidelijk blijven. Het is wel zo dat deze cursus dus puur C++ is en dus niet specifiek voor een microcontroller en dat ze al snel veel verder gaan dan je in een microcontroller zou gebruiken maar toch het blijft C++ en bruikbaar.

Maar ben wel blij met de deKees, hardbass, Rew en anderen van hen leer ik ook veel en dat is gelukkig weer wat meer gericht op microcontrollers.

IK hoop dat je eventueel ook een filter test met wat meer standaard materiaal, ik zou er ook graag 1 bouwen. Ik bedoel met meer standaard dus kant en klare spoelen dus niets iets wat ik toevallig in een bakje heb liggen :). Maar wel te koop is.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Ik zie dit in de headerfile voor de spi library

code:


extern SPIClass SPI;
#if defined(__MKL26Z64__)
extern SPIClass SPI1;
#endif
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__)
extern SPIClass SPI1;
extern SPIClass SPI2;
#endif
#endif

Dus je hebt drie aparte SPI modules op je teensy4:

SPI
SPI1
SPI2

Maar de AD9833 library heeft geen opties om naar een andere SPI te switchen. Al kun je wel in de AD9833.cpp overal SPI vervangen door SPI1 of SPI2.

Dat gaat het makkelijkste met een macro bovenin de AD9833.cpp file:

code:


#define SPI SPI2

PS: Wel na de lijst #include<> 's en voor de rest van de code.

En anders kun je misschien het display omschakelen.

Met FP?

Ja, klein programmatje met integer printf 1670 bytes, met fp printf 3152 bytes.

Ik krijg dat in de arduino niet gedaan trouwens. Wel met avrgcc.

code:


#include <stdio.h>

int main(void)
{
   char Buffer[200];
   sprintf(Buffer, "%7.2f", 12.5);
}

Aanzetten met extra linker switch:

code:


 "-Wl,-u,vfprintf -lprintf_flt -lm"

[Bericht gewijzigd door deKees op dinsdag 17 november 2020 14:47:46 (13%)

Op 17 november 2020 01:14:02 schreef benleentje:
[...]Het is wel zo dat deze cursus dus puur C++ is en dus niet specifiek voor een microcontroller en dat ze al snel veel verder gaan dan je in een microcontroller zou gebruiken maar toch het blijft C++ en bruikbaar.

C++ is ook heel goed toepastbaar in microcontrollers zeker nu deze veel krachtiger zijn dan bijvoorbeeld de arduino nano. En zelfs daar zijn al veel C++ libraries voor! Daarnaast leer je hiermee object georiënteerd programmeren, als je dat goed onder de knie hebt wil je niet meer terug. :)

PE2BAS
benleentje

Golden Member

@hardbass precies. Ik ben ook erg blij met de cursus en ik leer er erg veel van. Maar zoals met elke opleiding zal je niet altijd alles gebruiken, maar is het wel een goede basis voor de rest.

IK denk ook als je C++ goed begrijpt dat het je ook helpt om andere programmeertalen sneller te begrijpen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Zeker waar!

Bij leren programmeren gaat het om het ontwikkelen van een denkwijze, de syntax is bijzaak. Die kun je opzoeken online. Als je OOP snapt dan is de overgang naar bijvoorbeeld C# of Java niet zo heftig.

Een update van mijn kant, de AD9833 is binnen. Net eventjes aan de ESP geknoopt en dat werkt leuk. Meteen een excuus om mn nieuwe scope te gebruiken. Ook ik heb de library van Bill Williams gebruikt. Echter was een kleine aanpassing nodig aangezien ik het IDF-framework gebruik en de SPI bus deel met een schermpje. (De ESP-IDF library lost dat op een erg mooie manier op!)

Nu moet het nog in een kasje, daar is de 3d printer voor. Een klein versterkertje zou een erg mooie toevoeging zijn, maar ik wacht even waar Blackdog mee komt. ;)

PE2BAS
blackdog

Golden Member

Hi,

Ik ben vandaag een beetje aan het frutten geweest met de software, maar nog niet voldoende opgeschoten om wat te laten zien.

Maar ik ben ook met de analoge electronica bezig geweest en daar wil ik nu wel wat van laten zien.
Het was al vannacht, dat ik niet iets goed kon loslaten en slapen gaat dan toch niet,
mijn kleine DELL laptop er bij gepakt en gaan zoeken naar filters voor DDS systemen.

Natuurlijk is er ook bij Analog Devices voldoende te vinden hierover, maar het belangrijkste vond ik deze keer bij Maxim.
Mijn kennis trouwens van DDS systemen behalve grofweg de opbouw, is vrij minimaal.

En in het hier onder staande document staat belangrijke info als je zoals ik een zo recht mogelijke frequentie karakteristiek wilt hebben uit je DDS systeem.
Waar komt het in het kort nu op neer, voor als jullie eventueel te lui zijn om het onderstaande document te lezen... :+

De Maxim Application Note voor DDS filtering
www.bramcam.nl/NA/NA-AD9833-Gen/AN3853.pdf

Hoe zit het kortweg...
Je hebt de klok frequentie van b.v. de AD9833 printjes die ik hier heb en deze zijn uitgerust met een 25MHZ oscillator.
Dan heb je de Nyquist frequentie(het absoluut minimum aantal sample punten dat nodig is om er een Sinus signaal uit te bakken) welke de helft is van de klok frequentie en dat is hier 12,5MHZ.

Wat voor mij dus een leermomentje was vannacht, is dat al ruim voor de "Nyquist Frequentie" de amplitude van het uitgangssignaal al begint af te nemen!
Dus de afval bij 3MHZ is dus niet alleen de capacitieve belasting en de oplopende Ri van de uitgangsbuffer in het IC zoals ik gisteren opmerkte, maar dus ook inherent gedrag van een DDS chip.

In het Maxim document kan je vinden wat het -0,1dB punt van de amplitude is t.o.v. de "Nyquist Frequentie", en dat is dus bij 17% van 12,5MHZ wat dan uitkomt rond de 2,1MHz.
Van de vele projectjes die ik kan vinden op het Internet betreffende simpele DDS systemen, kan ik niets vinden die dit punt bespreken...
Mooi is in dit document, dat ze laten zien wat de oplossingen kunnen zijn, om de frequentie karakteristiek weer zo vlak mogelijk te maken.

De digitale manier gaat mij niet lukken, maar de correctie in het analoge domain, moet voor mij wel toepasbaar zijn.
Dit wordt in het Maxim document omschreven bij: Post-Equalizing
Dat is simpel een RC netwerkje aanbrengen met het goede kantelpunt in een van de versterker trapjes.
Wat ik niet weet is dit, als ik b.v. geen Sinus als uitgangs signaal vorm neem maar een driehoek, geld dit dan ook?
Wat ik wel al gezien heb, is dat al zonder filter je maar een paar honderd kHz als mooi driehoek signaal er uit krijgt, voor mij verder geen enkel probleem.
Nog een puntje, het blok signaal uit de DDS chip, dat is lachen, uhm een drama dus, laten we het een jitter blok noemen!
Beter is om een snelle comperator te gebruiken een blok te maken met mooie flanken uit het Sinus signaal en dat dan weer aan de versterker trapjes toe te voegen.

Versterker trapjes
De versterker trapjes moet ik nog ontwerpen en dat zullen vrijwel zeker twee snelle opamps zijn b.v. de LM7171 en/of de AD811 en bij mij in ieder geval ook nog relais
die 50-Ohm verzwakkers aansturen.
Alleen het lineaire fijn regelen van de uitgang weet ik nog niet zeker hoe ik dit doe, kan met een 500-Ohm potmeter zijn of met een DC geregelde opamp.
Het RMS signaal uit de AD9833 is iets meer dan 200mV en dat wil ik voorlopig tot 5V RMS versterken.

Uitgangsfilter
Dat heb ik al bijna twee weken geleden ontworpen met de software van Iowa Hills RF Filter Designer 2.2.
Ik ben toen begonnen een filter te ontwerpen dat heel vlak is en iets boven de maximale frequentie zit(3,3MHZ) die ik nodig vond voor dit meetinstrumentje, wat 3MHz is.

Ik heb het filter zo getuned dat het filter met ideale componenten vlak is tot 3MHz.
Het tweede uitgangsspunt was toen dat het filter een aanstuur impedantie zou krijgen van 200Ω, omdat dit de uitgangs impedantie van de AD9833 chip is.
De uitgangs impedantie wou ik op 50Ω hebben om eventueel direct mijn 50Ω verzwakker te kunnen aansturen.
Het filter moet zo stijl mogelijk zijn, met zo min mogelijk rimpel, het is dus een Chebyshev geworden met 0,01dB rimpel, dat was nog wat beter dan het Butterworth filter.
En dan nog een eis, waarden van de filter componenten moeten wel redelijk normaal zijn.

Het plaatje hieronder laat het filter zien met de waarden van de componenten die binnen 1% zitten.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-16.png

R1 in het filter plaatje, staat voor de aanstuur impedantie van 200Ω dit wordt trouwens niet meer de AD9833 direct, ik wil deze chip niet belasten en hij komt dus op de +ingang van de eerste opamp,
bij deze opamp die waarschijnlijk rond de 10x gaat versterken, pas ik dan ook de correctie toe voor afval die bij 2MHZ begint van de DDS chip.

Hoe ziet de filter karakteristiek er nu uit in de ideale toestand, kijk hieronder, het plaatje is klikbaar.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-01-Klein.png

.
De rode lijn is de amplitude bij 10dB/div en de bruine lijn is bij 1dB/div, bij 3MHz is de amplitude 0,06dB gezakt en dit is dus bij ideale componenten waarden.
In de praktijk is dit natuurlijk slechter, de frequentie karakteristiek kan als dit echt nodig is een beetje worden gecorrigeert in een van de twee versterker trapjes.

Het filter heb ik niet verder aangepast omdat ik het met een opamp ga aansturen, het is voor de opamp "lekkerder" als hij 200Ω ziet i.p.v. de standaard 50Ω
De waarden van de condensatoren vind ik geen probleem, het filter is zo getuned dat de meeste waarden na een kleine selectie met twee condensatoren kan worden gemaakt.

Schrik vooral niet van de spoelwaarden... 4,59uH ben je gek geworden Bram! :+
Nou nee hoor, ik wikkel al sinds mijn 16 jaar zelf spoelen, dat was toen voor mijn radios en middengolf zenders, alleen had ik toen geen handige meetinstrumentjes.
Midden 70 jaren kwamen in Amsterdam Amidon kernen bschikbaar via De Electronica Winkel, dat had ik al eens verteld.
Daar heb ik toen ook zo'n uitvouwbaar data vel van Amidon bij gekocht, aan de hand van die gegevens heb ik al vele kernen gewikkeld en ik vind het geen enkel probleem deze klusjes te doen.
Nu heb ik verschillende RCL meters tot mijn beschikking, en dan kan ik ook ringkernen "tunen" op de gewensde inductie.

Ik zoek met de "Mini Ring Core Calculator" uit hoeveel windingen is nodig heb bij de inductie die gewenst is.
Ik kijk nog steeds in het oude data vel want daar staan nog de Q karakteristieken in van de kernen.
Afgewogen zijn ondermeer de 50-2, 50-6 en de 50-10 kernen, de 50-6(kleur geel) kwamen er het gunstigste uit voor mijn spoelen, tussen de 250 en 300 als Q.
Dit natuurlijk wel als je de kern goed wikkeld, dat is 1-laag netjes gewikkeld over ongeveer drie kwart van de kern met zo dik mogelijk draad, ik heb 0,5mm gebruikt,
0,6mm zou ook nog kunnen, maar dat wordt dan wel wat lastig tunen.

Tunen van de kernen
Afhankelijk van de aangegeven waarde zijn er tussen de 31 en 34 windingen nodig op de T50-6 kernen voor dit filter.
Ik zet mijn RCL meter op 100kHz en leg het gewende aantal windingen op de kern en hou rekening met nog 1 extra winding wat draadlengte betreft.
Dan meet ik de kern, meestal zit je gewoon vrij dicht tegen de gewensde waarde aan, probeer een winding er bij of er af om zo dicht mogelijk bij de b.v. hier als eerste spoel aangegeven 4,59uH te komen.
Daarma ga je de windingen wat meer of minder over het kerntje verdelen, dit om hem precies op de goede inductie waarde te tunen.

Dit tunen doe je natuurlijk wel met korte aansluidraden, dit zijn al spoelen van een relatief lage inductie waarde.
Als je een 100kHz RCL meter hebt dan is 4,59uH makelijk af te lezen en kijk ook vooral naar de Q factor, die moet bij 100khz boven de 25 zitten metde T50-6 kernen,
heb je echt een lagere Q, dan zijn je aansluitdraden niet schoon genoeg!
Mijn 4,59uH spoeltje op de T50-6 kern heeft bij 100kHz een Q van 34,2! bij 1MHz als de verliezen niet te ver oplopen in de kern zou de Q meer dan 300 zijn.

Hieronder een plaatje van mijn spoelen, die in het alu huisje zijn bouwsetjes van Neosid, jammer genoeg niet meer te koop.
De Q van deze spoeltjes zijn wel een stuk lager, geen 34,2 bij 100Khz maar 22,4, de alu bus is hiervoor gedeeltelijk verantwoordelijk.
Het voordeel van deze spoelen dat ze makkelijk zijn te tunen omdat ze een afregelkern hebben.
De lange draden aan de onderzijde van deze spoelen zijn er aangezet om aan deze spoelen te kunnen meten.
Het witte blokje is een soort kaarsvet waarmee ik de windingen vast zet op de kern, kan eventueel ook met 10 seconde lijm.
Maar dit "kaarsvet" is makkelijk als ik de kerntjes een beetje warm maak dan kan ik de windingen een beetje verschuiven om de inductie nog aan te passen.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-17.png

.
Dit is de software waarmee ik de kernen uitreken, deze software is ook geschikt voor vele typen ferriet kernen.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-18.png

.
Dat was het weer voor vandaag.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Als je het zo uitlegd over het zelf wikkelen en daarna tunnen dat valt dat erg mee. Het meeste werk zit hem dan in het uitzoeken van geschikte kernen maar dat heb jij al voor ons gedaan dus nabouwen met die gegevens is beter te doen dan ik dacht.

De digitale manier gaat mij niet lukken,

Misshien een leuk klusje voor ander forum gebruiker, ook nog te moeilijk voor mij. Hoewel ik me afvraag als het gewoon een wiskundig verbad is tussen toenemende frequentie en afnemende amplitude is het niet veel meer dan voor een gegeven frequentie de correctie factor voor de amplitude uit te rekenen. Echter als bij 12,5Mhz de amplitude nog maar 17% dan geld na correctie dat de max amplitude overal 17% maximaal is.
Ik heb echter al een functie generator tot 25Mhz dus als deze gewoon tot 3Mhz gaat is dat ook prima. Hoewel het natuurlijk wel leuk is als je het maximale eruit kan persen.

IK heb nog steeds een wens om een 3 fase signaal generator te hebben wat tot ca 500Hz gaat, kun je deze generatoren ook synchroniseren tot 4 kanaal generator

[Bericht gewijzigd door benleentje op woensdag 18 november 2020 00:44:04 (12%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Met een dsp zou dat prima kunnen, al vraag ik me af wat dan nog het nut is van de ad9833. Dan kan je wellicht direct het signaal in de dsp kunnen opwekken.

Met die dsp kun je een array van cooficienten definieren. Deze cooficienten worden bepaald door een filter ontwerp tooltje. De dsp wordt dan effectief het filter uit je ontwerp

[Bericht gewijzigd door hardbass op woensdag 18 november 2020 10:59:23 (37%)

PE2BAS

Even nog niet alles gelezen, maarrrrr....

Je moet je realiseren dat als je 12.5MHz aan de uitgang vraagt, de DDS chip dus zijn ADC opdracht geeft om +1023, -1023, +1023, -1023 als uitgangssignaal te proberen te produceren. En dat is "best case".

Worst case, is de fase van het signaal zo dat ie 0,0,0... produceert.

Een vervelende situatie krijg je als je hem vraagt om 12499999 Hz te maken.... Dan moet ie ECHT rond de hele seconde 1000+ naar de ADC sturen en rond de seconde +0.5 rond de 0!

Als je dan een perfect theoretisch filter er achter zet, met een 12500000 cutoff frequentie dan zou daarachter dus weer het 12499999 (zonder amplitudeschommelingen) kunnen reconstrueren. Omdat ze in dit zonnestelsel die ideale filters nog niet gevonden hebben, hebbgen ze er een minder ideaal filter ingezet. Dat als richtlijn 17% van de nyquist frequentie genomen wordt, of iets dergelijks dat zou best kunnen. Maar dat heeft dus geen theoretische oorsprong, Gewoon nattevinger, dan zien de signalen er wel aardig uit.

Anderzijds... Die DDS doet voor de driehoek op 12.5MHz dus ook gewoon +1023, -1023, +1023, -1023 ... net als voor de sinus. Iets anders kan gewoon niet.

Dan over hoe een DDS werkt: Iedere klokcyclus doet ie gewoon dac := 1023 * sin (f * t);

Om dit in hardware te doen wordt dat:

code:

[every clock]
   phase += frequency;
   dac := SINTABLE (phase[31:22]);

Die "SINTABLE" kan dan ook

code:


   if (in[10]) return 1023-in[9:0]; 
   else        return in[9:0];

zijn.

Dan heb je je driehoek.... Kortom De essentie van zo'n DDS chipje kan je in minder dan 20 relgels Verilog omschrijven.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
benleentje

Golden Member

Met een dsp zou dat prima kunnen,

Ik vroeg me alleen af of het volgens een eenvoudige wiskunde berekening kan. Zodat het ook in de Teensy kan.

Je moet je realiseren dat als je 12.5MHz

Ik had al een idee dat 12,5Mhz niet realistisch is maar eerder een theoretisch maximum.

Omdat ze in dit zonnestelsel die ideale filters nog niet gevonden hebben,

Daarom is mijn glazenbol nog steeds erg wazig en werk mijn natte vinger voorspellingen een stuk beter :).

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi,

Weer even wat metingen op het analoge front.
Hoe ik de versterkertrapjes ga opbouwen is nog steeds niet helemaal zeker, maar ik wou in ieder geval eens een Eliptic filter proberen.

Ik heb een Eliptic filter geconfigureerd met Iowa Hils software met twee afgestemde kringen, waarvan één king op de clock frequentie zit van de AD9833, dus op 25Mhz, zie Marker-4 in het plaatje.
De tweede afgestende kring op b.v. 12,5Mhz lukte niet goed met deze software en ik weet ook niet of dit wel echt nodig is/kan, volgens mijn metingen is 12,5MHz al -40dB en dat is mooi.
Dit is de Spectrun Analyzer sweep die ik net gemaakt heb met de trimmer over de spoelen ingesteld op de frequentie die staat aangegeven in het schema zoals, uitgerekend door de Iowa Hills software.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-21.png

.
Hier kunnen jullie zien hoe de frequetiekarakteristiek er uit zou moeten zien volgens de Iowa Hills software.
De schaal van deze software kan ik niet instellen, maar er is goed te zien dat het goed overeen komt met de berekeningen van de software.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-23.png

.
De demping van het filter is heel erg goed, tot bijna 5MHZ is de demping maar -0,07dB en -0,1dB demping zit bij dit filter op rond de 5,8MHz.
De rest van de demping is in de "Marker Table" te zien.

.
Dit is een plaatje met een hogere resolutie van 0,2dB/Div.
Marker-1 geeft de basis demping aan, Marker-2 is het punt van 0,1dB demping.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-24.png

.
Dit is de open test opbouw, op een stukje print materiaal.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-22.png

De spoelen zijn weer gemaakt met T50-6 kerntjes en deze keer met 0,6mm draad, ik vond namelijk nog een paar meter hiervan.
Het "tunen" ging weer op de zelfde manier als bij het andere filter beschreven.
Wat opviel was dat de Q weer hoger was, dit komt door het dikkere draad, en de Q is ruim 40 bij 100kHz.

De condensatoren zijn er steeds twee parallel, C6, C7 en C8 kies ik dan een paar pF lager als het kan, dit omdat er ook capaciteit van de opbouw is.
De condensatorwaarde over de twee spoelen bestaat uit grotendeel een vaste condensator en een kleine trimmer.

De waarde die dus over de spoelen komt te staan, heb ik als eerste afgeregeld met een RCL meter en dit klopte vrij goed.
Later ben ik gaan spelen met deze trimmers om te zien wat voor effect het heeft op de doorlaat karakteristiek en de notch frequenties, dat is goed voor mijn inzicht. :+

Dit filter heeft minder componenten dan het 9e order filter en toch een flinke demping en een vrijwel rechte responce tot net geen 6MHZ.
Hij heeft wel een wat slechter puls responce, blok door dit filter duwen is dan ook geen goede optie en de driehoek golfvorm zal ook wel een beetje worden aangetast.
Tot welke frequentie de driehoek goed blijft met dit filter kan ik jullie vertellen als ik het eerste versterker trapje het gebouwd en dit voor het filter geplaatst heb.
De blok kan dan uit de blokomvormer in het tweede trapje worden bijgevoegd, later komt de schema opbouw, dat hangt wat af van de metingen aan het eerste trapje en dit filter.

Filter bouwen
Als je een RCL meter hebt die tot 100khZ gaat of een die twee digits achter de comma heeft bij uHenri spoeltjes, dan heb je geen spectrum analyzer nodig voor de controle van dit filter.
Ik zou dit filter ook nog kunnen meten met één van mijn functie generatoren, breedband RMS meter of een scoop, met de scoop wordt het wel lastig 0,1dB amplitude resolutie af te lezen.

Ik weet nog niet welke filters ik ga gebruiken, dit filter wat ik hier laat zien is de 50Ω versie, ik heb ook nog een 200Ω versie getekend/uitgerekend.
Omdat ik het 50Ω model nu al heb gebouwd ga ik daar eerst mee testen.

Ik zou zeggen, Shoot @ IT!

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Het ziet er allemaal goed uit en ik ben blij dat het filter iets vriendelijker is om na te bouwen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi,

Ik wil nog wat duidelijker maken over hoe ik meestal het maximale uit mijn projectjes haal die ik bouw.
Veel is eerst berekend met de software die tegenwoordig hiervoor gratis beschikbaar is.
Dat is b.v. een Spice variant en/of filter software en lijsten met tabellen.

Die geven meestal theoretische uitkomsten met ideale grafieken, alhoewel je steeds meer in de software, ook de eigenschappen van de componenten kan ingeven.
Bij het ontwerpen van de versterker trapjes is dit wel wat lastiger.

Bij veel opamps zijn de eigenschappen bij kleine signalen anders dan bij sterke uitsturing, dat zit niet altijd goed in het Spice model verwerkt.
Dus daarom solder ik vaak dan toch maar een probeer schakeling in elkaar, vooral als deze een wat grotere bandbreedte nodig heeft, hier dus vlak tot 10MHz zonder correctie voor de DDS.
Het versterkertrapje achter de AD9833 DSS chip wordt dus niet echt vlak tot 10MHZ, maar het gebruikte IC moet dat wel aan kunnen.
Dit versterker trapje krijgt ook de correctie voor het zakken van de uitgangs amplitude boven de 2MHz.

Mijn uitgangspunt blijft in principe de max 3MHz, maar als ik hem vlak kan kijgen tot zeg 6MHZ, dan is dat mooi megenomen.
Ik heb wel al en selectie gemaakt betreffende de opamps en daar ga ik vandaag nog verder mee, dit zijn vast de type nummers:
AD811
LM7171
THS3091

Dit zijn alle drie breedbandige opamps die ook redelijk veel stroom kunnen leveren over een grote bandbreedte.
En nee, er zijn geen Jelly Bean opamps die dit ook kunnen, je hebt echt goed spul nodig!
De THS309x series kom je veel in functie generatoren tegen, als versterker trapjes die uiteindelijk de uitgangen aansturen.

Mooi, maar nu terug naar mijn laatste filter, waar ik wat van wil laten zien als je van ideale componenten naar de reële situatie gaat.
Eerst even het plaatje en dan de uitleg.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-25.png

.
Bovenste grafiek
Dit plaatje laat drie keer het zelfde filter zien.
Bij de bovenste grafiek is alles ideaal, dus de perfecte componenten waarden en geen verlies factoren in de componenten.
De rode lijn geeft de demping aan in de 10dB/Div schaal en de bruine lijn in de 1dB/Div schaal.
Zelfs bij de bruine lijn is geen rimpel zichtbaar, die is beneden de 6MHz iets van 0,01dB.

Middelste grafiek
Dan krijgen we de middelste grafiek, hier is de varieatie in de componenten waarde 5% en je ziet hier vele lijnen geschreven.
Dit noemd men Monte Carlo, dus als ik condensator C1 nu eens 1pF hoger neem en de andere componenten gelijk hou, wat wordt dan de grafiek, en daarna als ik de eerste spoel nu 2% groter neem bij de 1pF hogere capaciteit?
Soms kan je het aantal stappen aangeven alsook de componenten variatie in procenten, dat kan tot miljoenen berekeningen opleveren. :+
Deze tweede grafiek geeft dus alleen de Monte Carlo variatie van de componenten waarde.

onderste grafiek
En dan de laatste grafiek, hierbij zijn behalve de variatie van de componenten waarden ook een beetje de paracitaire eigenschappen van de componenten meegenomen.
Nu is goed zichtbaar dat de bruine lijn veel eerder begint te dalen, bij 5,8MHz is het filter nu -1dB geworden in het ongunstigste geval.
Ook b.v. de Notch rond 25MHz is net al de tweede grafiek over een vrij groot gebied uitgesmeerd, maar nog wel beneden de -60dB die ik stelde bij het ontwerp.

Als je deze laatste grafiek nu vergelijkt met mijn spectrum plaatje, dan kan je zien dat mijn testfilter helemaal niet zo slecht is, kijk naar het plaatje met de 0,2dB/Div schaal.
Hoe komt het nu dat ik deze goede resultaten behaal, dat komt b.v. omdat ik niet denk, het is wel goed zo...

Optimalisatie spoelen
Ik zoek uit welke spoelkernen ik kan gebruiken, dat werden de T50-2, T50-6 en de T50-10.
Waarom deze kernen en dan heb ik het over de grote dus T50-x, kijkend in de grafieken en wetend dan grotere kernen langere draden verlangen door de grotere diameter van de kernen,
dan is het duidelijk dat langere draden mee DC Ri hebben wat resulteerd in een lagere Q factor.

Ook kies ik voor het winding aantal een zo dik mogelijk stukje draad, zodat er nog wel wat ruimte overblijft om wat te schuiven met de wikkelingen, dit om precies de goede inductie te krijgen.
Zet je RCL meter op de hoogste meetfrequentie, waarbij ik er vanuit ga dat niemand hier de prof apparaten ter beschikkening heeft die tot 10MHZ meetfrequentie gaan.
Dus netjes wikkelen die kern op het optimale kern materiaal met wat ruimte om te schuiven van de wikkelingen met zo dik mogelijk draad in één laag, daarna als de spoel geadjusterd is de wikklingen vastzetten met wat lak of kaarsvet.

Optimalisatie condensatoren
Dan komen we bij de condensatoren, ik heb hier een mix gebruikt, dat is Philips Cer condensatoren, een Silver Mica type, en dat alleen maar omdat ik deze waarde niet als Cer van Philips had.
Zoek de combinatie van de condensatoren zo uit dat je binen 1% van de waarde zit en hou rekening met wat paracitaire capaciteiten van je opbouw,
denk dan aan 3 tot 5pF per junctie dit is afhankelijk van je opbouw.

De condensatoren die de twee afgestemde kringen maken, worden grotendeels opgebouw door een vaste condensator met een trimmer condnestor die ongeveer 5 tot 10% regelberijk heeft.
Zoals ik al eerder aangaf, heb ik deze condensator en de trimmer al afgeregeld in de testschakeling aangebracht en de notch frequenties zaten maar heel weinig nast de berekende frequenties.
Ik had een zakje ceramische condensatoren bij ene leverancier bsteld met vele waarden, dit ligt nu in de prullenbak, gewoon rommel!
Neem goede condensatoren voor je filters, dat kan Polysyreen zijn tot zo'n 50MHZ, de Philips Cer. condensatoren, het liefst met het zwarte bandje, geel bandje zeker niet!
Of b.v. Silver Mica condensatoren, die vaak mijn voorkeur hebben als het om vermogens gaat, wat in dit project niet aan de orde is.

Filteropbouw
Bij deze filter test schakelng heb ik er ook aan gedacht de schakeling zo goed mogelijk op het testprintje te bouwen, de condesatoren zo kort mogelijk aan te sluiten.
De spoelen verschoven geplaatst zoals op de foto zichtbaar is.
In heb ook nog een schotje geprobeerd in het midden van het filter, dat gaf geen verbetering die ik kon meten.

Error Budget
Al dat "voorwerk" dat ik heb gedaan resulteerde in een filter dat maar iets slechter is dan de ideale waarden.
Nu kan je zeggen, Bram je DDS valt waarschijnlijk 1,5dB af bij 6Mhz, al die moeite als je DDS dominant is en dan zeg ik: Error Budget!
Ga al die fouten eens bij elkaar optellen, dan kan bij elkaar een vrij grote rimpel opleveren boven de 1Mhz van je uitgangs amplitude.

Bij mijn Siglent SDG 2042X hebben ze het uitstekend opgelost, beneden de 1MHz levert deze generator een perfecte blokweergave, er is geen rimpel zichtbaar op de blokpuls wat een goede manier is om te kijken naar "vlakheid" van een versterker trapje.
De filtering en de versterkertrapjes in de Siglent Generator zijn dus uitstekend ontworpen.

Met de houding van "het is wel goed zo" zou deze generator serie nooit zo populair zijn geworden. ;)

Mooi, nu is het tijd om een 10x versterker trapje te bouwen met een AD811 al eerste test.

Groet,
Bram

PS
Ik heb het bij de AD811 over dit product:
https://www.analog.com/en/products/ad811.html
.

En niet over dit product! 8)7
https://www.bol.com/nl/p/m5-magnetische-wimpers-nepwimpers-model-ad811…

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Met de houding van "het is wel goed zo"

IK doe nu al 20 jaar onderhoud aan machines. Veel machines zijn al van de jaren 70 begin 80. 20 jaar gelden hadden die machines veel uitval nu veel minder. Dus met veel zorg en aandacht maak je gewoon alles beter.
Toch heb ik met machines wel geleerd dat de simpele oplossingen toch vaak het beste zijn en dat over-engineering meestal heel slecht uitpakt de machine gaat dan net zo vaak kapot maar reparatie zijn veel duurder.

Echter als ik iets met elektronica maak denk ik ook al snel goed zo, simpel omdat ik niet de kennis heb om het veel beter te doen. Daarom is het wel leuk om te zien hoe het wel moet.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi,

Na een uur zoeken waarom mijn code zo vreemd liep, heb ik de DDS chip in zoverre werkend, dat ik met de encoder de frequentie goed kan instellen.
Als je de code hieronder ziet is het eigenlijk kinderspel, maar de fout die er in zat heb ik dus zeker een uur overheen gekeken.

Als je naar de output van de AD9833 keek op de scoop, zag je dat hij ongeveer 20x per seconde een hick-up had,
maar verder werkte het wel, al was de eerste versie wel wat lastig instelbaar om naar een paar MHz uitgangs frequenti te komen, toen heb ik de output van de encoder x100 gedaan en klaar was ik.

c code:


#include "QuadEncoder.h"

// Change these pin numbers to the pins connected to your encoder.
// Allowable encoder pins:
// 0, 1, 2, 3, 4, 5, 7, 30, 31 and 33
// Encoder on channel 1 of 4 available
// Phase A (pin0), PhaseB(pin1), 
QuadEncoder knobLeft(1, 0, 1);


#include <AD9833.h>                           // AD9833 library
#define FNC_PIN 8                             // Can be any digital IO pin
AD9833 gen(FNC_PIN);                          // Defaults to 25MHz internal reference frequency


void setup() {
  gen.Begin();                                // Deze regel had ik in de void loop geplaatst, de muts die ik ben :-)
                                              // Dat veroorzaakte het hick-up gedrag aan de uitgang van de AD9833.
  knobLeft.setInitConfig();
  knobLeft.init();
}

long positionLeft  = -999;
long DDS = 10;


void loop() {
  long newLeft;
  newLeft = knobLeft.read();
  if (newLeft != positionLeft) {
    positionLeft = newLeft;
    gen.ApplySignal(SINE_WAVE,REG0, (DDS = newLeft * 100));
    gen.EnableOutput(true);
}

}

Door de x100 truc kon ik goed varieeren tussen 100kHz en 6MHz om de frequentie karakteristiek op te meten.
Maar eerst hier even de grafiek met daarin de eerste versie van het versterker trapje met de frequentie correctie.
Het versterkertrapje zelf met de AD811, zonder correctie zou hij volgens de datasheet bij 20dB gain -3dB zijn bij 100MHz bij +-15V voeding.

Dit is de test setup, nog wel het DDS printje op het Breadboard ondanks de hoge paracitaire capaciteiten en dat ik hierdoor wat meer moest compenseren.
Aan de rechterkant gaat de zwarte coax naar de Fluke breedband RMS meter en die is daar afgesloten met een 50Ω inline afsluiter om het low pass filter mooi 50Ω te laten zien.
De AD9833 is AC gekoppeld met de AD811, dat is voor nu handig, en misschien injecteer ik later een stroom in de inverterende ingang van de AD811 om het DC niveau aan de uitgang rond "0mV" te krijgen.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-32.png

.
Ik heb het testschema in de grafiek geplakt, dat is voor nu mooi genoeg.
Met in het kader aangegeven compensatie waarden van C2=150pF en R2 van 301Ω wordt de frequentie karakteristiek binnen -0,1dB 3,5MHz, dus mijn doelstelling is behaald!
Bij de hier gekozen versterkings waarde van de AD811 komt er met 50Ω belasting 1,28V RMS uit deze schakeling.
Na deze schakeling komt de relais verzwakker, potmeter voor de fijn regeling van de amplitde en de buffer trap die het signaal op de maximale waarde brengt wilke ik nog moet kiezen.
Let op de schaal aan de linker zijde, dat zijn grote 1dB stappen.

Het plaatje is klikbaar voor een grote versie.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-31-Klein.png

.
Hier nog een lijstje van een deel van de metingen waar links de frequentie staat, in het midden de demping van een niet gecorrigeerde versterkertrap en rechts al de versterker wel gcorrigeerd is.
https://www.bramcam.nl/NA/NA-AD9833-Gen/NA-AD9833-Gen-33.png

.
De exra demping boven de 3,5MHz komt geheel voor rekening van de DDS Chip en die zal lastig goed te compenseren zijn, misschien met een LC kring in de tegenkoppeling van het tweede trapje.
Maar grote kans dat ik dat niet ga toepassen, dit omdat ik mijn doelstelling bereikt heb met 3,5MHz bij 0,1 dB vlakheid.
De frequentie karakteristiek loopt met de correctie componenten op tot +0,04dB bij 2Mhz, de aangegeven componenten waarden geven in deze testopstelling dus het maximaal haalbare.
het kan misschien nog iets beter worden als het breadboard niet meer aanwezig is, maar verwacht maar geen 0,1dB bij 6MHZ, dat zit er niet in.

Shoot!
Bram

[Bericht gewijzigd door blackdog op donderdag 19 november 2020 22:45:46 (13%)

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Dat is weer een mooie lading informatie. Op analoog gebied kan ik niet veel toevoegen denk ik. Al vind ik het wel interessant en door dit na te bouwen kan ik weer een hoop leren. Voor zover ik alle spullen heb tenminste. De opamps hiervoor heb ik niet, ik heb wat standaard spul, maar dat is veel en veel te langzaam. Ik zal eens een paar bestellen.

In je software zie ik nog een variabele DDS staan. Deze kan je weg laten. Hij doet niets. Om terug te komen op de originele vraag, als je onderstaande code gebruikt heb je de logaritmische instelling die eerder werd voorgesteld door dekees. (dacht ik :)) Dit gebruik ik in ieder geval.

c code:


#include "QuadEncoder.h"
#include <AD9833.h>   

#define FNC_PIN 8                             // Can be any digital IO pin


// Change these pin numbers to the pins connected to your encoder.
// Allowable encoder pins:
// 0, 1, 2, 3, 4, 5, 7, 30, 31 and 33
// Encoder on channel 1 of 4 available
// Phase A (pin0), PhaseB(pin1), 
QuadEncoder knobLeft(1, 0, 1);
AD9833 gen(FNC_PIN);                          // Defaults to 25MHz internal reference frequency

long positionLeft  = -999;
float a = (log(50000.0) - log(10.0)) / 512;
float b = log(10.0);

void setup() 
{
	gen.Begin();                                // Deze regel had ik in de void loop geplaatst, de muts die ik ben :-)
											  // Dat veroorzaakte het hick-up gedrag aan de uitgang van de AD9833.
	knobLeft.setInitConfig();
	knobLeft.init();
}

float EncToFreq(float x)
{
	return exp( a * x + b );
}

void loop() 
{
	long newLeft;
	newLeft = knobLeft.read();
	
	if (newLeft != positionLeft) 
	{
		positionLeft = newLeft;
		gen.ApplySignal(SINE_WAVE,REG0, EncToFreq(newLeft));
		gen.EnableOutput(true);
	}
}
PE2BAS