PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wechselstrom mit Bascom messen



Neutro
07.02.2012, 19:22
Hallo Bascom´r

Ich bin gerade in der Planungsphase für ein kleines Projekt. Ich möchte mit einem Mega8 Wechselsrtöme messen, um die Leistungsaufnahme von
Verbrauchern zu ermitteln.
Als Strom- Sensor habe ich folgendes Bauteil bereits zu hause vorliegen :http://pdf1.alldatasheet.com/datasheet-pdf/view/170239/LEM/LTS6-NP.html
Der Vorteil dieses Sensors liegt in der gal. Trennung vom Netz, der Strom wird mittels Hallsensor gemessen. Die Ausgangsspannung des LTS beträgt 2,5V wenn kein Strom fließt. wenn ein Wechselstrom fließt, entsteht ein Sinus der sich um den 2,5V Offset bewegt, in der Amplitude von der Stromstärke abhängig.
Jetzt zu meinem Problem: Wie messe ich mit Bascom über den analogen Eingang jetzt die Stromstärke? Bei einem Gleichspannungssignal ist das ja ganz einfach, aber bei AC steh ich irgendwie voll auf dem Schlauch. Mann müsste das Signal ja für eine gewisse Zeit (am besten für eine Periodendauer)
möglichst mehrfach abtasten und dann aus den Messwerten einen Mittelwert bilden?
Vielleicht hat der eine oder andere sowas ja schon mal gemacht und kann mir mit einem Codeschnipsel weiterhelfen?

Falls noch Rückfragen sind, gerne her damit!

Viele Grüße
Neutro

Kampi
07.02.2012, 19:38
Den Strom kannst du über einen Shut messen. Du schließt den A/D-Wandler paralell zum Shunt und den Widerstand vom Shunt weißt du ja und dann misst du den Spannungsabfall an dem Shunt. Aus dem Widerstand und der Spannung errechnest du dann den Strom.
Und die Idee mit dem Abtasten kannst du nehmen :)

Besserwessi
07.02.2012, 19:40
Mit einfach dem Mittelwert bekommt man bei Wechselstrom null heraus - die positive und negative Hälfte hebt sich auf. Um die Amplitude zu bekommen müsste man schon so etwas machen wie erst quadrieren und mitteln. Damit die Zahlen nicht so groß werden sollten vorher den Mittelwert (oder wenigstens einen Schätzwert, z.B. 512) abziehen. Damit bekommt man das Quadrat des Effektivwertes.

Etwas einfacher wird es eventuell, wenn man erst den Mittelwert anzieht, und dann den Betrag bildete. Damit bildet man eine Gleichrichtung nach.

Für die Leistungsmessung sollte man auch noch die Spannung abtasten und dann jeweils die Momentane Leistung = Spannung * Strom berechnen und die dann mitteln. Damit bekommt man auch dann die richtige Wirkleistung, wenn es eine Phasenverschiebung oder verzerrte Kurvenform gibt.

Neutro
07.02.2012, 19:45
Hallo Kampi,

als Sensor verwende ich einen LTS6 weil ich gal. vom Netz getrennt messen möchte, das hatte ich ja auch im Eingangspost bereits geschrieben. Die Variante mit Shunt würde mir aber ebenfalls eine AC am ADC Port ausgeben!
Wie man DC Spannungen mit einem MC misst ist mir schon klar, das habe ich schon oft genug gemacht.
Die AC kann man leider nicht so ohne weiteres gleichrichten, weil das den Messwert verfälschen würde.
Aber trotzdem vielen Dank für deine Antwort.
MFG
Neutro

Neutro
07.02.2012, 19:51
Hallo Besserwessi, mit dem Mittelwert hast du bei genauerem Nachdenken natürlich Recht! Da lag ich ja voll daneben.
Die Spannung ist in diesem Fall immer die 230V Netzspannung, die kann man natürlich zusätzlich messen um ein besseres Ergebnis zu erzielen.
Was die Kurvenform betrifft so erwarte ich da keine sooo starken Verbraucher wie große E Motoren die mir den Sinus verfälschen.
Die Max Stromaufnahme sollte sowieso unterhalb von 6A liegen.

MFG

Kampi
07.02.2012, 19:55
Mit einfach dem Mittelwert bekommt man bei Wechselstrom null heraus - die positive und negative Hälfte hebt sich auf. Um die Amplitude zu bekommen müsste man schon so etwas machen wie erst quadrieren und mitteln. Damit die Zahlen nicht so groß werden sollten vorher den Mittelwert (oder wenigstens einen Schätzwert, z.B. 512) abziehen. Damit bekommt man das Quadrat des Effektivwertes.



Stimmt >.<
Nicht zu ende gedacht....wie dämlich :(
Du sagtest doch das der Sensor eine Spannung von 2,5V = 0A ausgibt und dann wenn du einen Sinus damit misst schwankt die Spannung um die 2,5V herum.
Und aus den gemessenen Werten bildest du dann den Mittelwert.
Oder steh ich gerade auf dem Schlauch? :confused:

Besserwessi
07.02.2012, 20:03
Die Kurvenform im Netz ist schon bei der Spannung nicht Sinusförmig. Ein großer Motor sorgt dabei sogar eher noch dasfür das es wieder in Richtung Sinus geht. Die Übertäter sind Netzteile mit Gleichrichter und ohne gute PFC-Schaltung. In den letzten Jahren sollte das aber besser geworden sein - weil die alten PCs langsam ausgemustert werden. Je nach Schaltung muss der Strom nicht Sinusförmig sein, vor allem bei etwas mit Gleichrichter, also fast allem elektronischen Geräten.

Das andere Problem ist die Phasenverschiebung, wie man sie z.B. bei Induktionsmotoren oder Kondensatornetzteilen (z.B. einige LED Lampen) hat.
Die Spannung misst man dann auch nicht so sehr wegen der Amplitude der Spannung, sondern mehr wegen der Phase.

Neutro
07.02.2012, 20:30
@ Besserwessi: Die Last die ich zunächst damit messen möchte ist eine IR Wärmelampe, also dürfte da an Störungen nix besonderes zu erwarten sein...
@Kampi: Ja, so ist die Funktionsweise des Sensors. Wenn das Messtechnisch zu aufwändig wird, müsste ich evtl. auf einen Messgleichrichter zurückgreifen, wäre aber eine Alternative die ich nicht so gerne in Betracht ziehen möchte. Esmuss ja generell möglich sein das mit einem Controller zu messen?

Besserwessi
07.02.2012, 20:52
Eine IR Lampe ist schon in guter Näherung ein ohmsche Last. Da reicht es wirklich wenn man nur den Strom misst, und dann rechnerisch den Effektivwert bestimmt. Von der Rechenzeit sollte auch BASCOM das noch hinbekommen, wenn Takt nicht besonders niedrig ist.
Mit fertigem Basic Code kann ich nicht helfen, aber den entsprechenden Code in C hab ich.

-schumi-
07.02.2012, 22:25
Im Betrieblichen Auftrag eines Kollegen (Abschlussprüfung der Ausbildung) wurde das so gemacht:

L wurde duch ne Spule durchgeschlauft (Schon fertig als Stromsensor gekauft), dass dann in nen OP rein und Einweggleichrichtung in nen Kondensator großem Lastwiderstand (also kleiner Last) damit der auch mal wieder runterkommt wenn der Strom sinkt.

Berechnung war dann:
((Vin+0.7V)/OPVerstärkung)/sqrt(2)
Wies dann weitergeht hängt natürlich vom Stromsensor ab. In dem Fall wars ein einfaches Übersetzungsverhältnis das noch dazumultipliziert wurde.

Um die Genauigkeit zu erhöhen wurden auch immer 5 Messungen gemacht und der Mittelwert gebildet.

Das ganze funktioniert auch ganz gut. Dient im Dauerlauf als automatische Abschaltung von Testrahmen bei Überlast

wassermann
08.02.2012, 12:01
Ich hab das ganze mal für unsere PV-Anlage gebaut. Technisch einwandfrei ist nur die Variante von Besserwessi, die Scheinleistung anhand der quadratischen Mittelwerte für Strom und Spannung zu berechnen. Die Wirkleistung bekommt man über das Integral von Strom und Spannung. Somit musst du einfach oft genug pro 20ms abtasten. Den Leistungsfaktor bekommst du dann gratis. Da du ja sehr oft abtastest, kannst du dir dann auch bei Gelegenheit die Werte über die serielle Schnittstelle an den PC schicken und hast automatisch die Kurvenform.
Das Messen über einen Shunt erübrigt sich bei den LTS-Dingern, da man ohnehin bereits ein Spannung für den zu messenden Strom bekommt.
Alternativ wäre auch ein Wandler (wie oben beschrieben) möglich. Es gibt im Netz auch bereits einen fertig dokumentierten Leistungsmesser (Powermeter AVR 465).
Viel Spass beim Basteln und Vorsicht mit den 230V.

gruss,
wassermann

Neutro
08.02.2012, 21:15
Hallo allerseits,

zunächst mal vielen Dank für die Tipps und Lösungsansätze. Ich werde mal gucken ob ich das am Wochenende irgendwie in ein Bascom Prog. umsetzen kann.
@Wassermann: keine Angst, ich bin vom Fach-wegen der 230V. :-)

Ich werde mich dann am Wochenende noch mal melden
VG
Neutro

Neutro
09.02.2012, 15:41
So, da bin ich noch mal wieder. Nachdem ich ordentlich rumgegooglet habe bin ich zu dem Entschluss gekommen wohl doch einen
Messgleichrichter zu verwenden. Jetzt muss ich noch mal meine Fachbücher wälzen um da vernünfige Werte für die Bauteile
auszurechnen. Als schaltung werde ich wohl die hier verwenden:
http://www.loetstelle.net/grundlagen/operationsverstaerker/opamp_5.php
(Den Vollwellengleichrichter in der Mitte der Seite)
Oder kennt da jemand von euch noch eine bessere Schaltung?

Gruß
Neutro

PICture
09.02.2012, 15:57
Hallo!

Besser ist für mich immer relativ: https://www.roboternetz.de/community/threads/11458-Messgleichrichter?p=119839&viewfull=1#post119839 . ;)

wassermann
09.02.2012, 18:00
Hallo Neutro,

kein Problem, aber 230V tun weh und du wärst nicht der erste. Ich habe bei Anderen auch schon die Hinterlassenschaften einer 500V-Verteilung gesehen ... und diese Leute sind zur Vorsicht "erzogen" worden.
In diesem Sinne.
Viel Spass und Erfolg.

gruss,
wassermann

Neutro
10.02.2012, 08:04
Hallo Picture, vielen Dank für den Link, hat mir echt geholfen! Funktioniert das ganze eigentlich wenn man eine Spannung mit einem offset gleichrichtet? dann müssten die Impulse doch um 2,5V nöher ausfallen im gegensatz zu einer Normalen AC? Kommt hinter dem Gleichrichter noch ein Kondensator zur Glättung, sonst würde der µC ja nur ungenaue Werte messen können, abhängig davon an welcher Stelle er gerade misst.
@Wassermann: solche Anlagen habe ich leider auch schon zu oft gesehen....aber trotz aller Vorsicht ist es mir auch schon passiert eine DC von ca 800V gewischt zu bekommen...Aua...

PICture
10.02.2012, 08:58
Der Offset wird dazuadiert und ist immer zu berücksichtigen. Für RMS sinusoidalen Spannungen ohne Offset muss die gleichgerichtete Spannung für ADC mit Tiefpass (z.B. RC) ausreichend geglättet werden.

Für RMS Wert beliebieger Netzspannung muss die ungeglättete Spannung in einer Periode netzsynchron integriert werden (RMS = Fläche unter gleichgerichteter Ausgangskurve geteilt durch Periodezeit). ;)

Besserwessi
10.02.2012, 10:51
Bei den Gleichrichterschaltungen würde ich die Version von http://www.loetstelle.net/grundlagen/operationsverstaerker/opamp_5.php vorziehen. Da gehen die OPs nicht in die Sättigung und können schneller reagieren. Außerdem hat man einen konstanten Eingangswiderstand und der Masseanschluss ist hochohmig - das ist hier wichtig, denn da kommt die Mittlere Spannung (hier 2,5 V) ran.

Danach braucht man noch einen Tiefpass oder, wenn man es eilig hat einen Integrator, der genau eine ganze Zahl von Perioden ausließt. Man muss es mit dem Filter aber nicht übertreiben, da kann man auch den µC mehrere (z.B. 20) AD Werte auslesen lassen und dann den Mittelwert über 20 ms bilden lassen. Um den vollen Bereich des AD Wandlers ausnutzen zu können muss man noch den Offset wieder entfernen. Falls man eine +-5 V Versorgung für den OP hat, könnte man das auch gleich mit einem Elko am Eingang machen, das geht aber nicht bei er Schaltung von Picture !.

PICture
10.02.2012, 10:58
Falls man eine +-5 V Versorgung für den OP hat, könnte man das auch gleich mit einem Elko am Eingang machen, das geht aber nicht bei er Schaltung von Picture !.

Wiederspruch, weil Eingang identisch ist. ;)

Neutro
10.02.2012, 11:23
Einen Tiefpass am Ausgang hatte ich ja schon in Erwägung gezogen, um die Welligkeit zu entfernen. Vielleicht werde ich auch einen Integrator nehmen, muss ich mal gucken wenn ich die Schaltung am Wochenende Zeichnen werde.
Als OP hatte ich einen AD8604 angepeilt, weil das ein Rail to Rail Typ ist den ich auch zu hause habe.
Link: http://www.analog.com/static/imported-files/data_sheets/AD8601_8602_8604.pdf

PICture
10.02.2012, 11:30
Ohne negativer Versorgungsspannung kommst du sogar bei "rail-to-rail" OP's nie genau auf Null auf Ausgängen. ;)

Besserwessi
10.02.2012, 11:58
Die Eingangsschaltungen sind bei den beiden Vorschlägen nicht identisch: Bei der Schaltung von Lötstelle... hat der OP eine Rückkopplung in beide Richtungen - damit ist er inv. Eingang eine virtuelle Masse. Bei der anderen Schaltung geht der OP am Eingang bei der einen Halbwelle in die Sättigung.

Einen extra analogen Integrator braucht man eigentlich nicht, dass kann sehr gut der µC machen. Per Tiefpass lassen sich die Oberwellen (200 Hz, 300 Hz usw.) gut unterdrücken und es reichen dann einige wenige Samples des AD-wandler um die 100 Hz und ggf. einen Rest 50 Hz zu unterdrücken. Im einfachsten Fall einfach 2 Werte mit 5 ms Abstand mitteln, und schon ist man die 100 Hz weitgehend los. Wenn die Spannung unsymmetrisch ist, und man noch ein bisschen 50 Hz Rest hat, dann halt 4 Werte mit 5 ms Abstand, oder viele Werte über ein 20 ms Intervall.

Mein Favorit wäre sowieso die Software lösung.

PICture
10.02.2012, 12:06
Bei der anderen Schaltung geht der OP am Eingang bei der einen Halbwelle in die Sättigung.

Könntest du mir das, bitte, erklären, weil ich das bisher noch nicht gehört habe, dass ein OP am "-" Eingang in Sättigung gehen kann, wenn "+" Eingang am GND liegt ?

Neutro
10.02.2012, 12:15
Softwarelösung war ja auch mein Favorit, aber leider bin ich nicht soooo ein Sofware überflieger, als das ich das alleine in Bascom lösen könnte mit der ACV Messung.
Ich nehme immer gerne Sofwareschnipsel von anderen und modifiziere die dann so, das ich das gewünschte Ergebnis erhalte (besser gut kopiert als schlecht kreiert). wenn es hier jemanden gibt der mir so einen Bascom Codeschnpsel geben könnte, nehme ich den gerne an
@Picture: Das man auch mit Rail to Rail nict exakt auf 0V runterkommt ist mir bekannt, aber einen "virtuellen Reststrom" bin ich bereit zu akzeptieren. Das kann aber auch die Software noch wieder eleminieren. Für einen "normalen" OP müsste ich dann ja wieder mit z.B einen DC-DC Wandler eine neg. Spannung erzeugen.
Aber Danke für deinen Hinweis.

Gruß
Neutro

PICture
10.02.2012, 12:26
Die kleine Ausgangsspannung (laut DB um 15 mV), kann man natürlich bei "0" am Eingang messen und danach immer einfach softwaremässig abziehen.

Übrigens, für unipolare Spannung eignet sich ein analoger Integrator nicht, weil der Kondensator dann periodisch entleert werden muss. ;)

Besserwessi
10.02.2012, 13:18
@picture: Der OP geht nicht am Eingang in die Sättigung, sondern schon als ganzes, bzw. mit der Spannung am Ausgang. Im linearen Bereich, sorgt der OP Dafür das die Spannung an den beiden Eingängen gleich ist - damit kann man dann relativ einfach den Eingangswiderstand von der Schaltung von Löststelle ... berechnen, bzw. sehen, das man da einen gewöhnlichen konstanten Eingangswidestand hat.
Bei der Schaltung wo der OP in die Sättigung geht, gilt dann nicht mehr das die Spannungen an beiden Eingängen gleich ist. Damit muss man den Eingangswiderstand für beide Polaritäten getrennt berechnen und bekommt auch was anderes heraus. In der Regel kann man annehmen das der Eingang hochohmig ist - das muss aber auch nicht für jede OP gelten. Mit so einem OP (z.B: OP07) geht die Schaltung dann gar nicht. Man hat also keinen konstanten Eingangswiderstand.

Code für die Softwarelösung hab ich in C, und auch noch eine Version in ASM für den wesentlichen Teil (AD Interruppt). Die ASM-Version sollte sich ggf. auch mit relativ wenig Änderungen in BASCOM als Inline ASM einbinden lassen.

PICture
10.02.2012, 13:29
Der OP geht nicht am Eingang in die Sättigung, sondern schon als ganzes, bzw. mit der Spannung am Ausgang.

Danke, so habe ich gemeint, aber anders gelesen. :)

stfan1409
11.02.2012, 19:17
hhhmmmmmmmm - mache ich da jetzt einen Denkfehler?

-Der Sensor gibt 2,5V bei 0A raus - d.h. wenn die Sinusspannung negativ wird, also unter 2,5V ist, kann ich softwaremäßig die Werte ingnorieren. Schon die Gleichrichtung gespart.
-Sinus 50Hz / 1 sec. = 20ms
-wenn ich z.b. 25 Messungen in 20ms mache wären das alle 800µs eine Messung.
-Nun kann man ganz einfach den absoluten Mittelwert ausrechnen.

Besserwessi
11.02.2012, 21:52
So schwer ist die Softwarelösung wirklich nicht. Am einfachsten wohl noch die Nachbildung der Gleichrichtung in Software:
Beim AVR bekommt man mit frei laufendem ADC etwa alle 100 µS einen Wert. Die genaue Zeit hängt vom Takt und der Einstellung des Teilers ab. Danach richtet sich die Zahl der Samples für 20 ms, ggf. auch ein Vielfaches davon, wenn man so viel Zeit hat. Für 20 ms braucht man so rund 200 Werte.

Vom AD Wert wird die Lage des Nullpunktes (vermutlich irgendwo bei 500 - 520) abgezogen, und dann mit ABS(...) der Betrag gebildet. Die Werte werden dann aufsummiert, und am Ende noch geteilt. Auch in BASCOM sollte die Rechenzeit ausreichen um das Aufsummieren auch in der Zeit zwischen den Samples zu schaffen, wenn man mit ganzen Zahlen rechnet. Es reicht sogar aus um auch noch den Mittelwert noch einmal zu berechnen - für die nächste Messung.

Der eigentlich einzigen Nachteile der Softwarelösung sind die Rechenzeit während der Messung (da bleibt ggf. kaum was über) und der Code von vielleicht 500 Bytes für die Lösung mit dem Betrag. Dafür spart man sich die Gleichrichterschaltung und man kann eine höhere Auflösung (durch Oversampling) bekommen, durchaus im Bereich 12 Bit. Auch mit dem Gleichrichter sollte man für ein genaues Ergebnis ein vielfaches von 10 ms oder 20 ms mitteln - viel einfacher wird also auch da die Software nicht.

Carlos76
12.02.2012, 01:10
hallo
Wenn 2,5V 0A sind , und du willst ein Wechselstrom messen täte ich einfach viele messungen in eine for schleife machen und alle werte in ein variablen array speichern danach mit min und max funktion von Bascom die spitzenwerte raussuchen , danach der grösste wert - kleinster wert = Sptizenstrom , dann der adc wert auf die ampere skalieren und mit wurzel 2 Dividieren und dann hast du ein effektivwert , in der for schleife muss natürlich ein wait , oder du machst es in einen timer isr die messungen . in Bascom sollte ungefähr so aussehen
For A = 1 To Tastmessungen
W(a) = Getadc(0) 'analogwert lesen und in W array speichern
Next A
Max(w(1) , M1 , Idx) 'aus W array Maximum wert raussuchen und speichern
Maxi = M1 'Maximum wert in Variable maxi speichern
Min(w(1) , M1 , Idx) 'aus W array Minimum wert raussuchen und speichern
Mini = M1 'Minimum wert in Variable Mini speichern
Spitzenstrom = Maxi-Mini
jetzt deine variable skalieren und dann
Effektiv= Spitzenstrom /(2)*(1.41)

Neutro
12.02.2012, 09:18
Hallo Carlos,
vielen Dank für deine Antwort, ich werde das mal ausprobieren sobald die ich Zeit dazu habe. Den Stromverlauf müsste ich eigentlich mit meinem Frequenzgenerator simulieren können.
Leider fehlt mir bei den Umgang mit Arrays immer noch der Durchblick, obwohl ich die grundsätzliche Funktion schon verstehe.
Wie muss ich denn in deinem Beispiel die Variablen deklarieren?
Dim A as Byte
Dim Tastmessungen as Byte
Tastmessungen =20 '20 Messungen sollen gemacht werden
dim W (20)as Single
Dim Maxi as Single
Dim Mini as single
Dim spitzenstrom as single
Dim Effektiv as Single ( wobei ich die Berechnung ja auf mehrere Zeilen aufteilen muss)


Als Wait würde sich dann ja ein Wert von ca. 1ms oder kleiner anbieten.

Das Programm an sich würde ich wohl in ein Unterprogramm verpacken was aus der Haupschleife heraus angesprochen wird, denn es sollen ja noch andere Sachen gemacht werden.

MFG
Neutro

Carlos76
12.02.2012, 09:58
Hallo Neutro
Lass alle variablen as word bis deine effektivberechnungen , du solltest noch deine ausgabe zum lcd oder print noch formatieren mit z.b. print Fusing(effektiv , "#.##")
dim tastmessungen as Byte 'sollte die gleiche grösse wie w haben
dim w(20) as word ' getadc mag kein single
dim Maxi as word '
dim mini as word
dim Spitzenstrom as word
dim Effektiv as Single 'und alle andere variablen für die Berechnungen als single deklarieren
Poste mal dein funktionierendes Bascom code
Gruss Carlos

Neutro
12.02.2012, 12:41
Hallo Carlos,
das Prog muss ich erst noch schreiben, das kann also noch ein paar Tage dauern bis ich soweit bin. Mir ging es hier ja zunächst mal
um den grundlegenden Code wie eine ACV einzulesen ist. Aber da hast du mir schon mal auf jeden Fall weitergeholfen.
Ob der Code dann auch wirklich mit der Hardware läuft wird dann wohl auch noch mal eine gewisse Zeit dauern, da ich ja noch erst
Den Schaltplan und Layout erzeugen muss, dann nöch ätzen.....Das ganze befindet sich ja momentan noch alles erst in Planung.
Ich werde mal versuchen das ganze vorab auf meinem Testboard auszuprobieren.
Wie ich die Werte anzeigen und formatieren muss ist mir aber bekannt, das habe ich für Gleichspannungen schon öfters gemacht.
auf jeden Fall werde ich euch weiterhin auf dem Laufenden halten. Darf ich dir bei Bedarf eine PN zukommen lassen?

Viele Grüße
Neutro

stfan1409
12.02.2012, 12:46
Hallo Neutro,
habe gerade keine Hardware hier, also ist der Code ungetestet - kannst ja mal versuchen.

Analogeingang0 wird alle 800µs eingelesen.
wenn der Wert größer 2,5V also größer 512 ist, wird er zur Variable Mittelwert gerechnet.
gleichzeitig wird gezählt, wie oft gemessen wurde.

ist der Analogeingang0 gleich 512 oder kleiner, wird mit den vorher gemessenen Werten gerechnet,
d.h. Variable Mittelwert / Zaehler(wie oft gemessen wurde)

Danach wird das Ergebnis über RS232 ausgegeben($baud = 19200 )





'Wechselspannung messen / STFan 12.02.2012


'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 8000000 '08 MHz
$baud = 19200

'-------------------------------------------------------------------------------
'8Bit Timer0: 50Hz bei 1Sekunde -> 20ms -> 25 Messungen in 20ms -> alle 0,8ms eine Messung also 1250 Messungen pro Sekunde
Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Const Timer0vorgabe = 156
Enable Timer0
Enable Interrupts


'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Config Portc = Input


'-------------------------------------------------------------------------------
'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc


'-------------------------------------------------------------------------------
'Variablen
Dim Analog0 As Word
Dim Zaehler As Byte
Dim Mittelwert As Integer , Mittelwert2 As Single
Dim Merker As Byte 'Merker = 0 = analogwerte werden eingelesen
'Merker = 1 = Werte wurden berechnet
'Merker = 2 = Werte wurden ausgeben
Dim Spitzenwert As Single
Dim Effektivwert As Single


'-------------------------------------------------------------------------------
'Programm


Do

If Merker = 1 Then
Print "Mittelwert2: " ; Mittelwert2 'Ausgabe des Mittelwert2

Spitzenwert = Mittelwert2 * 1.571 'berechnen Spitzen wert
Print "Spitzenwert: " ; Spitzenwert

Effektivwert = Spitzenwert / 1.414 'berechnen Effektivwert
Print "Effektivwert: " ; Effektivwert

Merker = 2
End If


Loop

'_________________________________________________ ______________________________





'................................................. ..............................
Timer0_isr:
Timer0 = Timer0vorgabe


Start Adc
Analog0 = Getadc(0) 'Analogwert messen
Stop Adc



If Analog0 > 512 Then
Incr Zaehler
Mittelwert = Mittelwert + Analog0
Merker = 0

Else

If Merker = 0 Then
Merker = 1 'Damit nach den Messungen nur einmal der Mittelwert berechnet wird!
Mittelwert2 = Mittelwert / Zaehler 'Effektivwert berechnen
Zaehler = 0 'Variable zurücksetzen
Mittelwert = 0 'Variable zurücksetzen
End If


End If

Return

Neutro
12.02.2012, 14:06
Hall Carlos,
wenn ich deinen Code richtig verstehe werden also 20 Messungen gemacht weil das Array auf 20 Stellen begrenzt ist?
wenn die 20 Stellen voll sind werden also die Min und Max werte bestimmt?
Ich habe das ganze mal in einen vollständigen Code als unterprog eingebunden, allerdings lässt sich dein Abschnitt nicht fehlerfrei Compilieren, das Problem liegt in dieser Zeile:
For A = 1 To Tastmessungen

@Stfan1409:
Danke für deinen Code, ich werde auch den mal Checken

Carlos76
12.02.2012, 14:50
Hallo
Klar Kannst du mir eine PN schicken :-)



Hall Carlos,
wenn ich deinen Code richtig verstehe werden also 20 Messungen gemacht weil das Array auf 20 Stellen begrenzt ist?
wenn die 20 Stellen voll sind werden also die Min und Max werte bestimmt?

Ja so sollte der ablauf sein.
Ich hab keine ahnung wieso du ein fehler bekommst , du solltest kompielierbaren code hier reinstellen, kann es sein das vergessen hast a as byte für die for schleiffe zu definieren?

Neutro
12.02.2012, 16:00
Ja, die Definition fehlte tatsächlich, aber dann wird die Zeile :
Max(w(1) , M1 , Idx) Als fehler markiert (asignment error)

Hier mal der ganze Code:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

'-------------------------------------------------------------------------------
'LCD Config

Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5

'-------------------------------------------------------------------------------


'Variable setzen

'print Fusing(effektiv , "#.##")
Dim A As Byte
Dim Tastmessungen As Byte
Tastmessungen = 20 'sollte die gleiche grösse wie w haben
Dim W(20) As Word ' getadc mag kein single
dim Maxi as word '
dim mini as word
dim Spitzenstrom as word
Dim Effektiv As Single 'und alle andere variablen für die Berechnungen als single deklarieren


'-------------------------------------------------------------------------------
'ADC Einstellungen

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

'-------------------------------------------------------------------------------
'Hauptprogramm

Cls
Cursor Off
Upperline
Lcd " ACV "
Lowerline
Lcd " Spannung "

Wait 3
Cls


Do

Gosub Spannungsmessung

Loop


Spannungsmessung:

For A = 1 To Tastmessungen
W(a) = Getadc(0) 'analogwert lesen und in W array speichern
Next A
Max(w(1) , M1 , Idx) 'aus W array Maximum wert raussuchen und speichern
Maxi = M1 'Maximum wert in Variable maxi speichern
Min(w(1) , M1 , Idx) 'aus W array Minimum wert raussuchen und speichern
Mini = M1 'Minimum wert in Variable Mini speichern
Spitzenstrom = Maxi-Mini
'jetzt deine variable skalieren und dann
Effektiv = Spitzenstrom / 2.82

Upperline Fusing(effektiv , "#.##") 'hier ist jetzt der Spannungswert der umgerechnet werden muss!

Return

Carlos76
12.02.2012, 16:10
hallo Neutro
es fehlt
dim M1 as word
dim idx as word
und das solltest du wechseln
Upperline Fusing(effektiv , "#.##") 'hier ist jetzt der Spannungswert der umgerechnet werden muss!
in
upperline
lcd Fusing(effektiv , "#.##")
jetzt wird deine gosub siemlich schnell durchlaufen , du solltest mindestens ein waitms 1 in deine messschleife am besten wäre es wenn du ein timer benutzt mit 1 ms

Neutro
12.02.2012, 19:56
Danke für die Antwort,

das mit dem Wait hatte ich glatt vergessen....

Besserwessi
12.02.2012, 21:04
Ein Wait ist nur nötig, wenn man sich auf so wenige Werte geschränkt. Sonst ist es eher besser mehr Werte des AD Wandlers zu nutzen, und nicht zu warten. Das Suchen nach Maximum und Minimum geht auch ohne alle Werte zu speichern, jeweils direkt nach der Messung. Dann ist es auch klein Problem nicht nur 20 Werte zu nutzen sondern z.B. 200 oder auch 1000.

Ein Timer ist hier eher nicht angebracht. Eher schon der Interrupt vom AD Wandler: also den AD Wandler im Free running mode laufen lassen und dann die benötigte Zahl (ca. 200) an Samples auswerten. Das Programm kann dann auch noch was anderes machen während der Messung.

Neutro
18.02.2012, 13:06
So, ich wollte mal einen kurzen Zwischenbericht zu dem Projekt abgeben:
Ich habe mich für eine "Hybrid" Lösung entschieden, soll heißen das ich einen Vollwellengleichrichter und den Programmvorschlag von
Carlos mit ein paar kleinen Änderungen nehmen werde.
Zur Erklärung: Der Gleichrichter wird das Signal des Stromsensors gleichrichten und in seiner welligen Form auf den Controller ADC geben.
Die Software soll dann 25 Messungen in 800µS Abstand ausführen, so das ich auf jeden Fall sehr dicht an die Spitzenspannung herankommen werde.
Der Min Wert braucht dazu nicht mehr bestimmt zu werden, der Max Wert/ 1,41 ergibt dann ja den Effektivwert der Spannung.
Leider bin ich noch nicht dazu gekommen die Software zu testen, zumindest beim compilieren erhalte ich keine Fehler.
Der Gleichrichter wird noch so modifiziert werden, das er den 2,5V Offset des Sensors abzieht. Dafür werde ich dann den OP (TL082) aber wohl doch symetrisch mit +/- 5V betreiben müssen. Am Ausgang des Gleichrichters wird noch eine Schottky Diode gegen GND eingesetzt um neg. Spannung vom ControllerPin
fern zu halten.

Bis hier hin schon mal vielen Dank an alle!

MFG
Neutro

Besserwessi
18.02.2012, 13:24
Wieso noch der Umstand mit der Gleichrichtung. Wenn das Signal schon mit 2,5 V offset vorliegt, kann man mit dem Signal direkt an den µC. Die Gleichrichtung erlaubt nur eine 2 fache Verstärkung, oder 1 Bit mehr an Auflösung. Mit der Bildung des Betrages und mitteln über z.B. 200 Werten (20 ms) gewinnt man mehr als 1 Bit(eher 2-3 Bit) durch das Mitteln. Das gibt also eine besseres Ergebnis mit weniger Aufwand.

Carlos76
18.02.2012, 13:36
die gleichrichtung brauchst du nicht , ich hab 24 stück lem lts 15 auf ein atmega 8 am laufen , über multiplex , benutze 8 ausgänge vom atmega , um die lems zu versorgen und 3 adc.
Mein programm funktioniert tadellos.
gruß carlos

Neutro
18.02.2012, 22:01
Ok, ok ihr habt mich überzeugt, ich werde den LTS mal direkt mit dem Controller verbinden und das Prog von Carlos verwenden. :-)
Ich offe mal das ich da nächste Woche zu komme.

Schönen Abend noch

Neutro