本文共 5648 字,大约阅读时间需要 18 分钟。
把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) { 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);}
转载地址:http://aqoxi.baihongyu.com/