PROIECT 2012
Proiectele realizate in cadrul Laboratorului de SMP 2012, Fiecare echipa are de completat in pagina WIKI corespunzatoare proiectului in cadrul tabelului de mai jos, in functie de grupa de care apartine La o grupa se poate implementa o singura data un proiect.
Lista cu proiectele disponibile o gasiti AICI.
Punctaj Proiect
-
2p Pagina Wiki in format HTML cu capitolele create - poze(diferite stadii ale proiectului) + schema hardware + listing software (microcontroller + OpenWatcom la Z3)
-
5p Functionalitate proiect - punctaj in functie de cerintele cerute/realizate
-
1p Calitatea proiectului - cat de organizati ati fost in realizarea acestuia, cod format frumos, optimizari etc...
-
2p Nota individuala - participarea voastra in proiect, raspunsul vostru la intrebarile laborantului la presentarea proiectului
Cerinte general valabile:
- Toate proiectele se vor integra software si/sau hardware cu placa EV/Z3. Pentru integrarea hardware se va folosi portul serial al placii EV/Z3
- Logica software de baza se va regasi pe placa EV/Z3 si va fi realizata în C + inline assembly folosind template-ul OpenWatcom de la laborator
- Pagina de wiki trebuie sa contina o descriere a ce a realizat fiecare student in cadrul proiectului
- Daca nu puneti pe site alta schema de proiectare hardware se va folosi cea cu PIC16F628A pusa la dispozitie
- Wiki-ul trebuie updat ca sa vad stadii intermediare ale proiectului
Elemente de electronica
-
Pentru a vedea/comanda un pret estimativ a componentelor va propun www.conexelectronic.ro . Gasiti si alte magazine pe Maica Domnului.
-
Letconul ar trebui sa aiba cam 40W , nu mai mult de 60 oricum , iar fludorul la 1mm-1.5mm. Sa aveti si un voltmetru cu voi.
-
Va recomand inainte sa alegeti proiectul sa cititi cateva elemente de electronica de AICI.
2012_332AB_P2
Table of contents
2. [edit]
2.2.1. Theacher Proposal
2.2.2. - placa PIC - PCB -
2.3. III. User Flow
2.5. V. Hardware Design
2.7. VI. Software Design
2.8. VII. Results
2.9. VIII. Download
2.10. IX. Status
2.11. X. Personal Contribution
Project Name [edit]
[edit]
I. Project Description
Tema proiectului consta in realizarea unui voltmetru/ampermetru folosind uC.
Pentru aceasta vom folosi un convertor analog numeric integrat uC pentru a calcula potentialul de tensiune intre doua puncte. Folosind un canal al ADC-ului, vom masura tensiunile in cele 2 puncte de interes, urmand ca pe urma sa se obtina valoarea tensiune intre cele doua puncte.
Pentru a masura intensitarea unui curent vom apela la o rezistenta de sunt. Cunoscand valoarea rezistentei (aleaga pe seama unor calcule) vom putea dedude valoarea curentului ce strabate rezistenta de sunt prin masurarea tensiunilor la capetele rezistentei si efectuarea de calcule in uC(legea lui Ohm).
Parametrii de operarea al uC vor fi furnizati de placa Z3, iar rezultatul returnat de uC va fi transmis si afisat pe ecranul placii Z3.
II. Project Requirements
Theacher Proposal
- placa PIC - PCB -
- converton analog-numeric 10 biti - masurare tensiune, intentisate.
- placa PIC trimite la Z3 marimea masurata ... ca medie a duratei de sampling trimisa de utilizator.
- Utilizatorul da de la tastatuura Z3 durata de masurare. Placa Pic ii returneaza media pe durata respectiva.
Placa pic primeste si stocheaza datele de la masurare. Utilizatorul poate cere si o media a datelor colectate
Ex: utilizatorul introd durata de 5s
Timp de 2min la fiecare 5s pic-ul ii trimite date. Placa Z3 stocheaza datele.utilizatorul putandule accesa.
III. User Flow
Avand in vedere evolutia tehnologiei in ziua de azi, cunoasterea tensiunii sau a curentului in interiorul unei scheme electrice ne poate oferi o posibilitate de reglare adecvata a comenzilor.
Circuitul pe care il proiecta va putea fi integrat in interiorul oricarui sistem electronic si va putea analiza tensiuni de pana la [-30V;+30V] DC si curenti de pana la 2A DC.
IV. Required components
*PIC16F870
*MAX232
*Shunt resistor 10W 2,2ohm 5% tolerance( 1+1,2)
* mufa DB9-mama
*rezistente(27k,2k7,3k3,100,100k,10k,47)
*condensatori(47n,22n,1u,100u)
*lm7805
*resonator HS49 20mHz
*switch-uri( 2xDIL,push button, 1xToggle button)
*LED
V. Hardware Design
In cele din urma am finalizat schema electronica a placii PIC.
Schema este realizata in Eagle, versiunea 6.1.0 Light.
In cele ce urmeaza este prezentat PCB-ul , creat de asemenea in Eagle, pe care il vom realiza cu ajutorul unei placi cu un singur strat.
VI. Software Design
In ceea ce priveste programarea microcontroller-ului , am intalnit mai multe dificultati din cauza modelului diferit de PIC.Insa am reusit sa prezentam un cod functional.
Pentru configurarea PIC-ului am folosit urmatoarea comanda:
__CONFIG(0x3FFF & FOSC_HS & LVP_OFF & WDTE_OFF & CP_OFF & PWRTE_ON);
astfel utilizam oscilatorul extern de 20Mhz.
Configurarea comunicatiei seriale se realizeaza prin:
#define BAUD 9600
#define BAUD_HI 1
#define SPBRG_VALUE 129
SPBRG = SPBRG_VALUE; // Baud Rate register, calculated by macro
BRGH = BAUD_HI;
SYNC = 0; // Disable Synchronous/Enable Asynchronous
SPEN = 1; // Enable serial port
TXEN = 1; // Enable transmission mode
CREN = 1; // Enable reception mode
TX9=1;// 8 bit serial transmition
SYNC=0;
RX9=0; //8 bit
Se realizeaza o comunicatie seriala de tip asincron pe 8 biti, fara bit de paritate, cu o viteza de 9600 kbps.
Pentru a putea utiliza modulul de convertor analog digital a fost nevoie sa construim 2 functii, una de initializare a modului si alta de utilizare a lui.
Procedura de initializare presupune setarea parametrilor precum: timpul de achizitie al datelor, semnalul de ceas, alinierea bitilor, configuratia bitilor in cadrul portului A (aferent ADC-ului) etc.
void ADCInit()
{
//We use default value for +/- Vref
//VCFG0=0,VCFG1=0
//That means +Vref = Vdd (5v) and -Vref=GEN
//Port Configuration
//We also use default value here too
//All ANx channels are Analog
/*
ADCON1
*ADC Result Right Justified.
*Acquisition Time = 2TAD
*Conversion Clock = 32 Tosc
*/
ADCON1=0b10000000;
}
Pentru o utilizare mai usoara a ADC-ului, am folosit urmatoarea functie:
unsigned int ADCRead(unsigned char ch)
{
if(ch>5) return 0; //Invalid Channel
ADCON0=0x00;
ADCON0=(ch<<3); //Select ADC Channel
ADCS1=1; //Select Fosc/32
ADCS0=0;
ADON=1; //switch on the adc module
GO=1; //Start conversion
while(GO); //wait for the conversion to finish
ADON=0; //switch off adc
unsigned int i;
i=ADRESH*256+ADRESL;
return i;
}
Functia va seta canalul pe care urmeaza a se efectua conversia in functie de parametrul ch, urmand a completa restul de setari necesare functionarii ADC-ului( frecventa de lucru, pornirea modulului etc). In cele din urma se va porni conversia prin setarea bitului GO; finalizarea conversiei va trece automat bitul GO pe zero, urmand apoi sa se opreasca modulul si sa se transmita rezultatul sub forma unui unsigned int.
Intrucat valorea citita din ADC nu are nici o reprezentare fizica, ea trebuie prelucrata corespunzator. Pentru aceasta vom utiliza 2 functii ce convertesc valoarea citita intr-o valoarea cu semnificatie reala, corespunzatoare domeniului de lucru al placii.
Astfel, conversia in Volti se va efectua in felul urmator: se va lua ca referinta valoarea divizorului dintre VCC si GND, adica 2,5v.=512 pentru ADC. Tensiunea finala ca fi reprezentata de modulul diferentei dintre valorea citita si valoare de referinta, raportat la plaja de valori a PIC_ului(210=1024) si inmultit cu tensiunea de referinta. In cele din urma se va imparti aceasta valoare la valoarea maxima a domeniului de masura adica 30V.
float adc2volt(float val)
{float v,i;
if(val<2.5) v=((val-512)/1024)*2.5; //calc tensiuni negative
else v=((512-val)/1024)*2.5; //calc tensiuni pozitive
i=v/30 ; //de determinat
return i;
}
In mod asemanator, valorea curentului masura in miliamperi va fi egala cu valoarea citita raportata la 1024 si inmultita cu valoarea maxima a tensiuni ce o poate reprezenta(5V). Se va imparti valoarea rezultata la 2.2 pentru a afla curentul in miliamperi.
float adc2amp(float val)
{float v,i;
v= (val/1024)*5;
i=v/2.2;
return i;
}
Ca program principal, se evidentiaza secventa de comunitatie si prelucrare matematica a valorilor masurate.
t=rcv;
while (t)
{if (DIL1==1) val=ADCRead(0);
else val=ADCRead(2);
if (DIL1==1) val_real=adc2volt(val);
else val_real=adc2amp(val);
if(t==rcv) val_ant=val_real;
// To avoid spikes, only the data that is in range of +/- 20% of the current value of the average will be considered
if(((val_ant-val_real)<val_ant*(0.2)) || ((val_real-val_ant)<val_ant*(0.2)))
{s[0]+=val_real;
s[0]=s[0]/2;
s[1]=DIL1;
val_ant=val_real;
}
t--;
}
In ceea ce priveste placa EV/Z3, codul este simplist, presupune citirea de la tastatura a unui numar si transmiterea lui catre PIC. Se asteapta primirea unui caracter inapoi, lucru ce marcheaza sfarsitul conversiei si se afiseaza sub formatul corespunzator
kIo.DisplayString(serialStart);
/* wait for a key to be pressed */
key = kIo.ReadKey();
buffer[0]=key;
kIo.SerialWrite(COM1,buffer,1);
kIo.Wait(1000);
while (kIo.SerialRead(COM1,buffer,1)==0){};
kIo.Buzzer(2,800);
kIo.DisplayString(serialDone);
if(buffer[0]==1) kIo.DisplayString(serialVolt);
else kIo.DisplayString(serialCurr);
while (kIo.SerialRead(COM1,buffer,1)==0){};
kIo.Wait(2000);
kIo.DisplayString(buffer);
kIo.Wait(5000);
VII. Results
Data about the final project implementation. Includes screenshots, movies, comments about your project in action.
VIII. Download
After you have presented your project at the laboratory (week 13-14) you will add all your sources here. Any hardware simulation used, code archive and so on.
IX. Status
18.04
Am realizat schema in Eagle corespunzatoare circuitului nostru. Urmeaza ca zilele aceastea sa cumparam componentele necesare si sa realizam PCB-ul.
29.04
PCB-ul a fost corodat si ne pregatim ca in zilele urmatoare sa lipim componentele pe placa.
2.05
A fost terminata ultima varianta a placutei in care am implementat un divizor de tensiune care ne permite sa masuram tensiuni negative si pozitive. Am scapat si de firul tras pentru a nu mai avea nici o problema in privinta unui scurtcircuit.
X. Personal Contribution
- Stancu Flavius - Valentin
Realizarea procedurilor de citire,initializare si conversie a ADC-ului. Realizarea schemei electrice/traseelor/lipirii componentelor. Debugg mufa DB9.
- Petre Dorin
Realizarea schemei electrice/traseelor/lipirii componentelor. Realizare cod Z3. Cumparat componente.