Forum: Mikrocontroller und Digitale Elektronik ADXL345 Inaktiv/Aktiv DC/AC Datenblatt Frage


von Andre K. (andre1980)


Lesenswert?

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

von Christian J. (Gast)


Lesenswert?

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*/

von Rhianna G. (Firma: nokia) (rhianna23)


Lesenswert?

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.

von Andre K. (andre1980)


Lesenswert?

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.

von Andre K. (andre1980)


Lesenswert?

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.

von Christian J. (Gast)


Lesenswert?

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...

von Andre (Gast)


Lesenswert?

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.

von Andre K. (andre1980)


Lesenswert?

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.

von Elouise F. (Firma: nokia) (elouise)


Lesenswert?

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
Noch kein Account? Hier anmelden.