Fórum témák

» Több friss téma
Cikkek » MMA7260QT gyorsulásmérő használata AVR-rel
MMA7260QT gyorsulásmérő használata AVR-rel
Szerző: Fizikus, idő: Szept 21, 2010, Olvasva: 25831, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   3 / 9

Kapcsolás

Az alábbi képen látható a próbapanelre összerakott kapcsolás. A panel bal oldalán lévő stab IC-t nem használtam, mert az USB-TTL átalakító látja el 5 V-tal az áramkört. Az ATMega8 Rx és Tx lábait is az átalakító megfelelő csatlakozójára kötöttem. A gyorsulásmérő 3 analóg kimenete a PC3, 4 és 5-ös lábakra lett kötve.

AVR program

Az oldal legalján található AVR kód folyamatosan, egy, az UART-on beérkező karakterre vár. Ha a beérkező karakter egy `m`, akkor az ATMega8 megméri az ADC-vel a gyorsulásmérő X, Y és Z tengelyeihez tartozó kimenetét, majd a mért értékeket visszaküldi az UART-on keresztül a PC-nek, a számokat vesszővel elválasztva és egy soreleje (\r) + újsor karakterrel lezárva (\n).

Ezek a nyers mérési eredmények eléggé nehezen értelmezhetőek, ezért két háromszögletű vonalzót használva referenciának kalibráltam az érzékelőt. A próbapanelt 30o-os és 45o-os lépésközönként körülfordítottam először az Y, majd az X tengely körül. Végül a próbapanelt élére állítva, a Z tengely körül is.

Y tengely körül történő forgatás (jobbra / balra döntés):

X tengely körül történő forgatás (előre / hátra döntés):

A függőleges (élére állított) próbapanel Z tengely körül történő forgatása (jobbra / balra döntés):

A fenti grafikonokról jól látható, hogy a különböző tengelyek mentén mért értékek minimuma 170 körül, maximuma pedig 540 körül van. A középérték pedig kb. 335. Ezeket a kalibrációs adatokat a későbbiekben használjuk majd fel.

Ahhoz, hogy a mért értékekből a különböző irányok mentén tapasztalható dőlésszöget megkapjuk, egy-két trigonometriai számítást kell majd elvégeznünk (lásd később).

A jobb érthetőség / szemléltethetőség kedvéért jó lenne grafikusan is megjeleníti a mért értékeket.

A következő oldalakon erre mutatok néhány egyszerű példát a Processing nyelvet használva.

Az ATMega8 WinAVR (AVR GCC) kódja:

  1. /*MMA7260QT gyorsulasmero hasznalata AVR-rel
  2. Hardware: ATmega8 @ 7.372800MHz
  3. Gyorsulasmero bekotese: X - PC3, Y - PC4, Z - PC5
  4. PC Software:HyperTerminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control=NONE*/
  5.  
  6. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  7. #define USART_BAUDRATE 9600  // soros kommunikacio sebessege: 9600 bps
  8. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
  9.  
  10. #include <avr/io.h>
  11. #include <inttypes.h>
  12. #include <util/delay.h> //Időzítő, késleltető rutinokat tartalmazó fájl
  13.  
  14. volatile int Z = 0;
  15. volatile int Y = 0;
  16. volatile int X = 0;
  17.  
  18. void Konfig10bitADC()        // ADC konfiguralas (beallitas)
  19. {
  20.     ADMUX |= (1<<REFS0);    // Vcc mint referencia
  21.     ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
  22. }
  23.  
  24. unsigned int Beolvas10bitADC(unsigned char csatorna)
  25. {
  26.     ADMUX = (ADMUX & 0b11110000) | csatorna;
  27.     ADCSRA |= (1<<ADSC);    // elso ADC konverzio elinditasa
  28.     while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  29.     ADCSRA |= (1<<ADSC);          // masodik ADC konverzió elindítás
  30.     while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  31.     return (ADCL | (ADCH<<8));        // ADC ertek kiolvasasa
  32. }
  33.  
  34. void KonfigUART() // UART beallitasa
  35. {
  36.    // 9600 bps soros kommunikacio sebesseg beallitasa
  37.    UBRRL = UBRR_ERTEK;    // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  38.    UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  39.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  40.    UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  41.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  42.    UCSRB |= (1 << RXEN) | (1 << TXEN);   //
  43. }
  44.  
  45. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  46. {
  47.    while(!(UCSRA & (1<<RXC)))  // Varakozas amig nincs uj bejovo adat
  48.    {
  49.       //Varakozas
  50.    }
  51.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  52.    return UDR;
  53. }
  54.  
  55.  
  56. void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  57.  
  58. {
  59.    while(!(UCSRA & (1<<UDRE)))  // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  60.    {
  61.       //Varakozas
  62.    }
  63.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  64.    UDR=data;
  65. }
  66.  
  67. int main(void)  // Foprogram
  68. {
  69.     char data;    
  70.  
  71.     KonfigUART();   // UART Konfiguralasa
  72.  
  73.     DDRC &= ~(1<<PC5);    // PC5-os lab bemenet (Z tengely)
  74.     DDRC &= ~(1<<PC4);    // PC4-os lab bemenet (Y tengely)
  75.     DDRC &= ~(1<<PC3);    // PC3-os lab bemenet (X tengely)
  76.     PORTC = 0x00;    // PORTC osszes laban a felhuzoellenallasok kikapcsolva
  77.  
  78.     Konfig10bitADC();    // ADC beallitas lefuttatasa
  79.  
  80.    while(1)
  81.    {
  82.         data = UARTAdatFogad();  // A berekezo bajt fogadasa
  83.        
  84.         if(data == 'm') // Ha a fogadott bajt a 'm'-mel egyezik meg, megmerjuk a gyorsulasokat
  85.         {
  86.                 Z =  Beolvas10bitADC(5);
  87.                 Y =  Beolvas10bitADC(4);
  88.                 X =  Beolvas10bitADC(3);
  89.            
  90.             UARTAdatKuld('0'+(X/100) % 10);  // Szazasok
  91.             UARTAdatKuld('0'+(X/10) % 10);   // Tizesek
  92.             UARTAdatKuld('0'+X % 10);    // Egyesek
  93.             UARTAdatKuld(',');
  94.             UARTAdatKuld('0'+(Y/100) % 10);  
  95.             UARTAdatKuld('0'+(Y/10) % 10);  
  96.             UARTAdatKuld('0'+Y % 10);  
  97.             UARTAdatKuld(',');
  98.             UARTAdatKuld('0'+(Z/100) % 10);  
  99.             UARTAdatKuld('0'+(Z/10) % 10);  
  100.             UARTAdatKuld('0'+Z % 10);    
  101.             UARTAdatKuld('\n');    
  102.             UARTAdatKuld('\r');    
  103.             _delay_ms(20);      
  104.         }
  105.     }
  106. }


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem