Sari la conținut
ELFORUM - Forumul electronistilor

Voltmetru/Ampermetru cu PIC 16F877A


GeoMar

Postări Recomandate

Am realizat si eu un Voltmetru/Ampermetru cu PIC 16F877A [pentru definitivarea sursei reglabile dupa acest forum]:

Schema Voltmetru_Ampermetru cu PIC 16F877A.jpg[/attachment]

El are o tensiune de referinta de 3,5V,pe baza caruia masoara, cu pasi de 0,03 v, tensiunea si amperajul.

Am scris hexul fara probleme, merge, imi masoara, dar intampin o problema de afisare.

Daca, de exemplu masor o tensiune de 14,91 V cu el si cu un aparat de masura in paralel, cand comuta afisarea la o tensiune de 14,88 V sau la 14,94 V, tensiunea [digitii] afisati anterior, am impresia ca se sting prea incet cand imi afiseaza valoarea noua, se suprapun cele 2 valori si nu se mai distinge valoarea afisata, exact ca in poza:

Poza 2.jpg[/attachment]

 

Daca cineva care se pricepe la programare, poate sa arunce o privire pe soft si sa ma ajute, as fi recunoscator.

NU trebuie scris softul de la zero, doar eventual cateva modificari pentru eliminarea problemei de afisare.

Atasez si sursele folosite pentru creearea hexului:

[attachment=0]hex-source.rar[/attachment]

 

Multumesc anticipat. :da

Link spre comentariu

1. Problema iti apare la orice tranzitie cu 0,03V?

DA, aceasta problema apare la orice tranzitie de 0,03v. Mereu trebuie sa misc potentiometrul sursei sa indice corect, sa nu se mai "suprapuna" cifrele afisate.La orice modificare a cifrelor afisate, asa reactioneaza.
Link spre comentariu

1. Informatia de la procesor la afisaj este transmisa: de cate ori se modifica sau este transmisa la un interval de timp de exemplu la 20msecunde?

Sincer nu stiu, NU ma pricep la partea soft [programare], tocmai de aceea am apelat la ajutor si am postat si Hex-source. Poate altii care se pricep, arunca o privire si ma ajuta.Eu doar am scris hexul in PIC, modificat de altcineva ca sa apara la inceput : Sursa reglabila by GeoMar. :jytuiyuIn hex-source se gasesc fisierele din poza:[attachment=0]Fisiere in Hex-source.jpg[/attachment]
Link spre comentariu

1. Se pare ca acolo este greseala ca apare oscilatia respectiva. Din pacate ASM tau este generat si apare si adresa din ROM si codificarea ei. Mi-a luat o ora aproape pentru primele 100 de instructiuni ca sa sterg informatia in plus.

Link spre comentariu

1. Se pare ca acolo este greseala ca apare oscilatia respectiva. Din pacate ASM tau este generat si apare si adresa din ROM si codificarea ei. Mi-a luat o ora aproape pentru primele 100 de instructiuni ca sa sterg informatia in plus.

Unde acolo este greseala? :nas: Asa de greu este? :nebunrau: Daca stiam ca este asa de greu, ma lasam pagubas. :jytuiyu Credeam ca se poate rezolva mai usor, de cineva care se pricepe la soft/programare. :da
Link spre comentariu

Colegu' a fost putin neatent intrucat in arhiva este postat si fisierul sursa , scris in MicroC .Din pacate autorul nu a implementat si un algoritm de mediere a valorilor citite precum si o afisare corespunzatoare adica un delay de circa 100ms intre afisarea unor valori succesive .Se poate rezolva relativ usor insa cum nu posed/folosesc MicroC ...

Link spre comentariu

Nu este nevoie de nici un delay (nici nu e recomandat delay care sa tina procesoru in ciclu infinit ,decit delay bazat pe intreruperi) , ci o marire a rezolutiei ADC din soft si se va afisa frumos pe lcd fara sa se schimbe valorile aiurea.

Pun aici un cod cum am facut eu :

void get_volt(int pin,int lin,int col){                   // assign text to string//aci incepe marirea rezolutiei din soft de la 8 bit la 12 bit daca tin bine minte***************************   int i;                                          i=1;                                           while(i<=256){                             aux=aux+ADC_read(pin);// se fac 256 citiri adc valoarea se imparte la 16    i++;                               }    adc_rd = aux/16;                                     tlong = (long)adc_rd * 25000;           // covert adc reading to milivolts     tlong = tlong / 4095;                       // aci deja avem 12 bit ADC se face conversia // 0..4095 -> 0-25000mV    ch     = tlong /10000;//aci am terminat cu conversia si am valoarea tensiunii numa buna de pus pe lcd*******************    lcd_chr(lin,col,48+ch);    ch     = (tlong / 1000) %10;                 // extract volts digit    LCD_Chr_cp(48+ch);                     // write ASCII digit at 2nd row, 9th column    LCD_Chr_CP('.');    ch    = (tlong / 100) % 10;            // extract 0.1 volts digit    LCD_Chr_CP(48+ch);                     // write ASCII digit at cursor point    ch    = (tlong / 10) % 10;             // extract 0.01 volts digit    LCD_Chr_CP(48+ch);                     // write ASCII digit at cursor point    LCD_Chr_CP('V');   aux=0;    }
Rezulta o afisare corecta pe lcd fara sa o ia razna numerele , rezoluta ~0.01V

Cirnatu ala de conversii matematice se poate inlocuii cu functia din C "sprintf" si iese mai compact codul , insa papa mai mult rom si ram.

Link spre comentariu

Nu este nevoie de nici un delay (nici nu e recomandat delay care sa tina procesoru in ciclu infinit ,decit delay bazat pe intreruperi) , ci o marire a rezolutiei ADC din soft si se va afisa frumos pe lcd fara sa se schimbe valorile aiurea.Pun aici un cod cum am facut eu :....Rezulta o afisare corecta pe lcd fara sa o ia razna numerele , rezoluta ~0.01VCirnatu ala de conversii matematice se poate inlocuii cu functia din C "sprintf" si iese mai compact codul , insa papa mai mult rom si ram.

Ehe, daca ma pricepeam si eu ca tine :aplauze , nu mai apelam la forum sa ma jute cineva.Acum daca zici ca merge asa, imi poti da un hex facut dupa modificarea ta, ca sa-l scriu si sa-l testez pe "viu", adica in montajul real, sa vedem cum merge.
Link spre comentariu

Nu este nevoie de nici un delay (nici nu e recomandat delay care sa tina procesoru in ciclu infinit ,decit delay bazat pe intreruperi) , ci o marire a rezolutiei ADC din soft si se va afisa frumos pe lcd fara sa se schimbe valorile aiurea.Pun aici un cod cum am facut eu :....Rezulta o afisare corecta pe lcd fara sa o ia razna numerele , rezoluta ~0.01VCirnatu ala de conversii matematice se poate inlocuii cu functia din C "sprintf" si iese mai compact codul , insa papa mai mult rom si ram.

Ehe, daca ma pricepeam si eu ca tine :aplauze , nu mai apelam la forum sa ma jute cineva.Acum daca zici ca merge asa, imi poti da un hex facut dupa modificarea ta, ca sa-l scriu si sa-l testez pe "viu", adica in montajul real, sa vedem cum merge.
O sa incerc sa fac ceva in weekend (in timpul saptaminii lucrez si abia am timp liber) sau maine ... depinde cum pot compila programul ca mai mult da crash mikroc-ul in windows7. Dupa modificare ar trebuii sa varieze cu maxim 0.03 unitati si o rezolutie de 14 biti sau 12 depinde cum se face formula , ar mai trebuii sa stiu tensiunea maxima afisata pe lcd
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