"Debouncen" von Fadern

Persönliche Seite #2308135
Lesenswert?

Hi,

ich stehe gerade vor einer etwas kniffligen Aufgabe, zumindest für mich.

Ich habe 8 Motorfader (5k) an einen max127 ADC (12Bit, I²C) 
angeschlossen. Nun wackeln die Werte um etwa +-5 Werte hin und her.
Die letztendlich benötigten Werte müssen nur 8Bit gross sein.

Bisher hab ich einfach die überschüssigen Bits durch Division 
weggeworfen. Jetzt will ich aber die Fader natürlich auch per Software 
stellen. Nur da wirds ein wenig ungenau.

Die Werte, die ich setze entsprechen dann also nicht 100%ig der Position 
in Millimetern von 0 aus gesehen. Sprich, wenn ich alle 8 Fader auf 50% 
setzen will, dann stehen sie etwa 1-2mm versetzt zueinander, das immer 
unterschiedlich.

Das Bilden von Mittelwerten ist schon drin im Programm, momentan bilde 
ich den Mittelwert aus 8 einzelnen. Das dauert allerdings etwa 1,2mS pro 
Messung. Letztendlich werden da 24 Fader dran hängen.
8*24*1,2 = 230,4mS => VIEL zu lange, sollte bei etwa 100-130mS liegen. 
Daher will ich die Mittelwertbildung auf 2-3 Werte runterschrauben.

Hab schon 100nF und 1µ Kondensatoren von ADC_inX nach GND und nach VCC 
versucht, brachte nichts ausser verzögertem flattern.

An der Referenz liegts nicht, Spannungen z.B. von Batterien oder die 
Spannung, die mein Multimeter für Diodentest ausgibt bleiben ruhig. Ich 
habe auch eine REF02 Spannungsreferenz dazugebaut, also Referenz ist 
ausgeschlossen.

Wie löst man sowas am geschicktesten?
Persönliche Seite #2308200
Lesenswert?

Hüpft noch in selbem Masse,
Hier der Codeauschnitt:
1
int runs = 8;
2
for(i = 0; i < runs; i++) {
3
  buffer[0] = config_byte;        // write the config byte to max127
4
  write(i2c_bus, buffer, 1);
5
  read(i2c_bus, buffer, 2);       // read 2 bytes (ad conv. result) from max127
6
  value = ((buffer[0]<<8)|buffer[1]);
7
  value >>= 4;            
8
  addval += value;
9
}
10
addval /= runs;
Das Format ist vom ADC ist so:
buffer[2]: buffer[0] = High Byte, buffer[1] = Low Byte, die oberen 4 
Bits sind belegt, die unteren leer.

Also: 11.10.9.8.7.6.5.4 | 3.2.1.0.x.x.x.x

Und um die unteren abzuschneiden, mach ich einfach value >>= 8 statt >>= 
4...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren