Jump to content
ELFORUM - Forumul Electronistilor
Giuseppe Bagarella

Voltmetru cu PIC

Recommended Posts

Da, asa am facut, dar citirea aia pe care nu o iau in seama ce scop are ?

 

Am facut 20 de citiri la 1ms si s-a mai imbunatatit treaba. La 887 variaza de la 8.3V la 8.7V iar la 877A de la 8.6V la 8.7V. Treaba e ca eu vreau sa fac cu 887.

Totusi eu zic ca ADC-ul n-ar trebui sa joace chiar atat de mult fara oversampling. E ceva in neregula undeva...

Edited by Dudikoff

Share this post


Link to post
Share on other sites

Salut! Pentru eliminarea fluctuatiilor LSB iti recomand si eu o mediere a esantioanelor masurate, cum a mai postat cineva anterior. Iti atasez o rutina scrisa pentru un 16F676, in limbaj de asamblare. O folosesc in multe aplicatii pe mai multe tipuri de PIC, difera doar valoarea contorului, in functie de viteza de masurare. O explicatie simpla: esti intr-un lift la etajul 5. Daca masuratoarea curenta coincide cu cea anterioara, liftul urca un etaj. Daca difera, liftul coboara. Daca masuratorile coincid in mod repetat, urci cu liftul pana la ultimul etaj (10) si valoarea masurata este cea curenta (registrul ajunge la valoarea maxima), daca nu, in final cobori pana la zero si valoarea masurata este cea anterioara.

In afara de acestea, nu uita sa decuplezi alimentarea uC chiar langa capsula (100nF) si sa ai grija la buclele de masa.

Daca masori o tensiune si PIC-ul se alimenteaza chiar din acea tensiune (de ex. monitorizezi o baterie) cel mai bine este sa folosesti ca referinta VDD, nu externa. Daca-l folosesti ca aparat de masura independent, atunci o referinta de 2.5V cu TL431 este excelenta.

Spor.

 

masurare
movlw b'00001001' ;AN2, internal Vref, left justified & enables A/D
bank0
movwf ADCON0
bank1
movlw b'00110000' ;Fosc/16
movwf ADCON1
nop
bank0
bsf ADCON0,GO ;start A/D
wait1
nop
btfsc ADCON0,GO
goto wait1
bank0
movf ADRESH,0 ;trunchiere biti 0,1
movwf Vbat
;rutina pentru medierea valorii Vbat
xorwf Vbat_tmp,0
btfss z ;Vbat == Vbat_tmp?
goto next11 ;nu
movf contor_Vbat,0 ;da
xorlw .15
btfsc z ;contorul a atins valoarea maxima?
goto next13 ;da
incf contor_Vbat ;contor_Vbat < 15
movf Vbat_tmp,0
goto next12
next11
movf contor_Vbat,1
btfsc z ;contorul a atins valoarea minima?
goto next13 ;da, contor_Vbat == 0
decf contor_Vbat ;nu, contor_Vbat > 0
movf Vbat_tmp,0
goto next12
next13
movlw .15
movwf contor_Vbat ;contor_Vbat reinitializat
movf Vbat,0 ;refresh valoare masurata
movwf Vbat_tmp
next12
movwf Vbat_med
return

Share this post


Link to post
Share on other sites

 

 

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 ?

 

Cum sa nu ! procedura se numeste

delay_us( )

mai departe cred ca te descuri.

Share this post


Link to post
Share on other sites

Dupa cum e scris programul - achizitia in functia de afisare, tu nu faci nici un fel de medieri intre afisari, asa ca n-ai cum sa obtii rezultate stabile prin mediere. Asta pe de o parte.

procedure Voltm_Update;
begin
 ADC:=ADC_Sample;
 WordToStr(ADC,txt);

Pe de alta, ai 5 locuri in care "citesti" adc-ul si afisezi rezultatele. 5. Incearca sa le "comasezi" cumva.

  PORTC:=128;      // Busy
  Voltm_Update;
  for i:=1 to steps-1 do begin
   Delay_ms(100);
   Voltm_Update;
   v:=Vin+byte(floor((i*r)+0.5));
   if v>63 then v:=v+31;
   v:=v or 128;
   PORTC:=v;
   for j:=1 to 5 do begin
    Delay_ms(50);
    Voltm_Update;
   end;
   PORTC:=128;
  end;
  Delay_ms(100);
  Voltm_Update;
  if x>63 then x:=x+31;
  x:=x or 128;
  PORTC:=x;
   for j:=1 to 5 do begin
    Delay_ms(50);
    Voltm_Update;
   end;

Share this post


Link to post
Share on other sites

Nu cred ca are nici o treaba cu medierea. I-am facut si mediere si intradevar mai reduce ceva. Medierea se face cand iti variaza ultimul bit, dar mie imi variaza chiar si ultimi 5 biti ! Asta inseamna ca pic-ul vede fluctuatii de 80mV pe intrarea ADC-ului... ori nu are de unde sa fie asa fluctuatii pe bornele unei baterii. Eu banuiesc ceva bucle de masa...

Share this post


Link to post
Share on other sites

O schema completa a montajului ai?

Completa insemnand inclusiv condansatorii pe alimentari, referinte...

Share this post


Link to post
Share on other sites

Ai ceva consum din pinii PIC care variază în timpul măsurătorii ? În orice caz, masa de lângă portul A trebuie considerată ca masă analogică .

 

 

PS Nu am măsurat ieri nimic cu Zener-ul ăla . M-am întors de la dentist stors de orice chef ....

Edited by UDAR

Share this post


Link to post
Share on other sites

Daca folosesti ca tensiune de referinta tensiunea de alimentare de 5V, se comporta la fel?

Share this post


Link to post
Share on other sites

TL431 tot din sursa de 5V e alimentat.

 

Dudi, poti pune o sonda de osciloscop pe alimentarea de 5V?

Share this post


Link to post
Share on other sites

Incredibil ! Am descoperit problema ! E de la referinta ! Am setat pe referinta lui interna de 5V si nu mai imi oscileaza nici o cifra, si asta fara nici un fel de mediere !

 

De fapt am descoperit doar o parte a problemei. Acum mai trebuie sa aflam de ce nu-i place cu referinta mea cu TL431...

O sa va explic un pic mai tarziu cum am facut-o.

 

 

Edit: Da, TL431 tot din tensiunea de 5V a pic-ului se alimenteaza.

Edited by Dudikoff

Share this post


Link to post
Share on other sites

Poate să fie asta :

 

post-176515-0-93417200-1488554948_thumb.jpg

 

 

Eu de obicei pun automat 10µF Tantal și de aceea am cam uitat de problemă .

  • Like 1

Share this post


Link to post
Share on other sites

Adica e stabil si daca nu ii pun nimic si daca ii pun 10uF iar daca ii pun 100nF...1uF nu e ? :rade:

 

Eu tocmai 100nF i-am pus.... Abia astep sa incerc si cu 10uF.

Share this post


Link to post
Share on other sites

Am măsurat între timp două Zenere - chiar dacă s-a depășit momentul , poate e util .

 

Deci : D1 D2 Tina

3,0V 2µA 3µA 0

3,5V 11µA 15µA 0,5µA

4,0V 53µA 68µA 9µA

 

Ambele au sub 0,1µA la 1V deci respectă DS . Diodele sunt BZX55C5V1 procurate de la Comet în urmă cu ceva ani ( 2009) , producătorul nu îl ( mai ) știu .

 

Concluzia : Atenție ce și cum protejați cu diode Zener ( de tensiune mică )!

O soluție mai bună este de obicei cu diode normale spre masă și Vcc urmat de o rezistență spre intrarea integratului .

Edited by UDAR

Share this post


Link to post
Share on other sites

UDAR, esti genial (ca de obicei) !

Am pus 10uF pe iesire la referinta mea cu TL431 si acum merge perfect. Nu mai joaca nici o cifra, doar zecimala foarte putin din cand in cand.

M-ai salvat iar de un atac cerebral. Mersi !

 

P.S: Mda, nu cred ca mai pun zener. Am mai testat si eu cu un alt zener in simulator si distorsioneaza rau de tot. Lasa, ca daca e sa loveasca un fulger si sa-mi vina mai mult de 230V la priza... pic-ul e ultima mea grija.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×