Sari la conținut
ELFORUM - Forumul electronistilor

Volt-Ampermetru + FAN cu Atmega8


dragutzu_marius

Postări Recomandate

Multumesc Depanatoru si celorlalti pentru ajutor.

Am rescris codul, si aparent pare ca functioneaza corect. In weekend am fost plecat, deasta doar acum revin cu update.

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'-------------------------------------------------------------Mesaj de intampinare-------------------------------------------------ClsLocate 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 Intensitate As SingleDim Putere As SingleDim Suma As SingleDim I As ByteDim Temperatura As SingleConst Divizor_u = 0.08415Const Const_volt = 2.59 / 1024Const Const_curent = 2.59 / 1024Const Divizor_i = 0.3333Const 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 20      Volt = Getadc(0)      Suma = Suma + Volt      Next      Tensiune = Suma / 20      Tensiune = Volt * Const_volt      Tensiune = Tensiune / Divizor_u      Locate 1 , 1      Lcd Fusing(tensiune , "##.##") ; "V"      '-----------------------------------------------------------------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      Locate 2 , 1      Lcd Fusing(intensitate , "##.##") ; "A"      '-----------------------------------------------------------------Calcul Putere------------------------------------------------      Putere = Tensiune * Intensitate      Locate 1 , 11      Lcd Fusing(putere , "##.&") ; "W"      '---------------------------------------------------------------Calcul Temperatura--------------------------------------------      Suma = 0      For I = 1 To 10      Th = Getadc(2)      Suma = Suma + Th      Next      Temperatura = Suma / 10      Temperatura = Th * Const_temp      Locate 2 , 11      Lcd Fusing(temperatura , "##.&") ; "C"Waitms 500LoopEnd
Referitor la partea de masurare de temperatura inca nu stiu cum sa fac calculele. De exemplu as vrea sa am un interval de la 10-15 grade la 90-100 de grade. De asemenea nu ma intereseaza sa afisez cu virgula, vreau doar partea intreaga, insa nu stiu cum sa fac asta, pentru ca imi da eroare la compilare daca las doar "Lcd Fusing(temperatura , "##") ; "C"".

Partea hardware este formata dintr-un divizor in care termistorul de 50k este conectat la +5V, celalalt terminal este conectat la intrarea ADC si un rezistor de 10K legat in serie cu termistorul la GND. Singurele date de catalog pe care le am sunt urmatoarele:

 

Termistor NTC 50K 50mW

[NTCM-HP-50K-1%]

 

Tip senzor termistor NTC

Rezistenţă 50kΩ

Putere comutată 50mW

Montare THT

Constantă de material B 3950K

Temperatura de lucru -55...125°C

Dimensiuni carcasă Ø3 x 4.5mm

Utilizare măsurare temperatură

Dimensiuni terminale lung. 25mm

 

 

Ca idee, daca va functiona citirea de temperatura, as vrea ca la anumite praguri ( 40, 45, 50, 55, grade, s.a.m.d.) sau liniar cu temperatura citita, sa imi genereze semnal PWM pe iesirea OC1B de la Atmega8 cu factor de umplere diferit pentru reglarea vitezei ventilatorului. Ca si frecventa, semnalul nu cred ca are nevoie de frecv. mare, cateva sute de Hz cred ca e suficient. Pentru detalii, schema este incarcata mai sus (nu cred ca mai e necesar inca odata pentru a nu umple inutil forum-ul).

 

Va rog sa imi spuneti si cum pot afisa pe LCD semnul "°" inainte de "C" [grade celsius]

 

Ma puteti ajuta cu indicatii la aceasta parte de soft?

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

.............Referitor la partea de masurare de temperatura inca nu stiu cum sa fac calculele. ................

Am si eu o sursa de 5A insa cu LM324 si Atmega8 pentru control, memorare la oprire ultima tensiune setata pentru a reporni "de unde a ramas" si VAmeter in care monitorizez temperatura pe traf si radiator cu termistori (de tip "lacrima"), strict legat de temperatura i-mi porneste ventilatoarele pentru radiator sau pentru transformator de la 32 grade alimentind gradual prin PWM, la 55 grade ajung la maxim si la 70 opreste termic. Din pacate valoarea exacta a termistorilor nu am notat-o (acum mi-am dat seama) ce-mi amintesc este ca sint de ordinul zecilor de Kohmi, e ceva timp de atunci...., mai jos pun partea de cod care se ocupa cu supravegherea termica si turatie ventilatoare facut asa cum m-am priceput, poate te ajuta.....:
'************** ventilator traf (th1)Ventilator:Valadc1 = Getadc(0)                                         'termistor trafGrade1 = Constgrade1 - Valadc1Grade1 = Grade1 / 5Pwm_1 = Grade1 - 32Pwm_1 = Pwm_1 * 8Pwm_1 = 220 - Pwm_1If Grade1 < 32 ThenConfig Outpwm1 = InputElseConfig Outpwm1 = OutputEnd IfIf Grade1 > 55 Then Pwm_1 = 0Pwm1a = Pwm_1'************** ventilator radiator (th2)Valadc2 = Getadc(1)                                         'termistor radiatorGrade2 = Constgrade1 - Valadc2Grade2 = Grade2 / 5Pwm_2 = Grade2 - 32Pwm_2 = Pwm_2 * 8Pwm_2 = 220 - Pwm_2If Grade2 < 32 ThenConfig Outpwm2 = InputElseConfig Outpwm2 = OutputEnd IfIf Grade2 > 55 Then Pwm_2 = 0Pwm1b = Pwm_2If Grade2 > 70 Or Grade1 > 70 Then Gosub StoptermicReturn
Ce-mi amintesc, cel mai greu mi-a fost sa fac softul sa-mi arate temperatura reala in functie de valoarea termistorilor disponibili, dar nu este imposibil. Pentru a afisa simbolul de "grade celsius" trebuie sa-l creezi "manual", la mine nu a mai avut loc in memorie...L.E. un colt din schema unde sint conectati termistorii:post-9441-139829718672_thumb.jpg
Link spre comentariu
  • 1 lună 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?

Link spre comentariu

Am facut si primele teste, pare destul de stabila sursa.Am incercat cu 2 halogene de 55W primadata, a fost foarte stabila tensiunea de iesire, si pe urma am pus 4 halogene de 55W, acolo a inceput putin sa "miste" iesirea cateva sute de mV.Singurul lucru care ma nelinisteste este faptul ca puntea dioda nu am prevazut-o cu radiator si aceasta se incinge destul de tare. Deja ma gandesc sa refac design-ul acestei surse in care sa prevad si racirea puntii diode. Puntea dioda folosita este una de 400V/50A (cel putin asa scrie)...In partea dreapta sus pe ecran este indicata puterea, si acum vad ca "W" a iesit din "fereastra"...

post-18358-139829738548_thumb.jpg

post-18358-139829738561_thumb.jpg

post-18358-139829738573_thumb.jpg

Link spre comentariu

Felicitari pentru realizare, sunt interesat in prima faza de partea de afisaj, pana la urma sunt 17 Amperi prin puntea aia normal ca incepe sa sfaraie dupa ceva timp fara radiator (cred ca merge un radiator cu ventilator cu tot de procesor pus pe ea)

Link spre comentariu
  • 1 an mai târziu...
  • 8 luni mai târziu...

Salut am facut circuitul la voltmetru functioneaza ok pe partea de tensiune pe partea de curent afiseaza cu mai putin de 20mA fata de curentul masurat de aparat am incercat imbunatari dar nu afiseaza corect intr-o plaje mai mare ! Se mai poate realiza ceva , eu am folostit dip atmega 8p-8pu iar ca divizorul de tensiune am folosit 1k5 iar pe intrare 16k9 !

Editat de djasu82
Link spre comentariu

Pai nu ai dat nici un detaliu despre shunt-ul folosit.Precizia shunt-ul se va reflecta in performantele ampermetrului.Orice aparat de masura trebuie calibrat. Calibrarea se poate face in 2 moduri: Hardware sau Software.

Nu ai specificat nici aparatul de masura  (folosit pentru verificarea comparativa) si nici domeniul pe care s-a facut masuratoarea.

Editat de djvas
Link spre comentariu

pai asa cum a realizat colegul marius adica 0.05 ohmi e suntul nu cred ca trebuie sa dau detalii despre aparatul de masura totusi nu e un jav de 20 de lei ! Chestia e ca nici in proteus nu indica corect curentul mda trebuie sa intervin asupra softului , nu am verificat tensiunea de referinta cu siguranta am alta valoare !

Re verificat acuma tensiunea de referinta e de 2,52 de aici si abaterea !

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