Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

AD konvertor - greska prilikom konverzije

[es] :: Elektronika :: Mikrokontroleri :: AD konvertor - greska prilikom konverzije

[ Pregleda: 377 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..38.28.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon AD konvertor - greska prilikom konverzije22.05.2021. u 09:39 - pre 2 meseca
Podzdrav...

Imam jedan problemcic koji je vezan za vrijednost dobijenu posle AD konverzije...

U pitanju je Arduino MEGA koji je , da tako kazem, ukljucen u namjenski napravljenu PCB za odredjeni sistem...

Na arduinu se koristi svih 16 AD konvertera koji se u jednoj funkciji iscitavaju jedan za drugim (A0 do A15).

Svi ADC ulazi su vezani na masu preko otpornika od 22k i paralelno otporniku kondezator od 1nF.

Trenutna situacija je takva da na prva 3 ADC ulaza(A0,A1 i A2) nema napona dok je na ostalima prisutan napon od oko 3,7V.( sto u konverziji daje vrijednost oko 770 )

Problem se ogleda u tome da ako iscitam svih 16 ADC ulaza, jedan za drugim, na prvom ulazu A0, svakih toliko, dobijem vrijednost 1 umjesto 0.

Znaci, iscitavanje A0 je tipa: 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0....itd

Ukoliko "skratim" funkciju na iscitavanje samo A0, A1 i A2 ( ne na svih 16 ) onda radi korektno tj A0 je uvijek 0 ( ovo mi je palo na pamet zbog sumnje da nesto hardverski nije ok mada su svi ulazi identicni po pitanju otpornika i kondezatora...).

Izmedju 2 niza iscitavanja postoji vremenska zadrska od 1s.

Ima li ko ideju sta bi moglo biti u pitanju?

Evo dio koda zaduzen za ADC:

Code:
void get_analog(){
  for(int TEMP = 0; TEMP < 16; TEMP++){
    RAW_ANALOG[TEMP] = 0;
  }
  RAW_ANALOG[0] = analogRead(A0);
  RAW_ANALOG[1] = analogRead(A1);
  RAW_ANALOG[2] = analogRead(A2);
  RAW_ANALOG[3] = analogRead(A3);
  RAW_ANALOG[4] = analogRead(A4);
  RAW_ANALOG[5] = analogRead(A5);
  RAW_ANALOG[6] = analogRead(A6);
  RAW_ANALOG[7] = analogRead(A7);
  RAW_ANALOG[8] = analogRead(A8);
  RAW_ANALOG[9] = analogRead(A9);
  RAW_ANALOG[10] = analogRead(A10);
  RAW_ANALOG[11] = analogRead(A11);
  RAW_ANALOG[12] = analogRead(A12);
  RAW_ANALOG[13] = analogRead(A13);
  RAW_ANALOG[14] = analogRead(A14);
  RAW_ANALOG[15] = analogRead(A15); 
}


 
Odgovor na temu

ZAS011
Uzgajivač šargarepe izakuće
Vanuatu

Član broj: 288510
Poruke: 4421

ICQ: 8713400
Sajt: www.justfuckinggoogleit.c..


+505 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 16:07 - pre 2 meseca
Jesi li u setup() rutini postavio sve analogne pinove da budu ulazni?

Code:
pinMode(pin_xx, INPUT);

--
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..38.28.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 16:44 - pre 2 meseca
Nisam bas siguran da razumijem....

Primjer iz Ardiuno IDE:

Code:
/*
  ReadAnalogVoltage

  Reads an analog input on pin 0, converts it to voltage, and prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.

  https://www.arduino.cc/en/Tuto...ltInExamples/ReadAnalogVoltage
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
}


Ne vidim da je negdje posebno naglasavano da su AD pinovi INPUT...

i PINOUT

Jel to znaci da pinove D54-D69 trebam proglasiti kao INPUT? ( iako, cini mi se da samo imaju AD funkciju...)
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..38.28.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 18:59 - pre 2 meseca
Evo ga i to...
Code:
void set_ANALOG_IN_PINS(){
  for(int TEMP = 54; TEMP <= 69; TEMP++){
    pinMode(TEMP, INPUT);
  }
}


ali situacija je i dalje ista...

Prikačeni fajlovi
 
Odgovor na temu

sdurut
Mašinbravar

Član broj: 76787
Poruke: 595



+49 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 19:05 - pre 2 meseca
Vidim da kao referentni napon koristiš 5V koji napaja MEG-u. To nije dobro jer je taj napon dosta nestabilan. Promeni da koristiš interni 1,1V iili 2,56V internu referencu koji MEGA podržava.
Za više detalja pročitaj.
Analog reference
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..38.28.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 19:35 - pre 2 meseca
Da... 5V od Mege je referenca za konverziju...
Tu postoji mali problemcic... Posto su ta ocitanja ustvari naponi od 12V, 9V i 5V koji su vec prosli kroz naponske razdjelnike tako da su svi ustimani da budu oko 3.7V... Ako bi uzimao 2.56 kao referencu morao bi hardver da mijenjam da spustim napon mjerenja ispod 2.56...
To je jedna stvar.
Druga stvar koja se meni namece kao pitanje je ako je ta referenca od 5V nestabilna, sto priznajem da je realno moguce, zasto samo na prvom ulazu...?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15437
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2342 Profil

icon Re: AD konvertor - greska prilikom konverzije22.05.2021. u 20:42 - pre 2 meseca
prvo, taj atmega nema 16 ADC-a nego ima 1 (jedan) ADC, ima ispred njega
multiplexer kojim se bira koji od 16 Analog ulaza bude spojen na taj
ADC... taj ADC radi tako sto puno kondenzator kroz otpornik i meri
vreme, ako ti promenis vrednost na multiplexeru a proces merenja nije
zavrsen kondenzator na adc-u je jos uvek u prethodnom stanju i citanja
ti se preslusavaju...

za pocetak probaj da usporis sve "drasticno" radi ovako nesto

analogRead(A0); // odbaci ovu vrednost

delay(1000); // cekaj sekund

x = analogRead(A0); // ovu vrednost koristi

delay(1000); // cekaj jos sekund

analogRead(A1); // odbaci citanje A1

delay(1000); // cekaj sekundu

y = analogRead(A1); // ovu vrednost koristi

delay(1000);

....


dakle prvo citanje analkognog ulaza odbaci, sacekaj sekundu i onda citaj
taj analogni ulaz opet i tek tu vrednost koristi... arduino funkcije su
malo ... a nemas mogucnost (mozda i ima ali ne znam kako) da uradis ono
sto bi normalno raio, nasetujes selekciju preko multiplexera, pa cekas,
a citas onda adc, ovako, promenis multiplexer tako sto uradis readadc
ali odbacis tu vrednost jer je to prvo citanje koje menja mux poziciju,
onda sacekas da se stabilizuje, onda citas ponoov isti taj ulaz, znaci
nema menjanja mux-a i koristis tu vrednost .... za prvi test pusti
sekundu pa posle smanju tu vrednost koliko treba da i dalje radi, mozes
a procitas u datasheet-u koliko treba da cekas kada promenix mux, obicno
je to oko 2x ili 3x vreme akvizicije (red velicine u mikrosekundama ili
jednocifreno milisekundama, ali za pocetak stavis sekund da bi bio safe)
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..8.162.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 09:22 - pre 2 meseca
Hvala svima na susgestijama...

Bogdanova me navela na malo eksperimentisanja...:)

Mozda nisam dobro shvatio Bogdana ali moj problem nije preslusavanje prilikom promjene ulaza na MUX-u ( mada ni to nije iskljuceno da se ne desava jer za te ocitane vrijednosti A1 do A15 nisam siguran da su 100% tacne) Meni je "bola oko" ta jedindica koja se povremeno pojavi na A0 tj kao rezultat PRVE konverzije (koja se desava posle izvrsavanja koda koji nije vezan za konverziju).

Kako god...
Malo sam izmjenio kod i 1 je nestao... Za mene bitno da znam da postoji takva pojava kod AD konverzije i da znam kako to rijesiti...Trenutno nemam bas viska vremena da ulazim dublje u PDF samog MCU...

Code:
void get_analog(){          //iscitavanje A0-A15
  RAW_ANALOG[0] = analogRead(0);
  for(int TEMP = 0; TEMP < 16; TEMP++){
    RAW_ANALOG[TEMP] = analogRead(TEMP);    
  } 
}


U svakom slucaju hvala momci!
 
Odgovor na temu

ZAS011
Uzgajivač šargarepe izakuće
Vanuatu

Član broj: 288510
Poruke: 4421

ICQ: 8713400
Sajt: www.justfuckinggoogleit.c..


+505 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 10:42 - pre 2 meseca
Citat:
Trenutno nemam bas viska vremena da ulazim dublje u PDF samog MCU

Bez čitanja datasheet-a teško ćeš da napišeš kod za njega.

--
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15437
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2342 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 11:48 - pre 2 meseca
Citat:

Code:
void get_analog(){          //iscitavanje A0-A15
  RAW_ANALOG[0] = analogRead(0);
  for(int TEMP = 0; TEMP < 16; TEMP++){
    RAW_ANALOG[TEMP] = analogRead(TEMP);    
  } 
}



ne valja ti ovo ... cak i ako ti deluje da radi, nece raditi kako treba...

Code:

void get_analog(){
  for(int TEMP = 0; TEMP < 16; TEMP++){
    analogRead(TEMP);    //ignorisi prvo citanje
    // delay(1); //ne mora ali moze da bude neophodno kod mnogih atmega mcu-a
    RAW_ANALOG[TEMP] = analogRead(TEMP); // koristi tek drugo citanje
  } 
}



 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..28.55.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 13:20 - pre 2 meseca
Citat:
Bez čitanja datasheet-a teško ćeš da napišeš kod za njega.

Potpisujem. Radio sam sa PIC serijom i MikroE razvojnom plocom jedno vrijeme i znam da bez PDF-a ne ide.
Smatram, da funkcije za arduino upravo zato i postoje da ne mora "obicni korisni" da razmislja o kojekakvim registrima, portovima, flagovima, ciklusima, oscilatorima...itd.

@bogdan.kecman

Citat:
ako ti promenis vrednost na multiplexeru a proces merenja nije
zavrsen kondenzator na adc-u je jos uvek u prethodnom stanju i citanja
ti se preslusavaju...


Iz PDF-a:
"26.3 Starting a Conversion
A single conversion is started by writing a logical one to the ADC Start Conversion bit, ADSC. This bit stays high as long as the conversion is in progress and will be cleared by hardware when the conversion is completed. If a different data channel is selected while a conversion is in progress, the ADC will finish the current conversion before performing the channel change."

Ja nemam objasnjenje zasto se prilikom PRVOG citanja pojavljuje ta jedinica.

Za eksperiment sam preskocio A0 tj poceo od A1 da on bude PRVI konvertovan (bez ikakvog neposrednog prethodnog konvertovanja). Isto se dogadja. Na A1 se povremeno desi ta jedinica dok na A2 je uvijek 0. Isto tako dok sam konvertovao A0 kao prvi , A1 i A2 ( na kojima nema napona) su uvijek 0.

Jedini zakljucak koji mogu da donesem je da prva konverzija ima neku "inerciju" (ili sta vec) komponenti unutar samog MCU i da kao takva nije 100% tacna.

Tacno sta se desava, sigurno da bi trebalo pogledati komplet funkciju analogRead ( razumjeti tacno sta ona radi ) i PDF od MCU.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15437
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2342 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 13:47 - pre 2 meseca
Citat:

Ja nemam objasnjenje zasto se prilikom PRVOG citanja pojavljuje ta jedinica.


rekao sam ti zasto, zato sto on ne ceka i ne provera nista vec ima "univerzalno" citanje adc kanala bez obzira koji je mcu u pitanju, a posto se u 99.9% slucajeva koristi uvek jedan kanal u krug zaostala energiju u kondu se ne vazi ..

i bas zato sam ti promenio ono, ne da bacis jedno citanje pa iscitas sve, nego bacis svako prvo citanje jednog kanala ... to sto ti nisi primetio da imas problem i na drugim kanalima ne znaci da ga nemas, a tek kad sprava bude bila u produkciji ce krenuti cuda da se desavaju, zato uradis tako i umesto da procitas 15 puta ti procitas 30 puta i sve radi kako treba

Citat:

, the ADC will finish


ali u pitanju je ATMEGA, ma koliko se DIY community lozi na njega microchip ih je kupio za dorucak i pored ultra popularnog arduina i ultra popularnog statusa kod DIY ekipe, prosto ljudi su neprofesionalni, datasheetovi su "sta su oni hteli da naprave" a ne "sta su napravili", rade "copy/paste" pa posle pisu 10+ errata dokumenata sta stvarno radi etc... stavis ovako i radi :)
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..28.55.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 14:16 - pre 2 meseca
Postujem...Sve je moguce...
 
Odgovor na temu

boogi
RS-BiH

Član broj: 56974
Poruke: 342
..28.55.wireless.dyn.drei.com.

Sajt: www.elektrohackl.at


+7 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 17:25 - pre 2 meseca
Evo i jedan update sa Arduino foruma:

"When you read from a different analog input to your last analogRead call, part of the process of the reading is to switch the internal multiplexer to the new input. This means that the sample-and-hold capacitor in the ADC does not have sufficient time to stabilise if your analog source has an impedance greater than a few kΩ.

The solution is either to ensure the source is a low impedance, preferably no more than 1 kΩ, or to allow sufficient time for the sample-and-hold capacitor to stabilise. Since the call to analogRead does not allow enough time, calling it a second time, even if pretty much immediately, with the same input pin specified, gives it the necessary time as the multiplexer is already switched to that same input."

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15437
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2342 Profil

icon Re: AD konvertor - greska prilikom konverzije24.05.2021. u 17:39 - pre 2 meseca
to ti je upravo to sto sam ti ja rekao i kako sam ti prepravio kod :D

 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: AD konvertor - greska prilikom konverzije

[ Pregleda: 377 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.