2016-08-10 23:43:20 +08:00
|
|
|
#include "mpu6050.h"
|
|
|
|
|
|
|
|
#include "bit.h"
|
|
|
|
#include "stm32f10x.h"
|
|
|
|
#include "i2c.h"
|
2016-08-19 21:59:04 +08:00
|
|
|
#include "uart.h"
|
2016-08-10 23:43:20 +08:00
|
|
|
|
|
|
|
void MPU_Sigle_Write(unsigned char reg_addr, unsigned char reg_data) {
|
|
|
|
IIC_Start();
|
|
|
|
IIC_Send(MPU6050_ADDR);
|
2016-12-17 18:04:39 +08:00
|
|
|
if(!IIC_Wait_Ack())
|
|
|
|
LED1 = 1;
|
2016-08-10 23:43:20 +08:00
|
|
|
|
|
|
|
IIC_Send(reg_addr);
|
|
|
|
IIC_Wait_Ack();
|
|
|
|
|
|
|
|
IIC_Send(reg_data);
|
|
|
|
IIC_Wait_Ack();
|
|
|
|
|
|
|
|
IIC_Stop();
|
|
|
|
}
|
2016-09-27 16:16:57 +08:00
|
|
|
|
2016-08-10 23:43:20 +08:00
|
|
|
unsigned char MPU_Sigle_Read(unsigned reg_addr) {
|
|
|
|
unsigned char reg_data;
|
|
|
|
IIC_Start();
|
|
|
|
IIC_Send(MPU6050_ADDR);
|
|
|
|
IIC_Wait_Ack();
|
|
|
|
|
|
|
|
IIC_Send(reg_addr);
|
|
|
|
IIC_Wait_Ack();
|
|
|
|
|
|
|
|
IIC_Start();
|
|
|
|
IIC_Send(MPU6050_ADDR+1);
|
|
|
|
IIC_Wait_Ack();
|
|
|
|
|
|
|
|
reg_data = IIC_Read();
|
|
|
|
IIC_Ack(1);
|
|
|
|
IIC_Stop();
|
|
|
|
return reg_data;
|
|
|
|
}
|
2016-09-27 16:16:57 +08:00
|
|
|
|
2016-08-10 23:43:20 +08:00
|
|
|
short MPU_GetData(unsigned char REG_Addr) {
|
|
|
|
unsigned char H, L;
|
|
|
|
H = MPU_Sigle_Read(REG_Addr);
|
|
|
|
L = MPU_Sigle_Read(REG_Addr+1);
|
|
|
|
return (short)(H<<8)+L;
|
|
|
|
}
|
2016-09-27 16:16:57 +08:00
|
|
|
|
2016-08-10 23:43:20 +08:00
|
|
|
void MPU_init() {
|
|
|
|
IIC_init();
|
2016-09-27 16:32:33 +08:00
|
|
|
do {
|
|
|
|
MPU_Sigle_Write(PWR_MGMT_1, 0x00);
|
|
|
|
MPU_Sigle_Write(SMPLRT_DIV, 0x07);
|
|
|
|
MPU_Sigle_Write(CONFIG, 0x06);
|
|
|
|
MPU_Sigle_Write(GYRO_CONFIG, 0x18);
|
|
|
|
MPU_Sigle_Write(ACCEL_CONFIG, 0x01);
|
2016-09-27 16:46:02 +08:00
|
|
|
} while(IMU_NOT_CONNECTED);
|
2016-08-10 23:43:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void MPU6050_getStructData(pSixAxis cache) {
|
|
|
|
cache->gX = (float)MPU_GetData(GYRO_XOUT_H)/16.4f;
|
|
|
|
cache->gY = (float)MPU_GetData(GYRO_YOUT_H)/16.4f;
|
|
|
|
cache->gZ = (float)MPU_GetData(GYRO_ZOUT_H)/16.4f;
|
|
|
|
|
|
|
|
cache->aX = (float)MPU_GetData(ACCEL_XOUT_H)/1671.83f;
|
|
|
|
cache->aY = (float)MPU_GetData(ACCEL_YOUT_H)/1671.83f;
|
|
|
|
cache->aZ = (float)MPU_GetData(ACCEL_ZOUT_H)/1671.83f;
|
|
|
|
|
2016-09-28 17:39:49 +08:00
|
|
|
#ifdef IMU_SOFTWARE_FIXED
|
2016-08-10 23:43:20 +08:00
|
|
|
cache->gX += G_X_OFFSET;
|
2016-09-28 17:39:49 +08:00
|
|
|
cache->gY += G_Y_OFFSET;
|
|
|
|
cache->gZ += G_Z_OFFSET;
|
|
|
|
|
|
|
|
cache->aX += A_X_OFFSET;
|
|
|
|
cache->aY += A_Y_OFFSET;
|
2016-08-19 21:59:04 +08:00
|
|
|
cache->aZ += A_Z_OFFSET;
|
2016-09-28 17:39:49 +08:00
|
|
|
#endif
|
2016-08-19 21:59:04 +08:00
|
|
|
}
|
|
|
|
void MPU6050_debug(pSixAxis cache) {
|
|
|
|
uart_Float2Char((float)cache->gX);
|
|
|
|
uart_sendData(' ');
|
|
|
|
uart_Float2Char((float)cache->gY);
|
|
|
|
uart_sendData(' ');
|
|
|
|
uart_Float2Char((float)cache->gZ);
|
|
|
|
uart_sendData(' ');
|
|
|
|
|
|
|
|
uart_Float2Char((float)cache->aX);
|
|
|
|
uart_sendData(' ');
|
|
|
|
uart_Float2Char((float)cache->aY);
|
|
|
|
uart_sendData(' ');
|
|
|
|
uart_Float2Char((float)cache->aZ);
|
|
|
|
uart_sendData(' ');
|
|
|
|
uart_sendData(0x0D);
|
|
|
|
uart_sendData(0x0A);
|
2016-08-10 23:43:20 +08:00
|
|
|
}
|