vineri, 6 iunie 2008
Principiul software

Proiectul se constituie din 4 fisiere:
1. defs.h - care contine define-uri pentru constante
2. funct.h - header cu prototipul functiei de initializare
3. init.c - fisierul contine initializarile pentru diferiti registri.
Noi am folosit portul D ca iesire pentru Led si intrare pentru buton. De asemenea am activat Watchdog-ul care e prescalat la o frecventa de 2048 ori mai mica decat o oscilatorului. De asemenea are nevoie de 2 valori consecutive pentru a se porni.
Initializam si convertorul analog digital care va lucra folosind referinta externa de 5V a montajului si canalul 0 pentru input.
4. main.h - programul principal al proiectului
Avem 3 variabile: g, in care stocam acceleratia (de tip float), adc, ce stocheaza valoarea scoasa de CAN( de tip unsigned int) si buffer, un sir de caractere,pe care il folosim la trecerea din float/int in string pt afisarea pe lcd.
Ledul este initial stins. La un interval de 100ms achizitionam o valoare in volri pe care o convertim numeric. Rezultatul este stocat in adc, convertit in acceleratie si afisat pe linia a 2-a a lcd-ului. Daca aceasta valoare depaseste o valoare de prag (noi am ales 7g), atunci ledul se aprinde, valoare este afisata pe prima linie a lcd-ului si intra intr=o bucla consitionata de apasarea butonului. Dupa apasare, programul revine in bucla normala dupa acel interval de SAMPLE.
Pentru soft am folosit ca bibliografie datasheet-ul lui ATMega16 dar si libraria de help din CVAVR pentru conversia adc, scrierea pe lcd si convertirea din numeric in string.
joi, 5 iunie 2008
Principiul Hardware
Principiul este unul foarte simplu:
Folosim senzorul MMA1213D pe care il alimentam la VCC(5V). El transmite prin VOUT o tensiune care corespunde unel acceleratii(de regula 0g la VOUT/2 si crescand sau scazand pentru +/-g, avand o caracteristica liniara). Tensiunea intra in canalul 0 de convarsie analog/digitala al microcontrolerului si este convertita intr-un numar pe 10 biti si apoi transformata in acceleratie cu ajutorul ecuatiei caracteristicii dedusa in urma calibrarii. Aceasta ultima valoare este transmisa la LCD si afisata. Daca valoarea depaseste un prag de acceleratie stabilit (eu am ales +/-7g) atunci se va aprinde un led care va semnala declansarea airbag-ului.
Schema electrica arata in felul urmator:
Bill of materials:
Bill Of Materials June 6,2008 10:32:51 Page1
Item Quantity Reference Part
______________________________________________
1 1 BC549 2N1613
2 1 C1 2u2
3 2 C2,C3 22pF
4 12 C5,C6,C7,C8,C9,C10,C11, 100n
C12,C13,C14,C15,C16
5 1 C14 10n
6 10 DB4,DB5,DB6,DB7,VOUT,TXD, TSTPAD
RXD,RS,R/W,EN
7 2 DB9-female,DB9 - male CONNECTOR DB9
8 1 D2 5V1
9 1 D3 D02BZ2_2
10 1 D5 LED
11 1 ICSP CON6
12 1 IC2 ATMega16-DIL40
13 1 JF1 ISP
14 1 J1 LCD 2x16
15 2 R1,R3 10k
16 4 R2,10k,4.7k,4.7K 1k
17 1 R2 15k
18 1 R2 330R
19 1 SW1 SW PUSHBUTTON
20 1 U8 MAX232
21 1 X1 QZPCBRST
22 1 2 MMA1213D
23 1 5V LM7805
24 1 9V BATTERY
25 1 1N4148 D1N3491
Aproape de final (ultima problema intalnita)
Am rezolvat ultima problema (dar una fundamentala). Senzorul nu mai functiona normal. El scotea un voltaj egal cu Vcc la iesire cat si pe pinul STATUS (ceea ce conform datasheet-ului senzorului insemna eroare). Am verificat toate lipiturile de scurt si am ajuns la problema: legatura intre pinul senzorului si unul dintre terminalele rezistentei din filtrul de iesire nu faceau bine contact. De altfel lipiturile din jurul senzorului nu sunt unele de buna calitate fapt ce se datoreaza totusi lipsei de experienta dar si ciocanului e lipit care nu a avut un varf atat de ascutit pentru a permite o lipitura la o asemenea precizie
miercuri, 4 iunie 2008
Calibrarea senzorului
Calibrarea senzorului am facut-o in modul urmator:
Am folosit un poloboc si am scos pe lcd voltajul si output-ul CAN-ului. Am notat valorile 502 pentru -1g si 517 pentru +1g si am trasat o caracteristica liniara. Am extras ecuatia dreptei cu care voi realiza corespondenta intre valorile digitale si acceleratia masurata in g.

Ecuatia gasita este g=(2*adc-1019)/15
Astfel vom putea transforma orice valoare a adc-ului in acceleratie.
luni, 12 mai 2008
Primele rezultatate concrete
Am reusit dupa multe batai de cap sa afisez tensiunea data de traductor dupa ce in prealabil am convertit-o digital. Problema care am intalnit-o a fost faptul k foloseam AREF ca referinta pentru A/D dar nu o legasem la masa pentru decuplare.
Am folosit o referinta externa de 5 volti pentru AREF(referinta convertorului A/D). Am ales 5 volti deoarece aceasta este tensiunea maxima pe care teoretic ar putea-o scoate senzorul. Microcontrolerul primeste de la iesirea senzorului o tensiune care variaza in jurul valorii de 2.6 volti (cat scoate pentru 0 g). Voltajul scade pentru un g negativ si creste pentru o acceleratie pozitiva.
Ramane doar sa calibram senzorul pentru a afisa acceleratia vazuta.
luni, 5 mai 2008
LCD -ul si primele probleme
Am incercat in ultima saptamana sa atasez si LCD-ul la placuta de test. Lipitul in sine nu a fost o mare problema. Am consultat datasheet-ul afisajului Ampire AC-162B (am adaugat link-ul) si am conectat pinii cu ajutorul unor fire pamblica. Din pacate afisajul nu are backlight, astfel incat firele ce leaga anodul cu catodul folosite pentru iluminare nu prea isi mai au rostul. LCD-ul l-am lipit pe o linie de ISP-uri pentru a fi mai stabil. Setarea de contrast si anume pinul 3 am rezolvat-o prin legarea direct la masa pentru un contrast maxim si pentru o simplificare a lucrului.
Am legat in urmatorul mod:
[LCD] [Atmega16 PORTC HEADER]
1 GND- 9 GND
2 +5V- 10 VCC
3 VLC- LCD contrast control voltage 0..1V
4 RS - 1 PC0
5 RD - 2 PC1
6 EN - 3 PC2
11 D4 - 5 PC4
12 D5 - 6 PC5
13 D6 - 7 PC6
14 D7 - 8 PC7
Insa am dat de o mare problema si anume: dupa ce am incarcat softul de test am observat ca nu afisa decat o linie goala. Dupa multe incercari si variante de cod (am incercat si o initializare din registrii direct) am gasit problema: pinul pentru EN (enable) nu era recunoscut deoarece la programare era initializata siguranta de JTAG. Dupa ce i-am dat disable totul a functionat corect.


