Jump to content


Photo

Volt-Ampermetru + FAN cu Atmega8


  • Please log in to reply
69 replies to this topic

#1 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 14 November 2013 - 10:25 PM

Salutare. M-am apucat sa imi construiesc o sursa de tensiune 0-30V / 0-10A pe care vreau sa o dotez cu un Volt-Ampermetru cu Atmega 8 care sa afiseze tensiunea si curentul pe un LCD 2x16. Pe langa afisarea tensiunii si curentului m-am gandit sa conectez si un ventilator si un NTC.
Pentru comanda ventilatorului m-am gandit sa citesc valoarea NTC-ului, iar spre ventilator sa generez impulsuri PWM la o anumita frecventa, din factorul de umplere sa stabilesc turatia ventilatorului care o aproximez prin teste.

Pentru inceput am conceput schema din atasament.
JP1 - este conectorul prin care voi citi tensiunea, respectiv curentul.
Pinul 1 - Citirea de tensiune
Pinul 2 - Citirea de curent ( cu shunt pe bara negativa -> la ADC ajunge tensiune negativa fata de GND )
Pinul 3 - GND
JP2 - Se conecteaza NTC 10K
JP3 - Se conecteaza un ventilator
JP4 - Conector pentru programare.


Ce parere aveti despre schema si ce imbunatatiri i-as putea aduce? Daca credeti ca partea hardware este bine conceputa, m-as apuca de PCB si pe urma voi continua cu intrebarile legate de parte de program.

Attached Files



Cu_reclama

Cu_reclama
  • Membri

#2 OFFLINE   dodo007

dodo007

    Nou venit

  • Membri
  • Pip
  • 74 posts

Posted 15 November 2013 - 03:23 PM

Salut,
Am construit si eu o sursa asemanatoare cu cea conceputa de tine (dar la 3A), si functioneaza foarte bine. Este cea modificata , cablajul conceput de Geomar, de la pagina:
viewtopic.php?f=14&t=22142&hilit=sursa+de+tensiune+digitala+atmega8&start=1605
Ca volt-ampermetru am utilizat montajul de mai jos, care functioneaza multumitor:
viewtopic.php?f=14&t=97842
Acelasi montaj de volt ampermetru l-am utilizat si la o sursa de 30V si 10A obtinuta din sursa ATX modificata. Am utilizat atmega TQFP pentru un cablaj cit mai mic si la marimea afisajului. Precizia nu este nemaipomenita, dar pentru mine este suficienta.
Attached File  DSCF5381aaa.JPG   225.26KB   504 downloadsAttached File  DSCF5386aaa.JPG   131.25KB   504 downloads
Bafta.

#3 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 15 November 2013 - 07:37 PM

Apropo, poate exprimarea mea nu a fost cea mai clara in primul post, insa partea de stabilizator este cea de pe site-ul http://www.electroni...ects/power/001/ , doar partea de VA-metru este "conceputa" de mine.

#4 OFFLINE   Depanatoru

Depanatoru

    Membru evoluat

  • Membri
  • PipPipPipPipPip
  • 2,983 posts
  • Locatie:Tirgu-Mures

Posted 15 November 2013 - 08:42 PM

ADC-ul nu poate masura tensiuni negative ... nu stiu cum te-ai gandit dar masa ADC-ului se conecteaza pe partea suntului ce duce la minusul condensatorului de filtraj iar intrarea de curent la borna de iesire minus a sursei . Asta e varianta simpla folosita in majoritatea schemelor de pe net cu dezavantajul ca pe tensiune ADC-ul va masura tensiunea reala de iesire - tensiunea pe sunt si trebuie corectii in soft pentru precizie tinand cont ca tensiunea pe sunt ajunge la circa 1V ( sensibilitatea ADC-ului ) pentru curentul maxim ...
O solutie simpla , eleganta si mai precisa presupune inversarea conexiunii de mai sus si folosirea unui AO ca inversor pentru curent , care eventual sa si amplifice , ca sa nu trebuiasca sunt de putere mare care pierde din precizie atunci cand se incalzeste

#5 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 16 November 2013 - 10:35 PM

Am modificat schema si am adaugat un AO pe care l-am folosit pe post de inversor, si amplificare 4,7 (am pus valori uzuale), iar corectia o sa o fac din soft. M-am gandit ca la 20A(ceea ce nu va fi cazu) => 1V cadere de tensiune pe SHUNT (0.05ohm/18W), o sa am la iesirea AO-ului 4,7V.

Pareri ?

Attached Files



#6 OFFLINE   Depanatoru

Depanatoru

    Membru evoluat

  • Membri
  • PipPipPipPipPip
  • 2,983 posts
  • Locatie:Tirgu-Mures

Posted 17 November 2013 - 12:20 AM

Foloseste referinta interna de 1V pentru ADC , mult mai stabila decat tensiunea de alimentare

Chiar pe intrarile ADC-ului ti-ar trebui niste condensatori 10nF - 100nF care taie zgomotul si alte perturbatii care ar putea sa faca sa fie instabila indicatia

Suntul stabileste si curentul maxim de protectie la scurt pentru sursa , 20A inseamna 600W disipati pe tranzistori ... trebuie facut exact de cat ai nevoie
Oricum iti recomand sa faci intai sursa si sa o testezi , dupa aia sa faci partea de masura

#7 OFFLINE   dodo007

dodo007

    Nou venit

  • Membri
  • Pip
  • 74 posts

Posted 17 November 2013 - 12:35 PM

Departe de mine de a fi lipsit de respect pentru efortul Dv. Imi cer scuze daca am fost inteles gresit. Insa mentionarea sursei de inspiratie este utila si necesara din multe puncte de vedere.
Printre altele, in discutiile din topicele mentionate de mine, se mentioneaza pe linga modificari in marirea preciziei de masura a curentului, mentionate de colegul Depanatoru si ideea de a marii precizia la masurarea tensiunii, prin impartirea intervalului de masura in doua 0-10 si 10-30V, trecerea de pe un divizor pe altul (doua intrari ADC), fiind facuta din soft (nu cred ca va complica prea mult introducerea unei bucle in plus in program si nici faptul ca folositi doua divizoare).
A se vedea si :
http://www.elfly.pl/...metr_en_DIP.htm
http://dfi57.blogspo... ... ta-cu.html
Spor la treaba.

#8 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 908 posts
  • Locatie:Bucuresti / Pitesti

Posted 17 November 2013 - 03:17 PM

In datasheet scrie ca impedanta maxima pe intrarea ADC a unui atmega8 este de cca 10Ko pt a avea un timp de achizitie corect. Cu cat impedanta de intrare este mai mica cu atat ADC-ul face conversiile mai rapid (se incarca cond-ul mai repede), dezavantajul este ca este consumat mai mult curent si acest lucru poate avea un impact pentru aplicatiile alimentate din baterii. Ceea ce nu este cazul aici.

Eu as reduce putin rezistenta de 10Ko pe care ai pus-o intre opamp si intrarea adc (pin24 parca).
Nu zic ca nu merge si asa, dar ca sa fii de partea sigura a gardului ...

#9 OFFLINE   Depanatoru

Depanatoru

    Membru evoluat

  • Membri
  • PipPipPipPipPip
  • 2,983 posts
  • Locatie:Tirgu-Mures

Posted 17 November 2013 - 03:40 PM

La tensiune continua nu conteaza prea mult impedanta sursei cum e descris in datasheet , pentru ca tensiunea variaza foarte lent ( numai cand umbli la reglaj ) si nu trebuie sa fie rapid ADC-ul , cand faci achizitii in alternativ sau impulsuri conteaza .

#10 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 908 posts
  • Locatie:Bucuresti / Pitesti

Posted 17 November 2013 - 03:54 PM

Asa este, am mentionat aceste informatii doar pt. ca am vazut rezistenta dimensionata exact la limita de sus. Am considerat ca este o informatie utila.

#11 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 18 November 2013 - 11:45 PM

Deja am facut cablajul pentru varianta de mai sus, cu un singur divizor pentru masurarea tensiunii, iar daca la final nu sunt multumit de masuratori, atunci voi reface dupa cum ati sugerat mai sus. Oricum putin exercitiu in plus nu strica.
Referitor la valoarea de 10kohm dintre AO si uC , voi vedea cum se comporta dupa ce va functiona, daca va fi prea lent, am sa pun o valoare mai mica, probabil ca voi scadea valorile si in divizorul pentru tensiune ca sa mai cresc curentul daca e cazul.

Am atasat si cateva poze cu cablajul, intr-un singur loc nu mi-a iesit chiar bine, la pinii 6 si 7 a mai trebuit sa corectez.

Pentru partea de alimentator propriu-zis mai am de asteptat dupa componente.

Attached Files



#12 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 28 November 2013 - 12:16 AM

Salutare.
Deocamdata am terminat partea de afisare , pentru alimentatorul propriu-zis inca nu am primit componentele, asa ca deocamdata ma joc cu volt-amper-metru, insa am nevoie de ajutor pentru scrierea codului.

Codul este scris in BASCOM, si nu reusesc sa afisez valoarea corecta pe LCD. Va rog sa ma ajutati unde am gresit. Deasemenea sa imi spuneti si cum intervine in calcul valoarea de referinta ? Pe pinul AREF am masurat 2,58V.
Singura mentiune pe care o am este faptul ca valorile din divizor le-am modificat de la 22k -> 10k, si 3.3k -> 1.5k (fata de schema initiala). De valorile noi am tinut cont si in cod.

Codul arata cam asa:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32



Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0

Dim A As Byte
Config Lcd = 16x2

Cls
Locate 1 , 3
Lcd "Power Supply"
Lowerline
Locate 2 , 2
Lcd "0-30V / 0-10A"
Wait 1

Cls
Cursor Off Noblink

Dim Volt As Word
Dim Curent As Word
Dim Th As Word
Dim Tensiune As Single
Dim Voltt As Single
Const Divizor_u = 0.12891986
Const Const_volt = 3.8675958188 / 1024
Const Const_th = 1

Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc

Do

Volt = Getadc(0)
Curent = Getadc(1)
th = Getadc(2)
Wait 1

Tensiune = Volt * Const_volt
Tensiune = Tensiune / Divizor_u

Locate 1 , 1
Lcd "U="

Locate 1 , 3
Lcd Fusing(tensiune , "##.##") ; "V"

Voltt = Volt * Const_th
Locate 2 , 2
Lcd Fusing(voltt , "##.#")


Loop
End

Si acum informatiile suplimentare:

Tensiunea la intrarea in divizor este de 7,47V
Tensiunea la intrarea in ADC(0) este 0.96V => din calcule divizorul este OK.
Pe LCD imi afiseaza 11.19V (aceasta valoare nu ramane stabila...oscileaza)
Iar pe al doilea rand imi afiseaza valoarea returnata de ADC, si anume 382 (la fel si aceasta valoare oscileaza....~375-385)

Mentionez ca acesta urmeaza sa fie primul meu program scris in BASCOM, asa ca va rog... rabdare... :bataie

Attached Files



#13 OFFLINE   binox

binox

    Membru

  • Membri
  • PipPip
  • 121 posts

Posted 28 November 2013 - 03:00 PM

Nu ma pricep la bascom dar in principiu ar trebui sa faci cam asa:
- sa setezi tensiunea de referinta a adc-ului , pt care ai mai multe optiuni: referinta interna, tensiunea de alimentare de pe AVCC sau o alta tensiune externa aplicata pe AREF
- ca sa calculezi tensiunea de intrare pe ADC poti aplica regula de 3 simpla:
1024........Vref
ADC.........Vin => Vin= (ADC*Vref)/1024
-ca sa afisezi tensiunea pe care ai aplicat-o divizorului, tensiunea care te intereseaza defapt mai inmultesti Vin cu cat ai tu divizorul
-ca sa nu-ti fluctueze rapid valorile pe ecran poti afisa media ultimelor x citiri, sau pur si simplu poti reduce rata de refresh a ecranului pt ca cifrele care se schimba rapid pe ecran sunt obositoare si enervante
-ca sa obtii rezultate cat mai exacte trebuie sa te asiguri ca Vref introdus in calcul este corect, daca folosesti referinta interna ar fi bine sa o masori pt ca nu e intotdeauna fix cat zice producatorul, iar masurarea trebuie facuta cu un voltmetru cu impedanta mare de intrare; la fel si in cazul in care folosesti pe post de referinta tensiunea de alimentare; acelasi lucru e valabil si pt divizorul rezistiv, mai ales daca nu folosesti rezistente de precizie
-nu uita sa folosesti condensatori de 100nf pe pinii de alimentare, pe AVCC si pe AREF, cat mai aproape de mc

#14 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 28 November 2013 - 10:07 PM

Multumesc pentru raspuns. Acum functioneaza corect, si am si inteles exact cum se calculeaza.
Codul este urmatorul pentru citirea de tensiune.
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32



Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0

Dim A As Byte
Config Lcd = 16x2

Cls
Locate 1 , 3
Lcd "Power Supply"
Lowerline
Locate 2 , 2
Lcd "0-30V / 0-10A"
Wait 1

Cls
Cursor Off Noblink

Dim Volt As Word
Dim Curent As Word
Dim Th As Word
Dim Tensiune As Single
Dim Voltt As Single
Const Divizor_u = 0.12891986
Const Const_volt = 2.59 / 1024


Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56

Start Adc

Do

Volt = Getadc(0)
Curent = Getadc(1)
Th = Getadc(2)
Waitms 500

Tensiune = Volt * Const_volt
Tensiune = Tensiune / Divizor_u

Locate 1 , 1
Lcd "U="

Locate 1 , 3
Lcd Fusing(tensiune , "##.##") ; "V"

Loop
End

Mai trebuie sa redimensionez divizorul pentru ca in situatia de fata nu pot masura mai mult de 20.07V.

Cum pot face sa afisez media ultimelor 10 citiri de exemplu? Refresh-ul ma gandesc ca trebuie scazut atunci la 100ms...

Cu_reclama

Cu_reclama
  • Membri

#15 OFFLINE   Depanatoru

Depanatoru

    Membru evoluat

  • Membri
  • PipPipPipPipPip
  • 2,983 posts
  • Locatie:Tirgu-Mures

Posted 29 November 2013 - 03:00 AM


Do

Suma = 0

For I = 1 To 10                                      

Volt = Getadc(0)

Suma = Suma + Volt

Next

Tensiune = Suma / 10

Tensiune = Volt * Const_volt

Tensiune = Tensiune / Divizor_u

...

Lcd Fusing(tensiune , "##.##") ; "V"

...

Suma = 0 

For I = 1 To 10

Curent = Getadc(1)

Suma = Suma + Curent

...



Cam asa se poate face , deci cate o bucla For care se executa de 10 ori pentru fiecare marime masurata , Suma poate fi o variabila comuna pentru toate marimile masurate din economie , daca o resetezi la zero cand treci de la una la alta




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users