logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak uzyskać dokładność odczytu ADC 16/24bit na poziomie pojedynczych uV?

karbiuch 29 Wrz 2017 22:26 909 7
  • #1 16728879
    karbiuch
    Poziom 6  
    Witam,


    Dostałem w prezencie płytkę prototypowa z atmega32 w dip wraz z takim scalakiem jako ADC 16/24bit. Nie mam schematu tego urządzenia, ale z tego co widzę to na ADC jest zasilane z 0-5V, a jako referencja jest dzielnik napięcia 2.5V. Chciałbym sobie trochę poprogramować i sprawdzić jak dokładnie w ogolę jestem w stanie "czytać" napięcie. Pierwsza rzeczą jaka zrobiłem to wyrzuciłem ten dzielnik napięcia i dałem źródło referencyjne 2.5V. Jednak nie rozumiem 2 rzeczy w nocie katalogowej:

    1) Na stronie 23 pisze, ze przetwornik możne działać jako "dump mode". Co to znaczy?
    Link

    2) Pisze, ze on jest 16/24bity. Dlaczego w przykładach jest pokazane, ze są wysyłane dane w postacie 2x8bitow? Gdzie reszta bitów?
    Link

    Jak wykonać odczyt na poziomie 24 bit?

    Tak w ogolę. Z jaka dokładnością można mierzyć praktycznie napięcie? Poziom kilku uV jest realny? Nano volty takze? Czy to już jest poziom szumów układów znajdujących się na drodze sygnału? Rozumiem, że dużo zależy od topologii układu i zapewne na moim "pająku" będę miał problem pomierzyć ok 100uV? Do 100zł jestem w stanie kupić multimetr, który pozwoli mi mierzyć pojedyncze uV?

    Znacie może jakaś gotową płytkę z Avrkiem, albo z czymś na arduino gdzie będę miał przetwornik większy niż 16 abym mógł się pobawić ?
    Mam wrażenie, że na moim pająku będzie mnie ograniczały niedoskonałości topologii. Warto kupić coś takiego do nauki?

    http://www.ebay.ca/itm/CJMCU-7793-AD7793BRU-3...770257?hash=item5d6fed2211:g:zV4AAOSwHHFY9MIq
  • #2 16729139
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16729146
    karbiuch
    Poziom 6  
    a na tym przetworniku z linku jest w ogole molziwosc uzyskania wiecej niz 16 bit? Nie kumam tej dokumentacji.
  • Pomocny post
    #4 16729268
    Sareph
    Poziom 24  
    karbiuch napisał:
    1) Na stronie 23 pisze, ze przetwornik możne działać jako "dump mode". Co to znaczy?
    Link
    No przeciez masz opis o co chodzi w dokumentacji.

    Cytat:
    When the dump bit in the mode register is set to 1, the channel status register is read immediately by a read of the channel data
    register, regardless of whether the status or the data register is addressed through the communications register.


    karbiuch napisał:
    2) Pisze, ze on jest 16/24bity. Dlaczego w przykładach jest pokazane, ze są wysyłane dane w postacie 2x8bitow? Gdzie reszta bitów?
    Link

    Nieskonfigurowana. :D Ot jak ustawisz w konfiguracji 24bit, to masz odczytać 3x8bit i tyle.
  • Pomocny post
    #5 16730650
    Jacek Rutkowski
    Poziom 28  
    karbiuch napisał:
    a na tym przetworniku z linku jest w ogóle możliwość uzyskania więcej niż 16 bit? Nie kumam tej dokumentacji.

    Jak uzyskać dokładność odczytu ADC 16/24bit na poziomie pojedynczych uV?
    Jest możliwe :)
  • #6 16736620
    karbiuch
    Poziom 6  
    Napisalem komunikacje po SPI. Odbieram dane z kanalu 0. Zarowno dla 16 bitow jak i 24 bitow. Pomyslalem sobie, ale to proste! Jestem super... az chcialem odczytac dane z reszty kanalow, I tu zonk, nie potrafia poprawnie odczytac danych z innych kanalow. Okazuje sie, ze przychodza niepoprawne wartosci. Skoro dla kanalu 0 dziala kod, to znaczy, ze zle adresuje "comunnitation register", "mode register", "communitation register".

    Dla kanalu 0 wysylam:
    #define ADCCHANEL0	0x38
    #define 24bitMODE 0x4A
    # define READADC0	0x48
    

    przychodza poprawne dane. Gdy zmienie na:

    #define ADCCHANEL4	0x3c
    #define 24bitMODE 0x4A
    #define READADC4	0x4c


    przychodza niepoprawne wartosci, lub FFFFFF. Dla kanalu 0 ten kod dziala. Zle adresuje kanal 4rty? Dobrze mam napisane definy?
    strona 22: http://www.analog.com/media/en/technical-documentation/data-sheets/AD7739.pdf
    
    	spi_data_send(ADCCHANEL0);									
    //mode register //#define ADCCHANEL0	0x38
    	PORTB|=_BV(ADCVCS);
    
    	spi_data_send(0x4A);									//- 
    //single conversion; dump mode, 24bit mode
    	PORTB|=_BV(ADCVCS);
    
    	while(SPIPIN & _BV(ADCRDYVPIN));
    
    	spi_data_send(READADC0);								 
    //data register; ch0 //#define READADC0	0x48
    	PORTB|=_BV(ADCCS);
    	SPIPORT&= ~_BV(ADCVCS);
    	SPDR=0x00;
    	while((SPSR & _BV(SPIF)) == 0);
    	SPSR |= _BV(SPIF);
    	cData=SPDR;
    	SPIPORT|=_BV(ADCVCS);
    	vstatus = cData; //reading status
    
    	SPIPORT&= ~_BV(ADCVCS);
    	SPDR=0x00;
    	while((SPSR & _BV(SPIF)) == 0);
    	SPSR |= _BV(SPIF);
    	cData=SPDR;
    	AdcVbyte[2]=cData;							//first byte 1/3
    	SPIPORT|=_BV(ADCCS);
    	PORTB|=_BV(ADCVCS);
    	
    	SPIPORT&= ~_BV(ADCVCS);
    	SPDR=0x00;
    	while((SPSR & _BV(SPIF)) == 0);
    	SPSR |= _BV(SPIF);
    	cData=SPDR;
    	SPIPORT|=_BV(ADCCS);
    	PORTB|=_BV(ADCVCS);
    	AdcVbyte[1]=cData;							//second byte 2/3
    
    	SPIPORT&= ~_BV(ADCVCS);
    	SPDR=0x00;
    	while((SPSR & _BV(SPIF)) == 0);
    	SPSR |= _BV(SPIF);
    	cData=SPDR
    	SPIPORT|=_BV(ADCCS);
    	PORTB|=_BV(ADCVCS);
    	AdcVbyte[0]=cData;							//last byte 3/3
    
    	if(vstatus& _BV(0))
    	{ //error reading
    		if(vstatus& _BV(1))
    		{
    			AdcVbyte[2] = 0x00;
    AdcVbyte[1] = 0x00;
    			AdcVbyte[0] = 0x00;
    		}
    		else
    		{
    AdcVbyte[2] = 0xff;
    			AdcVbyte[1] = 0xff;
    			AdcVbyte[0] = 0xff;
    		}
    	}
    	uartput(AdcVbyte[2]) ; //byte3
    	uartput(AdcVbyte[1]) ; //byte2
    	uartput(AdcVbyte[0]) ; //byte1
    
    
  • #7 16736838
    Jacek Rutkowski
    Poziom 28  
    Nie jestem specem od tego scalaka ani od C ale czy te adresy to są w pamięci procka dla zmiennych czy to są adresy z jakich próbujesz odczytać wynik w ADC?
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Jeśli to drugie to odczyt powinien być z tego samego adresu.
  • #8 16736873
    karbiuch
    Poziom 6  
    Adresy od ADCka. Juz tak probowalem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    lub

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie dziala. Zawiesza sie odpowiedz uarta.

    Jak zrobie tak jak w przykladzie z dokumentacji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    zwraca dobra wartosc od kanalu 0.

    Jak zrobie tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    zwraca blad z petli if vstatus& _BV(1)
REKLAMA