Forum: Mikrocontroller und Digitale Elektronik Ultraschall Überlegungen für Software


von chris (Gast)


Lesenswert?

hallo im forum

habe mir eine schaltung sender/empfänger für ultraschall 
zusammgebastelt, funktioniert auch ganz gut.

nun zum problem, irgendwie steh ich bei der sofware auf dem schlauch,

setze timer0 vom tin2313 (20MHz) ein und weiss das der schall bei 340m/s 
rund 29,4µs braucht für 1cm.
(angestrebte genauigkeit sollte 1cm sein optimieren kann man immer noch)
also routine so geschrieben das der timer bei 29,4µs einen int generiert 
und dann immer plus 1 rechnet, im studio getestet ja so gehts.

leider sind die empfangenen werte bisschen komisch denn ergebniss ist
47m 50cm, 50cm haut auch hin aber die 47m frage ich mich wo die 
herrkommen???

was sollte/muss unbedingt bei dem programm noch beachtet werden????

von STK500-Besitzer (Gast)


Lesenswert?

Zeig deinen Code!

von chris (Gast)


Angehängte Dateien:

Lesenswert?

oh die vorschau muss man sich erst dran gewöhnen aber hier ist er

von Karl H. (kbuchegg)


Lesenswert?

Seh ich das richtig:
  Am PORTD, Pin 5 hängt der Sender. Sobald der Pin auf 0 geht, fängt
  der zu senden an

  Am PORTD, Pin 6 hängt der Empfänger. Sobald der etwas empfängt, geht
  der Pin auf 0


PS: Du machst es einem nicht gerade leicht den Code zu verfolgen.

von Karl H. (kbuchegg)


Lesenswert?

Wie stellst du eigentlich den Messwert fest?

Ich würde auf jeden Fall mal das 0-setzen der Variablen vor den ersten 
Puls ziehen und nicht danach und mich nicht darauf verlassen, dass das 
alles beim Power-On des Prozessors schon 0 sein wird.

von chris (Gast)


Lesenswert?

ja genauso funktioniert
pull-ups hab ich auch schon drüber nachgedacht habs ausprobiert und es 
gab dort kein unterschied

ist dieser ansatz denn so realisierbar oder suboptimal????

ähm die ganzen ausgaberoutinen hab ich weggelassen damit die übericht 
bisschen besser wird aber was meinst du mit:

"Du machst es einem nicht gerade leicht den Code zu verfolgen."

von chris (Gast)


Lesenswert?

den messwert stell ich anhand der zeit fest:

start -> timervorbereiten -> signal senden und tccr0b setzen ->
timer läuft (29,4-30µs) -> nach dieser Zeit ein interrupt ->

dann zeit neu laden
in der routine
+1 was gleich 1cm ist
pind6 weiter pollen warten bis gesetzt


pind6 gesetzt dann zu stopp springen
werte auslesen ausgabe 10s warten

rjmp start

hoffe das es jetzt ein wenig verständlich ist

von Karl H. (kbuchegg)


Lesenswert?

chris schrieb:
> ja genauso funktioniert
> pull-ups hab ich auch schon drüber nachgedacht habs ausprobiert und es
> gab dort kein unterschied

Hast du schon mal mit einem Oszi die Zeit zwischen Sender-Statr und 
Empfänger-Echo ausgemessen?

> ist dieser ansatz denn so realisierbar oder suboptimal????

Sieht für mich nicht so schlecht aus.

> "Du machst es einem nicht gerade leicht den Code zu verfolgen."

Ich werd zb. jetzt nicht die Konfigurationsbist auseinanderpfriemeln um 
zu sehen wie du deinen Timer/Interrupt konfigurierst.

Du verwendest an manchen Stellen Hex Zahlen, bei denen ich mich 
minutenlang gefragt habe, was das eigentlich soll. Zb in der ISR 
vergleichst du cm mit $64. Ich hab mich jetzt gefragt was das soll, was 
ist die spezielle Bedeutung von $64? Draufgekommen bin ich erst im 
Nachhinein, beim weiteren Analysieren. Du zählst cm und m getrennt. 
Warum schreibst du das dann nicht einfach

    cpi    temp0, 100    ; 100 cm sind ein Meter

und gibst damit einen Hinweis an den Leser was hier passiert.

Die Subroutine ganz unten, wer braucht die? Niemand, wenn du den 
Timer-Konfigurier und Startcode an die Aufrufstelle gleich einfügst, 
muss man beim lesen nicht im Hinterkopf halten, woher das jetzt 
aufgerufen wurde, welche Bedeutung das hat, den Code absuchen, obs noch 
wo einen 2.ten Aufruf gibt. etc.

Auch hat sich der Messcode, beginnend mit dem Setzen des Senders und 
Abbruch durch den Empfänger, als zentrale Stelle der eigentlichen 
Messung eine etwas bessere optische Hervorhebung verdient. Alles andere 
ist nur Geplänkel rundherum, aber dort ist das Herz deines Programmes. 
So hab ich erst mal den Code 3 mal rauf/runterscrollen müssen, um zu 
finden, wo denn eigentlich die Messung abläuft.
Vor diesem Herz sollten alle gemessenen Variablen auf 0 gesetzt werden, 
danach kommt die Auswertung. Das wär zumindest für mich logisch. Bei dir 
muss ich 3 mal rumscrollen um rauszufinden ob die Variablen überhaupt 
auf 0 gesetzt werden.

etc. etc.

PS: Das erklärt zwar nicht die 40m, aber ich kann deine Berechnung nicht 
wirklich nachvollziehen.
20000000/8/256 = 9765. Kehrwert davon 0.0001024 Sekunden. In diesen 
Zeitabständen wird der Timeroverflow aufgerufen. Wie kommst du auf 
29,4µs?

von Karl H. (kbuchegg)


Lesenswert?

Aber summa summarum: Funktionieren müsste es.

Fehler in der Ausgaberoutine?

von chris (Gast)


Lesenswert?

ja gut ist ein wenig eigensinnig der code aber hinweise zur kenntnis 
genommen :-)

geg:
f=20Mhz
Teiler=8 im tiny im tccr0b einstellbar durch $02 oder 2, pdf tiny2313 
S.111
bits=74

gleichung um timer vorzuladen

1/(f/T/bit) = 1/(20Mhz/8/74) = 29,6µs -> 256-74 = 182 muss im tcnt0 
stehen

von Karl H. (kbuchegg)


Lesenswert?

chris schrieb:
> 1/(f/T/bit) = 1/(20Mhz/8/74) = 29,6µs -> 256-74 = 182 muss im tcnt0
> stehen

Ah, das Vorladen hab ich übersehen.

von Tobias (Gast)


Lesenswert?

Stimmt denn deine Taktfrequenz? in deinem Code gibst du ganz oben an, 
dass die CPU auf 4Mhz läuft. Und hier in deinen Angaben sagst du dass du 
20Mhz verwendest.

von chris (Gast)


Lesenswert?

ja stimmt auch 20mhz habe nur mal wieder vergessen es oben einzutragen 
da ich std mit 4mhz arbeite

von chris (Gast)


Lesenswert?

wie lange brauchen die piezoelemente bis sie ein/ausgeschwungen haben???
im datenblatt von ust40r/t ist leider nichts drüber zufinden

bei den leuten von roboternetz habe ich das ein oder andere gelesen, 
dass die erst senden(2,5ms) und nach 1,25ms den timer setzen da das 
übersprechen wohl sehr stark ist und nach der hälfte der zeit die 
amplitude so schwach ist das jetzt erst nach dem schall detektiert wird.

von chris (Gast)


Lesenswert?

ja gut leute denn kann ich ertsmal davon ausgehen das die software zwar 
den ein oder anderen fehler hat aber nichts dramatisches

danke für die hilfe und einen schönen pfingstsonntag noch

gruss chris

von chris (Gast)


Lesenswert?

Hallo Leute,

nach dem ihr mir den ein oder anderen Tip gegeben habt läuft die 
Software + Hardware schon recht gut, nun hab ich aber doch noch ein paar 
Fragen:

1. Sollte das Tastverhältnis 50:50 sein oder kann auch tan=30: taus=70 
sein???(40Khz)

2. zu Testzwecken teste ich die Schaltung erstmal frei im Raum mit einer 
Pausenzeit zur nächsten Messung von 3s.
Wie entscheidend ist die Fläche auf die das Signal trifft??
Im Moment 400x150x15mm Aluplatte.

3. Leider habe ich eine Abweichung bei 40cm gemessen 50-55cm
   bei 60cm schwankt der Wert so von 76cm-96cm
   Was könnte dort die Ursache sein oder sollte der Test nur im Rohr 
durvchgeführt werden???

von Markus K. (markus-)


Lesenswert?

chris schrieb:

> 1. Sollte das Tastverhältnis 50:50 sein oder kann auch tan=30: taus=70
> sein???(40Khz)

Das sollte schon 50:50 sein. Du bringst doch mit dem Strom einen Piezo 
zum schwingen und der will vorzugsweise sinusförmig schwingen. Warum 
willst Du es überhaupt ändern?

> 2. zu Testzwecken teste ich die Schaltung erstmal frei im Raum mit einer
> Pausenzeit zur nächsten Messung von 3s.
> Wie entscheidend ist die Fläche auf die das Signal trifft??
> Im Moment 400x150x15mm Aluplatte.

Das sollte schon reichen.

> 3. Leider habe ich eine Abweichung bei 40cm gemessen 50-55cm
>    bei 60cm schwankt der Wert so von 76cm-96cm
>    Was könnte dort die Ursache sein oder sollte der Test nur im Rohr
> durvchgeführt werden???

Sowohl der Sender als auch der Empfänger schwingen langsam ein. Das 
dauert mehrere Wellenzüge bis die die volle Amplitude erreichen. Dein 
Empfänger wird typischerweise irgendwo mittendrin (nachdem schon die 
ersten paar schwachen Wellen empfangen wurden) entscheiden, dass das 
Signal jetzt stark genug ist und erst dann ein Signal an den µC geben 
(evtl. passiert das auch durch die Schwelle des Timer-Eingangs). Wenn 
das Signal nun einmal stärker und einmal schwächer ist, dann beendet der 
Zähler seine Arbeit eben mal früher und mal später. Der Effekt sollte 
eigentlich nicht so stark sein wie Du ihn beschreibst, außer Du hältst 
die Aluplatte oder den Sender mit der Hand und bei jeder Messung ist der 
Winkel Sender/Aluplatte anders.

von chris (Gast)


Lesenswert?

Markus Kaufmann schrieb:

Das sollte schon 50:50 sein. Du bringst doch mit dem Strom einen Piezo
zum schwingen und der will vorzugsweise sinusförmig schwingen. Warum
willst Du es überhaupt ändern?

leider gibt es meine schaltung nicht her genau 50:50 einzustellen, ist 
mehr bei 30-40:70-60, deshalb muss ich mir dafür was anderes überlegen.

ich werde es auf jedenfall mit 50:50 probieren und wieder berichten

An alle ein frohes Fest und ein guten rutsch ins neue Jahr.

von Markus K. (markus-)


Lesenswert?

chris schrieb:

> leider gibt es meine schaltung nicht her genau 50:50 einzustellen, ist
> mehr bei 30-40:70-60, deshalb muss ich mir dafür was anderes überlegen.

Es wird mit einem anderen Tastverhältnis wahrscheinlich schon 
funktionieren, aber die Ergebnisse werden eben schlechter als mit 50:50 
sein.

von chris (Gast)


Lesenswert?

so nun hauts mich vom Hocker !!!!! :-ö

Habe mal ne astabile Kippstufe aufgebaut um die 41Khz so das ich das 
Tastverhältnis sauber auf 50:50 einstellen kann, noch minimale Änderung 
im Programm vorgenommen alles verbunden und siehe da, ein Steigerung um 
100%.

Mit der alten Sendeschaltung schwankten die Werte wie erwähnt sehr stark 
und Abstand zum Empfänger kleiner 15cm totaler Müll im Display

Mit der neuen Schaltung stehen die Werte sauber im Display nach jeder 
Messung ohne Schwankungen, im Moment leider nur 10-30cm, ich glaube ich 
muss den Empfänger empfindlicher kriegen!!!!

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo und ein gesundes neues Jahr

erstmal das was ich abhacken kann, sind Sender und Software arbeiten 
zuverlässig und stabil.

Als Empfänger (Ub=10V) habe ich 4x Transistorverstärker 
Spannungsverstärkung rund 92, leider kann ich nur mit 2 Stufen arbeiten, 
da ab der dritten sich das Ding aufschwingt (oder was anderes tut) und 
am Ausgang 250Khz macht.

1. Wo kommen die 250Khz her??? sollte die 3te/4te Stufe etwas weniger 
Verstärken?????

Ich hatte mir vorher überlegt das ich noch ein Bf980 dazu nehme, um die 
Verstärkung in Abhängigkeit der Regelspannung zu regeln. (s.B. X7)

Ohne Regelspannung, X2-X6 verbunden, Entfernung im Raum rund 10-150cm 
nen plus is noch drin aber das sind die stabilen Werte.

Mit Regelspannung X2-X10, X11-X6, X7-X12 verbunden, man kann rund 20cm 
drauf rechnen im Vergleich ohne Regelspannung.

D.h 20cm * 58µs= 1,2ms braucht die Regelung um zu arbeiten oder sehe ich 
das Falsch?????

2. Wie würdet ihr die Nachführung realisieren oder verbessern????

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.