Sari la conținut
ELFORUM - Forumul electronistilor

Voltmetru cu PIC


Postări Recomandate

Microchip recomandă referința peste 2,5V ( sau peste 2V , ceva pe-acolo ) . Zgomotele nu au prea mare efect ( uneori chiar dimpotrivă ) dar , deși nu este clar specificat , îmi pare că și liniaritatea scade la scăderea referinței .

 

Vorbesc , desigur , de PIC-uri uzuale , 16F / 12F .

 

 

EDIT A postat Dudi între timp . Păi dacă vrei să măsori 100V pe scara 0 - 99.9V nu ar trebui să ai mari dificultăți .

Cu referința aleasă de tine ( 4.096 nu 4.092 ! ) obții codul de 1000 ( zecimal ) pentru 100V la intrare ( cu divizorul discutat ) .

Nu trebuie să faci artificii software . Dacă vrei să lupți cu un eventual zgomot de 50 Hz poți să faci o mediere a mai multor măsurători . De exemplu 16 măsurători la 1.25ms între ele .

Editat de UDAR
Link spre comentariu

Radu, sunt multe PIC-uri cu FVR de 1.024 si 2.048V. Eu lucrez cu familia 18F K. Dar cum mereu masor 30 sau 40V, nu am incercat inca referinta de 1V. Referitor la liniaritate, solutiile ieftine (ADC incorporat sau extern la 1-2$ bucata) nu ofera prea mult.

 

In ultima vreme am preferat un ADC pe SPI ca sa il pot pozitiona mai aproape de punctul de masura.

 

Totusi, medierea sau oversamplingul ofera ceea ce un super ADC extern face cu un layout de amator.

Link spre comentariu

Radu, sunt multe PIC-uri cu FVR de 1.024 si 2.048V. Eu lucrez cu familia 18F K.

 

Ai dreptate , dar nu scrie niciunde că tensiunea aia e musai pentru referința ADC . Eu am lucrat doar cu PIC16 ( nu foarte mult nici cu astea ) dar și la PIC18F2xK20/4xK20 ( de exemplu ) scrie că referința trebuie să fie mai mare de 2V pentru a obține 10biți rezoluție .

În fine , nu vreau să insist.

Link spre comentariu

pai , precizia si cu rezolutia merg ''mana-n mana'' . adica depind una de alta.. sunt si cele mai importante. apoi imunitatea la zgomot e si ea importanta..

eu sunt de parere ca niste condensatori de 100nF pe intrarile ADC-urilor sau pe intrarea ADC ului ar taia spike-urile care pana la urma sunt cele care afecteaza.

Link spre comentariu

S-a ales praful ! L-am facut si nu merge... cum trebuie. Imi joaca cifrele foarte mult.

 

Schema pentru referinta si divizor este asa :

 

screenshot01.png

 

 

Prima data am facut cu PIC16F887, caci cu asta trebuie sa fac. Si rezultatul e asa :

 

https://vimeo.com/206452807

 

Apoi am zis sa incerc si cu PIC16F877A, si se pare ca merge mai bine dar tot joaca...

 

https://vimeo.com/206452575

 

Atentie ! testele au fost facute cu o baterie de 9V pe intrare, deci se exclude ca ar avea riplu tensiunea de intrare.

 

Cu intrarea in aer, la 877A imi arata 0V fix, iar cu 887 imi sare si la 1-2V din cand in cand... :(

Editat de Dudikoff
Link spre comentariu

Bucla principala este prea rapida. Pune un delay de 100 .. 200 ms undeva la final, inainte de acolada de inchidere.

Sau corect, folosesti un timer si faci afisarea la fiecare 100 ... 200ms.

 

LE: Acum am vazut si filmele. Daca masori tensiunea cu un voltmetru, fluctueaza tot asa? Baterie de 9V, uff. OK. Posteaza codul.

LLE: Oricum eu dupa PIC_AN0 as pune un opamp in conf voltage repeater cu un offset mic.

LLLE: Masoara si tensiunea PIC_Vref+ cu un voltmetru. Este stabila?

Editat de mars01
Link spre comentariu

Incearca sa faci V1 dintr-o baterie cu un regulator (gen 7805, LM1117 etc).

 

LE: Sunt destul de obosit dar:

 

In functia ta ADC_Init ai

 ADCON1:=%10010000;            // Right justified, External Reference

Daca vrei sa ai pe AN3 referinta externa Vref+ ar trebui sa arate asa:

 ADCON1:=%10010001;            // Right justified, External Reference

Aceasta se vede in pagina 128 din datasheet.

Editat de mars01
Link spre comentariu

Ce am pus eu e softul pentru PIC16F887 si e bine cum am facut. Tu te-ai uitat in datasheet-ul pentru 16F877A.

 

As vrea sa fac cum a zis UDAR, 16 citriri la 1.25ms... dar nu am functie pentru delay cu virgula. As putea sa fac 20 de citiri la 1ms, sau e musai 16 la 1.25 ?

Link spre comentariu

Ai spus ca ai folosit si 877A ...

 

10 citiri la 1ms ar trebui sa fie suficiente.

Dar inainte de aceste 10 citiri, fa o citire pe care nu o iei in seama.

 

Ceva de genul (in C):

unsigned int i, rezultat;

rezultat = ADC_read();
rezultat = 0;

for (i = 0; i < 10; i++){
  rezultat = rezultat + ADC_read();
}
rezultat = rezultat / 10;
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