PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten mit ADC einlesen und mit RC-Tiefpass entprellen



PCMan
20.10.2008, 20:43
Hallo Experten,
ich weiß das Thema "Entprellen" gab's schon recht häufig, aber meistens bezog sich das immer auf TTL-Logik.
Ich muss Pins sparen und wollte daher sowas wie ne "Ein-Draht-Tastatur" bauen. Naja es handelt sich dabei um 4 Taster, die so über Widerstände verdrahtet sind, dass durch den jeweiligen Druck eine gewisse Spannung erzeugt (aufaddiert) wird.
Okay das ist nicht das Problem.
Es ist aber bekannt, dass Tasten prellen.
Könnte ich nicht einfach das Prellen mit nem brutalen "0Hz-Tiefpass" rausfiltern? Okay, die Flanke ist dann nicht mehr steil, aber das macht ja nicht wirklich was, weil ich würde dann gewisse Grenzen einbauen, wann eine Taste als gedrückt gilt und wann nicht. Z.B.
1) 0V keine Taste gedrückt
2) 1,24..1,26V = Taste 1 gedrückt
3) 2,49..2,51V = Taste 2 gedrückt
4) 3,74..3,76V = Taste 3 gedrückt
...

Habe ich einen denkfehler?
Grüße Simon

shaun
20.10.2008, 22:21
Naja, wenn Du Taste 3 drückst, erscheint das als kurz 1- kurz 2- 3.
Du müsstets die Gültigkeit jedes möglichen Zustandes auch noch über die Zeit ermitteln.

MSN
20.10.2008, 22:29
und was wenn du 1und2 drückst?

thewulf00
21.10.2008, 09:08
Diese Ein-Draht-Tastatur wird gern genutzt, z.B. auf dem C-Control 1 Erweiterungsboard oder auf dem RN-Control 1.4 (ältere Versionen bestimmt auch).

Du machst einfach folgendes: Du liest immer 64 Werte ein, und bildest dann das mathematische Mittel. Dabei kannst Du auch auf eine Division verzichten, wenn Du ein Vielfaches von 2 benutzt, dann kannst Du einfach shiften. Bsp:

8 Werte addieren, shift 3 mal nach rechts. Dann hast Du den Durchschnittswert der 8 Werte. Bei 64 Werten wäre es dann eben 6 mal.

Dadurch kannst Du Prellungen sehr einfach "entwerten", da sich der "dauerhafteste" Wert durchsetzt. Und keine Angst, die Zeit ist noch ausreichend, das man nur kurz drücken muss, um einen dauerhaften Wert zu erreichen. Ansonsten auf 32 Werte runtergehen.

Beachten musst Du allerdings, dass Du in dem Fall unbedingt mit 16 Bit rechnen musst.

@MSN: Das kannst Du über 2er-Potenzen lösen...

PCMan
21.10.2008, 11:27
Hi,
danke für die Tipps. Ja das mit den mehrfach wandeln und Mitteln schwärmte auch in meinen Kopf herum. Das Prellen der Schalter im Hochfrequenten Bereich wollte ich eben mit diesem Tiefpass abfangen.
thewulf: meinst du den brauch man bei deinem Verfahren noch? Eine zusätzliche Sicherheit wär's ja schon und viel verzögerung + Hardwareaufwand kommt ja nicht dazu...
Grüße Simon

Besserwessi
21.10.2008, 14:52
Aud den analogen Tiefpass kann man verzichten. Ein Prellene rkenn man daran das der AD Wert schwankt. Eine Gültige Taste hat man also nur wenn sich die letzten (z.B. 4 Werte über 10 ms) Werte des AD Wandlers wenig unterscheiden.

PCMan
21.10.2008, 16:30
Würde das dann so aussehen: Also ich hab einen Timer laufen - bei der entsprechenden ISR werden dann die zB 64 Werte genommen und gemittelt (shift). Wenn die ISR 4 mal aufgerufen wurde und die gemittelten Werte in nem definierten Bereich liegen kann ich von nem tastendruck ausgehen?
Danke
Simon

Besserwessi
21.10.2008, 17:26
Bei nur 4 Tasten braucht man eigentlich gar nicht viel mitteln, da reicht die normale Auflösung des AD-wandlers, es sei denn man kriegt viel 50 Hz Störungen rein.
Normalerweise sollte es reichen in einen Interrupt immer die Gruppen von 4 oder 8 Werte in einen puffer zuschreiben. Wenn der Puffer voll ist kann man testen ob die Differenzen kleine sind (z.B. Differenz der nachbarn und 1.ter und letzter Wert). Wenn die Differenzen alle klein sind, kann man wohl von einem Stabilen gültigen wert ausgehen. Ob man dann den letzten Wert oder den Mittelwert nimmt sollte relativ egal sein. Als Interrupt könnte man einen Timer oder auch den AD-ready interrupts nehmen.

thewulf00
21.10.2008, 18:46
Wenn Du 64 Werte (was SEHR VIEL ist) nimmst, dann ist der Wert bereits "fertig genug", da brauchste keine 4 Werte mehr.

Vom Prinzip her so: (Pseudocode)



while (1)
{
werte = 0;
for (1 to 64)
{
werte += get_ADC();
}
werte >>= 6;
mache_was_mit_dem_wert(werte);
}

Besserwessi
21.10.2008, 21:07
@thewulf: Der Mittelwert von 64 Werten gibt schon relativ viel oversampling, hilft aber nicht dagegen das sich der Wert gerade ändert und man so einen mittelwert kriegt, der nicht zu der gerade gedrückten oder losgelassennen Taste passen muss. Das mittel von 64 Werten könnte gut gegen 50 Hz Störungen helfen, aber nicht gegen Prellen.

Um sicherzustelln , das man nicht gerade eine sich ändernde Spannung hat muß man wenigstens 2 Spannungswerte vergleichen. Nur wenn man mehrmals hintereinander etwa die gleiche Spannung mißt, kann man sicher sein, dass das es ein gültiger wert ist. Die Messungen sollten auchnicht zu schnell erfolgen, ein paar ms sollten schon dazwischen sein, um Prellen zu erkennen.

Dirk
22.10.2008, 02:21
Nach meiner Erfahrung mit inzwischen 3 ADC-Tastaturen (bis 16 Taster) an C-Control und einem M32 ist das völlig unkritisch! Man braucht nur 3 bis 4 Werte zu mitteln und bekommt die Taste zuverlässig. Natürlich ist auch der Wertebereich relevant, den man für jede Taste zuläßt. Ich lege die Grenze genau zwischen die jeweiligen exakten ADC-Werte, dann klappt das gut.

Gruß Dirk

kolisson
22.10.2008, 03:04
hi,

ich hab so ne adc tastatur zwar noch nicht probiert, denke aber spontan an einen kleinen tiefpass am adc-eingang.

und statt mittelwert könnte man ja besser an "median" bzw. "zentralzahl" denken.

gruss klaus

thewulf00
22.10.2008, 07:35
@thewulf: Der Mittelwert von 64 Werten gibt schon relativ viel oversampling, hilft aber nicht dagegen das sich der Wert gerade ändert und man so einen mittelwert kriegt, der nicht zu der gerade gedrückten oder losgelassennen Taste passen muss. Das mittel von 64 Werten könnte gut gegen 50 Hz Störungen helfen, aber nicht gegen Prellen.

Um sicherzustelln , das man nicht gerade eine sich ändernde Spannung hat muß man wenigstens 2 Spannungswerte vergleichen. Nur wenn man mehrmals hintereinander etwa die gleiche Spannung mißt, kann man sicher sein, dass das es ein gültiger wert ist. Die Messungen sollten auchnicht zu schnell erfolgen, ein paar ms sollten schon dazwischen sein, um Prellen zu erkennen.
Ja, im Prinzip hast Du recht. Für diesen Anwendungsfall ist Dein Ansatz der bessere. Über längere Zeit (ein paar ms) ein paar Werte aufzunehmen und zu vergleichen, klingt auch für mich logischer.


Die Sache mit den 64 Werten hatte ich bei meiner "Einparkhilfe" eingebaut. Der IR-Abstandssensor hatte dadurch absolut kein prellen oder schwanken mehr.

PCMan
22.10.2008, 08:27
Hi,
das ist ja eine anregender Diskussion geworden. Laut Besserwisseri wäre es dann so, dass man in gleichmäßigem Intervall Werte nimmt und diese dann auf Differenz untersucht. Wenn die differenz "klein" ist, kann man von einen stabilen Wert ausgehen. Okay. Da ich aber kein Bock auf Netzbrummen habe wollte ich so oder so einen Tiefpass davorschalten (vor den ADC-in). Da spricht doch prinzipiell nix dagegen oder?
Dann noch ne Frage zu den Interrupts: es gibt da die Timer-Interrupts, mit denen habe ich schon gearbeitet. Oben habe ich aber noch von einen AD-ready Interrupt gelesen; was ist damit gemeint?
Grüße Simon

Besserwessi
22.10.2008, 19:50
Gegen Netzbrummen ist ein Tiefpassfilter eher weniger geeignet, denn da müßte die Grenzfrequenz schon ziehmlich tief ( << 50 Hz) sein und dann fängt es an das man recht lange (z.B. 0,1-1 s) auf einen stabilen Wert warten muß bis man dem AD wert trauen kann. Normalerweise sollten die 50 Hz Störungen nicht so groß sein das sie stören. Wenn man da wirklich Probleme hat, die man nicht durch einen elektrischen Abschirmung lösen kann, hilft es am besten die AD-werte über eine Periode (oder mehrere) zu mitteln. So wird das z.B. in den Voltmetern gemacht.

Bei AVR Controllern (und vermutlich auch bei vielen anderen) kann der ACD einen Interrupt auslösen, wenn die Wandlung fertig ist. Wenn man den ADC im kontinuierlichen Betrieb betreibt, kann man alle 13 Zyklen des ADC-Taktes einen Interrupt kriegen, um den nächsten Wert zu verarbeiten (oder auch zu ignorieren). Eingstellt wird der Interrupt im Register ADCSRA bei den AVR Controllern.

PCMan
23.10.2008, 09:02
Hi Besserwessi,
naja ich hatte schonmal den ADC im Labor in Betrieb und da ist alles voller Neonröhren und das hat meine Werte auch nach brutaler Mittelung nicht sonderlich verbessert. Am besten wäre natürlich einen filter-kernel zu programmieren aber das wird mir dann doch zu aufwendig. Ich hätte halt einen Tiefpass bei <<50Hz gewählt und einen Kondensator mit niedriger Kapazität eingesetzt (somit dürfte es nicht allzuuuuu lange dauern bis der Wert auf sein Niveau kommt). Dabei bin ich leider zwar mit meinen Widerständen eingeschränkt aber das lässt sich sicher noch austüfteln, denke ich.
Grüße Simon

Besserwessi
23.10.2008, 19:41
Die Wartezeit hängt direkt mit der Grenzfrequenz des analogen Tiefpasses zusammen. Da ist egal ob man einen großen Kondensator oder einen großen Widerstand nimmt. Mit einem Tiefpass hoherer Ordnung könnte man eventuell eine kleine wenig besser wegkommen, aber auch nur in Grenzen.

Wenn man genau über eine Periode mittelt, bekommt man theoretisch eine perfekte Unterdrückung der 50 Hz und auch gleich aller Oberwellen dazu. Durch eine passende Länge des Intervalls ist durch Mittlen so eine Unterdrückung der 50 Hz um über 60 dB drin. Ein einfacher Tiefpass müßte dafür schon eine Grenzfrequenz von unter 0,05 Hz haben, was ziehmlich unpraktikabel ist.

PCMan
27.10.2008, 07:59
Hi Besserwessi,
was meinst du mit Periode? Ich nehme an du sprichst jetzt von der Zeit über die die Daten aus dem ADC eingelesen und gemittelt werden. Gibt's da ein Schema mit dessen Hilfe ich die passende Länge des Intervalls festlegen kann?
Grüßle,
Simon

Besserwessi
27.10.2008, 17:10
Mit Periode ist eine Periode der Störfrquenz gemeint, bei 50 Hz also 20 ms. Das einfache mitteln der Werte ist halt ein digitaler Tiefpass, der anders als die normalen analogen einige Frequenzen (hier 50Hz, 100 Hz, 150 Hz,...) perfekt unterdrückt und dazu auch noch recht schnell eingeschwungen ist.