Autor Tema: Acelerometro ADXL345 problema con rango menor a 8g  (Leído 2541 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Acelerometro ADXL345 problema con rango menor a 8g
« en: 12 de Diciembre de 2013, 20:56:43 »
Hola, sigo trabajando con este acelerometro en la LPCXpresso.
En este momento tengo problemas para configura el sensor en rangos menores a +-8g. El problema que tengo es que el eje Z se queda mudo... me tira un valor fijo aunque rote el sensor... los ejex x e y funcionan bien en 4g y 2g.
Alguna idea?

Saludos!
-
Leonardo Garberoglio

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #1 en: 13 de Diciembre de 2013, 01:05:41 »
Me sucedió algo parecido con otro sensor de acelerómetro. y era porque leía demasiado rápido el dato y no daba tiempo de actualizarse, solo le puse un delay antes de intentar leer. o leer un flag indicador que diga que el dato esta listo para leerse.


Desconectado rotting79

  • PIC12
  • **
  • Mensajes: 91
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #2 en: 01 de Mayo de 2016, 22:10:49 »
hey there

I know it's been a while from the last post here, but Im in a "loop" since a few days

Im working on the  ADXL345 accelerometer, and it is running good with I2C protocol, but when I tried to use the SPI protocol, it just doesn't work

I know the reading is alittle bit tricky, and it pass me, so if some one that has done it would be appreciate

just read the ID on first time right, but no the next ones....

(working on XC8, PIC18F45K22)

Hola

Sé que ha pasado un tiempo desde el último post aquí, pero estoy en un "bucle" desde hace unos días

Im trabajando en el acelerómetro ADXL345, y está funcionando bien con el protocolo I2C, pero cuando traté de utilizar el protocolo SPI, simplemente no trabajar

Sé que la lectura es un poco mala poco complicado, y me paso, por lo que si alguien que ha hecho que sería aprecio

acaba de leer el ID de primera a la derecha tiempo, pero no las próximas ....

(Trabajando en XC8, PIC18F45K22)


...On November 2nd, a PIC10 became self-aware and decided our fate in __delay_us ( 1 ); ...

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #3 en: 02 de Mayo de 2016, 08:46:30 »
Hi,
Do you have a Logic Analizer or a Oscilloscope?
You have to analize CLK, MOSI and MISO signals to try to understand what would be wrong.

Best wish!
-
Leonardo Garberoglio

Desconectado rotting79

  • PIC12
  • **
  • Mensajes: 91
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #4 en: 02 de Mayo de 2016, 11:01:51 »
hey there

thanks for your response Elgarbe, (I will keep posting in Spanish as well, so everyone can research in case)

yes I did analize teh output and input pins, but no success, actually it is the same SPI library I use in other components, and they work well, but this accelerometer just don't want to

I'd would use it as I2C, but the probelme is that Im going to attach the microcontroller to a  Boscam FPV 5.8G 200mW Wireless Audio Video Transmitter, and this one uses SPI only

as the picture attached before shows, I set to read the ID's device and only the very first time works, but not the next ones

any hint??? have you tried it with SPI???


Hola

gracias por su respuesta Elgarbe, (I mantendrá publicar en español, así que todo el mundo puede investigar por si acaso)

sí lo hice analizar teh pines de salida y de entrada, pero sin éxito, en realidad es la misma librería SPI que utilizo en otros componentes, y funcionan bien, pero esto acelerómetro simplemente no quieren

Me gustaría utilizarlo como I2C, pero el probelme es que Im que va a conectar el microcontrolador a un transmisor de video Boscam FPV 5.8G 200mW de audio inalámbrico, y éste utiliza solamente SPI

que el cuadro atado antes de espectáculos, me puse a leer el dispositivo del ID y sólo funciona la primera vez, pero no a las próximas

cualquier indicio ??? ¿Lo has probado con SPI ???

gracias por adelantado


thanks in advance
...On November 2nd, a PIC10 became self-aware and decided our fate in __delay_us ( 1 ); ...

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #5 en: 02 de Mayo de 2016, 13:21:24 »
I've never tried ADXL with SPI.
Could you provide writeByteSPI and readByteSPI, please?

-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #6 en: 02 de Mayo de 2016, 13:22:29 »
and your ADXL initialitation function
-
Leonardo Garberoglio

Desconectado rotting79

  • PIC12
  • **
  • Mensajes: 91
Re:Acelerometro ADXL345 problema con rango menor a 8g
« Respuesta #7 en: 03 de Mayo de 2016, 01:37:57 »
sure, here it is...

Código: C
  1. //==============================================================================
  2. // Connection of module ADXL345.
  3. //
  4. // GND          <<<>>> GND.
  5. // VCC          <<<>>> 3.3 V.
  6. // ADXL345_CS   <<<>>> You can change this pin.
  7. // ADXL345_INT1 <<<>>> You can change this pin.
  8. // ADXL345_INT2 <<<>>> You can change this pin.
  9. // ADXL345_SDO  <<<>>> Connect to SDI MCU.
  10. // ADXL345_SDI  <<<>>> Connect to SDO MCU.
  11. // ADXL345_SCK  <<<>>> Connect to SCK MCU.
  12. //==============================================================================
  13.  
  14. /* The next lines shoul be at the main file */
  15. //#define ADXL345_CS_TRIS           TRISDbits . TRISD4
  16. //#if defined ( _PIC16F887_H_ ) || defined ( _PIC16F886_H_ )
  17. //  #define ADXL345_CS              PORTDbits . RD4
  18. //#elif defined ( _PIC18F45K22_H_ ) || defined ( _PIC18F44K22_H_ ) || defined ( _PIC18F24K22_H_ )
  19. //  #define ADXL345_CS              LATDbits . LATD4
  20. //#endif
  21. //
  22. ///* Uncomment whathever Protocol using */
  23. //#define ADXL345_SPI_PROTOCOL
  24. ////#define ADXL345_I2C_PROTOCOL
  25.  
  26.  
  27.  
  28.  
  29. void setUpADXL345 ( void )
  30. {
  31. #if defined  ADXL345_SPI_PROTOCOL
  32.     // Set the control pìns as Outputs with the TRISx Macro.
  33.     ADXL345_CS_TRIS = OUTPUT;
  34.  
  35.     // Set the logic leves on control pins.
  36.     ADXL345_CS = HIGH;
  37.  
  38. #endif
  39.    
  40. // functions commented "//", jsut in case need it, as Reset values are '0s'.
  41.  
  42. // Single/Double TAP Registers.
  43. //    writeADXL345 ( THRESH_TAP, CLEAR );
  44. //    writeADXL345 ( DUR, CLEAR );
  45. //    writeADXL345 ( LATENT, CLEAR );
  46. //    writeADXL345 ( WINDOW, CLEAR );
  47.    
  48. //    writeADXL345 ( TAP_AXES, SUPPRESS_DOUBLE_TAP_EN | TAP_X_DISABLE |
  49. //                    TAP_Y_DISABLE | TAP_Z_DISABLE );
  50.  
  51. // Offset Regsiters.
  52. //    writeADXL345 ( OFSX, CLEAR );
  53. //    writeADXL345 ( OFSY, CLEAR );
  54. //    writeADXL345 ( OFSZ, CLEAR );
  55.    
  56. // BW Rate Regsiters.
  57. //    writeADXL345 ( BW_RATE, 0x0D );
  58.     writeADXL345 ( BW_RATE, LOW_POWER_NORMAL | DATA_RATE_800HZ );
  59.    
  60.  
  61. // Activity and Inactivity Regsiters.
  62. //    writeADXL345 ( THRESH_ACT, CLEAR );
  63. //    writeADXL345 ( THRESH_INACT, CLEAR );
  64. //    writeADXL345 ( TIME_INACT, CLEAR );
  65. //    writeADXL345 ( ACT_INACT_CTL, ACT_DC_COUPLED | ACT_X_DISABLE | ACT_Y_DISABLE |
  66. //                    ACT_Z_DISABLE | INACT_DC_COUPLED | INACT_X_DISABLE | INACT_Y_DISABLE |
  67. //                    INACT_Z_DISABLE );
  68.  
  69. // Free Fall Regsiters.
  70. //    writeADXL345 ( THRESH_FF, CLEAR );
  71. //    writeADXL345 ( TIME_FF, CLEAR );
  72.  
  73. // POWER_CTL Register (0x2D).
  74.     writeADXL345 ( POWER_CTL, LINK_BOTH | AUTO_SLEEP_ON | MEASURE_ON |
  75.                     SLEEP_OFF | WAKEUP_4HZ );
  76.  
  77. //    writeADXL345 ( ACT_INACT_CTL, CLEAR );
  78.  
  79. // INT_ENABLE Registers(0x2E).
  80.     writeADXL345 ( INT_ENABLE, INT_DATA_READY_OFF | INT_SINGLE_TAP_OFF | INT_DOUBLE_TAP_OFF |
  81.                     INT_ACTIVITY_OFF | INT_INACTIVITY_OFF | INT_FREE_FALL_OFF | INT_WATERMARK_OFF |
  82.                     INT_OVERRUN_OFF );
  83.    
  84.    
  85. // INT_MAP Registers(0x2F).
  86.     writeADXL345 ( INT_MAP, DATA_READY_PIN_INT1 | FREE_FALL_PIN_INT2 );
  87.    
  88. //        writeADXL345 ( DATA_FORMAT, 0x09 );
  89.     writeADXL345 ( DATA_FORMAT, CLEAR | SPI_4W | SELF_TEST_DIS | INT_INVERT_L |
  90.                     FULL_RES_10BITS | JUSTIFY_RIGHT | RANGE_2G );
  91.  
  92. // FIFO_CTL Register (0x38).
  93.     writeADXL345 ( FIFO_CTL, FIFO_MODE_FIFO | EVENT_ON_INT2 | 0x06 );
  94.  
  95.     __delay_us ( 10 );
  96.     writeADXL345 ( POWER_CTL, MEASURE_ON );
  97.  
  98.     }
  99.  
  100.  
  101. void writeADXL345 ( unsigned char registerVal, unsigned char val )
  102. {
  103.     #if defined ( ADXL345_I2C_PROTOCOL )
  104.         StartI2C ( );
  105.     //    WriteI2C ( ADXL345_ADDRESS | 0x00 );
  106.         I2CAddressCommand ( ADXL345_ADDRESS >> 1, I2C_WRITE );
  107.         WriteI2C ( registerVal );
  108.         WriteI2C ( val );
  109.  
  110.         StopI2C ( );  
  111.        
  112.     #elif defined  ( ADXL345_SPI_PROTOCOL )
  113.         ADXL345_CS = LOW;
  114.         writeByteSPI ( registerVal );
  115.         writeByteSPI ( val );
  116.  
  117.         ADXL345_CS = HIGH;
  118.     #else
  119.         #warning "You should at leats pick one of the SMPP Proteocol (I2C or SPI) Mode."
  120.         #warning "At the main file, uncomment the #define ADXL345_xxx_PROTOCOL to use."
  121.     #endif
  122.     }
  123.  
  124. unsigned char readArray [ ];
  125. unsigned char readADXL345 ( unsigned char registerVal )
  126. {
  127.     unsigned char val = CLEAR;
  128.  
  129.     #if defined ADXL345_I2C_PROTOCOL
  130.         StartI2C ( );
  131.         WriteI2C ( ADXL345_ADDRESS );
  132.         WriteI2C ( registerVal );
  133.  
  134.         RestartI2C ( );                  
  135.     //    WriteI2C ( ADXL345_ADDRESS | 0x01 );
  136.         I2CAddressCommand ( ADXL345_ADDRESS >> 1, I2C_READ );
  137.         val = ReadI2C ( );
  138.         StopI2C ( );    
  139.  
  140.     #elif defined  ADXL345_SPI_PROTOCOL
  141.         ADXL345_CS = LOW;
  142.         writeByteSPI ( registerVal | 0x80 );
  143.         val = readByteSPI ( );
  144.  
  145.         ADXL345_CS = HIGH;  
  146.  
  147.     #else
  148.         #warning "You should at leats pick one of the SMPP Proteocol (I2C or SPI) Mode."
  149.         #warning "At the main file, uncomment the #define ADXL345_xxx_PROTOCOL to use."
  150.     #endif
  151.  
  152.     return val;
  153.     }
  154.  
  155. // It takes about 1.17ms runing microcontroller at 8MHz.
  156. unsigned int x, z, y;
  157.  
  158. void readThreeAxisAccelerometer ( void )
  159. {
  160.     unsigned char acelerometerArray [ 6 ];    
  161.     unsigned char tempArrayVal = CLEAR;
  162.  
  163.     for ( unsigned char i = DATAX0; i <= DATAZ1; i++ )
  164.     {    
  165.         acelerometerArray [ tempArrayVal ] = readADXL345 ( i );
  166.         tempArrayVal++;
  167.         }
  168.  
  169.     x = acelerometerArray [ 0 ] | acelerometerArray [ 1 ] << 0x08;
  170.     y = acelerometerArray [ 2 ] | acelerometerArray [ 3 ] << 0x08;
  171.     z = acelerometerArray [ 4 ] | acelerometerArray [ 5 ] << 0x08;
  172.    
  173.     #ifdef ADXL345_DEBUG
  174.         printf ( " x= %d, y= %d, z=%d ", x, y, z );
  175.         puts ( " " );
  176.         delay_ms ( 100 );
  177.     #endif
  178.     }
...On November 2nd, a PIC10 became self-aware and decided our fate in __delay_us ( 1 ); ...