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?
Nils S. schrieb: > > an einen max127 ADC (12Bit, I²C) > Die letztendlich benötigten Werte müssen nur 8Bit gross sein. Dann scheide einfach die unteren 4 Bit weg. Damit ist dann auch das Zappeln verschwunden. Denn +-5 sind genau diese 4 unnötigen Bits.
Für so einen Fader sollte eine Bandbreite von grob 10-100 Hz locker reichen. macht also ein paar µF parallel zum Ausgang. 1µF ist vielleicht etwas klein. Schau auch mal, ob denn nicht die Spannungen auf der Bahn schon irgendwie schwanken.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.