Jump to content


Photo

Volt-Ampermetru + FAN cu Atmega8


  • Please log in to reply
69 replies to this topic

#16 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 02 December 2013 - 08:26 PM

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

Dim A As Byte
Config Lcd = 16x2

'-------------------------------------------------------------Mesaj de intampinare-------------------------------------------------
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 Intensitate As Single
Dim Putere As Single
Dim Suma As Single
Dim I As Byte
Dim Temperatura As Single
Const Divizor_u = 0.08415
Const Const_volt = 2.59 / 1024
Const Const_curent = 2.59 / 1024
Const Divizor_i = 0.3333
Const Const_temp = 1   'Provizoriu pana fac calculele

'---------------------------------------------------------------Configurare ADC----------------------------------------------------

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

Start 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 500
Loop
End

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?

Cu_reclama

Cu_reclama
  • Membri

#17 OFFLINE   nickrvl

nickrvl

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,338 posts
  • Locatie:Rm Valcea

Posted 02 December 2013 - 09:11 PM

.............
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 traf
Grade1 = Constgrade1 - Valadc1
Grade1 = Grade1 / 5
Pwm_1 = Grade1 - 32
Pwm_1 = Pwm_1 * 8
Pwm_1 = 220 - Pwm_1
If Grade1 < 32 Then
Config Outpwm1 = Input
Else
Config Outpwm1 = Output
End If
If Grade1 > 55 Then Pwm_1 = 0
Pwm1a = Pwm_1

'************** ventilator radiator (th2)
Valadc2 = Getadc(1)                                         'termistor radiator
Grade2 = Constgrade1 - Valadc2
Grade2 = Grade2 / 5
Pwm_2 = Grade2 - 32
Pwm_2 = Pwm_2 * 8
Pwm_2 = 220 - Pwm_2
If Grade2 < 32 Then
Config Outpwm2 = Input
Else
Config Outpwm2 = Output
End If
If Grade2 > 55 Then Pwm_2 = 0
Pwm1b = Pwm_2

If Grade2 > 70 Or Grade1 > 70 Then Gosub Stoptermic
Return

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:
Attached File  sch.jpg   45.84KB   2 downloads

#18 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 12 January 2014 - 09:21 PM

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

Dim A As Byte
Config Lcd = 16x2

'--------------------------------------------------------------Configurare PWM-----------------------------------------------------

Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up

'-------------------------------------------------------------Mesaj de intampinare-------------------------------------------------
Cls
Locate 1 , 3
Lcd "Power Supply"
Lowerline
Locate 2 , 2
Lcd "0-27V / 0-15A"
Wait 1

Cls
Cursor Off Noblink

'---------------------------------------------------------------Definire Constante-------------------------------------------------
Dim Volt As Word
Dim Curent As Word
Dim Th As Word
Dim Tensiune As Single
Dim Intensitate As Single
Dim Putere As Single
Dim Suma As Single
Dim I As Byte
Dim Temperatura As Single
Dim Th1 As Single
Dim Fan As Single
Dim Viteza As Byte
Const Divizor_u = 0.08415
Const Const_volt = 2.59 / 1024
Const Const_curent = 2.59 / 1024
Const Divizor_i = 0.14814814
Const Const_temp = 1                                        'Provizoriu pana fac calculele

'---------------------------------------------------------------Configurare ADC----------------------------------------------------

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

Start 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 = Pwm1a


Waitms 500
Loop
End

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?

#19 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 12 January 2014 - 09:56 PM

Am atasat si schema + pcb la ambele placi, alimentator si afisaj, poate va vrea cineva sa construiasca sursa. Ele sunt facute in Eagle.

#20 OFFLINE   dragutzu_marius

dragutzu_marius

    Nou venit

  • Membri
  • Pip
  • 90 posts

Posted 12 January 2014 - 11:30 PM

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

Attached Files



#21 OFFLINE   rosmarin

rosmarin

    Membru

  • Membri
  • PipPip
  • 258 posts
  • Locatie:TARGU-MURES

Posted 13 January 2014 - 12:13 AM

Felicitari dl Marius.
Mesajul dvs va fi receptat de cineva cu inima larga si care o sa va dea o mana de ajutor.Regret ca nu sunt eu cel competent.

#22 OFFLINE   briobit

briobit

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,689 posts
  • Locatie:Pe vapor

Posted 13 January 2014 - 12:27 AM

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)

#23 OFFLINE   bandutoiu

bandutoiu

    Nou venit

  • Membri
  • Pip
  • 24 posts

Posted 07 April 2015 - 12:31 PM

Referitor la schema si pcb nu apar .Se poate si un HEX pentru atmega8.



#24 OFFLINE   mariuss_suciu

mariuss_suciu

    Nou venit

  • Membri
  • Pip
  • 70 posts
  • Locatie:Timisoara

Posted 13 April 2015 - 01:40 PM

atasat schema, pcb facute in eagle, si fisierul hex pentru atmega8 smd in capsula TQFP32

Attached Files



#25 OFFLINE   djasu82

djasu82

    Membru

  • Membri
  • PipPip
  • 146 posts

Posted 11 January 2016 - 03:06 PM

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 !


Edited by djasu82, 11 January 2016 - 03:29 PM.


#26 ONLINE   djvas

djvas

    Membru

  • Membri
  • PipPip
  • 636 posts
  • Locatie:Bucuresti

Posted 11 January 2016 - 03:38 PM

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.


Edited by djvas, 11 January 2016 - 03:47 PM.


#27 OFFLINE   djasu82

djasu82

    Membru

  • Membri
  • PipPip
  • 146 posts

Posted 11 January 2016 - 07:20 PM

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 !


Edited by djasu82, 11 January 2016 - 08:10 PM.


#28 OFFLINE   Florian Ciobanu

Florian Ciobanu

    membru

  • Membri
  • PipPip
  • 392 posts
  • Locatie:Pitesti

Posted 11 January 2016 - 07:34 PM

mai puteti posta si softurile pentru procesor?



#29 OFFLINE   rosmarin

rosmarin

    Membru

  • Membri
  • PipPip
  • 258 posts
  • Locatie:TARGU-MURES

Posted 11 January 2016 - 07:35 PM

Daca cineva a realizat  acest montaj cu Atmega-8 PDIP. Din pacate nu sunt prietenos cu miniaturizarile din cauza vederii



Cu_reclama

Cu_reclama
  • Membri

#30 OFFLINE   Florian Ciobanu

Florian Ciobanu

    membru

  • Membri
  • PipPip
  • 392 posts
  • Locatie:Pitesti

Posted 11 January 2016 - 07:39 PM

acum nu am timp, va proiectam eu un cablaj






0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users