Forum: Mikrocontroller und Digitale Elektronik Entprellen eines Piezo-Mikrofons + BC547


von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

Hallo,

wenn man einen Taster entprellt, hat man ja immer die klassische
Signalfolge: Sagen wir erst mal NULL, dann mehrfach abwechselnd
kurze Null und Eins und dann nach einer gewissen Zeit, sagen wir
10-20ms konstant Eins. (Wenn ich es richtig verstanden habe)

In meinem Fall habe ich aber das durch einen BC547 verstärkte
Signal eines Piezo Kistall-Mikrofons. Bei Geräuschanregung bringt
das ein völlig anderes Signal. Ein chaotisches Rauschsignal,
dass sich nach der Erregung wieder abschwächt. Also tausende
von steigenden und fallenden Flanken, aber eigentlich nie
den Zustand, dass es über längere Zeit Eins (oder Null, je
nach Widerständen) bleibt.

Wie kann man denn so ein Signal entprellen?
Mein Signal soll übrigens INT0 triggern.

Danke für die entscheidenden trickreichen Hinweise:)))

VG
Karl

von Gast (Gast)


Lesenswert?

Signal einfach mit Kondensator passender Größe glätten/mitteln?

von Stefan Salewski (Gast)


Lesenswert?

Gleichrichten und über einen Tiefpass schicken, oder auf einen 
Spitzenwertdetektor geben wäre eventuell ein Möglichkeit.

von holger (Gast)


Lesenswert?

>Ein chaotisches Rauschsignal,
>dass sich nach der Erregung wieder abschwächt. Also tausende
>von steigenden und fallenden Flanken, aber eigentlich nie
>den Zustand, dass es über längere Zeit Eins (oder Null, je
>nach Widerständen) bleibt.

Das nennt man Schall. Wenn du den Mund aufmachst und redest
kommt ja auch nicht nur ein Knack raus.

>Wie kann man denn so ein Signal entprellen?

Pegel messen. Mittel/Spitzen/Effektivwert.
Such dir was aus.

>Mein Signal soll übrigens INT0 triggern.

Such mal nach Klatschschalter.

von Frank (Gast)


Lesenswert?

Mit einem sog. "nachtriggerbaren Monoflop", falls du den Pegel hoch 
genug bekommst, um den auszulösen.

Frank

von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

@Gast
>>Signal einfach mit Kondensator passender Größe glätten/mitteln?

Derzeit habe ich aus dieser Schaltung:
http://www.mikrocontroller.net/attachment/42571/klatschschalter.jpg
den Teil aus BC547 und den beiden Widerständen (aber ohne das Poti,
dafür aber ein 220K-Widerstand) herausgenommen und alles verlötet.

Die Signale werden wunderbar verstärkt und die Empfindlichkeit ist
perfekt. Nur halt die vielfachauslösungen stören. Zuerst habe ich
mir überlegt, dass ich in der Interupt-Routine direkt nach dem
ersten Trigger den betreffenden Interupt sperre und diesen dann
beim Timerinterupt, der pünktlich jede Sekunde eintrifft, wieder
freigebe. Aber bevor ich das umgesetzt habe, habe ich in diesem
Forum gesucht und das scheint wohl nicht so eine gute Idee zu sein,
bei diesen hohen Triggerfrequenzen.

Wenn ich jetzt hinter der Verstärkerschaltung einen Kondensator
parallel zum BC547 Emitter-Kollektoranschluss schalte, dann müsste
der Kondensator im Ruhezustand immer schön voll sein, um dann im
Moment des Triggers vom leitenden Transistor auf nahezu Null gezogen
zu werden. Macht der BC547 dann wieder dicht, könnte ich der Kondensator
wieder über den Widerstand oben (wo in der Schaltung das Poti sitzt)
wieder aufladen. Je nach Kombination von Kondensatorgröße und Widerstand
oben müsste der Kondensator sich dann mehr oder weniger schnell 
aufladen.
Die Berechnung könnte ich nach dem gleichen Verfahren machen, wie im
Tutorial zur Hardware-Entprellung.

Ist das richtig so?

Der Nachteil an der Sache ist der: Wenn der BC547 nicht voll
oder nicht lange genug durchschaltet , weil z.B. das Geräusch nur
sehr leise oder sehr kurz ist, dann könnte es doch sein, dass er
sich bei einem sehr kurzen Impuls nicht weit genug entlädt, um
überhaupt ein gültiges Signal für den Controller zu erzeugen,
während es ohne Glättung stark genug wäre.


@Frank
Danke für den Hinweis. Aber diese Schaltung ist mir NOCH zu
aufwendig. Erst mal versuchen, ob es nicht auch einfacherere
Lösungen gibt.

@Holger

Wenn ich das Signal gleichrichten muss, gehen durch die Dioden
wieder 2*0,7V  (Brückengleichrichter) verloren. Dann bin ich ganz
schnell wieder unterhalb der Schwelle,bei der der Controller eine
Eins erkennen kann.


Irgendwie ist mir sowieso nicht klar, dass die Schaltung überhaupt
funktionieren kann, weil die Spannung an der Basis muss doch
mindestens 0,7V betragen, damit überhaupt ein Steuerstrom fließen
kann. ???  Mein Piezo bringt aber nur im Extremfall 0,3V. Bei den
Signalen, die ich detektieren will sogar nur paar Millivolt.
Eigentlich ein Wunder dass die Schaltung überhaupt funktioniert.

von H.j.Seifert (Gast)


Lesenswert?

wenn du mal genau schaust, ist da ein Widerstand von 10M...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Vielleicht hättest Du meinen Beitrag aus Deinem anderen Piezo Thread 
nicht völlig ignorieren sollen.

von kurz (Gast)


Lesenswert?

Stell Dir doch mal die grundsätzliche Frage:

Warum willst Du "entprellen"?


Entprellen dient dazu:

a) kurze Störimpules nicht als Tastendruck auszuwerten, also zu 
ignorieren
b) prellenede Tasten nur einmal als gedrückt zu erkennen


Was liegt bei Dir vor?

Hast Du einen Signalverlauf, bei dem Deine Schaltung ein High rausgibt, 
ohne, daß der uP reagieren soll (Fall a)?

Denke nach Deiner Beschreibung zu gehen: nein.

Fall b liegt vor. Deine Idee den erkannten Interrupt für eine gewisse 
Zeit zu sperren ist doch nicht schlecht.


Ich würd ja keinen Interrupt für so ne Aufgabe verwenden.

- im HP ein Port pollen
- Signal erkannt
- Funktion auslösen
- eine Zeitvorgabe starten (Zähler in der HP-Schleife reicht völlig)
- Pollen des Eingangs sperren (Variable)
- nach Ablauf des Zählers (der Zeit) das Pollen wieder freigeben

und gut.

von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

Hallo Kurz,

mir ist klar, was entprellen ist. Bei mir gilt Fall B, also eine
prellende Taste soll nur einmal erkannt werden. Wobei die prellende
Taste (mein verstärktes Piezo-Signal) in kürzester Zeit sehr viele
Interupts auslöst (sagen wir 20-30) , wo ich eigentlich nur
ein Auslösung haben will. Zwischen zwei Interupts soll mindestens
ungefähr eine Sekunde vergehen.

Interupts verwende ich deshalb, weil ich die Schaltung an Knopfzellen
betreiben muss. Also muss Strom gespart werden, wo es nur geht.
Zwischen den sekündlichen Timerereignissen und zwischen Triggern
des Piezos sollte der Mü also möglichst schlafen.

@ H.j.Seifert:
Das ist vielleicht ein eintscheidender Hinweis, warum auch
kleinere Spannungen als 0,7V schon verstärkt werden können.
Durch die Beiden Widerstände 10M und 220K (in meiner Schaltung)
und durch den Innenwiderstand des Piezos wird die Spannung
so "vorgeteilt", dass im Ruhezustand des Piezos genau die
0,7V an der Basis anliegen. Wenn an der Spannungsteiler-
schaltung, die sich aus den beiden oberen Widerständen und
dem Piezo genau die 0,7V an der Basis ergeben, dann müsste
jede noch so kleine Spannungsänderung am Piezo bereits
eine Änderung des Widerstandes Rce ergeben und das dann
wiederum zu einer Veränderung des Spannungspegels am
Kollektor ergeben.  Ist das so korrekt?



Wenn die Schaltung optimal funktionieren sollte, müssten
die Widerstände oben genau auf den Innenwiderstand des Piezos
abgestimmt werden. Deshalb vielleicht auch das Poti! Ich dachte
bisher, das wäre nur die Empfindlichkeitseinstellung. Werde
nacher den Gleichstromwiderstand des Piezos ausmessen und
berechnen, wie groß die Spannung an der Basis und damit der
optimale Widerstand oben sein müsste. (weil ich ja kein Poti
hier habe)


Travelrec, vielleicht bin ich einfach nicht ahnungshabend
genug, um die entscheidenden Punkte zu erkennen.

Ich versuche die Entprellung gleich mal mit dem Kondensator
parallel zu Kollektor und Ground und schaue mal am Oszi, was
dabei rauskommt. Optimal wäre es ja, wenn die Schallsignale
in der richtigen Lautstärke es schaffen würden, den Transistor
zum Durchschalten zu bewegen, so dass der Kondensator komplett
entladen wird, und dieser sich in etwa einer Sekunde wieder
aufladen würde.

von faustian (Gast)


Lesenswert?

Der klassische Klatschschalter :) Nimm einen Hochpass (paar kHz), einen 
Detektor, ein Monoflop, ein T-Flipflop.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Kurz´s Idee ist nicht schlecht und kommt ohne weitere Bauelemente aus. 
Der erste vom Piezo ausgelöste Interrupt sperrt sich nach seiner 
Ausführung selber und wird erst nach einer Zeit von hier 1 Sekunde durch 
einen Timer wieder eingeschaltet.

Mein Vorschlag sah das kontrollierte Laden eines Pufferkondensators (mit 
Einzel- oder Mehrfachpulsen) über eine Diode vor, dessen Spannung für 
den Fall des Auslösens eines Interruptpins mit einem Transistor oder 
Komparator hätte aufbereitet werden können. Der Analog-Komparator im 
Controller kann übrigens auch Interrupte auslösen. Das Piezo selbst muß 
mit einem hochohmigen Widerstand immer entladen werden, da es sich sonst 
selber lädt und nach ein paar Pulsen keine Spannung mehr abgibt.

von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

@Travel Rec

> Kurz´s Idee ist nicht schlecht und kommt ohne weitere Bauelemente
> aus.Der erste vom Piezo ausgelöste Interrupt sperrt sich nach seiner
> Ausführung selber und wird erst nach einer Zeit von hier 1 Sekunde
> durch einen Timer wieder eingeschaltet.

Habe es jetzt auch so gemacht und es entprellt perfekt. Mit meiner
momentanen Erfahrung kann ich leider nocht nicht verstehen, warum
man von dieser Methode so oft abgeraten bekommt.

Ich habe zum Abschalten des Interupts folgendes Codeschnippsel
benutzt. Direkt hinter dem Sichern der Register :

cli
in temp1, GICR
ldi temp1, (0 << INT0)
out GICR, temp1
sei

In der Timerroutine das Gegenstück:
cli
in temp1, GICR
ldi temp1, (1 << INT0)
out GICR, temp1
sei

Ich würde noch gerne in der Timerroutine überprüfen, ob
INT0 aus ist, bevor ich Cli aufrufe. Aber ich finde den
Befehl zum Testen, ob das Bit gesetzt ist, nicht.
Nicht, dass ausgerechnet in der kurzen Phase zwischen
cli und sei ein Signal getriggert und unterschlagen
wird.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>in temp1, GICR
>ldi temp1, (0 << INT0)

Das 'ldi' nach dem 'in' macht keinen Sinn, da es wieder alles 
überschreibt. Stattdesen schreibe: sbr Templ (1<<Int0) setzt das Bit, 
cbr Templ (1<<Int0) löscht das Bit. Testen auf Bits geht mit sbrs (skip 
if bit in register is set) und sbrc (skip if bit in register is 
cleared).

von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

>Das 'ldi' nach dem 'in' macht keinen Sinn, da es wieder alles
>überschreibt.

Oh, das ist schlecht. Ich dachte, ich würde das GICR ins Temp1
laden und dort dann das Bit umändern, wobei der Rest unverändert
bleiben sollte.

>Stattdesen schreibe: sbr Templ (1<<Int0) setzt das Bit,
>cbr Templ (1<<Int0) löscht das Bit.

Genau das meinte ich eigentlich.

>Testen auf Bits geht mit sbrs (skip if bit in register is set)
>und sbrc (skip if bit in register is cleared).

Ah so. Werde mir das sofort hinter meine Ohren schreiben. Bzw.
in meine Datenbank.

Ich bedanke mich für Eure vielen Tips und Hinweise. Mein
Miniprojekt "Körperschallereignisse messen und die Zeitpunkte
(32-Bit-Zahl) ins  interne EEPROM schreiben zwecks späterem
Auslesen über TTL-UART-USB klappt soweit fehlerfrei. Wenn auch
auf Lochraster freiluftverdrahtet: Wenn Profis das sehen würden,
würden sie  bestimmt einen Lachanfall bekommen. ;)))

Als nächstes würde ich noch gerne eine externe RTC und ein
AT24C512 (in 3V, falls es das gibt) anbinden, weil die 512Byte
EEPROM des Atmega8 doch etwas knapp sind. Und die Zeit als 32
Bitzahl zu speichern erfordert beim Auslesen noch heftige
Umrechnngsorgien. Deshalb auch die RTC, die mir hoffentlich
genau Datumsangaben, am besten als Datumssstring ausgibt.
Außerdem ermöglicht mir eine externe RTC, dass ich auf
den Timer verzichten kann, was mir dann wiederum ermöglicht
den Powerdown-Modus zu benutzen.

Die Anbindung von EEPROM und RTC würde ich dann gerne per
I2C machen, wobei ich sagen muss, dass ich davon noch keine
Ahnung habe und bestimmt einen neuen Fred eröffnen muss.

Und dann müsste ich noch auf SMD umstellen, damit das alles
schön klein wird.

Danke nochmals und
bis zum nächsten Fred.

VG
Karl

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Wenn auch auf Lochraster freiluftverdrahtet: Wenn Profis das sehen würden,
>würden sie  bestimmt einen Lachanfall bekommen. ;)))

Nana, Profis verdrahten hin und wieder auch erst mal Schaltungsteile auf 
Lochraster, um die Funktion zu überprüfen. Das sieht auch nicht immer 
super aus ;-)

>Ah so. Werde mir das sofort hinter meine Ohren schreiben.

Drück mal im AVR-Studio Assembler-Editor ab und zu auf F1 ;-)

von STK500-Besitzer (Gast)


Lesenswert?

>Mit meiner momentanen Erfahrung kann ich leider nocht nicht verstehen, >warum man 
von dieser Methode so oft abgeraten bekommt.

Ein Interrupt ist i.d.R. zu kostbar, um ihn mit einem Taster zu belegen, 
den man auch in regelmäßigen Abständen abfragen kann.
Für Aufweckzwecke ist es natürlich legitim, einen Interrupt zu benutzen.
Wenn der Controller aber nicht schlafen geschickt wird, also auch nicht 
geweckt werden muss, ist die Verwendung eines Interrupt-Einganges für 
einen Taster verschwendung. Die Bedienung eines Tasters durch den 
Menschen und die Reaktion des Menschen auf den Tastendruck liegt im 
Bereich von Zehntelsekunden...

von Gast (Gast)


Lesenswert?

>warum man von dieser Methode so oft abgeraten bekommt.

Weil Polling einfacher und resourcensparender (externer Interrupt, 
Timer) ist und sonst keine gewichtigen Nachteile hat.

von Karl-alfred R. (karl-alfred_roemer)


Lesenswert?

Das mit dem Recourcenverbrauch ist einleuchtend. Aber mein Miniprojekt
hat ja recourcenmäßig noch genügend Luft. Wenn das also das wichtigste
Argument dagegen ist, dann mache ich es wieter so.

Habe die Schaltung heute testweise dort installiert, wo sie später
auch laufen soll. Die Empfindlichkeit war aber viel zu hoch, so dass
so ziemlich alles gezählt wurde, was nicht niet- und nagelfest war.
Nun könnte ich durch geschickte Auswahl der Widerstände die Verstärkung
des BC547 ja passend einstellen. Aber leider kann ich das nicht
ausrechnen. Und Ausprobieren dauert zu lange.

Jetzt überlege ich mir, den Piezo, der ja immerhin bis zu 0,3V bringt
direkt an den AD-Wandler des Mega8 zu klemmen und den Komparator-Modus
zu benutzen, der ja auch Interupts auslösen kann.
Dann könnte ich mit einem Poti parallel zum Piezo die Spannung an der
Mittelabzapfung die heruntergeteilte Spannung abgreifen.
Aber auch hier ist wieder Neuland für mich. Wieder mal mehrere
Steuerregister verstehen und so einstellen, dass der Komparator
genau das macht, was er soll. Es ist schon ein Kreuz!  ;)))

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Jetzt überlege ich mir, den Piezo, der ja immerhin bis zu 0,3V bringt
>direkt an den AD-Wandler des Mega8 zu klemmen und den Komparator-Modus
>zu benutzen, der ja auch Interupts auslösen kann.

Späte Einsicht. Aber damit kannst Du den Controller nicht wecken. Nimm 
doch eine Kombination aus beidem, den Transistorausgang an den 
Interruptpin und direkt über Gleichrichter und Schutzbeschaltung an den 
ADC. Der Interrupt weckt und der ADC mißt.

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.