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:
/*MMA7260QT gyorsulasmero hasznalata AVR-rel
Hardware: ATmega8 @ 7.372800MHz
Gyorsulasmero bekotese: X - PC3, Y - PC4, Z - PC5
PC Software:HyperTerminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control=NONE*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h> //Időzítő, késleltető rutinokat tartalmazó fájl
volatile int Z = 0;
volatile int Y = 0;
volatile int X = 0;
void Konfig10bitADC() // ADC konfiguralas (beallitas)
{
ADMUX |= (1<<REFS0); // Vcc mint referencia
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
}
unsigned int Beolvas10bitADC(unsigned char csatorna)
{
ADMUX = (ADMUX & 0b11110000) | csatorna;
ADCSRA |= (1<<ADSC); // elso ADC konverzio elinditasa
while (ADCSRA & (1<<ADSC)); // varas az atalakitasra
ADCSRA |= (1<<ADSC); // masodik ADC konverzió elindítás
while (ADCSRA & (1<<ADSC)); // varas az atalakitasra
return (ADCL | (ADCH<<8)); // ADC ertek kiolvasasa
}
void KonfigUART() // UART beallitasa
{
// 9600 bps soros kommunikacio sebesseg beallitasa
UBRRL = UBRR_ERTEK; // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
UBRRH = (UBRR_ERTEK>>8); // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
// Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
//Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
UCSRB |= (1 << RXEN) | (1 << TXEN); //
}
char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
{
while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
{
//Varakozas
}
//Most mar van beerkezett adat, amit kiolvasunk a pufferbol
return UDR;
}
void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
{
while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
{
//Varakozas
}
// Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
UDR=data;
}
int main(void) // Foprogram
{
char data;
KonfigUART(); // UART Konfiguralasa
DDRC &= ~(1<<PC5); // PC5-os lab bemenet (Z tengely)
DDRC &= ~(1<<PC4); // PC4-os lab bemenet (Y tengely)
DDRC &= ~(1<<PC3); // PC3-os lab bemenet (X tengely)
PORTC = 0x00; // PORTC osszes laban a felhuzoellenallasok kikapcsolva
Konfig10bitADC(); // ADC beallitas lefuttatasa
while(1)
{
data = UARTAdatFogad(); // A berekezo bajt fogadasa
if(data == 'm') // Ha a fogadott bajt a 'm'-mel egyezik meg, megmerjuk a gyorsulasokat
{
Z = Beolvas10bitADC(5);
Y = Beolvas10bitADC(4);
X = Beolvas10bitADC(3);
UARTAdatKuld('0'+(X/100) % 10); // Szazasok
UARTAdatKuld('0'+(X/10) % 10); // Tizesek
UARTAdatKuld('0'+X % 10); // Egyesek
UARTAdatKuld(',');
UARTAdatKuld('0'+(Y/100) % 10);
UARTAdatKuld('0'+(Y/10) % 10);
UARTAdatKuld('0'+Y % 10);
UARTAdatKuld(',');
UARTAdatKuld('0'+(Z/100) % 10);
UARTAdatKuld('0'+(Z/10) % 10);
UARTAdatKuld('0'+Z % 10);
UARTAdatKuld('\n');
UARTAdatKuld('\r');
_delay_ms(20);
}
}
}
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!