Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Meseria se fura, ingineria se invata.Telecomunicatii, comunicatiile la distanta, Retele de, telefonie, VOIP, TV, satelit




Aeronautica Comunicatii Constructii Electronica Navigatie Pompieri
Tehnica mecanica

Electronica


Index » inginerie » Electronica
» Accelerometrul - Elementele componente ale dispozitivului


Accelerometrul - Elementele componente ale dispozitivului


Introducere

Polobocul este un dispozitiv de masurare format dintr-o bula de aer captiva intr-un lichid care ne indica daca suprafata este dreapta. Bula de aer se deplaseaza intr-o parte sau alta fata de centrul lichidului in momentul in care suprafata pe care este asezat polobocul nu este dreapta. In momentul in care suprafata este dreapta bula de aer va fi perfect centrata. Acesta are de obicei 2 marcaje care indica centralitatea bulei.Polobocul (cu bula) este un dispozitiv analogic si deci este supus erorii de citire.In acest proiect ne vom ocupa de crearea unui poloboc digital care sa elimine acest tip de eroare. Eroarea care va mai exista se va datora doar pieselor folosite la realizarea lui.



Punerea in aplicare a unui poloboc digital desi simpla la prima vedere a ridicat numeroase probleme. Per total nu avem nevoie decat de un accelerometru,un convertor anagogic digital, un microcontroler, dispozitiv de avertizare (ex. led-uri), placa de suport, dispozitivele de alimentare (ex. baterie plus divizoarea de tensiune, etc) precum si cabluri de legatura. Problemele principale legate de acuratetea masurarii si de reducerea complexitatii proiectarii (si mai tarziu de realizarea fizica) nu sunt imposibil de depasit dar un viitor inginer trebuie sa se gandeasca la mai multe aspecte: pret, usurinta in utilizare, consum de putere, marimea dispozitivului final, usurinta de reproducere intr-o fabrica si altele.

In cerintele proiectului care s-au predat la inceputul semestrului s-a cerut folosirea unui microcontroler Atmel si ni s-a recomandat ATMega128. In acest proiect am folosit ATMega32 deoarece pur si simplu nu sunt diferente atat de mari intre cele microcontrolere :

Specificatii ATMega128 Specificatii ATMega32

Deci dupa cum se observa, surplusul de memorie pus la dispozitia noastra de ATMega128 este nefolosit caci un minimum de functionalitate se poate obtine si cu aproximativ 50-100 de randuri de cod care ar incapea in maxim cativa kilo.

Schema dispozitivului

-=Elementele componente ale dispozitivului=-

Placa suport poate fi ceva general sau ceva profesionist cum ar fi ceva cumparat de la Atmel(ex STK500).

Accelerometrul ales a fost ADXL202E a carui alimentare am ales-o convenabil la 3.5 V pentru a avea erori cat mai mici. Iesirea accelerometrului la 0 g masurat = 2.5V ; iesirea accelerometrului la +1 g masurat = 2.8V; iesirea accelerometrului la -1 g masurat = 2.2V.

Microcontrolerul ales este Atmega32 cu convertor analogic numeric intern pe 8 biti si pe setari normale la iesirea convertorului avem can(0g) = 731, can(-1g) = 644, can(+1g)=819, deci avem o gama = 175. Viteza can-ului a fost setata la viteza standard de 125kHz, deci suficient, viteza interna a microcontrolerului este 16mHz deci am putea folosi si un tact de ceas al microcontrolerului de 1kHz, practic de 1000 de ori pe secunda microcontrolerul vede ce valoare a primit de la accelerometru, aceasta valoare este trecuta prin can-ul intern si deci vom lucra in interiorul microcontrolerului cu o valoarea intreaga intre 644 si 819, cu 731 reprezentand citirea la 0 g; vom pozitiona accelerometrul intr-o parte a placii (stanga) si astfel ca putem zice prin conventie ca la citirea acceleratiilor negative (sub 731) placa are partea stanga mai jos decat partea dreapta deci vom activa led-ul corespunzator (cel stang); analog si pentru dreapta.

Led-urile alese sunt doar led-uri standard alimentate la 3.6V la 20mA ; firele de legatura sunt fire de cupru izolate de capacitate mica, deci fire standard;

Alimentarea se va face de la o baterie de 9V si voltajele necesare alimentarii componentelor (3.5V pentru accelerometru, 5V pentru microcontroler, 3.6V led-urile) vor fi scoase cu ajutorul unor transformatoare sau divizoare de tensiune.

Avem nevoie si de un buton de reset al microcontrolerului; asta deoarece erorile de citire se vor cumula si din lipsa unui sistem de calibrare sau de corectie a erorii vom fi nevoiti sa resetam dispozitivul (atunci cand acesta este la orizontala).

-=Mod de functionare=-

Problema initiala pe care o avem este ca accelerometrul ales setat standard va da la iesire doar valori acceleratiei instanee; exista si accelerometre care arata diferenta absoluta de la g=(acceleratia gravitationala) ,asemenea accelerometre se folosesc de exemplu la avioane si nu ar avea precizia necesara cerintelor impuse de noi.

Astfel ca noi trebuie sa alegem o formula de conversie intre g-ul masurat de accelerometru si gradele care ar trebui afisate, de aceea pentru simplificarea proiectului nu avem afisaj lcd, sau mai multe led-uri ci folosim doar 3 led-uri astfel incat legea noastra de decizie va fi:

Daca ((g citit)*(convertit CAN)*(operatie de corectie)) <731 => led stanga aprins

((g citit)*(convertit CAN)*(operatie de corectie)) =731 => led mijloc aprins

((g citit)*(convertit CAN)*(operatie de corectie)) >731 => led dreapta aprins

Tot ce este in parateza este de fapt o valoare dintr-un registru. Considerand ca accelerometrul da doar valori instanee putem spune ca aceasta operatia de corectie ar trebui sa fie doar o simpla adunare.

De fapt pentru optimizarea erorilor am avea nevoie de o operatie de corectie prin mediere, urmata de o adunare cu o valoarea pre-calibrata. pentru simplificarea calculelor am ales sa facem doar o adunare simpla: deci valoarea 'registru.g' = la inceput 731 si (g.citit.convertit - 731) va fi adunat la registru.g; legea de decizie va fi registru.g (dupa adunare) > sau = sau < 731.

Pentru intelegerea problemei sa dam un exemplu: consideram o suprafata inclinata spre stanga , deoarece nu ne intereseaza cat de inclinat este nu vom masura in grade, vom cinsidera direct valorile interne din microcontroler. Sa zicem ca dispozitivul se va inclina cu echivalentul a ceea ce vede accelerometrul 2.4V si deci dupa transfromare can => 683 (numar intreg folosit in interiorul micocontrolerlui) deci (g.citit.convertit - 731) = 683 - 731= -48; registru.g = 731 deoarece dispozitivul fusese tinut la orizontala => registru.g (dupa adunare) = 731 + (-48 )= 683 < 731 deci se aprinde led-ul stanga; daca am lua dispozitivul acum si l-am pune pe o suprafata si mai inclinata la stanga; sa zicem tot 2.4V vazut de accelerometru, deci => avem iar 683 => (g.citit.convertit-731 )= -48 dar acum r.registru = 683 caci a fost tinut pe suprafata inclina de mai sus => re.registru (nou) = 635 < 731 deci ramane aprins led-ul.

Mutand de pe aceasta suprafata pe o suprafata la orizontala => 2.6V vazut de la accelerometru => 847 dupa can => (g.citit.convert i- 731) = +96

registru.g = 635 => registru.g(nou) = 635 + (+96) = 731 deci se aprinde led-ul de orizontala.

Nevoia de un buton de reset vine din cauza unui anumit factor de "adunare" a erorilor. Practic deoarece accelerometru este de inalta precizie iar can-ul nu poate converti fara eroare valorile care le primeste de la accelerometru, la fiecare citire apare o anumita eroare. Aceasta va fi mereu mai mica de 0.5 din 1024 (valoarea de maxim a can-ului) si dupa un numar foarte mare de masuratori, sunt sanse mari ca valoarea de nivel stanga = dreapta = 0 sa nu fie 731 ci ceva relativ eronat si deci sa arate ceva gresit.

Sa exemplificam aparitia acestei erori. Sa zicem ca pentru 2.4015V de la accelerometru avem 684 din can desi ar trebui 683.55 deci din cauza lipsei de precizei a can-ului avem eroare de +0.45. Daca am muta pe o suprafata si mai inclinata si am avea de exemplu 2.4025V atunci o sa avem iar 684 desi ar trebui 683.65 deci eroare +0.35. Sa zicem ca intoarcem dispozitivul pe o suprafata nivelata si avem 847 cand ar trebui sa fie 846.75 deci eroare +0.25. Acum in registru.g (dupa.adunare) avem 732 deoarece in total eroarea a fost +1.05 si dispozitivul arata ceva eronat. Precizez ca dupa atenta analiza a specificatiilor accelerometrului si can-ului am ajuns la concluzia ca erorile prezentate mai sus sunt aproape imposibil de atins, eroarea maxima de la conversie la care ne putem astepta intr-o aplicatie practica la conversie acc-can ar fi de sub 0.1 din 1024; plus ca sunt sanse mari ca dupa o eroare cu +0.x sa apara la urmatoarea masuratoare o eroare cu -0.y si practic erorile se anuleaza una pe alta intr-o masura mai mare sau mai mica. Totusi dupa un numar de ordinul sutelor, daca nu chiar miilor de masuratori este nevoie de o resetare a registrului (registru.g) la valoarea 731 ( atunci cand suntem siguri ca ne aflam pe o suprafata dreapta).

Descrierea componentelor

-=Specificatiile accelerometrului=-

ADXL202E este un accelerometru cu doua axe, ieftin, de putere mica cu iesire digitala, toata pe circuit integrat monolitic . Acesta poate masura acceleratii intre (+-) 2g. Poate masura atat accelaratia dinamica( vibratia), cat si cea statica (gravitatia). In cazul nostru il vom folosi pentru cea de-a doua varianta.

Iesirile sunt tensiuni analogice sau semnale digitale care sunt proportionale cu acceleratia.Iesirile pe un ciclu de functionare pot fi masurate direct cu ajutorul unui contor dintr-un microcontroler fara un convertor analogic digital. Perioada unui ciclu de functionare poate fi modificata intre valorile 0.5 ms si 10 ms printr-un singur resistor RSET).

Pragul de zgomot tipic este de 200µg√Hz, lasand semnalele sub 2 mg ( la 60 de Hz) sa treaca.Largimea de banda este setata cu ajutorul a doua condensatoare CX , CY prin intermediul a 2 pini XFILT si YFILT.

-=Specificatiile microcontrolerului Atmel=-

ATmega32 este un microcontrolerul pe 8 biti in tehnoligie mos bazat pe o arhitectura avr risc avansata. Executand instructiunile puternice (complexe) intr-un singur tact de ceas, microcontrolerul poate atinge o viteza de procesare de 1mips/mhz, si ajuta programatorul sa optimizeze consumul de putere, scazand viteza de procesare. El este construit folosind tehnologia Atmel pentru memorii de inalta densitate.

Memoria flash de pe cip permite ca memoria programului sa fie modificata printr-o interfata SPI de catre un incarcator conventional in memoria non-volatila sau de un program de boot on-chip care se gaseste in codul avr. Programul de boot poate folosi orice interfata pentru a incarca aplicatia noastra in memoria flash a cipului. Combinand un procesor pe 8 biti risc cu sistem de memorie auto-programabila flash pe un singur cip monolitic Atmega32 devine un microcontroler puternic care se preteaza multor aplicatii.

-=Schema interna a microcontrolerului ATmega32=-

-=Schema pinilor microcontrelerului=-

*este evidenta necesitate unui "socket" pe placa suport de minim 40 pini.

-=Specificatii led=-

Model : L1-0-B5TH15-1

Marime: 5mm

Unghi-ul fascicolului de lumina: 15 grade

Lungimea de unda fascicolului de lumina: 470nm(albastru)

Intensitatea luminoasa: 3460mcd @ 20mA

Tensiune de alimentare: tipic 3.6V , 4.0V max @ 20mA

Disipatia de putere maxima: 120mW

Temperatura de operare: -30 to +85 C

Temperatura recomandata pentru lipirea pe placa suport: 265 C pentru 10 secunde

Nota: este evident ca se poate folosi orice led cu tensiunea de alimentare convenabila!

-=Butonul de reset=-

O sa folosim un "switch" pentru a reseta chipul. Legam un buton de pin-ul 9 al microcontrolerului, si anume de pinul reset. Acest buton este doar un switch inchis/deschis care leaga (sau opreste ) tensiunea +Vc (1.3-2.4V potrivit catalogului microcontrolerului) adica tensiunea de comanda la pinul de reset.

4.Programul scris in C

#include <mega32.h>

#include <math.h>

#include <stdio.h>

#include <delay.h>

//valori de accelerare si alte constante

#define TIME_ACC 10

unsigned char acc_cnt=TIME_ACC;

char measure_position = 0; // 0: horizontal

unsigned char channels[2] = ;

unsigned int num_avg = 15;

unsigned int sensitivity = 15;

int accel[1] = ;

unsigned int avg_cnt = 0;

float pitch_avg = 0.0f;

int old_pitch_avg = 0;

int old_plum_avg = 0;

unsigned int num_avg_msk = 0;

unsigned int num_avg_hlf = 0;

int p_1 = 0;

int r_1 = 0;

int pitch_avg = 0;

int pitch_avg_2 = 0;

int plum_avg_1 = 0;

char p_level = 1;

char r_level = 1;

// Calibrare ptr 0g=2.5v=731

sensitivity

num_avg_hlf = ((unsigned int)1) << (sensitivity);

num_avg_msk = (num_avg_hlf << 1) - 1;

num_avg = ((unsigned int)1)<<sensitivity;

// declararea functiilor

unsigned int read_adc(unsigned char);

void tsk_poll_accelerometers(void);

//initializare CAN

unsigned int adc_data;

#define ADC_VREF_TYPE 0x00

#pragma savereg-

interrupt [ADC_INT] void adc_isr(void)

#pragma savereg+

//Setare modului de lucru la 1khz

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

// pornirea can

unsigned int read_adc(unsigned char adc_input)

//functie de citire din accelerometru

void tsk_poll_accelerometers(void)

else

p_level = 0;


// iesire leduri

if(!p_level)

to_output |= (pitch_avg < 0 0b10000000 : 0b00010000;

if(to_output == 0)

to_output = 0b00001000;

to_output = ~to_output | 0b00000111;

PORTB = to_output;

if(abs(pitch_avg>>sensitivity) > 60)

measure_position = abs(measure_position-1);

pitch_avg = 0;

// corpul programului

void main(void)

5.Programul(condensat) scris in pseudocod*

//Declararea variabilelor folosite : 

RGG    DATA 30H

//RGG=(registru.g), registrul a carui valoare ne spune daca suntem la orizontala sau nu

RCN    DATA ADCL

//RCN=registrul de date al can-ului, potrivit manualului microcontrolerului are dezignatia ADCL, aici vom gasi valoarea rezultata in urma conversiei voltilor trmisi de accelerometru

RCC    DATA ADCSRA

//RCC=registrul de control al can-ului, potrivit manualului microcontrolerului are dezignatia ADCSRA

RTO    DATA 40H

//RTO=registrul care stocheaza valoarea de orizontala si anume 731

RTM    DATA 50H

//RTM=registrul temporar, folosit pentru a depozita o valoarea pentru putin timp

ORG     100H // setam originea codului executabil

CLR    EA // rutina de dezactivare a intreruperilor

//instructiuni standard de initializare a programului

MOV RTO,(2DB H)

//initializarea registrului RTO cu valoarea (2DB in hexa)=731 in decimal, acesti registru nu va mai fi modificat de-al lungul rularii programului

MOV RGG,(2DB H)

//initializarea registrului RTO cu valoarea (2DB in hexa)=731 in decimal dar acest registru va fi in permanenta modificat de fiecare data cand vom inclina dispozitivul

MOV RCC

//can-ul este pornit (bit7=1)echivalent enable, toate cazurile de intrerupere sunt dezactivate(biti 5,4,3) iar prescale-ul este setat la 2 (biti 2,1,0)

POLL //eticheta poll

MOV RTM,(2DB H)

initializarea registrului RTM cu 731

SUB RTM,RCN

RTM= RTM-RCN, => RTM=731-(valoare ce vine de la can)

ADD RGG,RTM

RGG=RGG+RTM => RGG.nou=RGG.vechi+(731-valoare.can)

//deci mai sus s-a calculat (registru.g) rezultat dupa miscarea dispozitivului

CP RGG,RTO

//=instructiunea compare,rgg-rto => modificarea bitului carry se executa calculul necesar regulii de decizie : (registru.g-731)

BRCS 1

daca bitul carry este set (=1) atunci sari peste urmatoare instructiune

MOV PORTB,00001000

deci se trimite la portb.3=led mijloc semnal de activare

//mai sus s-a verificat daca led-ul de echilibru(mijloc) trebuie aprins

BRCC 5

daca bitul carry este clear (=0) atunci suntem la nivelul de echilibru si nu avem nevoie de

rularea instructiunilor de mai jos care au ca rol determinare dezechilibrului stanga/dreapta, deci vom sari peste urmatoarele 5 instructiuni:

MOV RTM,RGG

copiem registru.g (deja adunat acum la valoare can) in registrul temp=rtm

SUB RTM,RTO

rtm=rtm - 731 , deci temp=valoarea.registru.g - 731

SBRC RTM,7

(=) sari peste urmatoare instructiune daca bitul 7 al RTM este 0, si deoarece bit-ul 7 ne arata semnul numarului stocat intr-un registru, daca valoarea este 0 atunci numarul este pozitiv, deci temp= valoarea.registru.g - 731 > 0 deci asa cum am ales prin conventie ne aflam pe o suprafata inclinata la dreapta, si instructiunea va sari peste instructiunea de mai jos care seteaza led-ul ptr stanga si se va rula direct instructiunea ptr activarea led-ului dreapta

MOV PORTB,10000000 //se activeaza led-ul stanga

MOV PORTB,00010000 //se activeaza led-ul dreapta

JMP POLL

//sari la eticheta poll,

// practic intre poll si jmp poll se realizeaza un ciclu while(1),adica un ciclu infinit

*desi unele instructiuni sunt chiar cele folosite de asemblereul microcontrolerului nu am reusit sa creez un program care sa se si compileze, de accea prin extensie as zice ca programul de mai sus e scris mai degraba in pseudocod

-=Concluzie=-

Asa cum ziceam in introducere un viitor inginer trebuie sa se gandeasca la mai multe aspecte: pret, acuratea masurarii, usurinta in utilizare, consum de putere, marimea dispozitivului final, usurinta de reproducere intr-o fabrica si alte aspecte.

Deci sa pornim de la pret. Majoritatea microcontrolerelor costa intre 10 si 50$, accelerometrul 10-20$, placa de suport 30-70$ (ex pentru Atmega32

la www.sunrom.com placa + microcontrolerul costa 70$) sau un kit complet: microcontroler + placa supot + software + cablu (de transfer PC-microcontroler) 100-150$ la (ex un kit Atmel STK500 costa 109$ la www.vikon.com); led-uri alese de noi costa 1.5$/bucata iar alte cheltuieli cum ar fi bateria 9V (1-2$) si cablurile de legatura sunt destul de mici. Dupa cum se observa cel mai scump este "development board", adica placa cu care vom programa microcontrolerul. Evident ca dupa programarea lui il putem muta pe o placa suport mult mai simpla al carei rol este doar de a sustine componentele.

Asa cum am mentionat mai sus, dupa un numar mare de masuratori este necesara o recalibrare; dar daca este calibrat suficient de bine teoretic se poate atinge o acuratete de sub 1 grad deviatie de la orizontala. Modul de utilizare este relativ simplu: pur si simplu punem placa cu dispozitivul pe o suprafata pe care vrem sa o masuram si observam care din led-uri se aprind.

Consumul de putere ar putea fi de ordinul sutelor de mW daca nu chiar mai mic, si asta deoarece putem seta atat accelerometrul cat si microcontrolerul sa lucreze la un tact mai mic (decat cel de 1khz setat din codul programului de mai sus).

Dimensiunea poate fi si de ordinul a cativa centimetri patrati, avand doar 3 componente voluminoase de montat: bateria, microcontrolerul si accelerometrul.

Cat despre usurinta de reproducere intr-o fabrica, aici ar trebui in principal sa intre usurinta adaptarii proiectului pentru realizarea lui pe o singura placa monolitica; cum microcontrolerul si accelerometrul au la baza tehnologie SMD, o aplicatie practica foarte compacta nu este chiar asa de greu de realizat.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate