Netáhlo Tomáš, xnetah00@stud.feec.vutbr.cz
Dvořák Martin, xdvora64@stud.feec.vutbr.cz
Jelikož se akcelerometr vyrábí v miniaturním QFN pouzdře u kterého by byl problém s pájením obvodu, byl použit modul od firmy Pololu Robotics & Electronics. Modul obsahuje již zmíněný akcelerometr a další doplňující obvody. Celý modul lze napájet napětím od 3,6 V do 15 V, protože obsahuje stabilizátor napětí LP2980AIM5-3.3. Na výstupech všech tří os X, Y i Z jsou zapojeny RC filtry, jak je doporučeno v datasheetu akcelerometru. Celkové schéma zapojení modulu udává obr. 2.
Výstupy akcelerometru jsou analogové. Pro převod napětí ze všech tří os akcelerometru se používá A/D převodník mikrokontroléru ATmega8. Velikost napětí na výstupu všech tří os při měření statického zrychlení na rozsahu 1,5 g udává tabulka č. 1, viz obr. 3. Hodnota 0 g odpovídá vodorovné ose, neboli náklonu 0°. Hodnoty 1 g a -1 g odpovídají poloze osy kolmé k zemskému povrchu, neboli náklonu 90° a - 90°.
Na obr. 4 je uvedeno blokové schéma akcelerometru. Výstupy X, Y, Z akcelerometru jsou připojeny na A/D převodník mikrokontroléru ATmega8. Jako referenční napětí pro A/D převodník je použito napětí 3,3 V z vývodu VDD, které je připojeno na pin AREF mikrokontroléru. Protože A/D převodník mikrokontroléru je 10-bitový, mohou data nabývat hodnot 0-1023 (v rozsahu napětí 0-3,3 V) U akcelerometru byla nastavena citlivost 1,5 g (pomocí propojek na SG1 a SG2). Změřené a vypočtené hodnoty napětí, tíhového zrychlení a úhlu natočení se zobrazují na LCD displeji 16x2. Celý obvod je napájen pomocí 9 V baterie a potřebná změna napětí na hodnotu 5 V se provádí regulátorem napětí.
Výpočet napětí se provádí podle následujícího vzorce:
x = ((napeti)*(3.3/1023)*1000);
kde proměnná napětí odpovídá hodnotě uložené v registru ADCW, tato hodnota je vynásobena podílem referenčního napětí 3,3 V a rozsahem A/D převodníku. Výsledná hodnota napětí je poté zobrazována v mV.
Poté se vypočítá hodnota tíhového zrychlení:
gx=((x-1650)/8.1);
kde od změřené hodnoty napětí x, odečteme hodnotu 1650 mV, která odpovídá nulovému tíhovému zrychlení a tyto hodnoty vydělíme počtem dílků mezi 0 g a 1 g. Pozn. počet dílků je vydělen 100, kvůli zobrazení na LCD.
Z hodnoty tíhového zrychlení lze poté vypočítat úhel náklonu, protože hodnota 0 g odpovídá vodorovné ose a hodnota 1 g odpovídá úhlu 90°.
uhelx=(asin(gx/100))/3.14*18000;
Ukázka zdrojového kódu, kompletní zdrojový kód je ke stažení: zdrojový kód.
ADMUX = 0b00000000; // kanál nula AD převodníku ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // povolení AD převodu, přerušení po dokončení převodu, předdělička 128 /****************************************************************** zobrazení na LCD *******************************************************************/ lcd_gotoxy(0,0); sprintf(buffer,"Ux= %d mV",ux); // napětí na ose x lcd_puts(buffer); lcd_gotoxy(0,1); if (gx1>=0) // tíhové zrychleni g osa x { sprintf(buffer,"g= %d,%d", gx1/100, gx1%100); lcd_puts(buffer); } else { gx1=(-1)*gx1; // tíhové zrychleni g záporné osa x sprintf(buffer,"g=-%d,%d", gx1/100, gx1%100); lcd_puts(buffer); } lcd_gotoxy(8,1); if (uhelx1>=0) // úhel náklonu osa x { sprintf(buffer,"u= %d,%d", uhelx1/100, uhelx1%100); lcd_puts(buffer); } else { uhelx1=(-1)*uhelx1; // úhel náklonu záporný osa x sprintf(buffer,"u=-%d,%d", uhelx1/100, uhelx1%100); lcd_puts(buffer); } /**************************************************************** obsluha AD převodníku *******************************************************************/ ISR(ADC_vect) { int napeti,x,y,z; double uhelx, uhely, uhelz; double gx, gy, gz; napeti = (ADCW); x = ((napeti)*(3.3/1023)*1000); // vypočet napětí osa x ux=x; gx=((x-1650)/8.1); // výpočet tíhového zrychlení osa x, stokrát větší gx1=gx; uhelx=(asin(gx/100))/3.14*18000; // výpočet úhlu náklonu osa x, stokrát větší uhelx1=uhelx; break; ADMUX++; // posun na další kanál AD převodníku if (ADMUX>2) { ADMUX=0; } ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // opětovné spuštění AD převodu }