0% found this document useful (0 votes)
24 views10 pages

Code MPU6050

Uploaded by

Khai Tran
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views10 pages

Code MPU6050

Uploaded by

Khai Tran
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 10

/********************************** (C) COPYRIGHT *******************************

* File Name : main.c


* Author : WCH
* Version : V1.0.0
* Date : 2023/12/22
* Description : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
*@Note
*7-bit addressing mode, master/slave mode, transceiver routine:
*I2C1_SCL(PC2)\I2C1_SDA(PC1).
*This routine demonstrates that Master sends and Slave receives.
*Note: The two boards download the Master and Slave programs respectively,
* and power on at the same time.
* Hardware connection:
* PC2 -- PC2
* PC1 -- PC1
*
Mpu6050 : Id Address = 0x68 wrt , 0x69 rd

- Compiles Downloads , Returns same data : Temp=175, AX=-11823 , AY=-11823 , AZ=-


11823 , GX=-11823 , AGY=-11823 , GZ=-11823
- TX = PA5
- RX = PA6
Output :

: MPU6050 003 :
- SystemClk:48000000
> IIC_Init() : bound=100000 , address=0x68 :
< IIC_Init() .
> MPU6050_Write() :
= MPU6050_Write() -> MPU_Set_Gyro_Fsr()
= MPU6050_Write() -> MPU_Set_Accel_Fsr()
= MPU6050_Write() -> MPU_Set_Rate()
= MPU6050_Write() ...
< MPU6050_Write() .
> mpu6050 Test ...

Temperature:2849
ACC : X=14846 , Y=292 , Z=-10048
GYRO : X=804 , Y=3665 , Z=-53

Temperature:2850
ACC : X=16938 , Y=-108 , Z=-4118
GYRO : X=-2373 , Y=7016 , Z=1027
*/

/*
*@Note
I2C interface routine to operate EEPROM peripheral:
I2C1_SCL(PC2)\I2C1_SDA(PC1).
This example uses EEPROM for AT24Cxx series.
Steps:
READ EEPROM:Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop.
WRITE EERPOM:Start + 0xA0 + 8bit Data Address + Write Data + Stop.

*/

#include "debug.h"

///

u8 AT24CXX_ReadOneByte( u16 ReadAddr );


void AT24CXX_WriteOneByte( u16 WriteAddr, u8 DataToWrite );
void AT24CXX_Read( u16 ReadAddr, u8 *pBuffer, u16 NumToRead );
void MPU6050_Write(); //void AT24CXX_Write(
u16 WriteAddr, u8 *pBuffer, u16 NumToWrite ) ;

///

#define __MPU6050_H
//MPU6050 AD0
#define MPU_AD0_H GPIO_SetBits( GPIOC,GPIO_Pin_1) // SDA
#define MPU_AD0_L GPIO_ResetBits(GPIOC,GPIO_Pin_1) // SDA

#define MPU_ACCEL_OFFS_REG 0X06 //accel_offs


#define MPU_PROD_ID_REG 0X0C //prod id

#define MPU_SELF_TESTX_REG 0X0D //X


#define MPU_SELF_TESTY_REG 0X0E //Y
#define MPU_SELF_TESTZ_REG 0X0F //Z
#define MPU_SELF_TESTA_REG 0X10 //A
#define MPU_SAMPLE_RATE_REG 0X19 //
#define MPU_CFG_REG 0X1A //
#define MPU_GYRO_CFG_REG 0X1B //
#define MPU_ACCEL_CFG_REG 0X1C //
#define MPU_MOTION_DET_REG 0X1F //
#define MPU_FIFO_EN_REG 0X23 //FIFO

#define MPU_INTBP_CFG_REG 0X37 // /


#define MPU_INT_EN_REG 0X38 //
#define MPU_INT_STA_REG 0X3A //

#define MPU_ACCEL_XOUTH_REG 0X3B //X 8


#define MPU_ACCEL_XOUTL_REG 0X3C //X 8
#define MPU_ACCEL_YOUTH_REG 0X3D //Y 8
#define MPU_ACCEL_YOUTL_REG 0X3E //Y 8
#define MPU_ACCEL_ZOUTH_REG 0X3F //Z 8
#define MPU_ACCEL_ZOUTL_REG 0X40 //Z 8

#define MPU_TEMP_OUTH_REG 0X41 //


#define MPU_TEMP_OUTL_REG 0X42 //8

#define MPU_GYRO_XOUTH_REG 0X43 //X 8


#define MPU_GYRO_XOUTL_REG 0X44 //X 8
#define MPU_GYRO_YOUTH_REG 0X45 //Y 8
#define MPU_GYRO_YOUTL_REG 0X46 //Y 8
#define MPU_GYRO_ZOUTH_REG 0X47 //Z 8
#define MPU_GYRO_ZOUTL_REG 0X48 //Z 8
#define MPU_I2CSLV1_DO_REG 0X64 //IIC1

#define MPU_SIGPATH_RST_REG 0X68 //


#define MPU_MDETECT_CTRL_REG 0X69 //
#define MPU_USER_CTRL_REG 0X6A //
#define MPU_PWR_MGMT1_REG 0X6B //1
#define MPU_PWR_MGMT2_REG 0X6C //2
#define MPU_FIFO_CNTH_REG 0X72 //FIFO
#define MPU_FIFO_CNTL_REG 0X73 //FIFO
#define MPU_FIFO_RW_REG 0X74 //FIFO
#define MPU_DEVICE_ID_REG 0X75 //ID

#define MPU_ADDR 0X68

u8 MPU_Set_Gyro_Fsr(u8 fsr);
u8 MPU_Set_Accel_Fsr(u8 fsr);
u8 MPU_Set_LPF(u16 lpf);
u8 MPU_Set_Rate(u16 rate);

short MPU_Get_Temperature(void);
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz);
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az);

u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
// return( MPU_Write_Byte( MPU_GYRO_CFG_REG , fsr << 3 ) );//
AT24CXX_WriteOneByte( MPU_GYRO_CFG_REG , fsr << 3 ) ;
return( 0 );
}

u8 MPU_Set_Accel_Fsr(u8 fsr)
{
// return MPU_Write_Byte( MPU_ACCEL_CFG_REG , fsr << 3 );//
AT24CXX_WriteOneByte( MPU_ACCEL_CFG_REG , fsr << 3 ) ;

return( 0 );
}

u8 MPU_Set_LPF(u16 lpf)
{
u8 data = 0;

if( lpf >= 188 )


data=1;
else if( lpf >= 98 )
data=2;
else if( lpf >= 42 )
data=3;
else if( lpf >= 20 )
data=4;
else if( lpf >= 10 )
data=5;
else
data = 6;

// // return( MPU_Write_Byte( MPU_CFG_REG , data ) );


// return( AT24CXX_WriteOneByte( MPU_CFG_REG , data ) );
AT24CXX_WriteOneByte( MPU_CFG_REG , data ) ;
return(0);
}

u8 MPU_Set_Rate(u16 rate)
{
u8 data;

if(rate > 1000)


rate = 1000;
if(rate < 4)
rate = 4;
data = 1000 / rate - 1 ;

// // data = MPU_Write_Byte( MPU_SAMPLE_RATE_REG , data ); //


AT24CXX_WriteOneByte( MPU_SAMPLE_RATE_REG , data ); //

return MPU_Set_LPF( rate / 2 ); //LPF


}

short MPU_Get_Temperature(void)
{
u8 buf[2];
short raw;
float temp;

// // MPU_Read_Len( MPU_ADDR , MPU_TEMP_OUTH_REG , 2 , buf );


AT24CXX_Read( MPU_TEMP_OUTH_REG , buf , 2 );

raw = ((u16)buf[0]<<8) | buf[1];


temp = 36.53 + ((double)raw) / 340;

return( temp);
}

u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)


{
u8 buf[6],res = 0 ;
//loc_gyro();

// // res = MPU_Read_Len( MPU_ADDR , MPU_GYRO_XOUTH_REG , 6 , buf );


AT24CXX_Read( MPU_GYRO_XOUTH_REG , buf , 6 );

// // if( res == 0 )
{
*gx = ((u16)buf[0]<<8) | buf[1];
*gy = ((u16)buf[2]<<8) | buf[3];
*gz = ((u16)buf[4]<<8) | buf[5];

printf("GYRO : X=%d , Y=%d , Z=%d \r\n",*gx,*gy,*gz);


}

return res;;
}
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
u8 buf[6] , res = 0 ;

// // res = MPU_Read_Len( MPU_ADDR , MPU_ACCEL_XOUTH_REG , 6 , buf );


AT24CXX_Read( MPU_ACCEL_XOUTH_REG , buf , 6 );

// // if( res == 0 )
{
*ax = ((u16)buf[0]<<8) | buf[1];
*ay = ((u16)buf[2]<<8) | buf[3];
*az = ((u16)buf[4]<<8) | buf[5];

*ax +=*ax; *ax = *ax/1000; //loc gia tri goc quay tới
*ay +=*ay; *ay = *ay/1000; //loc gia tri goc trái phải
*az +=*az; *az = *az/1000; //lọc giá trị góc

printf("ACC : X=%d , Y=%d , Z=%d \r\n", *ax , *ay , *az );


}

return res;;
}

int MPU6050_TEST(void)
{
short aacx,aacy,aacz;
short gyrox,gyroy,gyroz;
short temp;
while( 1 )
{
temp = MPU_Get_Temperature(); //
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //
//MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //

//printf("\r\n Temperature:%d \r\n",temp);

Delay_Ms(500);
}
}

///

/**********************************************************************
*@Note:
AT24Cxx
READ EEPROM Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop.
WRITE EERPOM Start + 0xA0 + 8bit Data Address + Write Data + Stop.
*******************************************************************************/
/* EERPOM DATA ADDRESS Length Definition */
#define Address_8bit 0
#define Address_16bit 1

/* EERPOM DATA ADDRESS Length Selection */


#define Address_Lenth Address_8bit
//#define Address_Lenth Address_16bit

/* Global define */
#define SIZE sizeof(TEXT_Buffer)

/* Global Variable */
const u8 TEXT_Buffer[]={"CH32V00x I2C TEST"};

/*********************************************************************
* @fn IIC_Init
* @brief Initializes the IIC peripheral.
* @return none
*/
void IIC_Init(u32 bound, u16 address)
{
printf("> IIC_Init() : bound=%d , address=%02X :\r\n" , bound , address );
GPIO_InitTypeDef GPIO_InitStructure={0};
I2C_InitTypeDef I2C_InitTSturcture={0};

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE );


RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure );

I2C_InitTSturcture.I2C_ClockSpeed = bound;
I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitTSturcture.I2C_OwnAddress1 = address;
I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;
I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init( I2C1, &I2C_InitTSturcture );

I2C_Cmd( I2C1, ENABLE );

I2C_AcknowledgeConfig( I2C1, ENABLE );

printf("< IIC_Init() .\r\n");


}

/*********************************************************************
* @fn AT24CXX_Init
* @brief Initializes AT24xx EEPROM.
* @return none
*/
void MPU6050_Init(void) //void AT24CXX_Init(void)
{
IIC_Init( 100000, 0x68 ); //IIC_Init( 100000, 0xA0 );
}
/*********************************************************************
* @fn AT24CXX_ReadOneByte
* @brief Read one data from EEPROM.
* @param ReadAddr - Read first address.
* @return temp - Read data.
*/
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;

while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET );


I2C_GenerateSTART( I2C1, ENABLE );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );

I2C_Send7bitAddress( I2C1, (0X68<<1) , I2C_Direction_Transmitter );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );

// Send Address 8b / 16b : //

#if (Address_Lenth == Address_8bit)


I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

#endif

I2C_GenerateSTART( I2C1, ENABLE );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );

I2C_Send7bitAddress( I2C1, (0X68<<1) , I2C_Direction_Receiver );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );


while( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) == RESET )
I2C_AcknowledgeConfig( I2C1, DISABLE );

temp = I2C_ReceiveData( I2C1 );


I2C_GenerateSTOP( I2C1, ENABLE );

return temp;
}

/*********************************************************************
* @fn AT24CXX_WriteOneByte
* @brief Write one data to EEPROM.
* @param WriteAddr - Write frist address.
* @return DataToWrite - Write data.
*/
void AT24CXX_WriteOneByte(u16 WriteAddr, u8 DataToWrite)
{
while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET );
I2C_GenerateSTART( I2C1, ENABLE );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );


// I2C_Send7bitAddress( I2C1, 0X68 , I2C_Direction_Transmitter );
I2C_Send7bitAddress( I2C1, (0X68<<1) , I2C_Direction_Transmitter );
//note:0x68<1

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );

// Send Address 8b / 16b : //

#if (Address_Lenth == Address_8bit)


I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

//#elif (Address_Lenth == Address_16bit)


// I2C_SendData( I2C1, (u8)(WriteAddr>>8) );
// while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
//
// I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
// while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

#endif

if( I2C_GetFlagStatus( I2C1, I2C_FLAG_TXE ) != RESET )


{
I2C_SendData( I2C1, DataToWrite );
}

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );


I2C_GenerateSTOP( I2C1, ENABLE );
}

/*********************************************************************
* @fn AT24CXX_Read
* @brief Read multiple data from EEPROM.
* @param ReadAddr - Read frist address. (AT24c02: 0~255)
* pBuffer - Read data.
* NumToRead - Data number.
* @return none
*/
void AT24CXX_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
{
while( NumToRead )
{
* pBuffer ++ = AT24CXX_ReadOneByte( ReadAddr ++ );
NumToRead -- ;
}
}

/*********************************************************************
* @fn AT24CXX_Write
* @brief Write multiple data to EEPROM.
* @param WriteAddr - Write frist address. (AT24c02: 0~255)
* pBuffer - Write data.
* NumToWrite - Data number.
* @return none
*/
void MPU6050_Write()
{
printf("> MPU6050_Write() : \r\n");

// // MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //MPU6050
AT24CXX_WriteOneByte(MPU_PWR_MGMT1_REG,0X80); //MPU6050
Delay_Ms(100);
// // MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //MPU6050
AT24CXX_WriteOneByte(MPU_PWR_MGMT1_REG,0X00); //MPU6050
// Delay_Ms(1);

printf("= MPU6050_Write() -> MPU_Set_Gyro_Fsr() \r\n");


// // MPU_Set_Gyro_Fsr(3); //+-2000dps
AT24CXX_WriteOneByte( MPU_ACCEL_CFG_REG , 3 << 3 ) ;
// Delay_Ms(1);
printf("= MPU6050_Write() -> MPU_Set_Accel_Fsr() \r\n");
MPU_Set_Accel_Fsr(0); //+-2g
printf("= MPU6050_Write() -> MPU_Set_Rate() \r\n");
MPU_Set_Rate(50); //50Hz

printf("= MPU6050_Write() ... \r\n");

// // MPU_Write_Byte(MPU_INT_EN_REG,0x00); //
AT24CXX_WriteOneByte(MPU_INT_EN_REG,0); //
// // MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //I2C
AT24CXX_WriteOneByte(MPU_USER_CTRL_REG,0); //I2C
// // MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); //FIFO
AT24CXX_WriteOneByte(MPU_FIFO_EN_REG,0); //FIFO
// // MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT
AT24CXX_WriteOneByte(MPU_INTBP_CFG_REG,1); //INT

// // int res ;
// // res = MPU_Read_Byte(MPU_DEVICE_ID_REG);
AT24CXX_ReadOneByte( MPU_DEVICE_ID_REG );
// // if( res == MPU_ADDR ) // ID
{
// // MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); // CLKSEL,PLL X
AT24CXX_WriteOneByte(MPU_PWR_MGMT1_REG,1); // CLKSEL,PLL X
// // MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //
AT24CXX_WriteOneByte(MPU_PWR_MGMT2_REG,0); //

MPU_Set_Rate(50); // 50Hz
}
// return 1;

printf("< MPU6050_Write() . \r\n");


}

/*********************************************************************
* @fn main
* @brief Main program.
* @return none
*/
int main(void)
{
// u8 data[SIZE];

Delay_Init();
USART_Printf_Init(115200);
// // printf(": eeprom 24Cxx :\r\n");
printf("\r\n\r\n: MPU6050 003 :\r\n");
printf("- SystemClk:%d\r\n",SystemCoreClock);

MPU6050_Init();

Delay_Ms(500);

MPU6050_Write();

Delay_Ms(500);

while( 1 )
{

printf("> mpu6050 Test ... \r\n");

MPU6050_TEST();

Delay_Ms(1000);

You might also like