Forum: Mikrocontroller und Digitale Elektronik Impulszähler Wärmemengenzähler Stromzähler


von Karl K. (leluno)


Lesenswert?

Zwecks Auswertung des Verbrauchs einer Heizung folgender Code:
1
u32 zl_imp;
2
#define DSZ tast3
3
#define WMZ tast4
4
u8 Abbruch;
5
//...
6
//+++++++++++++volleSecunde ++++++++++++++++++++
7
if(gbi(bool1,schalterVolleSecunde )){
8
cbi(bool1,schalterVolleSecunde);zl_sec_wdg=0;
9
lcd_time;
10
11
//+++++++ 30 sec +++++++
12
if(sec%30==20){
13
//1. Impulsauswertung  DSZ-Drehstromzähler
14
15
//Warten auf impuls
16
zl_imp=1;timer0_imp=0;Abbruch=0;
17
while(DSZ==0 && !Abbruch){zl_imp++;if(zl_imp==0)Abbruch=1;}//Abbruch bei Überlauf
18
19
//warten auf Impulsende
20
zl_imp=1;timer0_imp=0;Abbruch=0;
21
while(DSZ==1 && !Abbruch){zl_imp++;if(zl_imp==0)Abbruch=1;}
22
23
//Beginn Messung
24
zl_imp=1;timer0_imp=0;Abbruch=0;
25
while(DSZ==1 && !Abbruch){zl_imp++;if(zl_imp==0)Abbruch=1;}
26
27
//Berechnung  Impulsdauer und kw/h aus zl_imp
28
//...
29
30
//2. Impulsauswertung  WMZ-Drehstromzähler
31
//...
32
33
//3.  Messung ds1820 Vorlauf/rücklauf
34
//...
35
36
//4. Berechnung wärmeleistung + Verbrauch
37
//...
38
39
40
}//30 sec
41
}//------------volleSecunde--------------------

messung des momentanen Verbrauchs soll alle 30 sec erfolgen
mglst. kein Interrupt
Fragen:
kann es so funktionieren?

geht es besser?

von Wolfgang (Gast)


Lesenswert?

karl k. schrieb:
> Fragen:
> kann es so funktionieren?

Versuche mal in ganzen Sätzen zu formulieren, was du überhaupt für ein 
Eingangssignal zur Verfügung hast.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Es könnte schon sein, dass es so funktionieren könnte. Aber 
wahrscheinlich ist es nicht :-)

a) was hast du gegen Zeilenumbrüche? Dein Code ist extrem schwer lesbar. 
Jag den mal durch indent...

b) was hast du gegen Interrupts? gerade zum Auslesen von Impulsausgängen 
(ich nehme mal an es handelt sich um eine Art S0-Signal) bieten sich 
PC-Ints an. Damit kannst du sogar bis zu 8 Ausgänge quasi parallel 
bearbeiten.

c) ohne Interrupts wird es recht ungenau, weil du im busy-waiting eine 
eventuelle interrupt-Last nicht berücksichtigen kannst.

von Karl K. (leluno)


Lesenswert?

Wolfgang schrieb:
> karl k. schrieb:
>> Fragen:
>> kann es so funktionieren?
>
> Versuche mal in ganzen Sätzen zu formulieren, was du überhaupt für ein
> Eingangssignal zur Verfügung hast.

Die Eingangssignale sind die Impulse vom Drehstromzähler und vom 
Wärmemengenzaehler
http://www.ebay.de/itm/141025883482?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649
(übliche hallsensoren)

Michael Reinelt schrieb:
> b) was hast du gegen Interrupts?

von maßgeblicher Seite wird man immer darauf hingewiesen, dass Taster 
nicht über Interrupt angeschlossen werden sollen. Diese sind 
störempfindlich.

Die Auswertung ist mit 20 und 50 Zeit-Sekunden so gelegt, dass nur der 
Uhrzeit-timer läuft. Störung durch andere Interrupts kann nicht 
erfolgen. Ich könnte zl_imp aber auch in die timer-routine legen. Wird 
es dann genauer?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

karl k. schrieb:
> Michael Reinelt schrieb:
>> b) was hast du gegen Interrupts?
>
> von maßgeblicher Seite wird man immer darauf hingewiesen, dass Taster
> nicht über Interrupt angeschlossen werden sollen. Diese sind
> störempfindlich.

Welche "maßgebliche Seite"?

Bei den Flowmetern musst du das Datenblatt konsultieren. Bei den 
S0-Impulsen solltest du beachten dass die gerne so 12-24V Spannung 
haben, mit einem passenden Lastwiderstand um den richtigen Strom zu 
erreichen. Störungen ausschalten sollte nicht notwendig sein, ich hab 
trotzdem Optokoppler und eine eine Impulsformung vorgeschaltet, 
angelehnt an 
http://wiki.volkszaehler.org/hardware/controllers/hutschienencontroller_v2

S0 ist insofern unkritischer, weils da rein ums Zählen geht. Bei den 
Flowmetern muss man etwas mehr Hirnschmalz reinstecken, weil dich nicht 
die Gesamt-Wassermenge interessiert, sondern der aktuelle Durchfluss, um 
daraus zusammen mit der Temperaturdifferenz eine thermische Leistung 
errechnen zu können.

Übrigens, der von dir verlinkte Durchflussmesser schaut auf den ersten 
Blick nicht so aus, als wäre er für höhere Temperaturen geeignet...

von Karl K. (leluno)


Lesenswert?

Michael Reinelt schrieb:
> Welche "maßgebliche Seite"?

maßgeblich sind Moderatoren oder Peter Dannegger:
Beitrag "Entstörung Interrupt-Taster LPC1769"

Ich hab die Berechnung jetzt wie folgt:
1
u16 strom_kw_h1000, ww_1000l_hou;
2
#define DSZ tast3
3
#define WMZ tast4
4
u8 Abbruch;
5
6
//...
7
//+++++++++++++volleSecunde ++++++++++++++++++++
8
if(gbi(bool1,schalterVolleSecunde )){
9
cbi(bool1,schalterVolleSecunde);zl_sec_wdg=0;
10
lcd_time;
11
12
//+++++++ 30 sec +++++++
13
if(sec%30==20){
14
//1. Impulsauswertung  DSZ-Drehstromzähler
15
16
17
//warten auf Impulsanfang
18
timer0_imp=1;Abbruch=0;
19
while(DSZ==0 && !Abbruch){
20
  if(timer0_imp>223)Abbruch=1;}//Abbruch bei Überlauf ca 10 sec
21
22
timer0_imp=0;Abbruch=0;
23
while(DSZ==1 && !Abbruch){
24
  if(timer0_imp>223)Abbruch=1;}
25
26
//Beginn Messung
27
timer0_imp=0;Abbruch=0;
28
while(DSZ==0 && !Abbruch){
29
  if(timer0_imp>223)Abbruch=1;}
30
  
31
//Messung Ende=Impuls Ende
32
while(DSZ==1 && !Abbruch){
33
  if(timer0_imp>223)Abbruch=1;}
34
35
//Berechnung  Impulsdauer und kw/h aus zl_imp  R(A)= 500 imps/ kwh 
36
// 223 ticks=>7,2 sec=> 1kwh
37
//Geschwindigkeit timer0 31 ticks/sec
38
if(!Abbruch)strom_kw_h1000 = 223000/timer0_imp;
39
40
//2. Impulsauswertung  WMZ-Drehstromzähler
41
/*Frequency: F=5.5 * Q (L / Min), error: ± 2% voltage :3.5-24VDC, current can not exceed 10mA, 330 pulses/liter,
42
F=onstant  * units of flow (L / min) * time (seconds).*/
43
44
//Messung Zeit für Durchfluss 1000l/h => 92 imps/sec
45
//Geschwindigkeit timer0 31 ticks/sec
46
ww_1000l_hou=0;
47
timer0_imp=0;
48
Abbruch=0;
49
while(ww_1000l_hou<92 && !Abbruch){
50
  while(WMZ==1 && !Abbruch){
51
    if(timer0_imp>31)Abbruch=1;}
52
  while(WMZ==0 && !Abbruch){
53
    if(timer0_imp>31)Abbruch=1;}
54
  ww_1000l_hou++;  
55
}
56
if(!Abbruch)ww_1000l_hou=31000/timer0_imp;

müsste eigentlich ausreichend genaue Werte geben. Kalibrieren kann man 
dann anhand der Werte des Stromzählers. Wenn die Ergebnisse streuen, 
werde ich auf Interrupt umstellen. Da die Messung über den timer 
erfolgt, erwarte ich das aber nicht.

Frequenzumrichter vor den Kompressor und gucken wie sich die Az 
verändert. Geht hoffentlich ganz weit nach oben.

Das Flowmeter ist bis 80° angegeben. Für 35° Vorlauf müsste das dicke 
reichen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

karl k. schrieb:
> maßgeblich sind Moderatoren oder Peter Dannegger:
> Beitrag "Entstörung Interrupt-Taster LPC1769"

Stimmt schon, auf Peter sollte man hören. Aber dort ging es um Taster 
und deren Entprellung. Dafür sind Interrupts nicht geeignet, auch weil 
es idR egal ist wann genau der Taster gedrückt wurde.

> Ich hab die Berechnung jetzt wie folgt:
sieht schon viel besser aus.

Ein Tipp noch: für längerfristige Auswertungen solltest du nicht nur die 
zeit zwischen S0-Impulses messen um auf die momentane Leistung zu 
schließen, sondern die Impulse auch zählen, um die Energie genau zu 
erfassen. Beim hochrechnen aus der Impulsdauer verfälscht du dir sonst 
die Energiebilanz aufgrund von Meß- und Rundungsfehlern.

> müsste eigentlich ausreichend genaue Werte geben. Kalibrieren kann man
> dann anhand der Werte des Stromzählers. Wenn die Ergebnisse streuen,
> werde ich auf Interrupt umstellen. Da die Messung über den timer
> erfolgt, erwarte ich das aber nicht.

genauigkeit dürfte reichen, du verschenkst halt viel Rechenzeit, aber 
wenn du die anderweitig nicht brauchst...

> Frequenzumrichter vor den Kompressor und gucken wie sich die Az
> verändert. Geht hoffentlich ganz weit nach oben.
Vergiss mal vorerst den FU, und schau mal wie dein System jetzt reagiert 
bzw. misst. Spannend ist da Warmwasser-Bereitung: Da hast du stark 
unterschiedliche Werte der Vorlauftemperatur (beginnend bei 25°C, ende 
bei 50°C je nach Speichertemperatur und -qualität). Du solltest 
folgendes beobachten: thermische Leistung bleibt in etwa konstant, aber 
elektrische leistungsaufnahme des Kompressors sollte annähernd 
proportional zur VL-temperatur ansteigen, COP entsprechend abfallen.


> Das Flowmeter ist bis 80° angegeben. Für 35° Vorlauf müsste das dicke
> reichen.
Dann ist ja gut. Ich hoffe du hast sauber gespült nach dem Einbau :-)

von Karl K. (leluno)


Lesenswert?

Michael Reinelt schrieb:
> Vergiss mal vorerst den FU

Da ich nun mal drei FUs gekauft habe, muss ich die auch ausprobieren. 
Ich habe hat das Pech dass meine Wp mit 2,8 kw/h elt viel zu groß ist. 
Mit 3,0 Az wäre ich zufrieden.
> Beim hochrechnen aus der Impulsdauer verfälscht du dir sonst die Energiebilanz

Ich habe mit meiner Heizung ja leider ein ganz anderes Nieveau wie du. 
Mir kommt es daher zunächst auf die relativen Werte an. Ich habe 10 
Jahre lang den Energieverbrauch nur geschätzt. Jetzt habe ich auf deine 
Empfehlung einen Drehstromzähler für die Heizung installiert und bin mir 
meines ganzen Elends erst mal richtig bewusst geworden.

Wenn ich allerdings die Erfahrungsberichte auf HaustechnikDialog lese, 
habe ich wohl noch Glück gehabt. Das ist ja teilweise richtig gruselig.

Jedenfalls danke für deine Unterstützung.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Ich meinte damit, du solltest mal mit den Messungen beginnen, ohne 
gleich den FU mit einzubeziehen, bzw. nicht auf den FU zu warten. Um 
Messergebnisse und -Genauigkeit besser beurteilen zu können, ist es 
einfacher eine Variable konstant zu halten :-)


Viel Erfolg!

von Karl K. (leluno)


Lesenswert?

bevor alles zu spät ist...

Suche nach S0 Schnittstelle am Drehstromzähler:

Dieser hat unten rechts zwei Klemmen
20-ohne Bezeichnung
21- IA P+

gemessen habe ich mit dem Voltmeter, Ergebnis keine Spannung. Das 
ohmmeter zuckt leicht.

Meine Schlussfolgerung:
keine S0-Schnittstelle da keine eigene Spannung nur "Taster"
=> Masse an 20, 21 als Eingang an AVR

Richtig?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

karl k. schrieb:
> bevor alles zu spät ist...
>
> Suche nach S0 Schnittstelle am Drehstromzähler:
>
> Dieser hat unten rechts zwei Klemmen
> 20-ohne Bezeichnung
> 21- IA P+
>
> gemessen habe ich mit dem Voltmeter, Ergebnis keine Spannung. Das
> ohmmeter zuckt leicht.
>
> Meine Schlussfolgerung:
> keine S0-Schnittstelle da keine eigene Spannung nur "Taster"
> => Masse an 20, 21 als Eingang an AVR
>
> Richtig?

Falsch :-(

Es ist mit an Sicherheit grenzender Wahrscheinlichkeit kein taster 
(sowas gibts meines Wissens nach nicht) sondern sehr wohl ein 
S0-Ausgang.

S0 braucht eine Versorgung von ca. 24V, strombegrenzt auf..(vergessen). 
Idealerweise eine KSQ. Mit 5V kann sie funktionieren, muss aber nicht. 
Du brauchst auf jeden Fall einen Pullup-Widerstand.

Falls du eine extra 24V-Versorgung brauchst, aufpassen dass du die 
maximal zulässige Eingangsspannung des AVR nicht überschreitest!

Deshalb ist die "saubere" Variante eine Versorgung mit 24V, KSQ, 
Schutzdioden, Optokoppler.

Schau dir doch bitte mal die Schaltung an die ich oben verlinkt habe!

von Karl K. (leluno)


Lesenswert?

Michael Reinelt schrieb:
> Falsch :-(

danke

von Pisa13 (Gast)


Lesenswert?

karl k. schrieb:
> ... ein ganz anderes Nieveau wie du.

Wenn schon dann bitte "Niewo" ;-)
http://www.wie-als.de/

von Karl K. (leluno)


Lesenswert?

Pisa13 schrieb:
> karl k. schrieb:
>> ... ein ganz anderes Nieveau wie du.
>
> Wenn schon dann bitte "Niewo" ;-)
> http://www.wie-als.de/

Arschloch


Die Auswetung funktioniert.
aktuelle Anzeige:
440l/2397W



Änderungen an der Hardware:
9Volt an 21 IA P+
Pullups 10k auf ground

Änderungen software:
Eingänge WMZ und DZS als Sensor statt Taster, diverse Kleinigkeiten:
1
//+++++++ 30 sec +++++++
2
//if(sec%30==20){
3
/**/if(sec%30==12 && gbi(bool2,b2WPan)){
4
//1. Impulsauswertung  DSZ-Drehstromzähler
5
led_off;
6
7
//warten auf Impulsanfang
8
timer0_imp=1;Abbruch=0;
9
10
while(DSZ==0 && !Abbruch){
11
  if(timer0_imp>223)Abbruch=1;}//Abbruch bei Überlauf ca 10 sec
12
  lgi(10,1,timer0_imp);
13
14
timer0_imp=0;Abbruch=0;
15
while(DSZ==1 && !Abbruch){
16
  if(timer0_imp>223)Abbruch=1;}
17
  lgi(11,1,timer0_imp);
18
19
//Beginn Messung
20
timer0_imp=0;Abbruch=0;
21
while(DSZ==0 && !Abbruch){
22
  if(timer0_imp>223)Abbruch=1;}
23
  lgi(12,1,timer0_imp);  
24
//Messung Ende=Impuls Ende
25
while(DSZ==1 && !Abbruch){
26
  if(timer0_imp>223)Abbruch=1;}
27
  lgi(13,1,timer0_imp);
28
//Berechnung  Impulsdauer und kw/h aus zl_imp  R(A)= 500 imps/ kwh 
29
// 223 ticks=>7,2 sec=> 1kwh
30
//Geschwindigkeit timer0 31 ticks/sec
31
32
if(!Abbruch)strom_kw_h1000 = 223000/timer0_imp;else strom_kw_h1000 = 851;
33
34
//2. Impulsauswertung  WMZ-Drehstromzähler
35
//Frequency: F=5.5 * Q (L / Min), error: ± 2% voltage :3.5-24VDC, 
36
//current can not exceed 10mA, 330 pulses/liter,
37
//F=onstant  * units of flow (L / min) * time (seconds).
38
39
//Messung Zeit für Durchfluss 1000l/h => 92 imps/sec
40
//Geschwindigkeit timer0 31 ticks/sec
41
42
43
ww_m3hou=0;
44
timer0_imp=0;
45
while(timer0_imp<93){
46
while(WMZ==1&&timer0_imp<93);
47
while(WMZ==0&&timer0_imp<93);
48
ww_m3hou++;  
49
}
50
lgi(15,1,ww_m3hou);
51
52
//3600l/330Pulse/3*ww_m3hou
53
54
ww_m3hou=((u16)364*ww_m3hou)/100;
55
56
lgi(16,1,ww_m3hou);lw("/");li(strom_kw_h1000);lw("#");
57
58
//...

von Jürgen (jliegner)


Lesenswert?

Michael Reinelt schrieb:
> S0 braucht eine Versorgung von ca. 24V

"Braucht" ist falsch. In der Regel ist das als Open-Collector bzw. 
Open-Drain realisiert. War jedenfalls bei den Teilen so die ich bisher 
gesehen habe. In diesen Fällen reichte der interne Pullup gegen 3.3V.

von Karl K. (leluno)


Lesenswert?

Jürgen Liegner schrieb:
> Michael Reinelt schrieb:
>> S0 braucht eine Versorgung von ca. 24V
>

Ich hatte zunächst 5Volt probiert. Das war trotz deutlichem Signal für 
den AVR zu wenig. 9Volt direkt vom Trafo waren dann ausreichend. Scheint 
mir eine Art schlechter Optokoppler zu sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.