Dual slope ADC

Na aanlang van de lange discussie in het "Je mooiste meetapparatuur" topic maak ik even een apart topic.

Op 30 mei 2011 17:33:11 schreef free_electron:
lf356 pakken. die dingen zijn precieser
en een goeie condensator al is die filmcap die je gebruikt hebt ook al niet mis
een 4066 vervangen door een dg4xx die hebben minder lek

het leuke aan een dual slope convertor is dat je die zo accuraat kan maken als je maar wilt.

per definitie is de integrator met de opamp lineair zolang je van de rails wegblijft.
de ingang van de opamp is enrom hoogohmig en vormt geen belasting voor de integrator.
de ingang van de comparator er na ook niet.
als je goeie opamps pakt met een zo laag mogelijke bias stroom ( fet ingangen zoals de lf356 ) zit je gebeiteld daar.

je resolutie is dan puur bepaald door 2 dingen :
hoe accuraat je de tijd kan fragmenteren ( met andere woorden meer bits en een hogere klok. )
je referentie.
als je een lm399 op de kop kan tikken en je maakt daarmee een 10 volt referentie die je afdeelt moet je met je circuitje makkelijk 5 1/2 digit halen.
ik heb ene ouwe keithley 2001 opengedaan in het lab om eens te kijken hoe ze daar de omzetter maken ; lf356 en een zilver mica cap. de multiplexers zijn , hou je vast.. 4052's ... de referentie een lm199 en een een opamp als stroombron voor de verwarming in die diode.

mijn eerste brouwsel ( http://www.circuitsonline.net/forum/view/message/1259531#1259531 ) is zo goedkoop mogelijk gemaakt.
inclusief laag flux aan de onderkant :)
maar het werkt, vanavond even verder ermee en dan met mn CPLD bordje aansturen voor een betere timing.
met een 25Mhz kristal zit ik op 40nS resolutie, lijkt me goed genoeg.
voor de LM399, zou een LM4140 ook werken, die is nieuw en leverbaar, 0.1% tolerantie en 3PPM tempco.
de 10PPM versie is minder dan 3,50 bij farnell ongeveer :)
die opamps zien er goed uit, moet werken.
voor een negatieve referentiespanning, LM4140/LM399 in een goede opamp jagen en inverteren genoeg?

Uit het vorige topic (en tevens TVP): lmc662 (2 euro bij RS) met 2fA aan bias current als opamp? Is alleen niet zo snel.

[Bericht gewijzigd door alex278 op dinsdag 31 mei 2011 13:13:01 (11%)

fred101

Golden Member

Leuk topic, ik ga er ook mee experimenteren. Is het een idee om je huidige schema hier neer te zetten ?

Ik heb een 24 bits ADC maar dat is nog te complex. Ik vind zo'n experiment als dit wel leerzaam. Dat s toch een beetje de basis.

http://www.opamp-electronics.com/tutorials/digital_theory_ch_013.htm

Een uitgebreide uitleg over ADCs in steeds verder gaande stapjes.

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs

een 24 bits ADC is toch goed te doen, welke microcontroller en ADC gebruik je?
zal vanavond even het schema posten maar het is eigenlijk belachelijk simpel :)
nu op school en zometeen op et werk dus kan nog even niet bij het schema.

Ik heb nog wat NJM2082D opamps liggen, welke volgens mij ook prima geschikt zijn.

Slewrate 20V/µS
Ingangs imperdantie 10^13Ω

$0,34 @ mouser

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
fred101

Golden Member

riktw, dat ligt iets complexer. Het ding zit op en evaluation board, heeft rs232 en uProcessor aan board. Software ervoor draait alleen onder windows 95/98 en ik werk met linux. Probleem is dat ik al blij ben dat ik wat uit een arduino krijg. Daarom wil ik eerst eens de basis leren en waar jij mee bezig bent is een mooie stap. Dat zal ik pogrammeer technisch nog net aankunnen.

Wat ik nu aan het uitzoeken ben is hoe ik de digitale output van de ADC direct naar 7 segment LEDs displays krijg. Dan hoef ik niks te programmeren. Vroeger deed men dat ook via BCD maar ik ben er nog niet precies achter hoe. Ik ben al blij dat ik nu snap hoe een ADC werkt en welke types er zijn.

Dus het leek me leuk eens een simpel metertje te maken met bv 3 digits als oefening. Met misschien de optie het aantal digits uit te breiden in stapjes. Maar eerst maar eens simpel beginnen.

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs
free_electron

Silicon Member

AD8510 is ene heel goede opamp. zit in de fluke 8846a als integrator.

di lm4140 haalt 6ppm, alleen geselecteerde halen 3ppm.

die lm399 doet 0.5 ppm...

http://cp.literature.agilent.com/litweb/pdf/34401-90013.pdf

pagina 159 ( intikken in pdf viewer , is nie tpagina 159 in boek )

daar staat het schema van de referentie en de ganse a/d omzetter,
let op die a/d omzetter is charge balancing en niet dual slope !
de comp pin gaat naar een asic die het nulpunt detecteert.
de 'flash' output gaat naar een klassieke a/d omzetter die de 'rest' digitaliseert.

[Bericht gewijzigd door free_electron op dinsdag 31 mei 2011 17:47:08 (57%)

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Op 31 mei 2011 15:24:13 schreef fred101:
Wat ik nu aan het uitzoeken ben is hoe ik de digitale output van de ADC direct naar 7 segment LEDs displays krijg. Dan hoef ik niks te programmeren. Vroeger deed men dat ook via BCD maar ik ben er nog niet precies achter hoe.

Ik heb het vroeger zo gedaan. Niet te moeilijk, en redelijk accuraat. D'r komt wel een EPROM en een GAL16V8 bij kijken.
Misschien een afzonderlijk ADC (en DAC) topic starten, teneinde Riktw's ding niet te kapen?

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

zow, schema:
http://imageshack.us/f/841/schematic.png/
en code:
http://pastebin.com/Ahh6dB4t

kijk uit, de boel is heel erg quick en dirty, code is voor een arduino btw.
als er intresse is in de eagle files van de PCB geef maar een gil ;)
zodra alles met de CPLD goed werkt zal ik die zooi ook even posten.
@F_E ik zie dat digikey nog wel de LM399 heeft, alleen daar is het wat moeilijk bestellen, farnell kan ik met mn werk en school nog bij bestellen.
even kijken of ik een keer met iemand kan meeliften dus :)

Ik was (nog) niet van plan er eentje na te bouwen. Maar je weet nooit...

ik zie dat digikey nog wel de LM399 heeft...

Tja, die spanningsreferentie. Als die er niet is, weet je uiteraard niet wat je meet.
Zou een kristalspanningsregelaar-oventje niet bruikbaar zijn? Met een redelijk stabiele ingangsspanning, een stabiele temperatuur en een stabiele belasting moet ook een 7805 bruikbaar zijn, denk ik zo.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
free_electron

Silicon Member

Op 31 mei 2011 21:04:04 schreef pros:
Ik was (nog) niet van plan er eentje na te bouwen. Maar je weet nooit...

[...]
Tja, die spanningsreferentie. Als die er niet is, weet je uiteraard niet wat je meet.
Zou een kristalspanningsregelaar-oventje niet bruikbaar zijn? Met een redelijk stabiele ingangsspanning, een stabiele temperatuur en een stabiele belasting moet ook een 7805 bruikbaar zijn, denk ik zo.

Dat is wat die 399 doet.
daar zit een temperatuurreglaar in die de diode op 1 specifieke temperatuur houdt.
de 399 wordt geleverd in een metalen behuizing met een thermische isolator errond.

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Dat had ik begrepen. De vraag was: kan je zelf iets bouwen dat in de buurt komt?
De spanning mag gerust wat afwijken, zolang ze maar stabiel blijft nadat de oven op temperatuur is.
Kalibreren is geen probleem - daar zorgt fred voor... :-)

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
free_electron

Silicon Member

Op 31 mei 2011 21:33:29 schreef pros:
Dat had ik begrepen. De vraag was: kan je zelf iets bouwen dat in de buurt komt?
De spanning mag gerust wat afwijken, zolang ze maar stabiel blijft nadat de oven op temperatuur is.
Kalibreren is geen probleem - daar zorgt fred voor... :-)

moeilijk... long term drift en dergelijke zijn belangrijk.
er is een reden dat haast al die 6 1/2 digit toestellen opgebouwd zijn rond een lm399

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
fred101

Golden Member

Misschien een afzonderlijk ADC (en DAC) topic starten, teneinde Riktw's ding niet te kapen?

Ik bedoelde niet dat ik nu wil weten hoe het moet, maar bedankt voor de info. Ik wil gewoon eens wat stoeien met dit principe. En ik hoef niet eens moeilijk te doen (dat led was voornamelijk om niet te hoeven programmeren) want ik heb een Arduino en het grootste probleem, de software dus, heeft Riktw opgelost :-)

Dankzij de info hier, vooral de uitleg van Free en de info van de link die ik eerder gaf heb ik in ieder geval nu eindelijk de ADC van de Fluke stabiel gekregen (fingers crossed) Als hij het morgen nog steeds goed doet, ga ik een opzetje maken mbv de arduino en het schema van Riktw. Lijkt me een leuk experiment, mijn eerste stapjes op het digitale pad onder deskundige begeleiding ;-)
Ik gebruik zolang wel een calibrator als referentie spanning

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs

Zow, CPLD werkt wel leuk, alleen I/O tekort dus niet op 40nS resolutie maar 160nS
nog preciseer is niet meer nuttig kwa tijd, de laatste 2 digits springen alle kanten op :)
http://img31.imageshack.us/img31/8567/test2gd.png
dit is met de MBED gedaan omdat de arduino wat I/O tekort kwam en mn CPLD geen ruimte meer had voor een parallel naar serieel converter.
de CPLD zitten 2 tellers in, de een telt tot ~ 0.08 seconden, 2097152 * een clockcycle van 25Mhz.
de ander telt net zo lang tot de condensator weer leeg is.
die kan tot maximaal ~ 0.32 sec tellen (8388608 * 25Mh clock)
de waarde wordt simpelweg op de I/O gezet, MBED leest dit uit, rekent de boel uit en stuurt dit naar de PC

voor de liefhebbers, ik gebruik nu een EPM3064 CPLD van altera.
er is geen code, ik heb alles in schematic entry gedaan:
http://img651.imageshack.us/img651/5333/testmm.jpg
als iemand projectbestanden van iets wil om het zelf te maken, geef een gil :)

volgende stap is een schema + nette PCB met wat betere onderdelen :)
is een opamp als de lf356 ook meteen goed om als comparatur te gebruiken of kan ik beter een echte comparator pakken.
en zoja, welke dan ;)
LM399 wordt nog gemaakt door liniar technology zag ik.
ze hebben ook een die nog beter is, tempco van 0.05%, de LTZ1000.
is wel 50 dollar de stuk hehe.

@fred101
mn mail/msn adres staat in mn profiel dus als je eens programmeerhulp nodig hebt he ;)
natuurlijk wel in ruil om dit project te kalibreren als ik een betere versie af heb :)

@riktw: wat voor cpld-bordje gebruik je?

free_electron

Silicon Member

hoedt u voor de asynchrone 7493 .... prop daar eens een 74193 in. die zijn synchroon..
Je zou wel eens wat glitches kunnen hebben

Nu je toch Altera gebruikt kan je het snel in een synth taal maken

verilog code:


module dsadc (input clk,zero,start, 
              output reg[15:0] charge,discarge,
              output reg chargeswitch, dischargeswitch)

`define endcharge 16'd10000
reg [2:0] state;
always @ (posedge clk) begin
   case state
       0: state <=0;
       1: begin
            charge <=0;              // wis tellers
            discharge <=0;
            chargeswitch <=1;        // ga laden
            dischargeswitch <=0;
            state <=2;               // en naar state 2
          end
       2: begin
           if (charge == `endcharge) begin  // aan het end ?
              chargeswitch <=0;             //   - stop laden
              state <=3;                    //   - ga naar state 3
           end
           else charge <=charge + 1;        // nee : tel op
          end
       3: begin
           dischargeswitch <=1;             // ontlaadmode
           if ~(zero) begin                 
              if ~(&discharge) discharge <=discharge +1; // tel op met eindstand
           end
           else begin
                dischargeswitch <=0;        // stop ontladen
                state <=0;                  // ga slapen
           end
   endcase
   if (start & (state ==0)) state <=1;      // als we slapen en start is actief : schop de boel wakker.
end
endmodule

das uit de losse pols er kunnen tikfouten in zitten.

simpele state machine. als je start hoog maakt gaat de machine naar state 1 waar beide tellers gerest worden en er dan naar state 2 gegaan wordt.

in state 2 hoog ik de charge teller op. als ik `endcharge beriek gaan we naar statre 3.

ik haal een truuk uit

het ~(&charge) is een bitwise NAND. Ik bekijk de ganse teller met een AND poort ( &charge) . zolang de uitgang van die and nul is (~) hoog ik op. anders stop ik. met andere woorden de teller stop op 11111111111111111. dat geeft aan dat er een overrun gebeurt is. kan je vangen in software.

als de 'ZERO' pin activeert spring ik weg naar state 0. ( slaap)

er zijn twee uitgangen om je analoge schakelaars te bedienen.
de ene laadt, de andere ontlaadt.

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Terzijde, maar wel m.b.t tot signaal meting en iets waar ik al een langere tijd mee bezig ben in mijn hoofd.

Als het ingangs signaal enkele nS-jes wordt vast gehouden en dan, net zoals in software, een search/compare er op los laten die de waarde vind dan hoeft er niet zoveel geteld te worden. Is zoiets ook mogelijk in hardware? Is er geen programmeerbare teller die dat kan doen? Desnoods met tabel in geheugen chip

b.v ingang is 2300mV, maxV=25V
eerste keer; test op 1/2*maxV
bij minder; test op 1/4*maxV ( bij meer; test op 3/4*maxV )
e.t.c

Dan in, [log2 N] weten we het antwoord, is dat niet sneller dan optellen?

free_electron

Silicon Member

dat is een SAR he. successive approximation.

je probleem is dat je daar gewogen en gecalibreerde referentiespanning nodig hebben die zich binair verhouden... 1 1/2 1/4 1/8 1/16

en dat is het probleem ! het is verrekte moeilijk om dat te maken met meer dan 12 bit... als je een 6 1/2 digit meter wilt maken heb je 24 bit nodig ....

je enige oplossing is dan om alles om te gooien naar 1 grootheid die wel accuraat te meten valt. en bij een dual slope is dat tijd...

je spanning is een tijd afgewogen tegen een rc constante.

de absolute constante maakt niks uit.
je laadt gedurende de tijd x met een gekende spanning en ontlaadt met een onbekende spanning gedurende tijd y.

je onbekende is dan x/y * ref.

zo simpel ist.

je hoeft slechts 1 accurate referentie te maken in plaats van een gewogen ladder !

bij een 6 1/2 digit meter is 1% fout al 3 digits die je in de vuilbak keilt.
zelfs al gebruik je 0.1% weerstanden dan gooi je nog 2 digit weg.
het kan gewoonweg niet. selfs laser trimmed weerstanden komen nauwelijks onder de 0.01% uit... en dan moet je de boel nog binair wegen.. eentje maken is makkelijk.. er 22 maken die zich exact binair verhouden is een ander paar mouwen

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Hoi Free_electron,

Je hebt de code voor de startconditie buiten de "case" gehaald, waarom doe je
het niet zo?

Op 1 juni 2011 00:46:56 schreef free_electron:

verilog code:


.....
always @ (posedge clk) begin
   case state
       0: begin 
            if (start)  state <= 1;
            else        state <= 0;
          end
       1: begin
            charge <=0;              // wis tellers
            discharge <=0;
.....

En volgens mij is de "else state <=0" overbodig want dat doe je elders ook niet....

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

Silicon Member

zo kan je het ook.

ik schrijf meestal de grote 'overriders' buiten de statemachiene ( reset , start etc )

is kwestie van gewente. ik heb meestal statemachienes waar je op verschillende punten kan binnenvallen. in plaats van overal if then else clauses te gaan zetten in de machien zelf ( het wordt moeilijk voor een buitenstaander om dan uit te vlooien hoe er precies kan gestart worden en waar de entry points zitten )
verzamel ik die onderaan. je ziet dan direct : als dit en dat : start in state zoveel, als dat en dt : start in state zoveel.

ik heb nog truken met `defines waar ik state en nextstate aanmaak.
ik kan ook delays maken die een aparte state oproepen waar een teller geladen wordt die dan aftelt tot nul, op nul gekomen springt routine dan vanzelf naar de opgegeven state.

in plaats van overal tellers te moeten rondstrooien heb ik een universele delay generator voor als er waitstates moeten gelopen worden.

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Op 31 mei 2011 23:41:19 schreef alex278:
@riktw: wat voor cpld-bordje gebruik je?

heb er zelf een bordje voor ontworpen, zo simpel mogelijk.
header voor I/O, header voor clock in, header voor voeding, header voor JTAG.
thats about it, zo simpel mogelijk :)
heb nog wel wat printjes over, als je er een wilt doe maar een mailtje en ik stuur dr wel een op voor de prijs van een biertje ;)

@F_E
heb nog niet in Verilog/VHDL gewerkt dus werk nog ff met schematic entry.
zal vanavond even kijken naar de 74193.
kwa onderdelen, de R en C voor de integrator moeten van goede kwaliteit zijn.
waar moet ik aan denken, zilver/mica condensator + weerstand met lage tempco?
en wat is een goede tempco voor een weerstand?

fred101

Golden Member

Draadgewonden, vacuumverpakt en "aged" . Ik ben slecht in getallen onthouden maar ik heb er pas een pdf over gevonden, alleen staat die op mijn andere pc.
Kool composiet heel hoog en negatief, je ziet ze in oude appartuur, geen verdikking an het einde ( kapjes)
De rest is plus/min dus kan positief of negatief zijn.
Koolfilm 200-300 ppm
Metaalfilm ik dacht 50 tot 100 ppm
Draadgewonden 0,5 tot 30 ppm

In die Fluke zit gewoon en 470 uF elco en twee van die gele rolletjes als condensators.
Ik zou zelf denken aan zilvermica. Of wat dacht je van wat ze in dat filmpje deden uit een van die links van Free, de Bob Pease show. Een condensator van een stuk coax. ( OT ) hebben jullie dat opamp pototype van Bob gezien. Een plaat van 20x20 cm met daarboven een angstaanjagende hoeveelheid draad, alles volgens mij in een kleur en gruwelijk veel onderdelen en alles min of meer zwevend gebouwd, cool, Bob is mijn held :-) )

Voor de rest kan ik het niet meer volgen. Ik ga je arduinocod proberen te laden en dan wat hardware er aan te knopen. Mocht je hem gecalibreerd willen hebben ben je welkom ( mag je ondertussen wel even met mijn TI msc 1210 AD converter evo bordje spelen ;-) )

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs

Op 1 juni 2011 03:57:21 schreef free_electron:
dat is een SAR he. successive approximation.

Okee, bedankt. Heb dit gevonden http://www.allaboutcircuits.com/vol_4/chpt_13/6.html

Uitpluis tijd aangebroken

alle 7493's vervangen voor een 74193 wordt moeilijk.
compilen kom ik uit op 68/64 macrocells, past niet :)