Sari la conținut
ELFORUM - Forumul electronistilor

Volt-Ampermetru + FAN cu Atmega8


dragutzu_marius

Postări Recomandate

Daca tensiunea masurata este ok atunci referinta este buna. Schema folosita are niste neajunsuri ... lm358 (IC3A) NU ESTE potrivit pentru acesta aplicatie ( probabil de aici si masuratoarea eronata din proteus) ar trebui folosit un chopper opamp sau auto zero opamp . Rezistentele R14 si R13 stabilesc amplificarea lui Ic3a. Acestea ar trebui sa aiba o valoarea cat mai precisa ( sortate sau puse direct cu toleranta mica). Shuntul .. ce toleranta are ?

Am intrebat de multimetru pentru ca eroare de 20 mA poate fi si de la el ( dar mai putin probabil ).

Singura varianta de calibrare fara batai de cap trebuie facuta soft. Si din pacate la aceasta schema fiecare replica trebuie calibrata individual. 

Editat de djvas
Link spre comentariu
  • Răspunsuri 79
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • peace

    14

  • Depanatoru

    11

  • dragutzu_marius

    10

  • Liviu M

    8

Top autori în acest subiect

Imagini postate

Pentru sunt de 0.1 am pus valoare 0.1  in program  iar pentru tensiunea maxima 21,2V am pus 0.102 si rezistente 11k si 1k5 spre masa iar valoarea constanta pentru curent si tensiune a ramas 2.59 ! Probat in proteus si practic functioneaza perfect , am eliminat amplificatorul operational fiindca nu misca nimic , e pus degeaba in montaj ! Poate daca se aleg alte valori la divizor va functiona si cu amplificatorul operational !

Link spre comentariu
  • 3 săptămâni mai târziu...
  • 8 luni mai târziu...

Am atasat mai jos o arhiva, cu  tot proiectul  plus un pcb facut de mine dar netestat inca. Tot Proiectul a fost descarcat de AICI

 

 

<script data-pagespeed-no-defer type="text/javascript">(function(){var g=this;function h(b,d){var a=b.split("."),c=g;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)a.length||void 0===d?c[e]?c=c[e]:c=c[e]={}:c[e]=d};function l(b){var d=b.length;if(0=d.offsetWidth&&0>=d.offsetHeight)a=!1;else{c=d.getBoundingClientRect();var f=document.body;a=c.top+("pageYOffset"in window?window.pageYOffset:(document.documentElement||f.parentNode||f).scrollTop);c=c.left+("pageXOffset"in window?window.pageXOffset:(document.documentElement||f.parentNode||f).scrollLeft);f=a.toString()+","+c;b.b.hasOwnProperty(f)?a=!1:(b.b[f]=!0,a=a<=b.g.height&&c<=b.g.width)}a&&(b.a.push(e),b.c[e]=!0)}p.prototype.checkImageForCriticality=function(b){b.getBoundingClientRect&&q(this,b)};h("pagespeed.CriticalImages.checkImageForCriticality",function(b){n.checkImageForCriticality(b)});h("pagespeed.CriticalImages.checkCriticalImages",function(){r(n)});function r(b){b.b={};for(var d=["IMG","INPUT"],a=[],c=0;c=a.length+e.length&&(a+=e)}b.i&&(e="&rd="+encodeURIComponent(JSON.stringify(t())),131072>=a.length+e.length&&(a+=e),d=!0);u=a;if(d){c=b.h;b=b.j;var f;if(window.XMLHttpRequest)f=new XMLHttpRequest;else if(window.ActiveXObject)try{f=new ActiveXObject("Msxml2.XMLHTTP")}catch(k){try{f=new ActiveXObject("Microsoft.XMLHTTP")}catch(v){}}f&&(f.open("POST",c+(-1==c.indexOf("?")?"?":"&")+"url="+encodeURIComponent(b)),f.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),f.send(a))}}}function t(){var b={},d=document.getElementsByTagName("IMG");if(0==d.length)return{};var a=d[0];if(!("naturalWidth"in a&&"naturalHeight"in a))return{};for(var c=0;a=d[c];++c){var e=a.getAttribute("data-pagespeed-url-hash");e&&(!(e in b)&&0=b[e].o&&a.height>=b[e].m)&&(b[e]={rw:a.width,rh:a.height,ow:a.naturalWidth,oh:a.naturalHeight})}return b}var u="";h("pagespeed.CriticalImages.getBeaconData",function(){return u});h("pagespeed.CriticalImages.Run",function(b,d,a,c,e,f){var k=new p(b,d,a,e,f);n=k;c&&m(function(){window.setTimeout(function(){r(k)},0)})});})();pagespeed.CriticalImages.Run('/ngx_pagespeed_beacon','http://www.elforum.info/index.php?app=forums&module=ajax§ion=topics&do=quote&t=81827&p=1319632&md5check=f18e0224ff561575f1ad2195d396ebe5&isRte=1,xDD6_yBh4z,true,false,NG18-AE7vhk');</script>Posted Image&&0){for(var>

Ai cumva si codul sursa la aceasta schema?

Link spre comentariu
  • 2 luni mai târziu...

La Multi Ani la toata lumea si An Nou Fericit tuturor!!!In sfarsit dupa o lunga pauza am reusit sa ma reapuc de proiect si sa avansez.Intre timp am reusit sa termin si alimentatorul propriu-zis care a functionat din prima, si deasemenea am reusit sa rezolv si partea cu ventilatorul (pwm-ul). In linii mari functioneaza si partea de soft, mai ramane de facut ajustarea la temperatura care deocamdata nu stiu, e doar aproape de realitate, neavand sonda la multimetru..... nu cred ca ceea ce afiseaza pe display este real. Insa ceea ce ma bucura este ca ventilatorul porneste treptat in functie de cat de tare se incalzeste radiatorul. :)Acesta este primul meu program scris in BASCOM.Codul este urmatorul:

$regfile = "m8def.dat"$crystal = 1000000$hwstack = 40$swstack = 16$framesize = 32'--------------------------------------------------------------Configurare LCD-----------------------------------------------------Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0Dim A As ByteConfig Lcd = 16x2'--------------------------------------------------------------Configurare PWM-----------------------------------------------------Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up'-------------------------------------------------------------Mesaj de intampinare-------------------------------------------------ClsLocate 1 , 3Lcd "Power Supply"LowerlineLocate 2 , 2Lcd "0-27V / 0-15A"Wait 1ClsCursor Off Noblink'---------------------------------------------------------------Definire Constante-------------------------------------------------Dim Volt As WordDim Curent As WordDim Th As WordDim Tensiune As SingleDim Intensitate As SingleDim Putere As SingleDim Suma As SingleDim I As ByteDim Temperatura As SingleDim Th1 As SingleDim Fan As SingleDim Viteza As ByteConst Divizor_u = 0.08415Const Const_volt = 2.59 / 1024Const Const_curent = 2.59 / 1024Const Divizor_i = 0.14814814Const Const_temp = 1                                        'Provizoriu pana fac calculele'---------------------------------------------------------------Configurare ADC----------------------------------------------------Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56Start Adc'---------------------------------------------------------------Bucla infinita-----------------------------------------------------Do      '----------------------------------------------------------------Calcul Tensiune---------------------------------------------------      Suma = 0      For I = 1 To 50      Volt = Getadc(0)      Suma = Suma + Volt      Next      Tensiune = Suma / 50      Tensiune = Volt * Const_volt      Tensiune = Tensiune / Divizor_u      Locate 1 , 2      Lcd Fusing(tensiune , "##.#&") ; "V "      '-----------------------------------------------------------------Calcul Curent----------------------------------------------------      Suma = 0      For I = 1 To 50      Curent = Getadc(1)      Suma = Suma + Curent      Next      Intensitate = Suma / 50      Intensitate = Curent * Const_curent      Intensitate = Intensitate / Divizor_i      Locate 2 , 2      Lcd Fusing(intensitate , "##.#&") ; "A"      '-----------------------------------------------------------------Calcul Putere------------------------------------------------      Putere = Tensiune * Intensitate      Locate 1 , 11      Lcd Fusing(putere , "##.&") ; " W "      '---------------------------------------------------------------Calcul Temperatura--------------------------------------------      Suma = 0      For I = 1 To 50      Th = Getadc(2)      Suma = Suma + Th      Next      Temperatura = Suma / 50      Temperatura = Th / 19.5      Locate 2 , 10      Lcd Fusing(temperatura , "##.&") ; Chr(178) ; "C"      '------------------------------------------------------------------Viteza Cooler------------------------------------------------      Select Case Temperatura         Case 27 To 29 : Pwm1a = 40         Case 29 To 32 : Pwm1a = 80         Case 32 To 35 : Pwm1a = 120         Case 35 To 40 : Pwm1a = 180         Case Is >= 40 : Pwm1a = 255         Case Else : Pwm1a = 0      End Select      Pwm1b = Pwm1aWaitms 500LoopEnd
Eventualele greseli/optimizari pe care le observati va rog sa mi le spuneti.Am sa postez si cateva poze cu "hardughia", insa mai am putin de lucru la partea mecanica.Ceea ce as mai vrea sa fac la soft este ca la temperatura sa imi afiseze doar partea intreaga, fara virgula, ma puteti ajuta cu vreo informatie utila?

 

 

Din ce calcul reiese "Divizor_u" si "Divizor_I"

Link spre comentariu

Crezi tu ... care pari a fi la nivelul de copiat scheme . Sa zici ca un operational e pus degeaba fara sa stii cauza , nu te califica sa-ti dai cu parerea

Oricum legat de LM358 fara alimentare negativa nu poate ajunge cu iesirea spre masa ca sa fie util cand lucreaza cu tensiune mica de intrare (curenti mici prin shunt)... cum avea la inceputul topicului dar s-a simplificat pe parcurs . Nu este "rail to rail" .

Editat de Depanatoru
Link spre comentariu
  • 2 săptămâni mai târziu...

Pe tensiune am reusit sa o fac foarte precisa afisarea.

Pe curent in schimb nu reusesc sa o fac sa imi afiseze corect.

Cred ca gresesc undeva la calcule, pana la 1A nu imi indica deloc corect, dupa 1A indica cat de cat corect cu o abatere +/- 20mA

Am scris urmatorul cod, poate isi da cineva seama unde gresesc

 

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
'--------------------------------------------------------------Configurare LCD-----------------------------------------------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
'---------------------------------------------------------------Definire Constante-------------------------------------------------
Config Portb.0 = Output
Config Portb.5 = Output
Config Portb.4 = Output
Dim Volt As Word
Dim Curent As Word
Dim Tensiune As Single
Dim Intensitate As Single
Dim Putere As Single
Dim Putere_int As Word
Dim Suma As Single
Dim I As Byte
Dim Temperatura As Single
Dim Temperatura_int As Word
Const Divizor_u = 0.08415
Const Const_volt = 2.59 / 1024
Const Const_curent = 2.59 / 1024
Const Divizor_i = 0.05
'---------------------------------------------------------------Configurare ADC----------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56
Start Adc
Do
'----------------------------------------------------------------Calcul Tensiune---------------------------------------------------
Suma = 0
For I = 1 To 50
Volt = Getadc(0)
Suma = Suma + Volt
Next
Tensiune = Suma / 50
Tensiune = Volt * Const_volt
Tensiune = Tensiune / Divizor_u
If Tensiune <= 10.0 Then
Locate 1 , 1
Lcd Fusing(tensiune , "##.#&") ; " V"
Else
Locate 1 , 1
Lcd Fusing(tensiune , "##.#") ; " V"
End If
'-----------------------------------------------------------------Calcul Curent----------------------------------------------------
Suma = 0
For I = 1 To 20
Curent = Getadc(1)
Suma = Suma + Curent
Next
Intensitate = Suma / 20
Intensitate = Curent * Const_curent
Intensitate = Intensitate / Divizor_i
If Intensitate <= 10.0 Then
Locate 2 , 1
Lcd Fusing(intensitate , "##.#&") ; " A"
Else
Locate 2 , 1
Lcd Fusing(intensitate , "##.#") ; " A"
End If
'-----------------------------------------------------------------Calcul Putere------------------------------------------------
Putere = Tensiune * Intensitate
If Putere < 99 Then
Locate 1 , 10
Lcd Fusing(putere , "##.#&") ; " W "
Else
Putere_int = Int(putere)
Locate 1 , 10
Lcd Fusing(putere , "###.#") ; " W "
End If
Waitms 500
Loop
End
Link spre comentariu

Are vreun semireglabil de ajustare la curent ? Ce schema ai folosit ? Fara trebuie sa tatonezi cu rabdare constanta de divizare , pentru ca in primul rand shuntul nu se poate masura cu precizia cu care masori o rezistenta mare de gen 10K .

Editat de Depanatoru
Link spre comentariu

Am incercat diferite valori pentru divizor, in simulerea din Proteus arata destul de bine, insa fizic la curenti mici imi afiseaza din 0,05 in 0,05.Nu reusesc sa il fac sa imi masoare cu o precizie de 0.01, cu alte cuvinte sa imi afiseze exact ca aparatul de masura. Nu are semireglabil, intrarea de curent este conectata la pinul ADC printr-o rezistenta de 10k.Vreau intai sa vad ca imi afiseaza corect si sa inteleg exact cum lucreaza ADC-ul, iar dupa asta voi pune si un AO cu amplificare si reglaj.

Editat de peace
Link spre comentariu

Posibil sa nu aiba destula rezolutie pe 10 biti , depinde cat e curentul maxim , se imparte la 1024 si vezi cat e "pasul" cel mai mic pe care il poate masura .

In principiu cu 10A maxim trebuie sa vezi cu rezolutie de 10mA , 0,01A . Trebuie sa verifici din calcul daca cu 10A prin shunt , ajunge tensiunea la 2,56V la intrarea ADC , capul de scala . Altfel trebuie modificata constanta de divizare corespunzator .

Oricum vezi ca acolo in program unde scrie 2,59 , aia e referinta masurata fizic pe un anumit microcontroler , il masori precis pe al tau si modifici .

Editat de Depanatoru
Link spre comentariu

La 10A tensiunea pe ADC este de 0,5V. Am schimbat valoarea de 2,56 cu 0,5 si imi indica cu mult mai putin. Asa am facut calculul si pt tensiune cu divizorul rezistiv si acolo imi arata corect, adica la 30v am pe ADC 2,59

Editat de peace
Link spre comentariu

Nu prea inteleg cum ai facut , referinta nu se schimba ca sa-ti dea rezultatul ... numai constantele de divizare

Intai se stabilesc limitele maxime , sa zicem 35V si 10A , care inseamna o anumita tensiune pe shunt sa zicem 0,1V .

La masurat tensiune e simplu , gasesti constanta de divizare care sa-ti reduca tensiunea 2,56/35

La curent trebuie sa se amplifice de operational tensiunea de la 0,1V pana la 2,56V , aici nu e o constanta de divizare propriuzisa ( ca si cum ai masura tensiune de maxim 2,56V fara divizare) , numai calculul sa afiseze real curentul . Posibil ca aici te-ai incurcat , nu e asa intuitiv ca la masurat tensiune .

Editat de Depanatoru
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