Jump to content


Photo

Voltmetru cu ATMEGA8 cod bascom si LCD!


  • Please log in to reply
24 replies to this topic

#1 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 24 June 2011 - 12:23 AM

In primul rand imi cer scuze moderatorilor ca am deschis un subiect cu titlu asemanator!
Vreau sa fac un voltmetru folosind porturile ADC de la un atmega8.
Codul bineinteles scris in BASCOM!
De conectat LCD la atmega stiu sa fac, sa scriu codul pentru a afisa ceva pe LCD stiu!
Ce nu stiu eu este functia ADC, deoarece nu am folosito deloc pana acum, si am cam 1-1,5 ani de folosit bascom si atmega in multe aplicati!
PORTC.0 este intrarea care o folosesc
Cam atat stiu sa fac:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto


 <<<<>>>>>>


End


Cu_reclama

Cu_reclama
  • Membri

#2 OFFLINE   iulian2010

iulian2010

    Membru

  • Membri
  • PipPip
  • 146 posts

Posted 24 June 2011 - 08:16 AM

Volt_div = 0.152519 se foloseste pentru afisarea pana la 30V cu divizor R1=100K si R2=18K.

'$sim
$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Cursor Off Noblink
Cls

Dim Adcv As Word , Volt As Single

Const Dif = 5 / 1024
Const Volt_div = 0.152519
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Do
   Adcv = Getadc(0)                                         ' 0 = ADC0
   Waitms 50
   'Calcul
   Volt = Adcv * Dif
   Volt = Volt / Volt_div

   Locate 1 , 1
   Lcd "Tensiune= "

   Locate 1 , 11
   Lcd Fusing(volt , "##.##") ; " V"

Loop
End


#3 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 24 June 2011 - 11:53 AM

Am facut simularea si functioneaza!
Acum vreau sa inteleg ce face fiecare comanda.

1.Dim Adcv As Word , Volt As Single
Mai exact ce defineste voltul ca "single" ce face acest "single"?
2.Const Dif = 5 / 1024
Este o valoare fixa? sau merge modificata in functie de imi trebuie? ce sunt numerele respective? "5" si "1024"?
3.Const Volt_div = 0.152519
De unde tia rezultat valoarea asta? si mai exact ce face?
4.Volt = Adcv * Dif
Ce valori se inmulteste mai exact?
Adcv ce valoare are? Dif ce valoare are?
5.Volt = Volt / Volt_div
Ai la fel ca mai sus, ce reprezinta fiecare?
6.Lcd Fusing(volt , "##.##") ; " V"
Mai exact ce este in parantez ce specifica si pe ce se bazeaza?


Daca esti dispus sa ma ajuti e OK, daca nu vrei nu este nici o problema.
Mie imi place sa inteleg si cum functioneaza si pe ce se bazeaza, nu numa sa mi se dea sa folosesc si eu sa nu am habar de ce face comenzile!
Mersi mutl inca o data!

#4 OFFLINE   iulian2010

iulian2010

    Membru

  • Membri
  • PipPip
  • 146 posts

Posted 24 June 2011 - 05:47 PM

Pot sa te ajut in limita timpului disponibil. Cele mai bune explicatii se gasesc in helpul Bascomului, de unde am luat cateva citate.
[quote name="Cilibiu"]1.Dim Adcv As Word , Volt As Single
Mai exact ce defineste voltul ca "single" ce face acest "single"?
[/quote]
"Every variable in BASCOM has a data type that determines what can be stored in the variable. The next section summarizes the elementary data types.
Elementary Data Types
Bit (1/8 byte). A bit can hold only the value 0 or 1. A group of 8 bits is called a byte.
Byte (1 byte). Bytes are stores as unsigned 8-bit binary numbers ranging in value from 0 to 255.
Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.
Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535.
Long (four bytes). Longs are stored as signed 32-bit binary numbers ranging in value from -2147483648 to 2147483647.
Single. Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
Double. Doubles are stored as signed 64 bit binary numbers. Ranging in value from 5.0 x 10^–324 to 1.7 x 10^308
String (up to 254 bytes). Strings are stored as bytes and are terminated with a 0-byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes etc."
[quote]2.Const Dif = 5 / 1024
Este o valoare fixa? sau merge modificata in functie de imi trebuie? ce sunt numerele respective? "5" si "1024"?[/quote]
Dif definit ca si constanta are valoare fixa, adica 5/1024 = 0.0048828125, deci Dif = 0.0048828125. Portul analog controlerului functioneaza cu tensiune continua pana la maxim 5V. 5 reprezinta valoarea maxima a tensiunii analogice si 1024 este valoarea returnata pe 10 biti.
[quote]3.Const Volt_div = 0.152519
De unde tia rezultat valoarea asta? si mai exact ce face?[/quote]
In functie de ce vrei sa faci poti folosi si alte valori. Constantei Volt_div i se atribuie numarul 0.152519. Este valoare fixa si este folosita in calcul. In loc de numarul "0.152519" poti scrie "Volt_div".
[quote]4.Volt = Adcv * Dif
Ce valori se inmulteste mai exact?
Adcv ce valoare are? Dif ce valoare are?[/quote]
Variabilei Adcv i se aloca valoarea returnata pe 10 biti de portul controlerului ADC0, in functie de tensiunea de intrare. Daca avem la intrare 2,49V, variabilei Adcv i se aloca valoarea 511. Acesta este un calcul teoretic 5 / 1024 * 511 = 2.4951171875.
Bascomul executa intr-o linie doar o operatie de ex:
Prima operatie: Volt = Adcv * Dif
Variabila Volt = valoarea returnata pe 10 biti inmultita cu 0.0048828125.
[quote]5.Volt = Volt / Volt_div
Ai la fel ca mai sus, ce reprezinta fiecare?[/quote]
A doua operatie: Volt = Volt / Volt_div
Variabila Volt = Volt( adica rezultatul inmultirii dintre Adcv si Dif) impartit la 0.152519.
[quote]6.Lcd Fusing(volt , "##.##") ; " V"
Mai exact ce este in parantez ce specifica si pe ce se bazeaza?[/quote]
Poti cauta cu search in helpul Bascomului functia Fusing. Volt reprezinta valoarea finala rezultata la a doua operatie.

#5 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 25 June 2011 - 12:00 AM

Mersi foarte mult, am experimentat intre timp aceste valori, si miam dat seama la ce ajuta, acum ca miai zis mai explicit, am inteles si mai bine.
in loc de valoarea 0.1525..... am pus 0.1, asta am vazut ca ajuta la 1V sau 0,1V sau 0,01V, bineinteles ca fara rezistente, cu rezistente este valoarea zisa de tine.
Mam prins de idee si imi este de mare folos!
Mersi foarte mult inca o data!

#6 OFFLINE   iulian2010

iulian2010

    Membru

  • Membri
  • PipPip
  • 146 posts

Posted 25 June 2011 - 12:23 AM

Uite alt exemplu cu valoarea returnata de ADC0 cu intrare maxima de 5V.
'$sim
$regfile = "m8def.dat"
$crystal = 8000000

Deflcdchar 0 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32        ' replace ? with number (0-7)'
Deflcdchar 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1                ' replace ? with number (0-7)
Deflcdchar 2 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
Deflcdchar 3 , 16 , 16 , 31 , 31 , 31 , 31 , 16 , 16        ' replace ? with number (0-7)
Deflcdchar 4 , 1 , 1 , 31 , 31 , 31 , 31 , 1 , 1            ' replace ? with number (0-7)

Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 20 * 4
Cursor Off Noblink
Cls

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
Start Adc

Dim W As Word , P As Word , V As Word , I As Byte , Cols As Byte
Dim Ps As String * 3

Cls
Cursor Off
Locate 3 , 1
Lcd "0"
Locate 3 , 5
Lcd "25"
Locate 3 , 10
Lcd "50"
Locate 3 , 15
Lcd "75"

Do
  W = Getadc(0)
  V = W / 20
  P = W / 10
  Ps = Str(p)
  Locate 1 , 1
  Lcd "ADC(0):" ; W ; "   "
  Locate 1 , 13
  Lcd P ; "%  "

  Cols = P / 5

  Locate 2 , 1
  For I = 1 To Cols
   Select Case I
   Case 1 : Lcd Chr(3)
   Case 5 : Lcd Chr(4)
   Case 10 : Lcd Chr(4)
   Case 15 : Lcd Chr(4)
   Case 20 : Lcd Chr(4)
   Case Else : Lcd Chr(0)
  End Select
  Next I

  Cols = Cols + 1

  For I = Cols To 20
  Select Case I
   Case 1 : Lcd Chr(2)
   Case 5 : Lcd Chr(1)
   Case 10 : Lcd Chr(1)
   Case 15 : Lcd Chr(1)
   Case 20 : Lcd Chr(1)
   Case Else : Lcd Chr(32)
   End Select
   Next I

   Waitms 100
  Loop
End

Display-ul este 20x4.

#7 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 25 June 2011 - 02:01 PM

Sincer e mai simplu primul cod!

#8 OFFLINE   costyy86

costyy86

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,728 posts
  • Locatie:Resita

Posted 17 February 2013 - 05:26 PM

Am sinumlat si eu coduriel puse aici, am simulat si inca un volt-ampermetru, insa nu imi afiseaza nimic pe display in proteus, am versiunea 7.7, oare sa fie problema cu programu? sau nu e ceva bun in cod?

#9 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 17 February 2013 - 05:32 PM

Pune schema din proteus sa vedem daca ai gresit conexiunea cu LCD-ul.
Diferenta dintre voltmetru si ampermetru nu difera deloc. Doar calculul este un pic diferit.

#10 OFFLINE   costyy86

costyy86

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,728 posts
  • Locatie:Resita

Posted 17 February 2013 - 05:46 PM

Pun PDF-ul si mai jos arhiva completa daca este nevoie

Attached Files



#11 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 17 February 2013 - 06:05 PM

Greselile sau gasit.
In primul rand.
LCD-ul in proteus este alimentat gresit.
Doi la mana pinul AVCC de la MCU trebuie conectat la 5V.
Iar la LCD pinul RW trebuie conectat la masa.
Revin cu schema.
L.E uite si schema .
Nu pot simula proiectul tau in proteus 7.5. Am repordus schema si am introdus programul tau.
Prima data nu rula nici la mine, dar cu modificarile aferente , functioneaza.

Attached Files



#12 OFFLINE   costyy86

costyy86

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,728 posts
  • Locatie:Resita

Posted 17 February 2013 - 06:14 PM

Da, ai dreptate functioneaza ok
Multumesc..

#13 OFFLINE   costyy86

costyy86

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,728 posts
  • Locatie:Resita

Posted 17 February 2013 - 06:41 PM

Daca nu sunt prea sacaitor, cum pot calcula rezistentele pentru ampermetru? sa spunem ca am nevoie pana la 5A

#14 OFFLINE   Cilibiu

Cilibiu

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,940 posts

Posted 17 February 2013 - 07:02 PM

La o rezistenta de 0.1ohm la 5A ai 500mV cadere pe ea. Deci din cateva calcule faci ca atunci cand ai 500mV pe rezistenta tie pe LCD sa iti apara 5.
De ex:
Legi intrarea ADC direct la rezistenta (presupun ca sti cum).
Calcul.
volt_dif =1
Volt=volt*0.01
Lcd volt
La 500mV iti va afisa 5 pe LCD. 500mV reprezetand curentul de 5A care trece prin rezistenta de 0.1 ohm.

Cu_reclama

Cu_reclama
  • Membri

#15 OFFLINE   costyy86

costyy86

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,728 posts
  • Locatie:Resita

Posted 17 February 2013 - 08:04 PM

Da stiu cum sa leg, direct pe iesirea de la rezistenta de 5W catre consumator, dar nu am reusit sa scriu codul nu imi calculeaza corect, sau nu stiu eu sa il scriu....eu vreau sa fac dual-bolt-ampermetru penru o sursa stabilizata, am facut vollmetrele insa nu imi iese pentru ampermetru
Voltmetrele vor fi afisate pe linia de sus si ampermetrele pe cea de jos....




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users