This is an old revision of the document!
Kiirendusandurit kasutatase peamiselt kiiruste muutuste mõõtmiseks. Samuti saab kiirendusanduriga mõõta anduri nurka maapinna suhtes.
Elektroonikas kasutatakse kiirenduse mõõtmiseks tihti MEMS (Microelectromechanical system e mikro elektomehaaniline seade) andureid. Järgnevalt kirjeldame Freescale MMA seeria andurite tööpõhimõtet.
Andur koosneb mikrofreesitud mahtuvuslikust andurelemendist (g-rakk) ja mõõte ning töötluselektroonikast. Mõõteelement koos elektroonikaga on suletud vee ja õhukindlalt anduri korpusesse. G-rakk on mikrokiipi söövitatud polüsilikooni kiht, mis koos kahe fikseeritud mahtuvusliku plaadiga moodustab kaks kondensaatorit. Kui andurile rakendada mingi kiirendus, siis g-raku keskmine kiht liigub vastavalt ühe või teise fikseeritud plaadi poole ning tekkiv mahtuvus muutub vastavalt kiirendusele.
Andurisse sisse ehitatud elektroonika tegeleb g-rakkude mõõtmisega ning analüüsimisega. Elementidest tulev informatsioon võimendatakse, filtreeritakse ning teisendatakse pingeks, mida saab kasutaja mikrokontrolleriga mõõta. Tavaliselt lisatakse anduritesse ka 0G väljund, millega on võimalik kontrollerisse tekitada katkestus juhul kui andur tuvastab 0G e kukkumise.
MMA7361L 3-teljelise kiirendusanduri lugemiseks on vaja kasutada kontrolleril kolme ADC sisendit (1 iga kanali jaoks). Näitekood näitab kanalitest mõõdetud ADC väärtust ning joonistab kiirendusanduri kanalite info ka graafilisele LCDle.
// // Kiirendus anduri testkood // Kiirendusanduri kanalid on ühendatud ADC1-3 portidesse // #include <homelab/pin.h> #include <homelab/adc.h> #include <homelab/module/lcd_gfx.h> #include <homelab/xmega/clksys_driver.h> long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } // // Põhiprogramm // int main(void) { //Käivitame LCD lcd_gfx_init(); lcd_gfx_write_string("Accelerometer"); adc_init(ADC_REF_AREF,ADC_PRESCALE_128); // Lõputu tsükkel while (true) { char buffer[60]; uint16_t x = adc_get_value(1); uint16_t y = adc_get_value(2); uint16_t z = adc_get_value(3); uint16_t x_map = map(x,950,1300,128,0); uint16_t y_map = map(y,1000,1400,0,160); sprintf(buffer,"x: %4d\ny: %4d\nz: %4d\n",x,y,z); lcd_gfx_goto_char_xy(0,2); lcd_gfx_write_string(buffer); lcd_gfx_drawPixel(x_map, y_map); _delay_ms(10); } }