PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschallwandler ansteuern



HansP
13.01.2019, 19:20
Liebe Community,

ich arbeite gerade an einem Ultraschall-Durchflusssensor mit dem Lauftzeitdifferenz-Verfahren.
Dafür muss ich einen Ultraschallwandler mit 1 Mhz ansteuern und die Laufzeit des US-Signals messen bis es am Empfänger ankommt. Ich kenne mich mit der Steuerungstechnik leider noch nicht so gut aus.

Ich nehme an ich brauche hierfür einen Signalgenerator (?) der eine Frequenz mit 1 MHz generiert und bei einem bestimmten Zeitpunkt an den US-Sender abgibt. Dieser Zeitpunkt muss irgendwo registriert werden (Oszilloskop?). Das Eingangssignal am US-Empfänger läuft auch über das Oszi und lässt sich so vergleichen. Nur wie steuert man den Signalgenerator an? Ich habe gelesen mit Arduino ist so etwas möglich?


Benötigt man für so etwas eine Software wie z.B. LabView?
Ich bin da leider ein Anfänger und lese mich gerade erst ein. Ich weiß nur noch nicht genau wo ich anfangen soll…

Danke und viele Grüße

hardware.bas
14.01.2019, 18:35
Läuft das eventuell auf den Dopplereffekt hinaus.
1 MHz als US in das Medium einspeisen und dann
ein Stück weiter gegen die Strömungsrichtung
die US-Frequenz messen und mit der Original-
1 MHz eine Schwebung bilden. Müsste dann ohne
Software gehen. VG Micha

Ceos
15.01.2019, 06:14
soweit mir das Prinzip verständlich ist, hat man 2 US-Piezos die sich gegenüber stehen und dabei entweder durch eine passende Konstruktion mitten in Flussrichtung orientiert sind oder in einem sehr flachen Winkel dazu.

Man sendet einen Puls von A nach B und dann noch einen von B nach A, die Laufzeitdifferenz ist dann die Mediengeschwindigkeit x 2

Beim Dopplerverfahren ist die Konstruktion ähnlich aber dabei misst man die Frequenzverschiebung. Welches davon präziser ist kann ich nicht im Detail sagen, aber ich schätze dass es einfacher ist den Laufzeitunterschied zu erfassen als die Frequenz zu ermitteln.

Beim Laufzeitverfahren wird auf jeden Fall nur gepulst und dafür sendet man üblicherweise nur einige Spannungspulse an den Piezo damit dieser einen Ping aussendet aber man regt ihn nicht dauerhaft an.

Steht im Datenblatt der verwendeten Piezos nicht eventuell eine ideale Anregungskurve dabei? Zur Not beim Hersteller einfach mal Anfragen was empfohlen wird, die sind sicher Auskunftsfreudig.

1MHz ist schon ein wenig heftig wenn man die Pulse einzeln generieren will, ich habe hier z.B. einen 400kHz Piezo und der wird von einem XMega @32Mhz per Timer PWM gesteuert welcher vom DMA pro Timer Umlauf einen neuen TOP und COMPARE Wert bekommt und das arbeitet schon grenzwertig, bei 1Mhz brauch man vermutlich schon was potenteres.

Aber wenn der Piezo auch mit gleichbleibender Frequenz angesteuert werden kann und dabei ein ausreichend starkes Signal für dich produziert, kannst du einfach einen PWM Ausgang benutzen, ihn auf die Frequenz einstellen und dann den Ausgang einfach Zeitdefiniert an und ausschalten.

Es muss kein Sinus sein, ein einfaches Rechteck reicht (meist noch nicht mal mit einem Duty Cycle >30% aber das ist Piezoabhängig)

HansP
15.01.2019, 08:15
Ja das mit der Laufzeitdifferenz stimmt.

Aber mein erster Schritt wäre erstmal zuschauen ob ich den einen überhaupt ansteuern kann und dann auch mit dem anderen etwas empfange, also nur Funktionsprüfung in Luft.

Der verwendete US-Wandler ist der hier:
https://www.piezohannas.com/1MHz-ultrasonic-transducer-for-heat-meter-pd6778350.html

maximum operating voltage: <200V

Wieso ist ein 1MHz besonders heftig? Andere Hersteller bieten auch Durchflusssensoren in sehr kleinem Maßstab an, z.B. als Clamp-on-Sensor von Sonoflow:
https://www.sonotec.de/produkte/nicht-invasive-fluessigkeitsueberwachung/durchflussmessung/sonoflow-clamp-on-sensor/

Deswegen dachte ich, dass das die Ansteuerung problemlos möglich ist.

Aber Danke für die Antworten, das hilft mir schonmal weiter. Ich werde mich heute in der Abteilung umhören wie ich das anstellen kann.

Viele Grüße
Hans

Ceos
15.01.2019, 08:49
Wieso ist ein 1MHz besonders heftig?

Okay unklar formuliert, sorry XD
Ich meine eine Pulsfolge mit 1Mhz aus einem 16Mhz Prozessor zu generieren ist heftig (zumindest wenn man es manuell pulsen will und jeden Puls dabei individuell variieren möchte um maximale Sendeleistung zu bekommen)

Meine 2te Idee war ja dass du einfach den PWM Ausgang eines Arduino nimmst den auf 1MHz stellst mit ner Duty Cycle von zunächst 10% (später steigend) und dann den Piezo (Mit Treiberstufe dazwischen, 3.3V bzw. 5V werden wohl nicht reichen, aber as hängt vom Piezo ab) einfach über Pin Enable und Disable (oder eine Enable Leitung am Treiber) nur eine Hand voll Pulse gibst. Denn dauerhaftes anregen bringt ja nichts in deinem Fall :)


PS: die haben da aber eine extrem spärliche Doku zu ihren Produkten ... sehr ungeil mMn

PPS: In Luft könnte das schwierig werden, die Piezos müssen üblicherweise an das Medium angepasst sein, ob du da überhaupt ein Signal raus und wieder rein bekommst kann cih dir garnicht mal sagen, aber wenn ich einen Luft Wandler in Wasser halte kommt da kaum ein Ton raus (Meine Erfahrung mit schaumvergossenen Luftwandlern)

wkrug
15.01.2019, 09:36
Evtl. ist die Dopplereffekt Methode doch einfacher.
Man könnte ja das Sendesignal mit einem Ringmischer mit dem Empfangssignal vermischen.
Als Mischprodukt müsste dann eine Frequenz im NF Bereich entstehen, die der Fließgeschwindigkeit entspricht.
Ob die Frequenz hoch genug ist um die sinnvoll auszuwerten müsste man ausrechnen.
Bei den Radarsensoren wird das aber üblicherweise so gemacht.

Ceos
15.01.2019, 10:08
Ich versuch mir das gerade immernoch krampfhaft vorzustellen, ob das überhaupt funktionieren kann.

Wenn ich und der Krankenwagen still stehen und der Wind bläst in meine Richtung .... erlebe ich dann überhaupt einen Dopplereffekt?

Eine Dopplermessung würde doch ausschließlich funktionieren wenn ich reflektierende Partikel oder Blasen im Medium hätte oder hab ich grad einen Denkfehler?

wkrug
15.01.2019, 13:07
Eine Dopplermessung würde doch ausschließlich funktionieren wenn ich reflektierende Partikel oder Blasen im Medium hätte oder hab ich grad einen Denkfehler?
Laut Wikipedia geht es:
https://de.wikipedia.org/wiki/Ultraschall-Durchflussmesser

Das Prinzip ist da nicht genauer beschrieben, aber ich vermute, das sich Sender und Empfänger auf einer Seite befinden müssen.
Dann fliesst das Medium im Prinzip vom Sender und Empfänger quasi weg.

Die Laufzeitdifferenzmessung find ich auch intressant!

Entweder vertauscht man dabei die Funktion von Sender und Empfänger jeweils.
Oder man nimmt 2 Empfänger die im gleichen Abstand vor und hinter dem Sender liegen.

Ceos
15.01.2019, 14:06
Ah ja den Artikel hatten wir schonmal hier :D


aufgrund der Fließgeschwindigkeit der (inhomogenen) Partikel im Medium erfasst. Hierzu werden im Medium Reflexionspunkte (Verschmutzung, Luftbläschen) benötigt.

HansP
15.01.2019, 14:42
@Ceos:
ah ok ich verstehe. Ja stimmt an dem Piezo ist eine Anpassungsschicht, die an das entsprechende Medium angepasst ist. Ich weiß auch nicht was passieren wird, wenn nicht stelle ich den Versuchsaufbau ins Wasser :D

@wkrug:
ja es müssen Partikel oder Luftblasen vorhanden sein, deswegen habe ich mich für das Laufzeitverfahren entschieden, da unter anderem auch reines Wasser gemessen werden soll.

Ceos
15.01.2019, 15:14
und wenn man wie im wiki-bild reflexiv misst, könnte man sogar beide verfahren machen, aber bei dem aufbau ist der messhub mikrig, lieber direkt in strömungsrichtung messen oder im spitzen winkel

fliesskomma
17.02.2019, 16:11
Hallo Hans,
per Ultraschall ist das Laufzeitverfahren das einzig Mögliche. Das hast Du schon richtig gewählt.
@Alle Anderen
Doppler ist quatsch, denn es wird ja kein Schall vom Partikel zum einleitenden Transceiver zurück reflektiert. Doppler geht nur, wenn Sender und Empfänger am selben Ort lokalisiert ist und das zu messende Partikel sich (idealen Fall) im Längsabstand dazu bewegt. Im Laufzeitdifferenzverfahren, mit in Strömungsrichtung versetzten Transceivern, tritt der Dopplereffekt natürlich auch ein. Dummerweise aber spiegelbildlich. Denn die Frequenzverschiebung bei Schalleinleitung des Senders hebt sich spiegelbildlich bei der Ausleitung in den Empfänger wieder auf.

Und jetzt konstruktiv weiter...
Die Frequenzerzeugung sollte mit einem Arduino gut gehen. Der normale UNO, oder Nano mit 16MHz Takt hat 3 Timer, wobei Timer0 für einfaches Timing mittels millis() usw. verwendet wird. Timer1 (16Bit) und 2 (8Bit) stehen zur freien Verfügung. Und ein MHz steht im geradzahligen Verhältnis zu 16MHz. Ich würde Timer1 im CTC Verfahren verwenden, weil Timer1 zusätzlich über ein Input Capture Register verfügt. Grundsätzlich, während ein Timer hochzählt, zählt er von BOTTOM (=0) entweder bis zu MAX (0xFF bei 8Bit und 0xFFFF bei 16Bit), läuft über und beginnt von vorne. Es sei denn, es gibt einen Vergleich mit einem Registerwert kleiner als TOP. Dieser Wert nennt sich dann MAX. Bei Timer1 eignen sich dazu 3 Register: OCR1A, OCR1B und ICR1. Wobei OCR1A und OCR1B jeweils den Ausgangspins OC1A = D9 und OC1B = D10 zugeordnet sind. In den Registern TCCR1A und TCCR1B (Datsheet) befinden sich mehrer WGM- und COM-Bits .



Interrupts ausschalten: cli();
Register zurücksetzen: TCCR1A = 0;m TCCR1B = 0; TIMSK1 = 0;
Prescaler mittels CS10 Bit auf 1 setzen, damit im 16MHz (62,5ns) Takt gezählt wird. 8 x 62,5ns = 500ns = 1 eine Halbwelle von 1MHz.
TCCR1B |= (1<<CS10);
Mit den WGMs bestimmst Du den Timermode (Hier 4 oder 12) und welches Register für TOP herangezogen wird (Hier OCR1A, oder ICR1).
TCCR1B |= (1 << WGM12); // Mode 4 = CTC => OCR1A sets TOP
Verhalten des Ausgangspins auf toggle setzen
TCCR1A |= (1 << COM1A0); //Toggle OC1A
Counter Zählregister auf 0 setzen.
TCNT1 = 0;
OCR1A auf TOP setzen
OCR1A = 7; //0-7 = 8 Takte => 1MHz
Interrupts scharf schalten
sei()


Anschließend kommt aus Pin D9 des Arduino 1MHz, egal was in Deinem Hauptprogramm läuft. Gehe mal auf die Webseiten von Nick Gammon. Da gibts viele gute Beispiele.

Hab den Code getestet.
---
Eine Frage, was kostet der Ultraschalltransceiver? Und welche Bezugsquelle und Lieferzeit?
Und vlt noch, hast Du ein Datenblatt mit der Sendeschalleistung und welche Spannung (VSS) er sehen will?
Es gibt diese Bridge-Motor-Driver ICs ULN...irgendwas. Die können größere Spannungen bis über 100kHz treiben. Ob 1MHz geht, weiß ich nicht.

Viel Grüße und Erfolg bei der Umsetzung, Rainer



//############ Code Begin ##############
//Timer1. Variable Square-Wave-Generator
//Objective: Use CTC Mode. OCR1A sets TOP

uint16_t TOP = 7;

void setup() {
Serial.begin(115200);
pinMode(9, OUTPUT);//Signal output
//pinMode(10, OUTPUT);
cli();
TCCR1A = 0; //Reset the register
TCCR1A |= (1 << COM1A0); //Toggle OC1A

TCCR1B = 0; //Reset the register
TCCR1B |= (1 << CS10); // Prescaler = 1
TCCR1B |= (1 << WGM12); // Mode 4 = CTC => OCR1A sets TOP

TCNT1 = 0;

OCR1A = TOP;//Set output Compare Register. OCR1A defines TOP;

sei();
Serial.println("1MHz Beep running...");
}

void loop() {

}
//############ Code End ##############