把6050的加速度的采样率设置到最高<实际上超过了手册写的1KHz>,通过其内部fifo的方式把所有数据无遗漏的上传至上位机,并显示波形
main.c
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t len=0;
uint16_t get_num=0;
uint16_t get_tim=0;
uint16_t tick_ms=0;
_MSG msg;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
mpu_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(500);
msg.head = 0xfe;
msg.dir = 0x80;
msg.tim = tick_ms;
msg.sample_num = 0;
msg.tail = 0x0a0d;
HAL_UART_Transmit(&huart2,(uint8_t*)&msg,sizeof(_MSG),0xffff);
while(1)
{
if(HAL_OK==HAL_UART_Receive(&huart2,(uint8_t*)&msg,sizeof(_MSG),0xffff))//fe 00 t1 t0 l1 l2 0d 0a
{
if(msg.head==0xfe && msg.dir==0 && msg.tail==0x0a0d)
{
get_num = msg.sample_num;
get_tim = msg.tim;
if(get_num==0&&get_tim==0)continue;
if(get_num>MPU_MAX_BUF)get_num=MPU_MAX_BUF;
get_num = (get_num /6) *6;
if(get_tim==0)
{
get_tim = get_num*1.5+1000;
}
msg.head = 0xfe;
msg.dir = 0x80;
msg.tim = get_tim;
msg.sample_num = get_num;
msg.tail = 0x0a0d;
HAL_UART_Transmit(&huart2,(uint8_t*)&msg,sizeof(_MSG),0xffff);
break;
}
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
mpu_rst();
mpu_data_buf_p = 0;
tick_ms = 0;
while(1)
{
HAL_Delay(6);
len=MPU_fifo_data_size();
len = (len /6) *6;
if(mpu_data_buf_p+len<get_num)
{
}
else
{
len = get_num - (mpu_data_buf_p);
}
MPU_fifo_read(mpu_data_buf+mpu_data_buf_p,len);
mpu_data_buf_p+=len;
if(mpu_data_buf_p>=get_num)
{
HAL_UART_Transmit(&huart2,mpu_data_buf,mpu_data_buf_p,0xffff);
break;
}
tick_ms += 6;
if(tick_ms>get_tim)
{
HAL_UART_Transmit(&huart2,mpu_data_buf,mpu_data_buf_p,0xffff);
break;
}
}
mpu_write(MPU_PWR_MGMT1_REG,0x80);
}
/* USER CODE END 3 */
}
mpu6050驱动
/*
* mpu6050.c
*
* Created on: 2020年6月1日
* Author:
*/
#include "main.h"
#include "i2c.h"
#include "mpu6050.h"
uint8_t mpu_write(uint8_t reg,uint8_t data)
{
uint8_t buf[2];
buf[0] = reg;
buf[1] = data;
return HAL_I2C_Master_Transmit(&hi2c1,MPU_ADDR,buf,2,0xff);
}
uint8_t mpu_read(uint8_t reg)
{
uint8_t buf[1];
buf[0] = reg;
if(HAL_OK!=HAL_I2C_Master_Transmit(&hi2c1,MPU_ADDR,buf,1,0xff))
{
return 0;
}
if(HAL_OK!=HAL_I2C_Master_Receive(&hi2c1,MPU_ADDR,buf,1,0xff))
{
return 0;
}
return buf[0];
}
uint8_t mpu_read_multi(uint8_t reg,uint8_t *data,uint8_t len)
{
uint8_t buf[1];
buf[0] = reg;
HAL_I2C_Master_Transmit(&hi2c1,MPU_ADDR,buf,1,0xff);
HAL_I2C_Master_Receive(&hi2c1,MPU_ADDR,data,len,0x1fff);
return 0;
}
uint8_t mpu_write_multi(uint8_t *data,uint8_t len)
{
HAL_I2C_Master_Transmit(&hi2c1,MPU_ADDR,data,len,0x2ff);
return 0;
}
uint8_t MPU_Set_Gyro_Fsr(uint8_t fsr)
{
return mpu_write(MPU_GYRO_CFG_REG,fsr<<3);
}
uint8_t MPU_Set_Accel_Fsr(uint8_t fsr)
{
return mpu_write(MPU_ACCEL_CFG_REG,fsr<<3);
}
uint8_t MPU_Set_LPF(uint16_t lpf)
{
uint8_t 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(MPU_CFG_REG,data);
}
uint8_t MPU_Set_Rate(uint16_t rate)
{
uint8_t data;
if(rate>1000)rate=1000;
if(rate<4)rate=4;
data=1000/rate-1;
data=mpu_write(MPU_SAMPLE_RATE_REG,data);
return MPU_Set_LPF(rate/2);
}
uint8_t MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
uint8_t buf[6],res;
res=mpu_read_multi(MPU_GYRO_XOUTH_REG,buf,6);
if(res==0)
{
*gx=((uint16_t)buf[0]<<8)|buf[1];
*gy=((uint16_t)buf[2]<<8)|buf[3];
*gz=((uint16_t)buf[4]<<8)|buf[5];
}
return res;;
}
short MPU_Get_Temperature(void)
{
uint8_t buf[2];
short raw;
float temp;
mpu_read_multi(MPU_TEMP_OUTH_REG,buf,2);
raw=((uint16_t)buf[0]<<8)|buf[1];
temp=36.53+((double)raw)/340;
return temp*100;
}
uint8_t MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
uint8_t buf[6],res;
res=mpu_read_multi(MPU_ACCEL_XOUTH_REG,buf,6);
if(res==0)
{
*ax=((uint16_t)buf[0]<<8)|buf[1];
*ay=((uint16_t)buf[2]<<8)|buf[3];
*az=((uint16_t)buf[4]<<8)|buf[5];
}
return res;;
}
uint16_t MPU_fifo_data_size()
{
uint16_t res;
res = mpu_read(MPU_FIFO_CNTH_REG);
res <<= 8;
res |= mpu_read(MPU_FIFO_CNTL_REG);
return res;
}
uint16_t MPU_fifo_read(uint8_t *buf,short len)
{
return mpu_read_multi(MPU_FIFO_RW_REG,buf,len);
}
/**
*
*/
void mpu_init()
{
uint8_t res;
short ax=0,ay=0,az=0;
HAL_GPIO_WritePin(AD0_GPIO_Port,AD0_Pin,GPIO_PIN_RESET);
mpu_write(MPU_PWR_MGMT1_REG,0x80);
HAL_Delay(20);
mpu_write(MPU_PWR_MGMT1_REG,0x00);
MPU_Set_Gyro_Fsr(3);
MPU_Set_Accel_Fsr(2);
MPU_Set_Rate(100);
mpu_write(MPU_USER_CTRL_REG,0X40);
mpu_write(MPU_FIFO_EN_REG,0X08);
mpu_write(MPU_INT_EN_REG,0X01); //
mpu_write(MPU_INTBP_CFG_REG,0X80|0x20|0x10);
res=mpu_read(MPU_DEVICE_ID_REG);
Log_pf("MPU_DEVICE_ID_REG=%X\n",res);
if(res==MPU_ADDR)
{
mpu_write(MPU_PWR_MGMT1_REG,0X01);
mpu_write(MPU_PWR_MGMT2_REG,0X00);
MPU_Set_Rate(100);
}
MPU_Get_Accelerometer( &ax, &ay, &az);
Log_pf("ax=%d, ay=%d, az=%d\r\n",ax, ay, az);
Log_flush();
if(res==0)
{
while(1)HAL_Delay(100);
}
Log_pf("MPU_INT_STA_REG=%x\n",mpu_read(MPU_INT_STA_REG));
Log_flush();
}
void mpu_rst()
{
mpu_write(MPU_PWR_MGMT1_REG,0x80);
HAL_Delay(20);
mpu_write(MPU_PWR_MGMT1_REG,0x00);
MPU_Set_Accel_Fsr(3);
MPU_Set_Rate(1000);
mpu_write(MPU_USER_CTRL_REG,0X40);
mpu_write(MPU_FIFO_EN_REG,0X08);
mpu_write(MPU_INT_EN_REG,0X00);
mpu_write(MPU_INTBP_CFG_REG,0X80|0x20|0x10);
}