Skocz do zawartości

LPC1114 i ADXL345 problem z odczytem


kermit

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

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.