본문 바로가기

Development/Embedded

ATmega128 - MPU6050 레지스터 읽기

atmega128 / mpu6050 / gy-521 / 자이로 / 가속도 / 센서




TWI 통신으로 레지스터 0x3B부터 0x40, 0x43부터 0x48까지

그러니까 가속도 XYZ 출력과 자이로 XYZ 출력 레지스터를 읽기까지 성공함.

읽어들인 RAW 데이터를 정제하는데 머리가 아픔

MPU는 ATmega128을 사용했고

GY-521의 SCL -> PD0 / SDA -> PD1에 연결

사용된 센서는 MPU-6050 3축 가속도 / 3축 자이로 / 온도를 감지

오프셋을 설정 / 필터로 안정적인 값을 추출하는 작업을 해야 하는 것 같은데

아직 완벽히 이해하지 못함.

아래의 소스에서 getRawData();는 레지스터에서 읽은 단순한 값을 각 변수에 저장함.

변수의 내용을 확인 하기 위해선 텍스트 LCD로 확인하거나 시리얼 통신으로 값을 읽어서 확인해야 함.

#include <stdlib.h>
#include <delay.h>
#include <mega128.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
 
typedef unsigned char byte;
 
/*------MPU------------*/
byte MPU6050_read(byte addr);
void MPU6050_write(byte addr, char data);
void getRawData();
unsigned int gx = 0, gy = 0, gz = 0, ax = 0, ay = 0, az = 0;

byte buffer[12];
    
void main(void)
{ 
    TWSR = 0x00;
    TWBR = 0x12;
    
 MPU6050_write(0x6B, 0x00);
 MPU6050_write(0x6C, 0x00);
    
    getRawData();
    
    while(1)
    {  
        getRawData();
    }
}
 
byte MPU6050_read(byte addr)
{
 byte dat;
 
 TWCR = 0xA4;
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x08)));
 
 TWDR = 0xD0;
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x18)));
 
 TWDR = addr;
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
 TWCR = 0xA4;
//------------------------------------------------------------- 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x10)));
 TWDR = 0xD1;
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x40)));
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x58)));
 
 dat = TWDR;
 TWCR = 0x94;
 
 return dat;
}
void MPU6050_write(byte addr, char data)
{ 
 TWCR = 0xA4;
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x08)));
 
 TWDR = 0xD0;
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x18)));
 
 TWDR = addr; // addr = 0x43
 TWCR = 0x84;
 
 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
//------------------------------------------------------------- 
 TWDR = data;
 TWCR = 0x84;

 while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
 
 TWCR = 0x94;
 delay_us(50);
}
void getRawData()
{
    buffer[0] = MPU6050_read(0x3B);
    buffer[1] = MPU6050_read(0x3C);
    buffer[2] = MPU6050_read(0x3D);
    buffer[3] = MPU6050_read(0x3E);
    buffer[4] = MPU6050_read(0x3F);
    buffer[5] = MPU6050_read(0x40);
    
    buffer[6] = MPU6050_read(0x43);
    buffer[7] = MPU6050_read(0x44);
    buffer[8] = MPU6050_read(0x45);
    buffer[9] = MPU6050_read(0x46);
    buffer[10] = MPU6050_read(0x47);
    buffer[11] = MPU6050_read(0x48);
    
    ax = (int)buffer[0] << 8 | (int)buffer[1];
    ay = (int)buffer[2] << 8 | (int)buffer[3];
    az = (int)buffer[4] << 8 | (int)buffer[5];
    gx = (int)buffer[6] << 8 | (int)buffer[7];
    gy = (int)buffer[8] << 8 | (int)buffer[9];
    gz = (int)buffer[10] << 8 | (int)buffer[11];
}
2014 / 02 / 19 - 20:23 최초 작성

2014 / 02 / 20 - 01:36 태그 정리


'Development > Embedded' 카테고리의 다른 글

STM32F103 - PWM 소스  (0) 2014.02.19
FB155BC 설정 with USB2UART Downloader  (0) 2014.02.19
STM32F103 - Flash Downloader 에러  (0) 2014.02.19
ATmega128 - PWM Mode 14 소스  (0) 2014.02.19
ATmega128 - MPU6050 레지스터 읽기  (5) 2014.02.19
STM32F103 - USART Interrupt 소스  (2) 2014.02.19