AVR: подключаем 3х осевой акселерометр mma7455l

mma7455lДумаю, и так всем известно, что акселерометр измеряет ускорение.

Мне в руки попался цифровой трёх осевой акселерометр MMA7455L, с ним и буду экспериментировать.

Характеристики акселерометра MMA7455L

  • измерение ускорения по 3м осям
  • разрядность 10 бит
  • регулируемая шкала 2/4/8 G
  • интерфейс i2c или SPI
  • генерирование прерываний при превышении ускорением заданного порога
  • напряжение питания 2.4 V – 3.6 V

Подключение акселерометра MMA7455L к atmega8

Акселерометр выпускается в очень неудобном для ручной пайки корпусе LGA 14, поэтому запаять его на плату, сделанную при помощи ЛУТа (лазерно-утюжной технологии), было непросто,  спасибо Косте Акмарову, который помог мне в этом нелегком деле ;)

К avr atmega8 акселерометр был подключен по SPI:

mma7455+atmega8

Пример программы avr для работы с акселерометром MMA7455L

Для доступа к регистрам акселерометра написал  функции:

void mma7455l_write_byte( uint8_t addr, uint8_t val )
{
  mma7455l_select();
  spi_transfer( MMA7455_WR | ( addr << 1 ) );
  spi_transfer( val );
  mma7455l_unselect();
}
 
uint8_t mma7455l_read_byte( uint8_t addr )
{
  uint8_t val;
  mma7455l_select();
  spi_transfer(  addr << 1 );
  val = spi_transfer( 0x00 );
  mma7455l_unselect();
  return val;
}

Далее, используя эти функции настроил акселерометр:

void mma7455l_init( void )
{
  spi_init();
  //запрещаем работу по i2c
  mma7455l_write_byte( MMA7455L_I2CAD, _BV( MMA7455L_I2CAD_I2CDIS ) );
  //включаем режим постоянного измерения и выбираем шкалу +/- 2G
  mma7455l_write_byte( MMA7455L_MCTL, MMA7455L_MCTL_GLVL_2G |
                                      MMA7455L_MCTL_MODE_MEAS );
}

Что бы понять когда измерения закончены, будем опрашивать статусный регистр:

void mma7455l_wait_ready( void )
{
    while( ( mma7455l_read_byte( MMA7455L_STATUS ) &
                    _BV( MMA7455L_STATUS_DRDY ) ) == 0 );
}

Результаты измерения можно получить в 10 или в 8 битом разрешении, я решил использовать 8 битные значения:

void mma7455l_meas( int8_t *x, int8_t *y, int8_t *z )
{
  mma7455l_wait_ready();
  *x = (int8_t)mma7455l_read_byte( MMA7455L_XOUT8 );
  *y = (int8_t)mma7455l_read_byte( MMA7455L_YOUT8 );
  *z = (int8_t)mma7455l_read_byte( MMA7455L_ZOUT8 );
}

Результат измерений буду выводить в uart, в итоге получилась вот такая функция main

int main(  )
{
  uart_init();
  puts( "hello mma7455l\r\n");
 
  mma7455l_init();
  int8_t x,y,z;
  for(;;) {
    mma7455l_read( &x, &y, &z );
    printf("x=%d y=%d z=%d\r\n", x,y,z );
  }
  return 0;
}

Для эксперимента производил вращательный движения платой с акселерометром, а результаты записывал в лог файл. Графики, построенные по этому логу, можно посмотреть тут.

Архив с исходниками всего проекта для avr atmega8 под avr-gcc (WinAvr) можно скачать тут.

Запись опубликована в рубрике Микроконтроллеры avr с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>