Sari la conținut
ELFORUM - Forumul electronistilor

Voltmetru/Ampermetru cu PIC 16F877A


GeoMar

Postări Recomandate

Tensiunea maxima este de 35 V si 3,5 A, asa cum arata la pornire el, in poze, neconectat la sursa reglabila.[attachment=0]Imagine0763-b.jpg[/attachment]Adevarat ca MicroC nu vrea sa mearga pe Win7, am incercat si eu, am tot Win7.Daca nu se poate mai devreme, e bine si in weekend, mai bine mai tarziu decat niciodata.

Link spre comentariu

Aveti nevoie si de usart ?

NU, nu am nevoie, nu am realizat si partea de conectare la PC [parca asta face USART].Nu le am cu programarile de PIC-uri ca sa cunosc termenii necesari.Cred ca se poate modifica mai rapid fara, parerea mea. Se poate elimina partea aceea din soft.Sa mearga sa afisez tensiunea/amperajul sursei pe el, nu pe PC.
Link spre comentariu

1. Din pacate softul original este asa cu delay. Si tot din pacate GeoMar a folosit fisierul hexa care l-a avut. Daca il poti rezolva ar fi foarte bine. Se pare ca are un delay de 50 us.

unde e delay-ul ala ? eu cred ca softul initial functiona perfect singura problema fiind modificarea clock-ului de la 14... la 11 Mhz fara alte modificari in cod :da
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) ,

Poti sa postezi un exemplu de "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++;                               }
,

 

Pe de o parte, cu i= 0 si while(i<255) puteai face i "numai" char. Economiseai memorie.

Pe de alta parte, ce oscilator folosesti? Cam ce rata de esantionare iti rezulta?

 

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;
,

Ce tip are adc_rd? Ca daca nu e double, ai deja prima "aproximare" in cod.

Mai ai unala impartirea tlong/4095 si inca una la tlong/10000.

Asa ca ma intreb cat de reala e rezolutia aia de 0.01V

Link spre comentariu

Nici n-am zis de overflow, ci de trunchiere. Atunci cand rezultatul e salvat in orice nu e double, compilatoarele "arunca" tot ce e dupa virgula (pastreaza doar partea intreaga). Si asta fara sa rotunjeasca (trunchiaza). Asa ca, de exemplu, daca teoretic rezultatul unei impartiri e 4.99, cand il salvezi in char/int/long... ramai cu 4.

Link spre comentariu

@GeoMar: m-am uitat putin prin Multimeter.c si am vazut ca ai facut ceva modificari prin cod (ti-ai scris numele). Sa inteleg ca poti compila fisierul respectiv?

Daca da, la sfarsitul fisierului e un Delay_ms(50) comentat. Tu l-ai comentat?

Si daca da, si daca nu, poti incerca sa-l reactivezi, sa recompilezi si sa vezi daca e mai bine.

Daca o sa fie mai bine dar nu suficient, poti incerca sa maresti numarul din paranteze (nu as trece de 255, totusi, in cazul in care functia accepta parametru de tip char).

 

Rectivarea insemana ca daca acum arata asa

//Delay_ms(50);                        // Waits 50ms
dupa va arata

Delay_ms(50);                        // Waits 50ms
Link spre comentariu

NU am modificat in afara de nume si scrisul "Sursa reglabila" in loc de multimeter, care se afla separat in fisierul Ar2r.In rest nu am modificat la delay nimic, nu am comentat nimic.Am modificat, pana sa compilez sa obtin hexul, frecventa quartzului folosit, adica 11,059200 in loc de 14,31818 cum era in schema.Ar influenta asta cu ceva?

Link spre comentariu

Nu stiu, da' cum ziceam si mai sus, incearca sa te joci cu Delay_ms(50); de la sfarsitul fisierului, sa vezi daca ajuta.

OK. Am sa incerc si varianta ta, sa vad ce randament are.Poate asa deprind si eu ceva din "arta" programarii, :ras: cu toate ca nu cred ca se mai "lipeste" de mine la varsta mea. :rade:Mersi oricum, am sa postez rezultatele obtinute. :daP.S.Cred ca pana la urma putem renunta la afisarea ultimului digit de la V,A,W si Ohmi, daca se poate si scapam de problema.NU cred ca este nevoie de precizie de 0,01V. :nas:0,1V ar fi destul de suficient.
Link spre comentariu

Poti sa-mi dai pinningul de la display? Am intalat mikroC, da' se pare ca au facut ceva modificari prin functii si trebuie sa definesc pinii pentru lcd:

Modelul este GDM1602K rev2,1, asa scrie pe el.Pinii sunt pe schema.Uite datasheet-ul[attachment=0]GDM1602K-Extended.pdf[/attachment]
Link spre comentariu

Ca sa micsorezi rezolutia, comenteaza linia 74:

//          LCD_Chr_CP(48+ch);               // write ASCII digit at cursor point

Am reusit sa recompilez codul. Mai vedem maine daca mai ai nevoie (da' nu vad de ce nu te-ai descurca singur).

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