Arduino UNO und ADXL345 erhalten 0 0 0 ODER -1 -1 -1 Ausgänge mit SPI-Kommunikation

Ich habe das Evaluierungsboard EVAL-ADXL345Z von Analog Device an den Arduino UNO R3 angeschlossen, der Code entspricht und läuft einwandfrei. Zuerst konnte ich noch die Ausgabewerte erhalten, aber nach einiger Zeit sind die Ausgabewerte, die ich bekomme, entweder 0 0 0 ODER -1 -1 -1. Gibt es ein Problem mit ADXL345 oder Arduino UNO? Habe ich den Sensor beschädigt?

Verbindung:

ADXL345 --> Arduino
VIO     --> 3.3V
GND     --> GND
CS      --> Pin 10
VS      --> 3.3V
SCL     --> Pin 13
SDA     --> Pin 11
SDO     --> Pin12
INT1    --> Pin 8

Code:

#include <SPI.h>
#define PINNUMBER

int CS=10;
char values[10];

int x,y,z; 
double xg, yg, zg; 
char ff=0;
long line = 0;

#define   DEVID      0x00   //Device ID Register
#define   OFSX      0x1E   //X-axis offset
#define   OFSY      0x1F   //Y-axis offset
#define   OFSZ      0x20   //Z-axis offset
#define   THRESH_ACT   0x24   //Activity Threshold
#define   THRESH_INACT   0x25   //Inactivity Threshold
#define   TIME_INACT   0x26   //Inactivity Time
#define   ACT_INACT_CTL   0x27   //Axis enable control for activity and inactivity detection
#define   THRESH_FF   0x28   //free-fall threshold
#define   TIME_FF      0x29   //Free-Fall Time
#define ACT_TAP_STATUS   0x2B   //Source of tap/double tap
#define   BW_RATE      0x2C   //Data rate and power mode control
#define POWER_CTL   0x2D   //Power Control Register
#define   INT_ENABLE   0x2E   //Interrupt Enable Control
#define   INT_MAP      0x2F   //Interrupt Mapping Control
#define   INT_SOURCE   0x30   //Source of interrupts
#define   DATA_FORMAT   0x31   //Data format control
#define DATAX0      0x32   //X-Axis Data 0
#define DATAX1      0x33   //X-Axis Data 1
#define DATAY0      0x34   //Y-Axis Data 0
#define DATAY1      0x35   //Y-Axis Data 1
#define DATAZ0      0x36   //Z-Axis Data 0
#define DATAZ1      0x37   //Z-Axis Data 1



void setup(){ 
  SPI.begin();
  SPI.setDataMode(SPI_MODE3); //configure accelerometer for SPI connecttion
  Serial.begin(9600);
  pinMode(CS, OUTPUT); //set chip select to be output
  digitalWrite(CS, HIGH); //set chip select to be high
  writeRegister(DATA_FORMAT, 0x03); //put accelerometer into 16G range
  writeRegister(POWER_CTL, 0x08);  //Measurement mode 
}

void loop(){
  readRegister(DATAX0, 6, values);

  x = ((int)values[1]<<8)|(int)values[0];
  y = ((int)values[3]<<8)|(int)values[2];
  z = ((int)values[5]<<8)|(int)values[4];

  line  = line + 1;
  Serial.print(line);
  Serial.print('-');
  Serial.print("X: ");
  Serial.print(x, DEC);
  Serial.print(',');
  Serial.print("Y: ");
  Serial.print(y, DEC);
  Serial.print(',');
  Serial.print("Z: ");
  Serial.print(z, DEC); 
  Serial.print(',');  
  delay(100); 

  //convert accelerometer value to G
  xg = x * 0.0078;
  yg = y * 0.0078;
  zg = z * 0.0078;

  //Print the results to the terminal 
  //so that i can monitor the reading using the serial monitor.

  Serial.print("xg: ");
  Serial.print((float)xg,2);
  Serial.print("g,");
  Serial.print("yg: ");
  Serial.print((float)yg,2);
  Serial.print("g,");
  Serial.print("zg: ");
  Serial.print((float)zg,2);
  Serial.println("g");
  delay(100); 

}

//  char registerAddress - The register to write a value to
//  char value - The value to be written to the specified register.
void writeRegister(char registerAddress, char value){
  //Set Chip Select pin low to signal the beginning of an SPI packet.
  digitalWrite(CS, LOW); // to signal beginning of SPI packet 
  SPI.transfer(registerAddress);
  SPI.transfer(value);
  digitalWrite(CS, HIGH); // to signal end of SPI packet
}

void readRegister(char registerAddress, int numBytes, char * values){
  // to perform read operation the most significant bit of the register address must be set
  char address = 0x80 | registerAddress; 
  if(numBytes > 1)address = address | 0x40;   
  digitalWrite(CS, LOW);   
  SPI.transfer(address);
  for(int i=0; i<numBytes; i++){
    values = SPI.transfer(0x00);
  }
  digitalWrite(CS, HIGH);
}
Dies sollte auf Arduino SE verwiesen werden: arduino.stackexchange.com
@akellyirl Die Existenz eines separaten Arduino macht hier nicht alle Fragen zu Arduino direkt zum Thema.
user38122, haben Sie den Code geändert, der dazu führte, dass er nicht mehr funktionierte, oder er funktionierte nur zufällig nicht mehr? Wenn der erste, haben Sie den letzten funktionierenden Code (wenn Sie die Versionskontrolle verwenden oder sich nur daran erinnern)?
Wenn Sie sich die Arduino-Quellen ansehen, gibt SPI::transfer ein Byte (auch bekannt als uint8_t) zurück, obwohl Sie es einem char * zuweisen. Der von Ihnen gepostete Code kann nicht kompiliert werden (haben Sie vergessen, die Variable `values' zu indizieren?), also fügen Sie entweder den falschen Code hier ein oder kompilieren nicht die Datei, für die Sie sie halten.

Antworten (2)

Fängt es gut an, lässt aber mit der Zeit nach? Oder hat es einmal funktioniert, aber jetzt schlägt es jedes Mal fehl? Eine Google-Suche hat dieses
PDF gefunden , mit Überlegungen zur Handhabung auf der ersten Seite: 1. Nicht gegen Verpolung geschützt 2. Das Fallenlassen auf eine harte Oberfläche kann die Beschleunigungsgrenzen überschreiten.

Die wichtigsten anderen Optionen zum Brechen des Sensors wären: statische Beschädigung oder das Arduino IO überschreitet 3,3 V. Das Datenblatt hier listet eine Spannungsgrenze von 3,9 V auf (Seite 6).
Laut der UNO-Webseite sind die "offiziellen" Ausgangspegel 5 V ...

Verfügt die R3-Version über eine Übersetzung der Logikebene? Hast du irgendeinen Spannungsteiler verwendet? Haben Sie ein modifiziertes Board, wie hier beschrieben ?

Vorher hat es gut funktioniert. Danach können wir auf die Register zugreifen und in den Messmodus wechseln. Aber der Wert ist immer noch X=0,Y=0,Z=0 konstant
Ich würde sicherheitshalber einen Spannungsübersetzer empfehlen. Abgesehen davon bezweifle ich, dass Sie es "kaputt" gemacht haben - jedenfalls aus Hardware-Sicht ...

Setzen Sie das FIFO_CTL-Register auf 0x80, dann füllt Ihr adxl345 die Daten in 0x32-0x37-Registern

Das hört sich so an, als wäre es einen Versuch wert, obwohl die Antwort besser wäre, wenn Sie näher darauf eingehen würden, welchen Modus der Wert 0x80 festlegt usw.