Datenblatt: https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf Es geht um die Inaktiv/Aktiv Modi. Man kann einen DC bzw. AC Modus aktivieren. (dies hat nicht mit Strom zu tun ^^). Nur erkenne ich den Unterschied nicht. Mit den Translator Übersetzungen kann ich mir keinen rechten Reim daraus machen. Seite 24: > ACT AC/DC and INACT AC/DC Bits > > A setting of 0 selects dc-coupled operation, and a setting of 1 > enables ac-coupled operation. In dc-coupled operation, the > current acceleration magnitude is compared directly with > THRESH_ACT and THRESH_INACT to determine whether > activity or inactivity is detected. > > In ac-coupled operation for activity detection, the acceleration > value at the start of activity detection is taken as a reference > value. New samples of acceleration are then compared to this > reference value, and if the magnitude of the difference exceeds > the THRESH_ACT value, the device triggers an activity interrupt. > > Similarly, in ac-coupled operation for inactivity detection, a > reference value is used for comparison and is updated whenever > the device exceeds the inactivity threshold. After the reference > value is selected, the device compares the magnitude of the > difference between the reference value and the current acceleration > with THRESH_INACT. If the difference is less than the value in > THRESH_INACT for the time in TIME_INACT, the device is > considered inactive and the inactivity interrupt is triggered. Beim benutzen der beiden Modi kann ich nicht wirklich einen Unterschied erkennen. Nach einer gewissen Zeit wird inaktivität erkannt und bestimmte LED Muster erzeugt. Beim erkennen einer Bewegung/Erschütterung, zeigt es wieder andere Muster. Egal ob AC oder DC Aktiv. Kennt jemand den Unterschied und könnte es mir mal versuchen zu erklären? Danke
Andre K. schrieb: > Es geht um die Inaktiv/Aktiv Modi. Man kann einen DC bzw. AC Modus > aktivieren. (dies hat nicht mit Strom zu tun ^^). Nur erkenne ich den > Unterschied nicht. Naja, ganz einfach:AC ist "Wechselstrom" und DC eben Gleichstrom. Bei DC hast Du einen Lage-Offset mit drauf der durch die Gravitation entsteht. Bei AC geben dir x,y,z die Werte aus (Zentrum 0), die durch die Bewegung enstehen. Bildlich wird da ein Kondensator zwischen die MEMS und den AD Wandler geschaltet, der DC abschneidet und nur AC durchlässt. Hört es auf sich zu bewegen kehren sie zu 0 zurück. Wie beim Oszilloskop auch: AC und DC, bei AC liegt alles um die Null Linie. Achte auf die 10Bit und 13 Bit Unterschiede! Idealerweise lässt man sich alle Achsen fortlaufend ausgeben und dreht das Ding mal hin und her, dann sieht man wie sich was verhält und auch welche Kalib.werte man einspielen muss. Die Thresholds kannst du nur mit Ac verwenden, sonst machen die keinen Sinn, weil eine Achse immer g als Offset hat. Im Low Power Mode wird das Ganze aber so mit Rauschen zugemacht, dass die Thresholds schon sehr weit liegen müssen. Die Abtastrate will auch gut bewählt sein, das ist aber alles gut erklärt. Je genauer desto länger dauert es, logisch. Das LINK Bit verknüpft INACT und ACT derart, dass es einen INACT erst geben kann nachdem ein ACT Int kam und umgekehrt. ACT feuert dauernd, INACT erst nachdem eine gewisse Zeit abgelaufen ist (max 255s). Vorsicht: Die meisten ADXL3454 sind heute Klone und ich hatte mal eine Charge da war Z kaputt, fest geklemmt. Auf den Tisch klopfen half da auch nicht. Fallen die Platinchen runter auf harten Boden können die MEMS kaputt gehen.
1 | adxl_writeRegister(DATA_FORMAT, 0x01); // 10 Bit |
2 | adxl_writeRegister(OFFX, - 3); |
3 | adxl_writeRegister(OFFY, 0); |
4 | adxl_writeRegister(OFFZ, - 15); |
5 | adxl_writeRegister(BW_RATE, 0x1A); |
6 | |
7 | /* Konfiguration des ADXL345 auf
|
8 | INT1 Pin = InActivity Interrupt
|
9 | INT2 Pin = Activity Interrupt */
|
10 | |
11 | adxl_writeRegister(THRESH_INACT, THRESHOLD); /* InActivity Threshold */ |
12 | adxl_writeRegister(THRESH_ACT, THRESHOLD); /* Activity Threshold */ |
13 | adxl_writeRegister(TIME_INACT, TIMEOUT_ACTIVITY); /* InActivity 2 Minuten */ |
14 | |
15 | adxl_writeRegister(ACT_INACT_CTL, 0xff); /* Beide Funktionen aktivieren im AC Mode */ |
16 | adxl_writeRegister(POWER_CTL, 0x08); /* Starte Messungen */ |
17 | adxl_writeRegister(INT_MAP, 0x10); /* Inactivity = INT1, Activity = INT2 */ |
18 | |
19 | adxl_readRegister(INT_SOURCE); /* Pending Ints löschen */ |
20 | adxl_writeRegister(INT_ENABLE, 0x18); /* Beide Interrupts aktvieren*/ |
I have DATA_READY, Activity and Inactivity interrupts mapped from INT1 to INT0 on the arduino. DATA_READY works fine, the problem is Activity and Inactivity are always set to 0 in the INT_SOURCE register. I have set up the threshold for activity and inactivity and the time of inactivity. I would like the algorithm to run when DATA_READY and Activity interrupts are 1 and do nothing when Inactivity is 1 (activity is 0). When Activity is 0 the accelerometer should go automatically in sleep mode and wakes up if activity is detected.
Christian J. schrieb: > Naja, ganz einfach:AC ist "Wechselstrom" und DC eben Gleichstrom. Bei DC > hast Du einen Lage-Offset mit drauf der durch die Gravitation entsteht. > Bei AC geben dir x,y,z die Werte aus (Zentrum 0), die durch die Bewegung > enstehen. Bildlich wird da ein Kondensator zwischen die MEMS und den AD > Wandler geschaltet, der DC abschneidet und nur AC durchlässt. Hört es > auf sich zu bewegen kehren sie zu 0 zurück. Wie beim Oszilloskop auch: > AC und DC, bei AC liegt alles um die Null Linie. Sorry, mehrmals gelesen, aber so richtig macht es noch nicht Klick. Fakt ist, es funktionieren beide Modi. Wenn der Sensor ruhig daliegt, egal in welcher Lage, geht er nach der angegeben Zeitschwelle, in einen anderen Modi. Bei Bewegung kehrt zum alten Modi zurück. Egal ob DC oder AC. > Achte auf die 10Bit und 13 Bit Unterschiede! Idealerweise lässt man sich > alle Achsen fortlaufend ausgeben und dreht das Ding mal hin und her, > dann sieht man wie sich was verhält und auch welche Kalib.werte man > einspielen muss. Ja, kalibrieren musste ich ihn auch. Mit dem Freefall hätte sonnst nicht geklappt. X war bei 0 auf 5. Y war bei 0 auf -170. Z war bei 0 auf 280. Diese Werte konnte ich von diesem China Modell noch gut angleichen. > Die Thresholds kannst du nur mit Ac verwenden, sonst machen die keinen > Sinn, weil eine Achse immer g als Offset hat. Funktioniert aber auch mit DC. Liegt es vielleicht daran das alle Achsen aktiviert wurden? Denn eine der Achsen hat ja immer ~0 wenn er auf irgendeiner Seite liegt. > Im Low Power Mode wird das Ganze aber so mit Rauschen zugemacht, dass > die Thresholds schon sehr weit liegen müssen. Die Abtastrate will auch > gut bewählt sein, das ist aber alles gut erklärt. Je genauer desto > länger dauert es, logisch. LowPower nutze ich nicht. Die gesteuerten LEDs verbrauchen ein Vielfaches. Ob der ADXL345 da ein paar µA mehr oder weniger verbraucht ist egal. > Das LINK Bit verknüpft INACT und ACT derart, dass es einen INACT erst > geben kann nachdem ein ACT Int kam und umgekehrt. ACT feuert dauernd, > INACT erst nachdem eine gewisse Zeit abgelaufen ist (max 255s). Naja, ich lasse einfach beim erkennen von Inaktivität eine Variable true setzen und beim erkennen von Aktivität diese Variable auf false setzen. Den Rest vom Code dann abhängig von dieser Variable. Somit muss ich da nichts verlinken. > Vorsicht: Die meisten ADXL3454 sind heute Klone und ich hatte mal eine > Charge da war Z kaputt, fest geklemmt. Auf den Tisch klopfen half da > auch nicht. Fallen die Platinchen runter auf harten Boden können die > MEMS kaputt gehen. Ja ich weis. Die von mir bestellten weichen zum Glück nur vom 0 Punkt ab. Un zum Glück nicht soweit, wie man es mit dem internen Offset entgegenregeln kann. In der Range reagieren sie aber linear und keine Achse hängt. >>In dc-coupled operation, the >>current acceleration magnitude is compared directly with >>THRESH_ACT and THRESH_INACT to determine whether >>activity or inactivity is detected. Würde ich so verstehen, wenn die Schwellwerte z.B. 30 sind, das wenn eine der Achsen 30 überschreitet bzw. -30 überschreitet der Interupt ausgelöst wird. Wenn der Sensor auf einer Seite liegt, hat z.B. x=0 y=0 und z=270. Z würde dann ja bei geringster Bewegung auslösen, das sie über dem Schwellwert liegt. Macht aber kein Sinn, da dann das geringe flackern von +-1, was der Sensor hat, schon ein auslösen der Z Achse bewirken würde. Macht es aber im Praxis Test nicht. Da muss eine ordentliche Bewegung passieren. >>In ac-coupled operation for activity detection, the acceleration >>value at the start of activity detection is taken as a reference >>value. New samples of acceleration are then compared to this >>reference value, and if the magnitude of the difference exceeds >>the THRESH_ACT value, the device triggers an activity interrupt. Verstehe ich so, das immer die letzte Messung der x, y und z Achse als Referenz genommen wird. Und geschaut wird ob zu diesen Werten die Schwelle überschritten werden. Um bei dem Beispiel zu bleiben (x=0, y=0, z=270). Wenn x 30 bzw. -30 oder y 30 bzw. -30 oder z 240 bzw. 300 überschreitet ein Interupt ausgelöst wird. Hach so richtig verstehe ich es nicht. Kannst du vielleicht ein Beispiel zu den Unterschieden bringen? Vielleicht macht es dann Klick.
Rhianna G. schrieb: > I have DATA_READY, Activity and Inactivity interrupts mapped from > INT1 > to INT0 on the arduino. DATA_READY works fine, the problem is Activity > and Inactivity are always set to 0 in the INT_SOURCE register. I have > set up the threshold for activity and inactivity and the time of > inactivity. I would like the algorithm to run when DATA_READY and > Activity interrupts are 1 and do nothing when Inactivity is 1 (activity > is 0). When Activity is 0 the accelerometer should go automatically in > sleep mode and wakes up if activity is detected. Mein Englisch ist zwar nicht so gut, aber ich denke du hast vergessen die Interupts auch zu aktivieren. Dies geht im Register 0x2E. Mehr dazu im Datenblatt Seite 26 Rechts Oben. >Setting bits in this register to a value of 1 enables their respective >functions to generate interrupts, whereas a value of 0 prevents >the functions from generating interrupts. The DATA_READY, >watermark, and overrun bits enable only the interrupt output; >the functions are always enabled. It is recommended that interrupts >be configured before enabling their outputs.
Andre K. schrieb: > Sorry, mehrmals gelesen, aber so richtig macht es noch nicht Klick. Fakt > ist, es funktionieren beide Modi. Nee, da kann ich aber auch nix für. Und es funktionieren nicht beide für jede Anwendung. Statische Lagen nur DC und dynamische Bewegungen mit Beschleunigung nur AC. Die Schwellwerte werden ja nicht von der letzten Lage übernommen sondern absolut und darum funktioniert nur AC bei ACT und InACT. Bei mir gehen alle, x,y und z zurück auf 0. Bin raus...
Na die Werte x=0 y=0 und z=0 werden ja nur im Freien Fall erreicht. Auf mindest eine Achsen wirkt bei Still daliegen immer eine positive oder negative Gravitation.
Ich habe die Text nochmal durch sehr viele Übersetzer geschickt. >In dc-coupled operation, the >current acceleration magnitude is compared directly with >THRESH_ACT and THRESH_INACT to determine whether >activity or inactivity is detected. >>Im gleichstromgekoppelten Betrieb wird die aktuelle Beschleunigungsgröße >>direkt mit THRESH_ACT und THRESH_INACT verglichen, um festzustellen, ob >>Aktivität oder Inaktivität erkannt wird. Die aktuellen Beschleunigungsgrößen sind ja die DATAX0, DATAY0 und DATAZ0 Werte. Als Beispiel, wie es aktuell bei mir eingestellt ist. THRESH_ACT THRESH_INACT hat den Wert 30. Alle 3 Achsen werden überwacht. Wenn der Würfel vor mir liegt, haben: DATAX0 = 0 (+-4) DATAY0 = 0 (+-4) DATAZ0 = 270 (+-4) Da der Z Wert über der Schwelle ist, sollte der Würfel im DC Modus nicht den Interupt Inaktiv ausgeben. Aber er macht es. >In ac-coupled operation for activity detection, the acceleration value at the start of activity detection is taken as a reference value. New samples of acceleration are then compared to this reference value, and if the magnitude of the difference exceeds the THRESH_ACT value, the device triggers an activity interrupt. >>Im Wechselstrom-gekoppelten Betrieb zur Aktivitätserkennung wird der Beschleunigungswert zu Beginn der Aktivitätserkennung als Referenzwert verwendet. Neue Beschleunigungsproben werden dann mit diesem Referenzwert verglichen, und wenn die Größe der Differenz den THRESH_ACT-Wert überschreitet, löst das Gerät einen Aktivitätsinterrupt aus. Um bei dem Beispiel zu bleiben, sollte ein ändern der DATAX0, DATAY0 und DATAZ0 Werte um +-30 dann den Interrupt als Aktivität auslösen. Was auch gemacht wird. Naja vielleicht ist mein ADXL345 China Clone in dieser Funktion auch einfach defekt, und verweilt immer im AC-Modus, egal wie das Bit im Register gesetzt wird. Oder ich raff es einfach nicht wie das gemeint ist, auch eine Möglichkeit.
I will try to figure it out for more. Keep sharing such informative post keep suggesting such post.
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.