Forum: Mikrocontroller und Digitale Elektronik Impulsmessung Durchflusssensor


von Robert K. (chrysler001)


Lesenswert?

Hallo zusammen,

ich habe eine Frage zu meiner Impulsmessung.
Ich habe ein Rohrsystem mit einem Durchflussmesser. Nachdem 
Durchflussmesser ist ein Magnetventil eingebaqut. Ich möchte jetzt einen 
Impulswert von zum Beispiel 50 einstellen.
Das magnetventil öffnet sich und die erzeugten Impulse des 
Durchflussmessers sollen mit der ISR gezählt werden an Pin INT0 
(PortD2).
Dazu vernwende ich dein Arduino Uno.
Die Impulsmessung ist nur ein teil des kompletten programmes.
Nun zu meiner Frage.
Wenn ich nur 50 Impulse messen möchte bis das Magnetventil schließt, 
werden mir aber zwischen 70-100 alles angezeigt. wenn ich einen 
Impulswert von 500 - 9000 Eingebe bis das Magnetventil schließt, dann 
haut der mir nach dem schließen des Magnetvetils noch 13-16 impulse 
zusätzlich raus. So das nicht 2000 sondern 2015 Impulse gemessen worden.
Liegt der Fehler an meinem Interrput programm? Oder woran könnte der 
fehler liegen?
Ich habe im Anhang mal den Code des Interrupts zusammen gestellt.


1
#define  F_CPU 16000000UL
2
#define  baudrate 9600UL
3
#define UART_MAX_LENGTH 10
4
5
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <util/delay.h>
11
#include <string.h>
12
13
14
volatile uint16_t impuls_val = 0;
15
16
17
void uart_init (long oszi,long BAUD)
18
{
19
  UBRR0L = (unsigned char)(oszi/16L/BAUD-1);
20
  UBRR0H = (unsigned char)((oszi/16L/BAUD-1)>>8);
21
  UCSR0A = 0X00;
22
  UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);
23
  UCSR0C |= (1<< UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00);
24
}
25
26
void uart_send_c(unsigned char c_str)
27
{
28
  while(!(UCSR0A&(1<<UDRE0)));
29
  UDR0 = c_str;
30
};
31
32
33
void uart_sende_string(char* strin)
34
{
35
  unsigned char c;
36
  while((c = *strin++) != '\0')
37
    uart_send_c(c);
38
};
39
40
41
42
ISR(INT0_vect)
43
{
44
  impuls_val++;
45
}
46
47
48
49
int main(void)
50
{
51
    DDRB |=(1<<2);  //output Pin magnetventil
52
53
    PORTD |= (1<<2);    //impuls input
54
55
56
    EICRA |= (1<<ISC00)|(1<<ISC01);    // bei steigender Flanke wird interrupts ausgelöst
57
    EIMSK |= (1<<INT0);
58
59
    uart_init(F_CPU,baudrate);
60
61
62
    char buffer_impuls_val[50] = "";
63
    uint16_t impuls_input = 0;
64
65
66
    sei();
67
68
    while()
69
    {
70
        impuls_input = 50;
71
/////start der Impulsmessung ///////////////////////////
72
        uart_sende_string("Start der Impulsmessung!");
73
74
        impuls_val = 0;
75
76
        PORTB |= (1<<2);    //Magnetventil öffnen
77
78
        while (impuls_val < impuls_input)       //dauerschleife bis vergleichswert erreicht
79
        {
80
81
        }
82
83
        PORTB &= ~(1<<2);    // Magnetventil schließen
84
85
  _delay_ms(800);
86
  cli();
87
88
///////Ausgabe der ermittelten Impulse /////////////////////////////////
89
  uart_sende_string("Durchgeflossender Impulswert: ");
90
  sprintf(buffer_impuls_val,"%d",impuls_val);
91
  uart_sende_string(buffer_impuls_val);
92
93
  impuls_val = 0;
94
95
  sei();
96
97
}

von Falk B. (falk)


Lesenswert?

@ Robert Kofmane (chrysler001)

>Wenn ich nur 50 Impulse messen möchte bis das Magnetventil schließt,
>werden mir aber zwischen 70-100 alles angezeigt.

Logisch. Denkst du, dein Ventil schließt unendlich schnell?
Wie schnell schaltet das Ventil? Mit welcher Frequenz kommen die 
Impulse?

>Liegt der Fehler an meinem Interrput programm? Oder woran könnte der
>fehler liegen?
>Ich habe im Anhang mal den Code des Interrupts zusammen gestellt.

Sieht sowei OK aus.

von Purzel H. (hacky)


Lesenswert?

Zeig mal ein Foto vom System, dh dem Fluessigsystem, und gib ein paar 
Daten durch. Druck, Fliessgeschwindigkeit ..

von Robert K. (chrysler001)


Angehängte Dateien:

Lesenswert?

Im Anhang habe ich den Aufbau mal gezeichnet. Der Temperatursensor und 
der Druck ist hier nicht von bedeutung. Dieser spielt nur bei der 
Fließgescwindigkeit eine Rolle.
Druck liegt bei rund 4 bar. Die Temperatur bei rund 10-15 Grad. Dies ist 
aber nur für die ermittlung des exakten Volumenstromes notwenig. die 
Fließgeschwindigkeit ist durch den Kugelhahn einstellbar.
Ein paar viele gemessene Werte habe ich schon.

Werte bei schneller fließgeschwindigkeit:
bei 500 Impulse in 4sekunden haut er mir aber 513 Impulse raus. 500 
Impulse isnd rund 490 Miilliliter

bei 2000 Impulse in 15sekunden haut er mit 2014 und 2013 Impulse raus. 
2000 Impulse sind rund 1932 Milliliter.

Werte bei langsamer Fließgeschwindigkeit:

Bei 500 Impulsen in 28 Sekunden haut er mir 501 Impulse raus. sind rund 
518 Milliliter.

bei 2000 Impulsen haut er mir 2002 Impulse raus. das sind rund 2051 
Milliliter.


Sehr schön zu erkennen sind die verschiedenen genauigkeiten der 
ausgeflossenen Volumens. bei langsamer Fließgeschwindikeit ist es nicht 
so genau wie bei einer schnellen Fließgeschwindigkeit.
Bei langsamer fließgeschwindkeit haut er mir auch nicht so große fehler 
Impulse nach dem stopp des Magnetventils raus.

von Markus (Gast)


Lesenswert?

>Bei 500 Impulsen in 28 Sekunden haut er mir 501 Impulse raus. sind rund
>518 Milliliter.

Wie genau willst Du es denn haben? Bei gemischt analog/digitalen System 
ist eine Schwankung von +-1 nahezu unvermeidlich.

von grundschüler (Gast)


Lesenswert?

Das ist doch geradezu ein Standard-Problem, dass Sensor-Systeme 
nichtlineare Abweichungen haben. Messreihen aufstellen und das Ergebnis 
der Messreihen so gut wie möglich mit der Software erfassen.

Wenn es bei gleichen Randbedingungen zu Abweichungen kommt, musst du 
halt einen Mittelwert nehmen.

von Robert K. (chrysler001)


Lesenswert?

Meine Messwerte sollten so genau wie möglich sein! der Sensor alleine 
hat schon eine Abweichung von +-2% . bei 500 Impulsen und die Messung 
ergibt 501 Impulse, damit bin ich voll und ganz zu frieden.
Aber was mich etwas stutzig macht ist bei einer schnellen 
Fließgeschwindigkeit. Das bei 500 Impulse nicht 500 sondern 513-514 
Impulse raus kommen.
sind die 13-14 Impulse durch die Zeitverzögerung des Magnetventils 
geschuldet oder durch die Rotation der Flügelrades welches nach dem 
schließen des magnetventils erst anhalten muss?

Ich habe es mit 3 verschiedenen Sensoren probiert. jeweils 150 
Messungen.
bei schneller Fließgeschwindigkeit sind auf meinem eingabewert immer 
13-15 Impulse drauf und bei langsamer Fließgeschwindigkeit 1-3 Impulse. 
Mit diesen Werten kann ich schon gut was anfangen.

Meine zweite Frage ist, ob die zusätzlichen 13-15 Impulse nur die 
Rotation des Flügelrades nach dem schließen des magnetventils ist oder 
ob ich die 13-15 Impulse mit zu dem ausgeflossenem Wasser rechnen kann?

Da bin ich mir noch etwas unschlüssig.

von Wolfgang (Gast)


Lesenswert?

Robert K. schrieb:
> Meine zweite Frage ist, ob die zusätzlichen 13-15 Impulse nur die
> Rotation des Flügelrades nach dem schließen des magnetventils ist oder
> ob ich die 13-15 Impulse mit zu dem ausgeflossenem Wasser rechnen kann?

Welchen Zeitpunkt meinst du mit "schließen des magnetventils"?

Um raus zu kriegen, ob es eine Totzeit in deinem System ist, messe 
Zählraten und Zeiten für z.B. Vorgabe von 50, 100, 150, ..., 1000 Pulse 
und plotte das.

Mit der Erkenntnis, die du daraus ziehst, kannst du deine Vorgabewerte 
passend korrigieren.

von Clemens S. (zoggl)


Lesenswert?

Du hast 2 Probleme:
Beim start muss das rad beschleunigen und beim stop erst auslaufen lauft 
das rad nach.

Dreh mal den druchregler ganz zu, langsam auf und lanngsam wieder zu.
Und dann eine 2. Messung mit langsam öffnen und schließen des 
Magnetventils

Und eine dritte mit Magnetventil auf und Druckregler langsam zu.

Vll sieht man dann bereits dern anlauf und stoppfehler besser

Sd

von Bastian W. (jackfrost)


Lesenswert?

Wie hoch ist die viskosität deiner Flüssigkeit ?

Wenn du dir die Diagramme u.B von Kral für Spindeldurchflusszähler 
anschaust, dann siehst du das der Fehler im unteren Nereich stark 
absteigt heute langsamer der Durchfluss ist.

Du hast eine Flügelradsensor, oder ?

Du kannst ja ein Offset einrechnen , das du anhand der Frequenz 
auswählst.

Hast du nen k Faktor ( Impulse/l ) vom Hersteller für den Sensor ?

Gruß JackFrost

: Bearbeitet durch User
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.