|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 11 27, 16:13. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Skaitmeninė elektronika » Dviejų adc skaitymas
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 16:19 |
|
|
|
Bandau perskaityti su atmega328p du adc, bet smegenys jau perkaito beskaitant google, nes kiek autorių, tiek skirtingai viską daro.
pasidariau dvi funkcijas
Kodas: |
int readAdc1(){
//ADC5
ADMUX |= (1<<MUX2) | (1<<MUX0);
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
int readAdc2(){
//ADC1
ADMUX |= (1<<MUX0);
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
} |
ir tada skaitau main funkcijoj:
Kodas: |
adc1 = readAdc1();
adc2 = readAdc2();
|
Bet gaunu tik adc1 rezultatus. Suprantu, kad tikriausiai kažkaip reikia išvalyti bitus, bet nesuprantu kaip. Gal kas susidūrėte su panašia situacija? Ačiū. |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 17:30 |
|
|
|
Issinagrinek pradziai bitiniu operatoriu veikima, tada suprasi kur apsizioplinai. |
|
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 19:49 |
|
|
|
naudok ne OR "|=" priskyrimą, o absoliutinį "=".
|= priskyrimas naudojamas, kai reik tik tam tikrus bitus paverst 1, tačiau kitų bitų vertės nepakeičiamos, todėl šita operacija:
Kodas: |
ADMUX |= (1<<MUX0); |
nieko realiai nepakeiti, nes nuliniam bitui jau buvo priskirtas vienetas anksčiau, o antrasis bitas taip pat lieka lygus vienetui.
Mano pasiūlymas būtų naudot tik vieną funkciją:
Kodas: |
int readAdc(int adc_nr){
//read from according adc
ADMUX = adc_nr;
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
|
Tuomet pagrindinėj programoj atrodytų taip:
Kodas: |
adc1 = readAdc(5);
adc2 = readAdc(1);
|
Jeigu bijai programoj sumaišyt, kuris adc yra kuris, tai prisiskirk pradžioj globalias konstantas ad1 = 5 ir ad2 = 1 ar kaip nors kitaip ir jas duok funkcijai. |
|
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 20:22 |
|
|
|
Dabar pasirašiau pabandymui šitaip:
Kodas: |
int readAdc1(){
//ADC5
ADMUX = 5;
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
int readAdc2(){
//ADC1
ADMUX = 1;
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
} |
, bet visada pareina į 1023. Ta prasme įjungiu maitinimą, kelias sekundes parodo tikrąsias vertes ir tada grįžta į 1023... |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 20:44 |
|
|
|
Ugniues rašo: |
bet visada pareina į 1023. Ta prasme įjungiu maitinimą, kelias sekundes parodo tikrąsias vertes ir tada grįžta į 1023... |
O kas prie tų ADC įėjimų prijungta? |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 22:53 |
|
|
|
Ugniues rašo: |
Dabar pasijungiau dar paderinamąjį rezistorių. |
Tai ką dabar ADC nuskaito? Beje, nepamiršk, kad iš kart po MUX pakeitimo, nuskaityta reikšme negalima pasitikėti, todėl geriausia ją ignoruoti ir skaityti dar kartą. |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 23:07 |
|
|
|
Tą patį. Kai tik paduodu maitinimą rodo ~500 (rezistorius per viduriuką maždaug) ir tada staigiai grįžta į 1023. Toliau sukiojant- reikšmė nekinta. |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 23:31 |
|
|
|
O kodėl tu rezultatus imi iš ADC registro? Nes pagal datasheet 250psl. tai matavimo rezultatas talpinamas į ADCL ir ADCH registrus, o ne ADC. |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 22, 23:56 |
|
|
|
Taigi atraminės įtampos nenurodei, nes tame pačiame ADMUX registre bitai REFS1, REFS0 užduoda atraminę įtampą. Tai pvz. jei kaip atraminę įtampą nori naudoti Vcc, reikia išstatyti REFS0. Tuomet ADMUX nustatymas t.b. toks:
Kodas: |
ADMUX = 0x40+0x01 // ADC1
ADMUX = 0x40+0x05 // ADC5 |
MindLess rašo: |
O kodėl tu rezultatus imi iš ADC registro? Nes pagal datasheet 250psl. tai matavimo rezultatas talpinamas į ADCL ir ADCH registrus, o ne ADC. |
Nesikabinėk, kompiliatorius viskuo pasirūpina ir nuskaitymas vyksta taip, kaip ir priklauso. |
|
|
|
|
|
Dviejų adc skaitymas |
Parašytas: 2015 03 23, 15:44 |
|
|
|
Šitą buvau apsibrėžęs kitoje funkcijoje. Klaida, buvo, kad kondensatoriaus kojelė nebuvo gerai įlindusi į breadboard'ą ties Vref. Ačiū už pagalba! |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
|
|