Jump to content
ELFORUM - Forumul electronistilor

Volt-Ampermetru + FAN cu Atmega8


dragutzu_marius
 Share

Recommended Posts

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 - GNDJP2 - Se conecteaza NTC 10KJP3 - Se conecteaza un ventilatorJP4 - 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.

post-18358-13982970874_thumb.png

post-18358-139829708747_thumb.png

Link to comment
Share on other sites

  • Replies 79
  • Created
  • Last Reply

Top Posters In This Topic

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.

post-16627-139829709305_thumb.jpgpost-16627-13982970932_thumb.jpg

Bafta.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Foloseste referinta interna de 1V pentru ADC , mult mai stabila decat tensiunea de alimentareChiar 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 indicatiaSuntul stabileste si curentul maxim de protectie la scurt pentru sursa , 20A inseamna 600W disipati pe tranzistori ... trebuie facut exact de cat ai nevoieOricum iti recomand sa faci intai sursa si sa o testezi , dupa aia sa faci partea de masura

Link to comment
Share on other sites

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/multimetr/multimetr_en_DIP.htm

http://dfi57.blogspot.ro/2011/11/voltam ... ta-cu.html

Spor la treaba.

Link to comment
Share on other sites

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 ...

Link to comment
Share on other sites

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.

post-18358-139829710909_thumb.jpg

post-18358-139829710926_thumb.jpg

post-18358-139829710943_thumb.jpg

Link to comment
Share on other sites

  • 2 weeks later...

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 = 32Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0Dim A As ByteConfig Lcd = 16x2ClsLocate 1 , 3Lcd "Power Supply"LowerlineLocate 2 , 2Lcd "0-30V / 0-10A"Wait 1ClsCursor Off NoblinkDim Volt As WordDim Curent As WordDim Th As WordDim Tensiune As SingleDim Voltt As SingleConst Divizor_u = 0.12891986Const Const_volt = 3.8675958188 / 1024Const Const_th = 1Config Adc = Single , Prescaler = Auto , Reference = InternalStart AdcDoVolt = Getadc(0)Curent = Getadc(1)th = Getadc(2)Wait 1Tensiune = Volt * Const_voltTensiune = Tensiune / Divizor_uLocate 1 , 1Lcd "U="Locate 1 , 3Lcd Fusing(tensiune , "##.##") ; "V"Voltt = Volt * Const_thLocate 2 , 2Lcd Fusing(voltt , "##.#")LoopEnd

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

post-18358-139829715668_thumb.png

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 = 32Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0Dim A As ByteConfig Lcd = 16x2ClsLocate 1 , 3Lcd "Power Supply"LowerlineLocate 2 , 2Lcd "0-30V / 0-10A"Wait 1ClsCursor Off NoblinkDim Volt As WordDim Curent As WordDim Th As WordDim Tensiune As SingleDim Voltt As SingleConst Divizor_u = 0.12891986Const Const_volt = 2.59 / 1024Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56Start AdcDoVolt = Getadc(0)Curent = Getadc(1)Th = Getadc(2)Waitms 500Tensiune = Volt * Const_voltTensiune = Tensiune / Divizor_uLocate 1 , 1Lcd "U="Locate 1 , 3Lcd Fusing(tensiune , "##.##") ; "V"LoopEnd

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...

Link to comment
Share on other sites

DoSuma = 0For I = 1 To 10                                      Volt = Getadc(0)Suma = Suma + VoltNextTensiune = Suma / 10Tensiune = Volt * Const_voltTensiune = Tensiune / Divizor_u...Lcd Fusing(tensiune , "##.##") ; "V"...Suma = 0 For I = 1 To 10Curent = 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
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines