Electronics > Projects, Designs, and Technical Stuff
Sigma Delta ADC Design
<< < (3/3)
iMo:
Another experiment - the "network topology" as Lattice calls it. See below the schematics.

With Vref=3.3V / 2  (thus the PWM and the comparator share the same source for Vref=Vccio/2) and R1=R2 the Vinp=0..3.3V maps to 0..FullScale_18bit.

See below the calibration table and formula (the Forth runs inside the UPduino).


--- Code: ---: sdadc 700 io@ 701 io@ ;                                 \ read the raw data from the sdadc 2x16bit
: sdf sdadc d>f ;                                         \ read and convert int32 to float (48bits fp)
: sdvf f# 4.96897511e-3 f# 1.2578181e-5 sdf f* f+ ;       \ .. convert to Volts

--- End code ---

The peak in the TL431 measurement with v2 (tl431 @2.5ma wired to the Vinp) comes from my writing this post (see above the shot with my setup)  ::)
iMo:
SD ADC v3 with a Second Order SD modulator based on TSP #32 blog.

Below a continual measurement with a stable run for ~3minutes, 1measurement in aprox 2.8secs.

####

PS: this particular kind of SD ADC (see above Lattice whitepaper) works such the 1bit bitstream from the Modulator (an integrator, comparator and a single FFlop) is accumulated in ACC (ie 19bit) while it adds the actual level of the bitstream to ACC on each modulator's clock (ie. 1.5MHz). To count 19bits takes 2^19/1.5M=0.35secs therefore.

After that time the 19bit ADCsize data are passed into an LPF (and the ACC is reset to zero), in case of LPF=3 it takes 2^3 passes, thus a single measurement takes 0.35*8=2.8secs.

There is an option to have ACC>ADCsize, ie 22bit ACC and 19bit ADCsize, then it takes 2^(22-19) times longer to get a measurement (the larger ACC does averaging).

####

The UPduino with the Simple SD as above (19bits ADCsize, ACC=19, LPF=3, sampling clock=1.5MHz ).

Added the inverted signal from the 1bit FF sampler (Q and /Q outputs, 3.3V logic) fed into the second integrator.

SD reference voltage is the Vcc=3.3V of the FPGA.

All put on the solderless breadboard wired with jumping wires, voltages stabilized by 1117 and 7905.

Below is a 3minutes long measurement of an TL431 done under stable conditions (I hold my breath :) ), you may see how the last digits flips.
 
The data are the raw data coming directly from the SDADC, multiplied by -3.3V/(2^19). Not calibrated.

When the SD ADC data are available an interrupt is asserted and the main loop reads the data.
Forth running in the FPGA:


--- Code: ---0 variable sdflag

: isdadc ( -- )                     \ ISR: INT_SD interrupt
   $bF intflag! $FF intflag!        \ ISR: clear the INT_SD flag
   1 sdflag !                       \ ISR: set SDADC data ready flag
   ;         

' isdadc 1 rshift $3BFC !           \ place isdadc ISR at INT_6 vector location

: sdadc 700 io@ 701 io@ ;           \ read SDADC raw data
: sdf sdadc d>f ;                   \ convert to float
: sdvf f# 6.2942504882e-6 sdf f* ;  \ make Volts, mult by 3.3/2^ADCsize

: testx BEGIN                       \ wait on a measurement, print result in Volts
        sdflag @ 0<>                \ is the SDADC flag set? Loop
        UNTIL
        sdvf f.  cr                 \ print Volts
        0 sdflag !                  \ reset SDADC flag
        ;
 
: test 0 do testx loop ;            \ do XXXX measurements

$40 intmask!                        \ enable isdadc interrupt
eint                                \ global int enable

7 set-precision                     \ we will print 7 digits
30000 test                          \ do make 30000 measurements
--- End code ---

The STDEV is 11.5uV of that measurement.
jaromir:
Your post from late May looks promising.
Any news on this topic?
iMo:
Since then I tried with sinc3 filters but the results are rather poor.
The sinc3 filter code came from AD7402 DS, for example.

PS: One issue I can see with this design is its complexity (when you want something similar to the Multislope) tends to be pretty large. For example the Q and /Q signal levels have to be switched from +Vref=10V to -Vref=-10V, at around 1-2MHz.. And the resistors, capacitors and opamps with same quality as with Multislope.
SiliconWizard:
I've never implemented a sigma-delta ADC, but I have implemented sigma-delta DACs. I got pretty good results using only linear interpolation for the oversampling stage. Sure that's not ideal, but it takes up a lot less area and can run much faster.
Navigation
Message Index
Previous page
There was an error while thanking
Thanking...

Go to full version
Powered by SMFPacks Advanced Attachments Uploader Mod