Sari la conținut
ELFORUM - Forumul electronistilor

Voltmetru cu ATMEGA8 cod bascom si LCD!


Postări Recomandate

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 = 40Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6Config Lcd = 16 * 2Config Adc = Single , Prescaler = Auto <<<<>>>>>>End
Link spre comentariu
  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

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

 

'$sim$regfile = "m8def.dat"$crystal = 8000000Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7Config Lcd = 16 * 2Cursor Off NoblinkClsDim Adcv As Word , Volt As SingleConst Dif = 5 / 1024Const Volt_div = 0.152519Config Adc = Single , Prescaler = Auto , Reference = AvccStart AdcDo   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"LoopEnd
Link spre comentariu

Am facut simularea si functioneaza!Acum vreau sa inteleg ce face fiecare comanda.1.Dim Adcv As Word , Volt As SingleMai exact ce defineste voltul ca "single" ce face acest "single"?2.Const Dif = 5 / 1024Este o valoare fixa? sau merge modificata in functie de imi trebuie? ce sunt numerele respective? "5" si "1024"?3.Const Volt_div = 0.152519De unde tia rezultat valoarea asta? si mai exact ce face?4.Volt = Adcv * DifCe valori se inmulteste mai exact?Adcv ce valoare are? Dif ce valoare are?5.Volt = Volt / Volt_divAi 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!

Link spre comentariu

Pot sa te ajut in limita timpului disponibil. Cele mai bune explicatii se gasesc in helpul Bascomului, de unde am luat cateva citate.

1.Dim Adcv As Word , Volt As Single

Mai exact ce defineste voltul ca "single" ce face acest "single"?

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

2.Const Dif = 5 / 1024

Este o valoare fixa? sau merge modificata in functie de imi trebuie? ce sunt numerele respective? "5" si "1024"?

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.

3.Const Volt_div = 0.152519

De unde tia rezultat valoarea asta? si mai exact ce face?

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

4.Volt = Adcv * Dif

Ce valori se inmulteste mai exact?

Adcv ce valoare are? Dif ce valoare are?

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.

5.Volt = Volt / Volt_div

Ai la fel ca mai sus, ce reprezinta fiecare?

A doua operatie: Volt = Volt / Volt_div

Variabila Volt = Volt( adica rezultatul inmultirii dintre Adcv si Dif) impartit la 0.152519.

6.Lcd Fusing(volt , "##.##") ; " V"

Mai exact ce este in parantez ce specifica si pe ce se bazeaza?

Poti cauta cu search in helpul Bascomului functia Fusing. Volt reprezinta valoarea finala rezultata la a doua operatie.

Link spre comentariu

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!

Link spre comentariu

Uite alt exemplu cu valoarea returnata de ADC0 cu intrare maxima de 5V.

'$sim$regfile = "m8def.dat"$crystal = 8000000Deflcdchar 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.7Config Lcd = 20 * 4Cursor Off NoblinkClsConfig Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADCStart AdcDim W As Word , P As Word , V As Word , I As Byte , Cols As ByteDim Ps As String * 3ClsCursor OffLocate 3 , 1Lcd "0"Locate 3 , 5Lcd "25"Locate 3 , 10Lcd "50"Locate 3 , 15Lcd "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  LoopEnd

Display-ul este 20x4.

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

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.

post-15533-139829581405_thumb.jpg

Link spre comentariu

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 =1Volt=volt*0.01Lcd voltLa 500mV iti va afisa 5 pe LCD. 500mV reprezetand curentul de 5A care trece prin rezistenta de 0.1 ohm.

Link spre comentariu

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 ampermetruVoltmetrele vor fi afisate pe linia de sus si ampermetrele pe cea de jos....

Link spre comentariu

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.
Notă: Postarea ta va necesita aprobare moderator înainte de a fi vizibilă.

Vizitator
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Răspunde la acest subiect...

×   Alipit ca text avansat.   Restituie formatare

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.




×
×
  • 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