Durchfluß messen

mcflay

Neues Mitglied
25. Feb. 2011
26
0
0
Sprachen
Hallo an alle,
mein erstes Projekt habe ich nun erstmal soweit vorbereitet,
das eine Platine erstellt wurde und ich dann das Proggie an diese anpassen werde.
Nun kann ich mich mal an einer Privatenangelegenheit bei Euch melden:D

Ich fahre ein Italienisches Dreirad.
Dieses hatte im vergangen Jahr zwei mal nen Kolbenfresser
weil die Ölpumpe für das Zweitaktöl den Dienst aufgegeben hat.
Nun möchte ich einen Druchflußmesser in die Zuleitung bauen.
http://www.conrad.de/ce/de/product/150391/
Dieser gibt mir Impulse als Siganl zum Auswerten.
Bei einer 1mm Düse sind es 10000 Impulse für 1 Liter.
Nun kommt mein Problem ich raffe nicht wie ich dieses nun dem Tiny25 klar machen soll:eek:
Außerdem soll er mich akkustisch nach einiger Zeit warnen wenn kein Signal kommt.

Würde mich freuen wenn ihr mir wieder etwas auf die Sprünge helfen könntet:D
 

Anhänge

  • Farbe neu.JPG
    Farbe neu.JPG
    66,5 KB · Aufrufe: 18
Hallo mcflay,

nun so schwer ist das nicht. Letztendlich willst Du ja feststellen und gewarnt werden, wenn nix mehr fließt. Also ich würde den Ausgang des Sensors an einen Interrupteingang anschließen, der z.B.: auf die steigenden Flanken reagiert. Mit jedem Interrupt erhöhst Du eine Zählervariable. Mit einem Timer legst Du einen "Überwachungszeitraum" fest. Im Interrupt des Timers kontrollierst Du, ob (nach gewissen Kriterien) genügend Impulse gezählt wurden und nullst den Zähler dabei. Sind nicht genug Impulse im Zeitfenster angekommen, gibst Du eine Warnung raus. Man könnte das ganze auch optisch mit einer LED-Kette signalisieren. Dann kannst Du sehen, wieviel etwa fließt (so was gab es früher beim Trabant mal für eine Momentanverbrauchsanzeige).
Leider hat der Tiny25 keinen DAC, sonst könntest Du gleich die Tonausgabe realisieren. Kannst Du aber auch mit einem zweiten Timer als PWM auf einen Ausgang machen.

Ich hoffe, ich konnte Dir Anregungen genug liefern.

Michael
 
Also ich würde den Ausgang des Sensors an einen Interrupteingang anschließen, der z.B.: auf die steigenden Flanken reagiert. Mit jedem Interrupt erhöhst Du eine Zählervariable. Mit einem Timer legst Du einen "Überwachungszeitraum" fest. Im Interrupt des Timers kontrollierst Du, ob (nach gewissen Kriterien) genügend Impulse gezählt wurden und nullst den Zähler dabei. Sind nicht genug Impulse im Zeitfenster angekommen, gibst Du eine Warnung raus.

Soweit verstehe ich das schon aber wie siehts mit der Ausführung aus,
ich habe mir schon das Datenblatt x-mal durch gelesen aber ich kapiere nicht was die von mir wollen.
Gibts kein Tutorial in Assembler wo ich mir sowas anschauen kann
und wo das auch so geschrieben wird das man es versteht.


Man könnte das ganze auch optisch mit einer LED-Kette signalisieren. Dann kannst Du sehen, wieviel etwa fließt (so was gab es früher beim Trabant mal für eine Momentanverbrauchsanzeige).

Genau so hatte ich mir das Gedacht,
es geht mir nicht darum den Tankinhalt runter zu zählen,
sonder das ich optisch ne kontrolle des Durchflusses habe.
Da der Durchflußmesser ja ähnlich wie ein Drehzalgeber funst,
hatte ich die Hoffnung da was zu finden wie sowas gemacht wird,
aber die meisten sind in C oder Bascom geschrieben
und da ich gerade erst in Assembler einsteige ist mir das umwandeln noch etwas heavy.

Leider hat der Tiny25 keinen DAC,
Hat er nicht:eek:
Hätte jetzt meinen Hintern verwetten können das im Datenblatt was darüber stand.
Oder ist das wieder zu allgemein gehalten da ja auch der 45 und 85 darinne mit aufgeführt werden?
 
Hallo mcflay,

ich habe mir schon das Datenblatt x-mal durch gelesen aber ich kapiere nicht was die von mir wollen.
Gibts kein Tutorial in Assembler wo ich mir sowas anschauen kann
und wo das auch so geschrieben wird das man es versteht.
da hat oldmax im FAQ-Bereich mal was geschrieben ...
Keine Angst vor Assembler
ist ne ganze Menge Text aber evtl hilft es schon etwas weiter.

Genau so hatte ich mir das Gedacht,
es geht mir nicht darum den Tankinhalt runter zu zählen,
sonder das ich optisch ne kontrolle des Durchflusses habe.
Da der Durchflußmesser ja ähnlich wie ein Drehzalgeber funst,
hatte ich die Hoffnung da was zu finden wie sowas gemacht wird,
aber die meisten sind in C oder Bascom geschrieben
und da ich gerade erst in Assembler einsteige ist mir das umwandeln noch etwas heavy.
Also ne Art "Drehzahlmesser" für den Durchflußsensor ist eigentlich ein
kleineres Problem. Das macht man mit nem Timer. Die Ausgabe auf ner
LED-Kette wird bei nem Tiny25/45/85 aber wegen der wenigen Pins wieder
mit zusätzlicher Programmierung zu tun haben. Da ist nen etwas größerer
Controller mit mehr Pins für Anfänger evtl besser geeignet sonst mußt du
die LEDs an ein Schieberegister (74595) anschließen und die Daten über
Bitgezappel an den Pins rausbefördern.

Zu BASCOM, C, Assembler ...
Assembler verfolgt eine ganz andere Philosophie wie bei einer Hochsprache.
Direkte Umsetzung der Programme geht zwar meißtens, kann aber bei speziellen
Konstrukten im Programm recht schnell gegen die Wand rennen. Ist also nicht
so einfach wie man sich das am Anfang vorstellt. Eine reine Entwicklung in
Assembler ist dagegen auch nicht schwieriger als in einer Hochsprache.

Hat er nicht:eek:
Hätte jetzt meinen Hintern verwetten können das im Datenblatt was darüber stand. Oder ist das wieder zu allgemein gehalten da ja auch der 45 und 85 darinne mit aufgeführt werden?
Laut der Datenbank hier im Forum hat er ADC-Eingänge.
Und laut Datenblatt ...
• Peripheral Features
– 8-bit Timer/Counter with Prescaler and Two PWM Channels
– 8-bit High Speed Timer/Counter with Separate Prescaler
• 2 High Frequency PWM Outputs with Separate Output Compare Registers
• Programmable Dead Time Generator
– USI – Universal Serial Interface with Start Condition Detector
– 10-bit ADC
• 4 Single Ended Channels
• 2 Differential ADC Channel Pairs with Programmable Gain (1x, 20x)
• Temperature Measurement

– Programmable Watchdog Timer with Separate On-chip Oscillator
– On-chip Analog Comparator
würde ich mal sagen auch ;) Aber wofür brauchst man den bei der Anwendung ?

Das größere Problem ist das er keinen 16Bit-Timer/Counter hat. Der würde
nämlich bei dieser Anwendung die Software entlasten. Geht zwar auch mit
8Bit aber dann hat man mehr Interrupts durch Timer-Überläufe die man
aufsummieren muß um auf seine 16Bit oder mehr zu kommen.

Ich würde das mit dem Timer1 und dem ICP (InputCapturePin) machen.
Schau mal im Projekte-Bereich. Da hab ich letztens nen Drehzahlmesser
gebaut. Ist zwar in Bascom und mit 7Segment aber das Prinzip ist das
selbe.

Sieh dir auch mal den Tiny44/84 an. Der hat nen 16Bit-Timer/Counter und
etwas mehr Pins. Der Tiny2313 hätte genausoviel Flash wie der Tiny25
aber auch ne Menge mehr Pins und nen 16Bit-Timer/Counter. Das entlastet
dann wieder die Software und läßt sich einfacher programmieren. Ich benutze
den Tiny2313 eigentlich recht gerne. Er hat für Bascom allerdings schon recht
wenig Flash drin. Allerdings gibt es neuerdings anscheinend von Atmel auch
nen Tiny4313 :D nur wo gibts den :( Aber in Assembler ist der Tiny2313
recht gut geeignet. Bis man 2k in Assembler voll hat kann man schon ganz
gut tippen :D

Für Anfänger am besten geeignet und universell einsetzbar ist eigentlich der
Mega8. Der hat genug Flash, SRAM, IO-Pins, Timer/Counter, ADC, ... usw.
Da kann man sich dann richtig austoben ;)

Gruß
Dino
 
Hallo mcflay,

ich weiß zwar nicht warum es nun unbedingt Assembler sein muss, aber gut. Tutos gibt es ja nun wirklich mehr als genug, nur ob die wirklich helfen?
z.B.:http://www.mikrocontroller.net/articles/AVR-Tutorial

Ich habe früher (vor 30 Jahren) auch rein Assembler gemacht, da gab es aber noch nicht so viele und vor allem brauchbare Hochsprachen. Heutzutage mach ich alles mit C. Das ist ja immer noch sehr hardwarenah, aber mal ehrlich, über die Register im Detail will ich mir keine Gedanken mehr machen müssen. Wenn Du wirklich in Assembler einsteigen willst, dann mußt Du zunächst in die Grundlagen einsteigen. Fertige Programme sind gerade in Assembler nicht so leicht zu verstehen.

Gut genug davon - mal konstruktiv.
Was braucht Du für den Start konkret:
- Interrupthandler für INT0
- Timer mit Interrupthandler
- LED an einem Ausgang
Damit würde ich beginnen. Dabei ersteinmal eine LED im Timertakt blinken lassen und wenn das läuft den Takt an INT0 hängen und zählen. Beachte den Pullup an Deinem Sensor (ich glaub der ist open collector).

Michael
 
Oh soviel Input:D
Ich fange mal mit Dino an:

Hallo Dino,
auf Assembler bin ich durch meinen Mentor Helmut Janetzke, ist glaube ich zumindest dem Dirk ein Begriff, gekommen.
Der hielt von allem anderen nicht viel und versuchte mich in die unergründlichen Tiefen der Assemblerprogramierung einzuführen.
Leider ist er letzte Woche von uns gegangen und ich stehe da wie der Ochse vorm Scheunentor.:(
Wenn ich erlich sein soll würde mir ne einfachere Sprache, also etwas wo man auch einigermaßen versteht was im Programmablauf abbrennt, lieber.
Und da ich bei Assembler ja eh noch ganz am Anfang stehe ist das erlehrnen ja eh Vorraussetzung.
Da ich etwas Erfahrund in Pascal habe würde sich Bascom anbieten und somit den Einstieg etwas erleichtern, oder sehe ich das falsch?

Die Ausgabe auf ner
LED-Kette wird bei nem Tiny25/45/85 aber wegen der wenigen Pins wieder
mit zusätzlicher Programmierung zu tun haben.
Als Prozessor den Tiny25 zu wählen war nur weil ich den in der Firma auch verwende.
Ich kann aber auch jederzeit einen anderen nehmen.
Da ich von myavr das myAVR Board MK2 vorliegen habe würde sich ja der Mega8 förmlich aufdrängen;)

von Atmel auch
nen Tiny4313 nur wo gibts den
Bei Farnell GUCKST DU

Da hab ich letztens nen Drehzahlmesser
gebaut. Ist zwar in Bascom und mit 7Segment aber das Prinzip ist das
selbe.
Habe ich schon gefunden gehabt noch bevor ich den Durchflußmesskram in meinem Kopf hatte:D
Werde mir das nochmal genauer anschauen vielleicht hilfts ja:rolleyes:
 
Nun zu Dir Michael:D
Gut genug davon - mal konstruktiv.
Was braucht Du für den Start konkret:
- Interrupthandler für INT0
- Timer mit Interrupthandler
- LED an einem Ausgang
Damit würde ich beginnen. Dabei ersteinmal eine LED im Timertakt blinken lassen und wenn das läuft den Takt an INT0 hängen und zählen.
Beachte den Pullup an Deinem Sensor (ich glaub der ist open collector).
So werde ich das mal versuchen, muß vorher nur noch den Durchflußmesser irgendwie in Betrieb nehmen sodaß ich auch was messen kann.
Mit durchpusten geht das zwar ganz gut aber da bleibt mir irgendwann die Luft weg bis es läuft:D
 
Hallo mcFlay,

also wenn Du das myavr-Board hast, nimm das für den Anfang. Da hast Du schon LEDs und sogar einen Summer drauf. Auch der Atmega8 hat keinen DAC, aber wie gesagt, Tonausgabe per Timer und PWM geht auch.

Bei Assembler kann ich leider nicht wirklich helfen, bei C schon.

Vielleicht hast Du ja das Sisy-Zeugs. Soweit ich mich erinnere, hat das schon einige Templates für den Einstieg parat.

Michael
 
Hi
Nun möchte ich auch noch ein paar Gedankenanstöße geben. Der Tiny25 sagt mir zwar nix, aber so wie ich auf die Schnelle sehen konnte, hat er 8 Anschlüsse. Nimmt man die Stromversorgung ab, bleiben noch 6 für IO. Nun weiß ich nicht, ob diese auch genutzt werden können, aber ich denke, du kannst einen für Drehzahlimpulse, einen für die Durchflußimpulse und einen für einen Ausgang nehmen. Damit läßt sich schon etwas machen....
Er wird einen internen Takt haben, das mußt du nun so hin bekommen, das du eine Timer ISR mit Vorteiler am besten auf 1 mSek. bekommst.
Bei der Drehzahl ist die Rechnung nun einfach: 60000 mSek. sind 1 Minute. Also rechnest du 60000/Zeit zwischen zwei Umdrehungsimpulsen. Damit hast du U/Min.
Dein Durchfluß ist 10000 Imp/Liter. also mußt du berechnen, wieviel Liter /Min verbraucht werden. Da grab ich mal in meinem unmermesslichem Fachwissen und überschlag das mal....
Mischung 1:50 ist 1liter Zweitaktöl auf 50 Liter Benzin. Verbrauch 10l/ 100 km heißt 0,2 Liter Zweitaktöl auf 100 Km
Angenommen, Tempo ist 100 km/h dann hab ich einen Verbrauch von 0,2 L Zweitaktöl / h = 2000 Imp/ Std ~ ca. 33 Imp/ Min
Nun kann auch hier die Zeit zwischen zwei Impulsen analog zur Drehzahlmessung durchgeführt werden. Nun kannst du ein intelligentes Programm drauf setzen, das bei hoher Drehzahl auch der Ölverbrauch steigt und dies überwachen. Auch hier hilft ein "Gedankensturm"
Nehmen wir einmal an, die Drehzahl bei 100Km/h beträgt ca. 2800 /min. Also hab ich ein Zeitfenster zwischen den Drehzahlimpulsen von ca. 21mSek.
Gleiche Annahme beim Zweitaktöl, allerdings ist hier nicht 2800 sondern die 33 einzusetzen. Ergebnis ca.1800 mSek. Teilst dunun die 1800 mSek durch die 21 mSek. erhalst du einen Faktor. (ca.85) Ausgehend davon, das das Mischungsverhältnis bei jeder Drehzahl konstant sein soll und der Verbrauch abhängig von der Drehzahl ist, so sollte dieser Faktor immer gleich sein. Ist natürlich nur eine Hypothese....
Wie macht man sowas...
Also, du hast einen Timer, dessen ISR idealerweise alle mSek aufgerufen wird.
hier zählst du die mSek. für den Durchflußmesser und für die Drehzahl jeweils auf.
Kommt ein Impuls von der Umdrehung des Motors, dann speicherst du den gezählten Wert in Variablen und setzt den Zähler auf 0.
Gleiches geschieht, wenn ein Signal vom Durchflußmesser kommt mit dem Zeitzähler für Durchfluß. Anschließend startest du in der normalen Programmschleife die mathematischen Routinen und prüfst den Faktor. Gib eine Hysterese dazu und gut. Bist du innerhalb dieser Hysterese, mach eine grüne LED an oder bist du außerhalb, eine Rote. Natürlich kannst du dann auch einen Ausgang im mSek. Takt togglen und auf einen Lautsprecher schalten. Achte dabei, das der Lautsprecher nicht unter Spannung stehen bleibt. Eventuell solltest du einen Kondensatur in die Lautsprecherleitung in Reihe schalten, dann wird der LS halt etwas leiser.
Ach ja, eine Ganzzahldivision ist gar nicht so schwer...
Code:
;-------------- Division 16 ---------------------

;*****************************************************
;* Vorlage 32Bit Division von Karl Heinz Buchegger			*
;* Vorzeichenlose 16-Bit-Division 					        *
;* Reg_AH,Reg_AL = Reg_AH,Reg_AL / Reg_BH,Reg_BL		        *
;* Reg_BH,Reg_BL = Rest							*
;***************************************************** 

Div_Word:
	clr Reg_CL
	clr Reg_CH
	Ldi YL, 16
div_Loop1: 
	LSL Reg_AL
	rol Reg_AH

	rol Reg_CL
	rol Reg_CH
	
	cp Reg_CL, Reg_BL
	cpc Reg_CH, Reg_BH

	brcs div_Loop2
	Sub Reg_CL, Reg_BL
	SBC Reg_CH, Reg_BH

	inc. Reg_AL
div_Loop2: 
	dec YL
	brne div_Loop1
	mov Reg_BL, Reg_CL
	mov Reg_BH, Reg_CH

ret
;**********************************************
Ich hoffe, dir ein wenig Licht gebracht zu haben.... oder ist es dunkler geworden ?
Gruß oldmax
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)