Turometru digital

Introducere

Initial mi-am propus sa fac un computer de bord pentru Dacie (care, surprinzator, are interfata de diagnostic OBD2). Dar cipul (ELM323) necesar pentru comunicatia cu masina s-a dovedit prea dificil de obtinut, asa ca am optat ca doar sa implementez un turometru digital.

Descriere generală

Proiectul este realizat cu ajutorul plăcuței din prima etapă la PM. Pentru implementare se folosește un display LCD BC1602E, cu 2 randuri a 16 caractere fiecare.

In principiu, se masoara turatia unui motor electric folosind un senzor special care detecteaza lumina unui LED infrarosu. Pe axul motorului este montata o rotita gasita intr-un mouse, care are gaurele pe margini. Se numara cate gaurele s-au succedat in intervalul de timp pentru a determina turatia.

Display-ul se leagă la microcontroller pe anumite porturi, folosind o magistrala de date speciala (a se vedea mai jos, la Hardware Design).

Programul este scris in C și este scris pe microcontroller cu ajutorul programului PonyProg2000 (a se vedea mai jos, la Software Design).

Hardware Design

Am impartit totul pe componente (module) separate:

  • Placuta cu ATMega 16
  • Display LCD
  • Placuta cu 8 LED-uri colorate
  • Placuta butoane
  • Motoras electric cu senzori

Componentele sunt legate intre ele prin diferite magistrale. Am ales aceasta solutie deoarece in viitor vreau ca ele sa poata fi montate in locuri diferite fata de placuta microcontroller-ului. Daca o sa reusesc sa implementez interfatarea cu OBD de la masina, nu ar fi posibil ca LCD-ul, LED-urile, butoanele sa fie in acelasi loc cu placuta.

Pentru display-ul LCD, se foloseste o transmisie de date pe 8 biti. In driver am pastrat si optiunea cu 4 biti.

Aproape toti pinii microcontroller-ului sunt folositi.

Totul se vede cel mai bine din schema proiectului.

Alimentarea

Alimentarea se poate face in mod preferabil cu un cablu USB. Se poate conecta si la un transformator. Alimentarea celorlalte componente se face prin cabluri speciale de pe magistrale, pentru Vcc si Vss. Tensiunea de alimentare este 5V.

Pentru LCD Vcc si Vss se transmite prin cablu.

Motorul electric se alimenteaza de la orice sursa la care poate rezista. Pentru testare am folosit tot alimentarea placutei.

Componente folosite (sumar)

  • AtMega 16 + placa dezvoltare
  • Display BC1602E
  • Motor electric + circuit detectie rotatie ax
  • Magistrale pentru conectare (facute de mine din cablu UTP)
  • Placuta cu 8 LED-uri (de mine facuta)
  • Placuta cu 4 butoane (de mine facuta)

Placuta cu microcontroller-ul

Display LCD

Magistrala LCD

Motor electric

Placuta LED-uri

Placuta Butoane Magistrala LCD

Pe spatele placutei de dezvoltare se gasesc numeroase fire de legatura, in special pentru Ground si Vcc.

Probleme mari au aparut la initializarea LCD-ului. Am pierdut foarte mult timp debugand driver-ul (fusese modificat de mine destul de mult), dar in final problema s-a dovedit a nu a avea nici o legatura nici cu driver-ul nici cu hardware-ul. Era vorba de bitul de fuse pentru Enable JTAG, care il uitasem activat si nu permitea folosirea pin-ilor PC2 → PC5. Astfel LCD-ului i se transmiteau date eronate, chiar daca din program acestea erau setate corect.

Software Design

Programul este impartit in 3 componente principale:

  • Programul principal
  • Modulul / driver-ul LCD
  • Modulul pentru meniuri

Programul principal se ocupa cu initializarea celorlalte module si obtinerea datelor despre motor, sau de la butoane. Functiile care se ocupa de diferite aspecte are functionalitatii sunt bine separate. La fel si variabilele globale. Updatarea informatiilor de pe display si aprinderea LED-urilor este controlata tot de catre programul principal.

Este folosit un timer al microcontroller-ului pentru a determina cand este nevoie de update-uri la informatiile de pe display sau la LED-uri. De asemenea cu ajutorul acestuia se va salva numarul de rotatii al motorului la fiecare secunda. Starea butoanelor se verifica la un interval de 50 ms pentru a preveni eventuale erori sau reapasari.

In general, procedura pentru meniuri si butoane este similara cu cea a monitoarelor. Se navigheaza prin meniuri si se alege ce se vizioneaza sau se modifica. Butoanele au o structura speciala, care tine starile de apasare, pin-ul corespunzator, actiunea (o functie) pe care o va face butonul la apasare, si actiunea butonului fata de meniu (tot o functie). Cand se face update, se vede daca este necesara efectuarea actiunii specifice butonului. Este tratat si cazul in care s-a intrat intr-un element de meniu si trebuiesc facute modificari.

Driver-ul de LCD este luat si modificat din laboratorul 1. Se foloseste o magistrala de date de 8 biti pentru LCD. API-ul este lasat in header, iar implementarea este ascunsa in fisierul C. Pentru asteptarile mai mari am folosit functiile de delay din avr-libc.

Modulul pentru meniuri expune un fel de API simplist in header. Acesta permite navigarea prin meniuri si obtinerea identificatorului meniului curent. Fiecare intrare din meniu poate avea copii. Butoanele (functiile) pentru navigare sunt sus, jos, enter, exit. Pentru meniuri am cautat sa fac economie de memorie, avand in vedere ca ATMega16 are doar 16 KB disponibili.

Meniurile sunt:

  • Rotatii pe minut
  • Rotatii pe secunda
  • Setare turatie tinta (neimplementat)
  • Informatii
  • Informatii Hardware
  • Informatii Autor
  • Debug
  • Stare senzor RPM
  • Valoarea ultimei probe RPM
  • Frecventa probe RPM
  • Test LED-uri

Pentru masurarea turatiei, se mentine un vector de 20 de probe de turatii, una la fiecare 50 ms. Astfel, se pot obtine informatii despre turatie odata la 50 ms, ceea ce mareste timpul de raspundere considerabil. Pentru valoarea rotatiilor pe minut, se aduna toate valorile din vector.

Dimensiunea programului este de 8436 bytes.

Arhiva cu fișierele proiectului este disponibilă la secțiunea Download.

Rezultate obținute

Meniurile de pe display functioneaza corespunzator. Se poate naviga prin ele cu ajutorul celor 4 butoane (sus, jos, enter, exit), si au functii de afisare a unor diferite informatii, si functie de modificare de parametri. Exista si cativa parametri de debug, care sunt plasati intr-un meniu special.

Turatia motorului electric este indicata cu ajutorul placutei de LED-uri. Acestea se aprind in functie de cat de mare este turatia. Pe langa asta, LED-ul rosu de pe placuta de langa ATMega se aprinde si se stinge cand se detecteaza prezenta unei gauri in dreptul senzorilor de la axul motorului.

In acelasi timp, turatia motorului poate fi afisata pe display (rotatii pe minut sau rotatii pe secunda).

Uneori apare un mic bug la masurarea turatiei din cauza senzorilor care se intampla uneori sa perceapa tranzitii inexistente in unele pozitii ale axului motorului.

Download

pm/prj2011/dtudose/turometru-digital.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0