Beschleunigungssensor ADXL335 liefert kein konstantes Signal/Winkel

Hi, ich möchte mit dem ADXL335 eine Neigung messen, funktionert auch soweit nur noch nicht optimal. Da ich jetzt alles fest in einem Gehäuse hab, ist mir aufgefallen das der Winkel stark schwankt. D.h. im setup teil lass ich die 0-Lage bestimmen und anschließend die differenz von 0-Lager zur aktuellen Lage ausgeben. jetzt beweg ich den sensor nicht und trozdem schwankt der winkel zwischen 0° und manchmal sogar 2,8°

an was kann das liegen?

danke im voraus

Gruß MMM

Um was für ein Projekt handelt es sich und wie genau muss die Messung denn sein? Wie stark / schnell schwanken die Messergebnisse? Handelt es sich um vereinzelte "Ausreißer" oder hält der "Fehler" länger an? Der Sensor ist analog, daher kann es (insbes. bei längeren Leitungen und ungünstiger Kabelverlegung) zu Störungen kommen. Ebenso ist zu erwarten, dass bei schwankender Stromversorgung des Arduinos oder des Sensors (ich nehme an du hast einen 3.3 V Spannungsregler vor dem Sensor) auch die Messungen schwanken werden. Ursache dafür kann z. B. ein Motor oder ein anderes Gerät mit großer Stromaufnahme sein.

Mögliche Lösungen: 1) Einzelne Ausreißer filtern: Mehr Messungen machen und (gleitenden) Durchschnitt bilden, z. B. immer aus den letzten 16 Messungen. Nachteil: Langsamere Reaktion

2) Analoge Messung bei schwankender Versorgung des Arduinos: AREF auf die 3.3V Stromversorgung des Sensors legen; siehe: AnalogReference Nachteil: jetzt kannst (und darfst!) du keine Analogsignale größer als 3.3V mehr einlesen!

Poste mal deinen Code und mehr Infos zum Projekt, wie gesagt, die Messungen hängen von vielen Faktoren ab.

Gruß, Marv

Lade dir mal spasseshalber das MultiWii 2.2 Projekt. Da gibt es auch entsprechenden Support für diesen Gyro. Must du dir vielleicht mal die Zeit nehmen und dich mal durch den Code kämpfen. Auf jeden Fall scheinen die dort solche Probs nicht zu kennen ....

danke schonmal das Projekt werd ich mir mal anschauen.

ich habe ein Relaisshild noch am Arduino hängen, wenn ich diese abstecke, ist das signal ziemlich konstant. wie könnte ich dies anders anschließen?

der sensor wird mit den 3.3V des arduino Boards versorgt, direkt vor dem sensor hab ich ein elko verbaut um kleine schwankungen abzufangen.

#define ADC_ref 4.8

#define zero_x 1.569

#define zero_y 1.569

#define zero_z 1.569

#define sensitivity_x 0.3

#define sensitivity_y 0.3

#define sensitivity_z 0.3

#define grenzwinkel 15

unsigned int value_x;
unsigned int value_y;
unsigned int value_z;

float xv;
float yv;
float zv;

float xv_ref;    //Ref_wert_x
float yv_ref;    //Ref_wert_y
float zv_ref;    //Ref_wert_z

float winkel;

int relais_1 = 9;
int relais_2 = 10;
int relais_3 = 11;
int relais_4 = 12;
int hupe = 2;
int ziehen = 3;
//int self_test = 6;

int hupe_state = 0;            //status hupe
int ziehen_state = 0;          //aktueller status ziehen
int last_ziehen_state = 0;     //letzter status ziehen
int counter_ziehen = 0;        //zähler tastendrücke
unsigned long time_start;      //zeit errechen
unsigned long time_dauer;
int frei_ziehen = 0;           //status frei ziehen


void setup()  
{
    Serial.begin(9600);
    
    //Definition I/O
   pinMode(relais_1, OUTPUT);
   pinMode(relais_2, OUTPUT);
   pinMode(relais_3, OUTPUT);
   pinMode(relais_4, OUTPUT);
   pinMode(hupe, INPUT);
   pinMode(ziehen, INPUT);
   
  
   

   
   // relais auf "LOW" sind angezogen(arbeitskontakt)
   digitalWrite(relais_1, LOW);
   digitalWrite(relais_2, LOW);
   digitalWrite(relais_3, HIGH); 
   digitalWrite(relais_4, HIGH);
   
   delay(1000);
    // ref_wert auslesen und setzen
   value_x = analogRead(0);
   value_y = analogRead(1);
   value_z = analogRead(2);
   xv_ref=(value_x/1024.0*ADC_ref-zero_x)/sensitivity_x;  
   yv_ref=(value_y/1024.0*ADC_ref-zero_y)/sensitivity_y;
   zv_ref=(value_z/1024.0*ADC_ref-zero_z)/sensitivity_z;
}

Probier mal die externe Referenzspannung mit 3.3 V zu benutzen. Das Problem ist wahrscheinlich, dass die 5 V des Arduinos ein bisschen einsacken wenn du die Relais schaltest, während die geregelten 3.3 V und somit auch die Analogsignale des Sensors gleich bleiben. Aufgrund der internen Referenzspannung des Atmega werden die Messergebisse größer, da mit dem ADC nur das Verhältnis von Eingangsspannung und Referenzspannung betrachtet wird (keine Absuluten Werte).

Wie schnell muss denn die Reaktion des Sensors sein? Eine Durchschnittsbildung schadet eigentlich nie. Außerdem würde ich empfehlen, einen Kalibrierungstaster einzubauen, auf dem du deine Referenzwerte neu setzen kannst (statt das Arduino zu resetten).

Kleine Info zum Winkel messen: Du kannst mit einem Beschleunigungssensor keine Winkel direkt messen, sondern nur deren Sinus. Für kleine Winkel ist das ok, aber sobald du mehr als 10° neigst gibt es erhebliche Abweichnungen. Um das zu korrigieren musst du entweder abgefahrene Rechnungen durchführen (arcSin) oder eine LUT verwenden, die für einen beliebigen Messwert einen Winkel liefert (große Tabelle anlegen oder kleine + Interpolieren).

@TERWI:

TERWI: Da gibt es auch entsprechenden Support für diesen Gyro.

Der ADXL ist ein Beschleunigungssensor und kein Gyro ;). Es gibt aber einige Chips auf denen ein Beschleunigungssensor und ein Gyro kombiniert sind (z. B. der MPU6050).

also externe referenz 3,3V hat nichts gebracht. jedoch, hab ich eine Taste zum 0-Setzen generiert, und das funktioniert um einiges besser, aber warum?

die auslösezeit sollte in max. 200ms erfolgen, also wenn z.B.erkannt wird (winkel > 15°) dann abschalten.

zum winkel, es ist eine komplexe rechnung dahinter xD

Das Nullsetzen mit dem Taster hat den Vorteil, dass es während dem Betrieb stattfindet, wenn also die restlichen Komponenten (Relais) bereits im Gang sind. Sind die Relais die ganze Zeit an und es handelt sich nur um eine Notabschaltung? Oder werden öfters die Relais geschaltet? Wenn ersteres der Fall ist, kannst du einfach dein Nullsetzen im Setup erst nach dem Einschalten der Relais machen.

Möchtest du nur prüfen, ob der Winkel größer als eine feste Grenze wird? Dann kannst du ja uch einfach diesen Analogwert als Grenze speichern, ohne die ganze Rechnerei!

ja ist eine Notabschaltung. die rechnerei brauch ich, da ich nicht 100% garantieren kann das, das kippen um genau eine Achse ist und somit rechne ich dies mit dem skalarprodukt aus, müsste allerdings einmal versuchen ob ich die analogwerte auch mit der rechnung verrechnen kann.

bin jetzt atm dabei die 0-Lager ins eprom zu schreiben und dies immer nur beim start abzurufen, da normalerweise wenn einmal genullt ist man da nichts mehr dran machen muss.

bin heut abend fast am durchdrehn xD habs jetzt rausgefunden an was das liegt das das signal schwankt. sobald die relais angezogen haben, sind starke schwankungen drin! aber warum? was kann ich dagegen tun?

Hängt die Last an der gleichen Stromversorgung wie der Sensor? Das sollte man trennen.

Relais stören generell stark. Selbst wenn das theoretisch sauber getrennt ist. Musst nur schauen wie viele Threads es hier über Störungen bei Relaiskarten gibt.

TripleM: also externe referenz 3,3V hat nichts gebracht. jedoch, hab ich eine Taste zum 0-Setzen generiert, und das funktioniert um einiges besser, aber warum?

Wenn Du den Sensor mit 3,3V betreibst und als Referenz die externe 3,3V Spannung verwendest dürfen Lastschwankungen und darum einsacken der 5V Versorgung keine Auswirkungen haben. Hast Du analogReference(EXTERNAL) verwendet und die 3,3V mit AREF verbunden?

Grüße Uwe

uwefed:
Wenn Du den Sensor mit 3,3V betreibst und als Referenz die externe 3,3V Spannung verwendest dürfen Lastschwankungen und darum einsacken der 5V Versorgung keine Auswirkungen haben. Hast Du analogReference(EXTERNAL) verwendet und die 3,3V mit AREF verbunden?

genau so hab ich es gemacht, hab auch mit nem Oszilloskop gemessen, meine spannung ist sehr konstant, 4.96V ab und an schwankt es mal auf 4.95V

der Sensor hängt an 3.3V und die Relaiskarte an 5V

also hab jetzt ein 1µF Elko an die spannungsversorgung Relaisplatine gehängt un somit fast alle schwankungen ziemlich minimiert! :)

aber mal noch ne andere frage, gibt es alternativen einen winkel zu messen? (kleine projektbeschreibung: Hab ein Traktor + Seilwinde + Funk wenn man jetzt den traktor nicht in sicht hat, bzw. nicht aufpasst, kann es passieren das dieser kippt. um dies zu verhindern, soll der arduino dann abschalten (mit 2 Relais Signal trennen))

1µF sind für sowas recht klein. Da kannst du ruhig 100µF nehmen.

hatte ich nur gerade zur hand^^ im endstatum werd ich dann auf einen größeren gehen, bin gerade am platinenlayout

des weiteren würd mich interessieren wie ich das mit dem selbst test realsieren könnte, der pin hat der sensor ja, aber wie reagiert dieser?

Steht im Datenblatt: http://www.analog.com/static/imported-files/data_sheets/ADXL335.pdf

auf Seite 3. Anscheinend gibt er da bei bei einer positiven Flanke einen mehr oder wenigen festen Wert aus (abhängig von der Versorgungsspannung)

"mehr oder wenigen festen Wert" das ist der punkt. ich dachte mir wenn der pin gesetzt ist, kommt ein fester wert raus, aber wenn diese gesetzt ist, ist der wert immer noch lageabhängig :(