PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strom und Spannungsmessung



Kampi
08.02.2010, 18:40
Hallo
Ich habe hier ein Programm was an einem ADC Eingang vom Mega32 die Spannung misst und an einem zweiten die Spannung die an einem Widerstand abfällt um daraus den Strom zu berechnen.
Allerdings zeigt das LCD mir die Werte jeweils zwei mal an und ich weiß nicht wieso.
Hier ist der Code


$regfile = "m32def.dat"
$crystal = 16000000

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Start Adc

Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Const Ref = 5 / 1023
Dim Spannung As Single
Dim Strom As Single
Dim Volt As Single
Dim Ampere As Single


Main:
Do

Initlcd
Cls
Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige


Loop
End

Sub _spannungsmessung
Local W As Word
W = Getadc(0.)
Spannung = W * Ref
Spannung = Spannung * 1
Volt = Spannung
End Sub

Sub _strommessung
Local S As Word
S = Getadc(1.)
Strom = S * Ref
Strom = Strom / 100
Ampere = Strom
End Sub

Sub _spannungsanzeige()
Locate 1 , 1
Lcd "Spannung :"
Locate 1 , 13
Lcd Spannung
End Sub

Sub _stromanzeige()
Locate 2 , 1
Lcd "Strom :"
Locate 2 , 13
Lcd Ampere
End Sub


Und hier ein Foto um das Problem zu zeigen.
http://img684.imageshack.us/img684/6269/bilddk.jpg
Was ich meine ist das z.B. 2x der Spannungswert angezeigt wird.

Dirk
08.02.2010, 21:06
Hallo Kampi,

versuch die LCD-Ausgabe mal so:
Locate 1 , 1
Lcd "Spannung: " ; Spannung

Sonstiges:
- Initlcd gehört nicht in die Do-Loop Schleife, sondern davor.
- Vor Loop würde ich eine kurze Pause setzen: Wait 1

Gruß Dirk

Kampi
08.02.2010, 21:25
Gut das klappt. Und wie kann ich es machen das er die Single Variable rundet oder so? Weil der stellt jetzt ca 12 oder mehr Stellen da und das ist mir zu lang.

Henry
08.02.2010, 22:02
Das kannst Du mit folgendem Befehl machen.
Du brauchst dazu noch eine String-Variable (im Beispiel SpannungSTR)

SpannungSTR = Fusing(Spannung , "#.###")
Dies würde Dir die Werte mit 3 Stellen hinter dem Komma ausgeben.
Du musst dann natürlich die String-Variable im Display anzeigen lassen.

Kampi
08.02.2010, 22:15
Wie sieht das den Beispielhaft aus? Weil ich kann mir irgendwie grad nichts darunter vorstellen

Henry
08.02.2010, 22:41
Du musst eine zusätzliche Variable deklarieren:
Dim SpannungSTR as String
Dann kommt nach dem messen der Spannung der genannte Befehl:


SpannungSTR = Fusing(Spannung , "#.###")
und zur Anzeige auf dem Display schreibst Du dann z.B.:

Locate 1 , 1
Lcd "Spannung: " ; SpannungSTR

Kampi
08.02.2010, 22:58
So das runden funktioniert allerdings wird die Spannung nun wieder doppelt dargestellt :D

Rone
09.02.2010, 00:17
Hallo!

Die Bascom Hilfe ist Dir ein Begriff?
Such nach Fusing und ersetz einfach Print durch Lcd.

MfG
Rone

Kampi
09.02.2010, 18:29
So ich habd en Code nun soweit fertig....außer die Formeln die müssen noch angepasst werden. Das ist er:



$regfile = "m32def.dat"
$crystal = 16000000

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Start Adc

Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Declare Sub _widerstandsmessung()
Declare Sub _widerstandsanzeige()
Const Ref = 5 / 1023
Dim Volt As Single
Dim Strom As Single
Dim Ohm As Single
Dim Spannung As Single
Dim Voltstr As String * 2
Dim Ampere As Single
Dim Stromstr As String * 2
Dim Widerstand As Single
Dim Ohmstr As String * 2


Initlcd
Cls
Main:
Do

Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige
Wait 1

Loop
End

Sub _spannungsmessung
Local V As Word
V = Getadc(0.)
Spannung = V * Ref
Spannung = Spannung * 1
Volt = Spannung
Voltstr = Fusing(volt , "#.&&")
End Sub

Sub _strommessung
Local A As Word
A = Getadc(1.)
Strom = A * Ref
Strom = Strom / 100
Ampere = Strom
Stromstr = Fusing(strom , "#.##")
End Sub

Sub _widerstandsmessung
Local O As Word
Local P As Word
O = Getadc(2.)
P = Getadc(3.)
Widerstand = Spannung * 1
Ohm = Widerstand
End Sub

Sub _spannungsanzeige()
Locate 1 , 1
Lcd "U = " ; Voltstr ; ""
End Sub

Sub _stromanzeige()
Locate 2 , 1
Lcd "I = " ; Stromstr ; ""
End Sub

Sub _widerstandsanzeige()
Locate 3 , 1
Lcd "R = " ; Ohm
End Sub


Allerdings zeigt mir das LCD die Sachen immernoch nicht richtig an. Zwischen U= und I= ist eine Leerzeile. Und die Bascom Hilfe hilft mir auch irgendwie nicht wirklich weiter, weil das Problem einfach nicht verschwindet.

Rone
09.02.2010, 18:56
Hallo!

Was mir mal so spontan ins Auge springt:
Du definierst einen String mit 2 Zeichen:
Dim Stromstr As String * 2
Dann probierst Du 4 Zeichen da reinzuquetschen:
Stromstr = Fusing(strom , "#.##")

Ich find zwar keine Leerzeile,aber:
Lcd "I = " ; Stromstr ; ""
Vor und nach dem = ist sehr wohl ein Leerzeichen!

Vielleichts hilfts weiter.

MfG
Rone

Kampi
09.02.2010, 19:14
Nein das hilft alles nichts. Und was ich meinte ist das hier.

So sieht das LCD Display vom Text her im moment aus

----------------------
| U =
|
| I =
----------------------

Und es soll so aussehen:

----------------------
| U =
| I =
| R =
----------------------
Also im ganz groben :D

Rone
09.02.2010, 19:50
Hallo!

Wo wird die Widerstandsanzeige aufgerufen?

MfG
Rone

Kampi
09.02.2010, 19:53
Die hab ich im moment noch rausgeschmissen aus dem Hauptprogramm, weil die durch den Fehler jedesmal die ganze Anzeige verhuntzt.

rolber
09.02.2010, 20:31
Hallo

Versuch mal vor dem End Sub in den Unterprogrammen Stromanzeige und Spannungsanzeige ein Waitms 1000 einzusetzen.
Ansonsten scheint dein Programm schon i.O. zu sein.

Roland

Kampi
09.02.2010, 20:47
Mmh bringt auch nichts.....aber wenns nicht das Programm ist was ist es dann?

rolber
09.02.2010, 21:09
Hallo !
Hast Du mal anstelle von Locate X, X
die Befehle Secondline, Thirdline, Fourthline benutzt ?
Nur mal um zu testen , das es auch ein 4 zeiliges Display ist.

Roland

Kampi
09.02.2010, 21:20
Kann ich mal probieren.

rolber
09.02.2010, 21:26
Hallo !!
Kleiner Fehler von mir.
Die Befehle heissen :
Upperline --1. Zeile
Lowerline --2. Zeile
Thirdline --3. Zeile
Fourthline --4. Zeile

Damit klappts bestimmt

Roland

Kampi
09.02.2010, 21:36
Die Befehle kommen jeweils immer anstelle von dem Locate oder? Hab die jetzt mal anstelle vom Locate gemacht aber es geht immernoch nicht >.<. Langsam nervt das echt

rolber
09.02.2010, 21:43
Hallo !
So:
Thirdline
LCD "Text"

Dann sollte der Text in Linie 3 des LCD ausgegeben werden
Lowerline
LCD "Text"
Dann sollte der Text in Linie 2 des LCD ausgegeben werden
Die Waitms 1000 nicht vergessen.

Roland

Kampi
09.02.2010, 21:49
Ne er schreibt es in Zeile 1 und 3 obwohl es in Zeile 1 und 2 soll..... . Kann das eventuell auch ein Fehler am LCD sein?

molleonair
09.02.2010, 21:50
hatte mal ähnliche Probleme
kann es sein das du ein EADOG oder EADIP Display verwendest ?
probier mal:

Config LCD = 20 * 4a

rolber
09.02.2010, 21:53
Versuch mal folgendes :
CLS
Upperline
LCD "U= "
Waitms 1000
Lowerline
LCD "I= "
Waitms 1000
Thirdline
LCD "R= "
Waitms 1000

Dann müsste es klappen

Roland

Kampi
09.02.2010, 21:57
Ne klappt auch nicht richtig.....2 und 4 will er nicht darstellen :/

molleonair
09.02.2010, 22:01
was genau hast du für ein lcd ??

Kampi
09.02.2010, 22:02
Das hier:
http://www.conrad.de/goto.php?artikel=181863

molleonair
09.02.2010, 22:09
Das läuft bei mir in meiner reflowsteuerung auch
hier mal der code
wahrscheinlich reicht es bei dir die config lcd anzupassen
initlcd gleich mit oben hin und noch ein waitms 500
und es sollte laufen



Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Initlcd

Kampi
09.02.2010, 22:14
Config Lcd = 20 * 4a , Chipset = Ks077

Die Zeile wars. Es klappt endlich!!!!!
Tausend Dank an alle für die Tipps ](*,)

molleonair
09.02.2010, 22:16
naja ist mit den EA-LCDs immer so ein Spaß
die tanzen immer ein bissl außer der Reihe

rolber
09.02.2010, 22:17
Hallo !!

Hier werden Sie geholfen !!

Roland

Kampi
09.02.2010, 22:31
So das hier ist dann das fertige Werk:



$regfile = "m32def.dat"
$crystal = 16000000

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Start Adc

Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Declare Sub _widerstandsmessung()
Declare Sub _widerstandsanzeige()
Const Ref = 5 / 1023
Dim F As Integer
Dim Volt As Single
Dim Strom As Single
Dim Ohm As Single
Dim Spannung As Single
Dim Voltstr As String * 4
Dim Ampere As Single
Dim Stromstr As String * 4
Dim Widerstand As Single
Dim Ohmstr As String * 4


Initlcd
Cls
Main:
Do

Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige
Call _widerstandsmessung
Call _widerstandsanzeige
Wait 1

Loop
End

Sub _spannungsmessung
Local V As Word
V = Getadc(0.)
Spannung = V * Ref
Volt = Spannung
Voltstr = Fusing(volt , "#.##")
End Sub

Sub _strommessung
Local A As Word
A = Getadc(1.)
Strom = A * Ref
Strom = Strom / 1 'Shunt = 1 Ohm
Ampere = Strom
Stromstr = Fusing(strom , "#.##")
End Sub

Sub _widerstandsmessung
Local O As Word
Local P As Word
O = Getadc(2.) 'U1
P = Getadc(3.) 'Ux
F = 100 'R1 = 100 Ohm
Widerstand = F * P
Widerstand = Widerstand / O
Ohm = Widerstand
Ohmstr = Fusing(ohm , "#.##")
End Sub

Sub _spannungsanzeige()
Upperline
Lcd "U = " ; Voltstr
Waitms 1000
End Sub

Sub _stromanzeige()
Lowerline
Lcd "I = " ; Stromstr
Waitms 1000
End Sub

Sub _widerstandsanzeige()
Thirdline
Lcd "R = " ; Ohmstr
Waitms 1000
End Sub


Werde Donnerstag auf der Arbeit erstmal die Schaltung Hardwareseitig aufbauen und hoffentlich klappts dann so wie ichs mir vorgestellt habe =)

rolber
09.02.2010, 22:38
Falls noch Fragen !!!
Einfach melden.

Roland