Skocz do zawartości
Zaloguj się, aby obserwować  
kermit

LPC1114 i ADXL345 problem z odczytem

Pomocna odpowiedź

witam!

Od jakiegoś czasu bawię się modułem IMU gy-80:

schemat:

podłączam go do płytki z mikrokontrolerem lpc1114 , a dokładniej:

http://www.kamami.pl/dl/litecomplpc1114.pdf

moduł IMU jak i płytka z mikrokontrolerem zasilane są z portu USB napięciem 5V ponieważ posiadają one własne stabilizatory 3,3V, moduł posiada również translator napięć I2C z 3,3V na 5V teoretycznie mogło by to sprawiać problemy, ponieważ mikrokontroler chodzi pod napięciem 3,3v lecz komunikacja z magnetometrem oraz barometrem działa bez problemu.

Problematyczne okazało się uruchomienie akcelerometru, ponieważ odczytywana wartośći z reejstrów w których powinny znajdować się wyniku pomiarów ciągle równe są zero.Wszystkie odczyty wysyłam przez przejsciówke UART do aplikacji stworzonej w labview lub ostatnio do terminala (Hercules)ale w obu wypadkach odczytywane wyniki równe są 0.Odczytywanie sygnatury działa bez problemu, więc połączenia jak i sam układ wydaje się sprawny.Męczę się już z tym akcelerometrem od 4 dni niestety nie mogę nic wskurać. Konfiguracja układu też wydaje sie poprawna chociaż w takim stopniu aby można było odczytać jakiekolwiek wyniki. Może ktoś miał już doczynienia z tym akcelerometrem i byłby w stanie mi pomóc.

oto kod częśc kodu odpowiedzialna za konfigurację akcelerometru oraz odczyty wyników:


//definicje dla akcelerometru
#define adxl_adr 0xA6
#define data_format_reg 0x31
#define range_2g 0
#define range_4g (1<<0)
#define range_8g (1<<1)
#define range_16g (1<<0)|(1<<1)
#define power_reg 0x2D
#define data_rate_reg 0x2C
#define x_lsb_data 0x32
#define ID_reg 0

void accel_config(uint8_t range);
void accel_read(uint8_t *buffer);
uint8_t accel_read_id(void);

// ciała funkcji
void accel_config(uint8_t range)
{
 I2CWriteLength = 7;
 I2CMasterBuffer[0]=adxl_adr;
 I2CMasterBuffer[1]=data_rate_reg;
 I2CMasterBuffer[2]=((1<<0)|(1<<1)|(1<<2));    //data rate 12,5hz
 I2CMasterBuffer[3]=data_format_reg;           
 I2CMasterBuffer[4]=range;
 I2CMasterBuffer[5]=power_reg;
 I2CMasterBuffer[6]=(1<<3);                    //włączenie pomiarów


 I2CEngine();
}

void accel_read(uint8_t *buffer)
{
 uint8_t i;
 I2CWriteLength = 2;
 I2CReadLength = 6;
 I2CMasterBuffer[0]=adxl_adr;
 I2CMasterBuffer[1]=x_lsb_data;
 I2CMasterBuffer[2]=adxl_adr+1;
 I2CEngine();
 for(i=0;i<=5;i++)
    {
      *buffer++ = I2CSlaveBuffer[i];
    }

}

uint8_t accel_read_id(void)
{
 I2CWriteLength = 2;
 I2CReadLength = 1;
 I2CMasterBuffer[0]=adxl_adr;
 I2CMasterBuffer[1]=ID_reg;
 I2CMasterBuffer[2]=adxl_adr+1;
 I2CEngine();

 return I2CSlaveBuffer[0];
}

w funkcji main dane wysyłane są na port szeregowy do terminala:

/*
===============================================================================
Name        : main.c
Author      : 
Version     :
Copyright   : Copyright (C) 
Description : main definition
===============================================================================
*/

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

// TODO: insert other include files here
#include "drivers/uart.h"
#include "drivers/gy80.h"
#include "redlib/stdlib.h"

 uint8_t hmc[5];
 uint8_t bmp_p[3];
 uint8_t bmp_t[3];
 uint8_t accel[5];
 int16_t data;

 char itoa_buf[10];

int main(void)
{
 uart_init();

 while(1)
   {
     if(uart_get_data() == 97)
       {
         uart_put_data(170);
         break;
       }
   }
 SysTick_Config(48000);
 I2CInit(0);
 //HMC_config(avg_4|datarate_70hz,gain_7,cont_mode);
 //bmp_init();
 accel_config(range_16g);
 while(global_timer<=25);

while(1)
 {

   accel_read(accel);
   //uart_put_data(accel_read_id());
   uart_put_string("\n");
   uart_put_string("-------------");
   //put x data
   data=(accel[0]<<8 | accel[1]);
   itoa(data,itoa_buf,10);
   uart_put_string("data x");
   uart_put_string(itoa_buf);
   uart_put_string("\n");

   //put y data
   data=(accel[2]<<8 | accel[3]);
   itoa(data,itoa_buf,10);
   uart_put_string("data y: ");
   uart_put_string(itoa_buf);
   uart_put_string("\n");

   //put z data
   data=(accel[4]<<8 | accel[5]);
   itoa(data,itoa_buf,10);
   uart_put_string("data z: ");
   uart_put_string(itoa_buf);
   uart_put_string("\n");
   uart_put_string("-------------");

   global_timer=0;
   while(global_timer<=200);
 }
}

pozdrawiam!!!

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...