Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


Postări Recomandate

Depinde ce hex ai folosit la acea schema, adica depinde daca hexul ala a fost chiar cel scris pentru simularea din acea imagine postata de tine sau daca nu cumva ai gresit tu ceva la editare...

 

Iata totul asa cum ai cerut, intai codul sursa:

/* Volt-Amper metru @nmihaic * Tensiune afisata 0-20Vcc * Curent afisat 0-5Acc * Microcontroller PIC16F876A * Oscilator Cristal 4Mhz * LCD 2x16 * Autor Marian@Elforum *///Conexiuni LCDsbit LCD_RS at RB1_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A;//Functie principalavoid main() {     INTCON = 0;     TRISA = 0x03;     Lcd_Init();     Lcd_Cmd(_LCD_CURSOR_OFF);     Lcd_Cmd(_LCD_CLEAR);     Lcd_Out(1,1,"VoltAmper-metru");     Lcd_Out(2,3,"***Mihai***");     Delay_ms(2000);     Lcd_Cmd(_LCD_CLEAR);     Lcd_Out(1,1,"Tensiune:");     Lcd_Out(2,1,"Curent:");     while (1) {         //Achizitie ADC         Tensiune = 0;         Curent = 0;         for (ADCx=0; ADCx<10; ADCx++) {         Tensiune += ADC_Read(0);         Curent += ADC_Read(1);         Delay_ms(50);         }         //Tensiune            Tensiune = Tensiune/ADCx;            V = (long)Tensiune*200;            V = V/1023;            ch = V/100;            if (ch==0) {                Lcd_Chr(1,10,32);                }            else {                Lcd_Chr(1,10,48+ch);                }            ch = (V/10) % 10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('.');            ch = (V/1) % 10;            Lcd_Chr_CP(48+ch);            LCD_Chr_CP('V');            Delay_ms(10);            //Curent            Curent = Curent/ADCx;            A = (long)Curent*500;            A = A/1023;            ch = A/100;            LCD_Chr(2,8,48+ch);            Lcd_Chr_CP('.');            ch = (A/10) % 10;            Lcd_Chr_CP(48+ch);            ch = (A/1) % 10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('A');            Delay_ms(10);      }}

Arhiva continand hex-ul pentru acest cod:

Volt-Ampermetru @nmihaic.rar

 

2 imagini cu simularea in proteus, prima ilustrand mesajul initial si ce-a de a 2-a afisajul asa cum arata in timpul functionarii ( click pe imagine pentru rezolutie full ):

Posted Image

Posted Image

 

Si in final arhiva care contine proiectul in proteus, dezarhivezi, deschizi programul apoi incarci in el proiectul din folder-ul dezarhivat, apoi dublu click pe microcontroller si la "hex" incarci pe cel din arhiva de mai sus, deci proiectul in proteus:

Proteus.rar

 

Bafta.

Link spre comentariu
Vizitator nmihaic

multumesc mult am reusit pana la urma sa il simulez :)

ce tes ruga daca ai putea introduce masurarea temperaturi si o linie de cod sa recunoasca apasarea unui buton  sa faca ceva switch intre 2 imagini(aia gasesc eu intre ce si ce) de ex sa afiseze tensiune si curent si dua switch sa afiseze temepratura si putere, si daca trece de 30 grade sa activeze o iesire a picului pentru a porni un ventilator :).

multumesc multt.

Link spre comentariu

ce tes ruga daca ai putea introduce masurarea temperaturi si o linie de cod sa recunoasca apasarea unui buton  sa faca ceva switch intre 2 imagini(aia gasesc eu intre ce si ce) de ex sa afiseze tensiune si curent si dua switch sa afiseze temepratura si putere, si daca trece de 30 grade sa activeze o iesire a picului pentru a porni un ventilator :).

multumesc multt.

Iarta-ma dar nu inteleg prea bine ce vrei sa zici...sa stii ca s-au inventat semnele de punctuatie :limb:  Scrie mai clar ce vrei sa obtii si vedem...

Link spre comentariu
Vizitator nmihaic

:)

is mai zapacit stiu :)

pai:

as vrea sa integrez un senzor de temperatura, daca ma poate ajuta cineva cu ceva lini de cod cum sa citesc de pe l(nu prea am experiexta cu ele) am inteles ca sunt unele pe i2c sau pe 1 wire, care e cel mai usor de folosit si cel mai usor de gasit?

dupa ce as integra un sezor de temperatura as scoate pe una din iesiri in momentul in care trece peste o anumita temperatura un 1 logic si cand scade sub alta temp sa treaca acea iesire pe 0 logic inapoi(pentru a integra un fan ceva)

as folosi acest voltmetru pentru o sursa de laborator .

o zi buna si multumesc.

Link spre comentariu

Cred ca te pot ajuta eu insa ideea este sa explici cat mai clar exact ce vrei. Acuma sa recapitulam:

 

-Afisare tensiune ( deja am facut-o );

-Afisare curent ( si pe asta am rezolvat-o );

-Afisare temperatura ( de adaugat ) si comutarea unei iesiri a microcontroller-ului in functie de temperatura citita;

-Afisare putere ( de adaugat );

 

4 functii de afisat in total, cred ca pot fi ingramadite pe display-ul ala, eventual mai putine cifre dupa virgula, poate doar una singura, ( sper ca intelegi ce vreau sa zic ). Acuma ce senzor de temperatura vrei sa folosesti mai exact? asta numai tu poti alege, si ce praguri preferi pentru comutarea acelei iesiri a uC, adica la ce temperatura vrei ca pe o iesire sa apara 1 logic?

Link spre comentariu
Vizitator nmihaic

pai temperatura nu e ceva fix in cod pot modifica si eu :) sa zicem la 40 grade sa porneasca colerul iar sub 30 sa il opreasca, ca senzor as folosi DS18B20 sau lm 35 sau alte idei :).

Link spre comentariu

Zic si eu: daca vrei doar un switch termic, nu merita sa pui un 1wire sau I2C (nu ca nu i-ar prinde bine lui Marian exercitiul  :limb:  de integrare in softul existent). Acel DS l-ai putea folosi la un proiect care ar cere ceva precizie si informatie mai exacta.

 

As folosi un NTC/PTC caruia ii cunosti curba de variatie si as face un divizor rezistiv, unde PIC citeste tensiunea divizata. Nu va fi foarte precis, dar va fi foarte ieftin. Rezistenta fixa din divizor o inlocuiesti cu un semipotentiometru (o singura tura) ca sa faci si reglaj hardware, compensand astfel toleranta resistentei fixe (5-10%).

 

Acuma, va las pe voi sa va hotarati. Spor la munca!

Editat de thunderer
Link spre comentariu

Pai am inteles ca se doreste si un afisaj al temperaturii citite si in atare situatie precizia este destul de deficitara... personal in lipsa de senzor la sursa mea am folosit un simplu BD139 in conexiune dioda ( baza si colector unite ) ca si senzor de temperatura, l-am intercalat intr-un generator de curent constant si caderea de tensiune de pe jonctiunea BE a BD-ului comanda un amplificator inversor, suna poate complicat dar nu este de fapt... sugestia mi-a fost facuta de catre Smilex si am fost ( si inca sunt ) surprins de precizia sa.

 

Revenind la ce s-a propus, LM35 are o variatie de 10mV per grad celsius, la o variatie de 100*C, iesirea variaza deci cu 1V, asta face necesara prezenta unui AO intre iesirea sa si intrarea uC, care in functie de variatia senzorului si gama de interes, sa varieze tensiunea intre 0-5V, configuratia ar fi destul de simpla avand in vedere simplitatea folosirii senzorului, daca se va decide ca se accepta ideea atunci pot veni si cu o schema ilustrativa si ulterior cu codul adaptat... dar asta maine sper eu ( sau de fapt azi mai corect spus... ).

Link spre comentariu
Vizitator nmihaic

Da voi folosi un LM35 am si comandat unu e foarte simplu de folosit :)

am o mica intrebare(de noob stiu) de ce la amplificarea teniuni de pe shunt ai folosit 2 AO si nu unu?

Multumesc ff mult pentru ideii si timpul acordat.

Link spre comentariu

Mi-as dori sa fii mai prompt in raspunsurile tale... adica sa lasi raspuns mai repede dupa ce postez eu, nu de alta dar uneori trec zile pana primesc un raspuns, astfel incat proiectul tau avanseaza greu, ca pana nu primesc feedback de la tine nu pot continua...

 

Acestea fiind zise, la care schema te referi cand spui ca am folosit 2 AO pentru amplificarea tensiunii de pe shunt?

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări