Forum: Mikrocontroller und Digitale Elektronik HCSR04-US-Sensoren an Atmega328P kurioser Effekt // Entstörung


von regina (Gast)



Lesenswert?

Nochmal Hallo!

Ein Problem gelöst, ein neues tritt auf: Ich möchte acht HCSR-04 
Ultraschallsensoren mit Atmega328P auslesen. Prinzipiell funktioniert 
alles soweit. Es tritt jedoch ein schwerwiegender Effekt auf. Zu 
Testzwecken habe ich erstmal nur einen Sensor angeschlossen (wobei ich 
das Programm auch schon mit mehreren getestet habe und es auch läuft, 
bis eben der Effekt auftritt) Wenn ich das Programm starte läuft alles 
gut. Über das Blinken einer Led lasse ich mir quasi den Abstand angeben, 
siehe main() im Code. Nun passiert manchmal folgendes: der Sensor (oder 
Programm) scheint sich aufzuhängen und liefert nur noch die 
Blinkfrequenz für <=10cm. Mir scheintes vor allem dann zu passieren, 
wenn ich quasi auf den Sensor haue, also schnell die Entfernung bis fast 
null verkürze (allerdings nicht näher als 2cm). Das kuriose: ich kann 
den Sensor/Programm auch wieder aus dieser Aufhängung befreien, dann 
läuft alles wie vorher. Dies scheint mir vor allem dann zu passieren, 
wenn ich einen relativ großen Abstand messen lasse. Danach läuft das 
Programm wie es soll, wenn ich davor etwas wild rumfuchtel hängt es sich 
wieder auf und läßt sich wieder befreien. Hat irgendwer eine Idee? Ich 
vermute einen Fehler in der funktion getDistanceHCSR04(), kann ihn aber 
nicht finden. Der Effekt tritt nämlich mit verschiedenen Sensoren (habe 
insgesamt 8), Kabeln und Eingängen auf. Board, Schaltplan, Testcode 
oben. Die Sensoren sind je auf einer Extraplatine mit 10uf Buffer. Alles 
hängt an einem 5v-Netzteil (liefert 5,68V, max. 40A). Die Kabel sind 
(nach außen) geschirmt, jedoch nich die Trigger/Echo Leitungen 
gegeneinander. Sind gute 0,25mm Low-Noise-Kabel. Das längste Kabel ist 
2,2m.
Ansonsten hätte ich noch eine andere Frage: Würdet ihr bei den längen 
und Kabelqualität einen LC-Filter (am Trigger-Eingang der Sensoren bzw. 
Echo-Eingang des Atmega einbauen? Hätte 10nf-Drosseln rumzuliegen, 
dachte aber, das wäre nicht nötig. Das jetzige Problemkommt daher 
vermutlich nicht.
Kurz noch zum Code: jeder Sensor hat einen Trigger- sowie EchoPin. Über 
PCI wird die Laufzeit gemessen. Der Code ist etwas unschön, viele 
#defines und switch-cases, aber mehr bekomm ich als Anfängerin noch 
nicht hin. Und bis auf diesen komischen Effekt läufts gut und schnell. 
Wenns fertig ist sollen da zwei WS2812b-Strips angeschlossen werden und 
alles so instaliert werden, dass einen über eine länge von 5m ein 
Lichtspot verfolgt.
Danke fürs Durchlesen und schönen Feierabend!

von regina (Gast)


Lesenswert?

Nachtrag:

also, weiteres rumspielen ergab: den gleichen komischen Effekt habe ich, 
wenn ich das Anschlusskabel offen lasse. Das würde auf ein Kabelproblem 
hindeuten. Allerdings: ohne irgendwas zu berühren kann ich den Effekt ja 
wieder abstellen. Außerdem: ich kann den Effekt auch manchmal, so bei 
jedem 5. Mal, hervorrufen, wenn ich den an USB angeschlossenen 
Programmer anlege. Ein Reset hilft manchmal, sehr oft, aber nicht immer. 
Bin ratlos. Würde mich freuen, wenn sich wer mal das Platinenlayout 
anschaut und ne Meinung dazu abgibt, liegt vielleicht doch nicht am 
Code, aber mir fehlt grad der Abstand um auf irgendwas kluges zu 
kommen...

von Gerd (Gast)


Lesenswert?

Ohne alles in Gänze gelesen zu haben: Kann es sein, dass ein externer 
Interrupt ununterbrochen auf Burst Signale reagiert und deswegen das 
Programm unerwartete Dinge tut?

von regina (Gast)


Lesenswert?

@gerd: ich versteh deinen Kommentar nicht ganz. Externe Interrupts 
benutze ich nicht, die PCIs schalte ich nur zur Zeitmessung an und 
direkt danach wieder aus... Und das Programm läuft auch lange gut, dann 
irgendwann nicht mehr. Einmal Reset gedrückt, und alles läuft wieder.
@alle: Wie gesagt, manchmal passiert es, wenn ich den Programmer auf 
meine ISP-Buchse stecke. Mit gestecktem Stecker machen Programme ja 
öfter komische Sachen. Warum denn eigentlich? Vielleicht löse ich über 
meinen Aufbau oder Software ja das gleiche Problem aus...

von Gerd (Gast)


Lesenswert?

Wenn dein Programm immer mal hängt, scheint es ja noch ein Problem im 
Programm zu sein. Das würde ich erst lösen. Evtl. wird ein Spezialfall 
nicht abgefangen, den man unter Umständen durch die Verkabelung auslösen 
kann oä. Mach am besten an keiner Stelle Annahmen wie (hier ganz 
Allgmeine ohne Bezug auf deinen Code): Die Variable muss ja sowieso > 0 
sein; das hier kann niemals überlaufen; Die Variable ist ja 
initialisiert; die while Schleife wird ganz sicher irgendwann mal 
aufhören; usw.

von sonic (Gast)


Lesenswert?

mein tip wäre:
gewöhne dir an, datenblätter zu lesen! ich hatte mal dasselbe problem, 
schaute ins datenblatt, fand dort, nicht versteckt, den satz:
"we suggest to use over 60ms measurement cycle, in order to prevent 
trigger signal to the echo signal". deine abfrage arbeitet unter 
bestimmten umständen im 50ms-zyklus. und dein problem passt verblüffend 
gut zu diesem hinweis, oder?
dann änderte ich meinen abfrage-zyklus und alles lief perfekt!
soll jetzt nicht arrogant klingen. ich hab auch bestimmt ein jahr 
gebraucht, bis ich den nutzen von diesen datenblättern so richtig zu 
schätzen wußte. und fand vorher die leute hier im forum, die oft als 
erstes antworten: "schau erstmal ins datenblatt" nervig. aber die wissen 
schon, was sie sagen!
viel erfolg beim rest!

von Regina (Gast)


Lesenswert?

Danke Sonic, würde wirklich einiges, eigentlich alles, erklären. Ich 
probiers nachher aus, gehe aber stark davon aus, dass das die Lösung 
ist! Zu meiner Ehrenrettung muß ich sagen: das Forum meines Vertrauens 
gibt dieses Datenblatt preis, da hatte ich auch reingeschaut:
https://www.mikrocontroller.net/attachment/218122/HC-SR04_ultraschallmodul_beschreibung_3.pdf

"Ein Messintervall hat eine Dauer von 20ms. Es können
also 50 Messungen pro Sekunde durchgeführt werden"

Da kamen mir meine 50ms mehr als doppelt sicher vor... Aber da hab ich 
vielleicht einen der billigeren Klone erwischt... In vielen anderen 
Datenblättern im Netz steht dein zitierter Hinweis.
Danke, ich geb später mal Bescheid...
Hätte ich auch selbst mal drauf kommen können, ist ja schnell 
ausprobiert...
Jetzt versteh ich Gerd auch viel besser...
Dank euch beiden!

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.