Analóg-digitális átalakítás
Mit jelent? Analóg jel: folyamatosan változik az időben, elvileg bármilyen értéket felvehet. feszültség (V) idő (s)
Digitális jel: csak meghatározott értékeket vehet fel Digitális jel: csak meghatározott értékeket vehet fel. Például 0V vagy 5V. Példa:
Ha a digitális jel sok lehetséges értéket vehet fel, jól megközelítheti az analóg jelet. Például egy tíz bites ADC 10 biten 210 különböző lehetséges digitális értékkel közelíti az analóg jelet. 0-5V analóg jel esetén ez kb 0.005 V-os ugrásokat jelent. Az átalakítás menete: Az átalakító adott időnként (mintavételi idő) mintát vesz a bementén levő analóg jelből és azt a hozzá legközelebb álló digitális értékkel helyettesíti.
Bemenetek: Single ended: A láb fölhöz képesti feszültsége az átalakítandó jel, (F-port 8 lába) Differenciális bemenet: A két láb feszültsége közti különbség az átalakítandó jel (ADC1,ADC0 és ADC3, ADC2 lábak). Ezeken a bemeneteken 1x,10x,200x előerősítést (gain) lehet beállítani.
Működési mód Egyetlen konverziót hajtson végre Folyamatosan konvertáljon Az átalakításhoz használt referencia feszültség beállítása
Hogyan kell beállítani a működési módot, a bemeneti csatornát, a gain-t, hogyan kell kiolvasni a konvertált értéket stb A megfelelő regiszterek megfelelő bitjeit kell beállítani, illetve kiolvasni. Pl: Az eredmény 10 bitje az ADCH illetve ADCL regiszterekben van, eredetileg jobbra igazítva. Analog input channel and differencial gain: MUX bitek az ADMUX regiszterben. ADMUX=0xED (ADC3-ADC2, 10xgain, 2.56V reference, left adjusted result, a táblázatból derül ki! ADMUX bitjei (h-l):REFS1,REFS0,ADLAR,MUX4,2,1,0 0 0 : internal Vref ADLAR bit: 0-jobbra igazítás az eredménynél 1-balra igazítás MUX4:0 00000 –ADC0 single ended input 01001 -ADC1,ADC0 differencial input 10x gain –>TB!
ADCSRA –regiszter bitjei: A konverzió kezdete, vége ADCSRA –regiszter bitjei: A konverzió kezdete, vége. (kezdet: ADEN bit 1, vége ADEN bit 0) Az átalakító képes az átalakításhoz kapcsolódó megszakításokat is kezelni! (köv alk) FELADAT: feladatlap kitöltése Mintaproject beüzemelése Az adc.c megértése stb
Ha kész a konverzió elindít egyeljárást: interrupt Kontrol , státusz ADCSRA ADCH,ADCL a konvertált érték bemenetválasztás bemenetek Maga a konverter és a vezérlő áramkör Gain választás: MUX dekóderből Műveleti erősítő
A konverzió akkor kezdődik amikor az ADSC bitet egyre állítjuk. Amikor vége a konverziónak lenullázódik. Ekkor az ADCR regiszterben van az eredmény. Folyamatos üzemmódban újra és újra konvertál. Ehhez az ADFR bitet az ADCSRA-ban 1-re kell állítani, utána kell indítani a konverziót. A folyamatos konvertálást úgy kell leállítani, hogy az ADCIF –et nullára húzzuk. A konverzió sebességét az órajel frekvencia valahanyad részére lehet beállítani. The prescaling is set by the ADPS bits in ADCSRA. The prescaler starts counting from the moment the ADC is switched on by setting the ADEN bit in ADCSRA. The prescaler keeps running for as long as the ADEN bit is set, and is continuously reset when ADEN is low.
Az F-porthoz van kötve! F 0-7, ADC 0-7 The reference voltage for the ADC (VREF) indicates the conversion range for the ADC. Single ended channels that exceed VREF will result in codes close to 0x3FF. VREF can be selected as either AVCC, internal 2.56V reference, or external AREF pin. Az F-porthoz van kötve! F 0-7, ADC 0-7
Melyik mód van beállítva? void ADC_init(void) { unsigned int test_conversion; //A MUXn bitekkel allitjuk be az ADC csatornat ADMUX |= _BV(MUX0) | _BV(MUX1); /MUX0,MUX1 1, ADMUX |= (1 << REFS0) /*| (1 << REFS1)*/;//belso AVcc hasznalatanak engedelyezese //Az ADC engedelyezese es frekvencia osztasanak beallitasa, 8 MHz / 128 = 62.5 kHz ADCSRA |= (1 << ADEN); ADCSRA |= (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2); // ADCSRA &= ~_BV(ADFR);//Egyetlen egy konverzio, jobbra igazitas ADCSRA &= ~(_BV(ADFR));//Egyetlen egy konverzio, jobbra igazitas //Egyetlen egy beolvasast vegzunk, hogy a tobbi konvertalas pontos es gyorsabb legyen test_conversion = ADC_read(); }
int ADC_read(void) { unsigned char i; int ADC_temp; unsigned int ADCr = 0; ADCSRA |= _BV(ADEN); //Engedelyezzuk az ADC-t //Egy beolvasast vegzunk ADCSRA |= (1 << ADSC); //Egyetlen atalakitas while(!(ADCSRA & (1 << ADIF))); //Varakozunk mig a konverzio befejezodik, az ADIF jelzobit aktiv for (i=0;i<8;i++) //8-szor vegezzuk az ADC atalakitast, hogy pontosabb eredmenyt kapjunk { ADCSRA |= (1 << ADSC); //Egyetlen konverziot csinalunk while(!(ADCSRA & (1 << ADIF))); //Varunk mig az atalakitas be nem fejezodik. Az ADIF flag aktiv ADC_temp = ADCL; //Kiolvassuk az ADCL regisztert ADC_temp |= (ADCH << 8); //Kiolvassuk az ADCH regisztert ADCr += ADC_temp; //Az eredmeny (8 minta alapjan) osszegyujtese a tovabbi atlagolashoz } ADCr = ADCr >> 3; //8 minta kozeperteke ADCSRA &= ~_BV(ADEN); //Letiltjuk az ADC-t return ADCr;
adc.c, adc.h –t beinkludolni! adc_init() adc_read() Használati példa: getvolt eljárás az adc.c-ben! void getVolt(void) { unsigned char volt[6]; unsigned int ADCresult = 0; ADCresult = ADC_read(); //előtte inicializálni kell! //Egy valos valtozot sztringge alakitjuk at dtostrf(3.27 * ADCresult / 1024, 5, 3, volt); //A PC-be kuldjuk a feszultseg erteket //ehhez soros kommunikáció is kell sendString("A beolvasas eredmenye: "); sendString(volt); sendString(" volt.\r"); }
adc.c,adc.h,uart.c,uart.h, uartinit,adcinit és a főprogram: main.c