完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想用STM32做个平衡小车,现在弄这个MPU6050,网上混了好多天,DMP的移植比较麻烦,找了别人移植过的来,先全部粘贴编译一下,在仔细看看,现在编译不过,本来I2C的编译也有问题,是输入输出口的问题,添加位绑定后解决。现在出现一下错误,那个大神来解救一下我吧,万分感谢啊! 第一个错误的指向程序,好像说是几个宏没定义,但是我不懂具体是说的啥 struct int_param_s { #if defined EMPL_TARGET_MSP430 || defined MOtiON_DRIVER_TARGET_MSP430 void (*cb)(void); unsigned short pin; unsigned char lp_exit; unsigned char active_low; #elif defined EMPL_TARGET_UC3L0 unsigned long pin; void (*cb)(volatile void*); void *arg; #endif };
|
|
相关推荐
13个回答
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我有STM32F411的MPU6050程序,楼主可以给个邮箱!
|
|
|
|
|
|
|
|
|
|
|
|
这是MPU6050.C的程序,这个里面目前也有两个问题
mpu6050MPU6050MPU6050.c(268): error: #165: too few arguments in function call mpu6050MPU6050MPU6050.c: if(!mpu_init()) mpu6050MPU6050MPU6050.c(310): warning: #223-D: function "asin" declared implicitly mpu6050MPU6050MPU6050.c: Pitch = (asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3); #include "MPU6050.h" #include "IOI2C.h" #include "usart.h" #include "inv_mpu_dmp_motion_driver.h" #include "inv_mpu.h" #define PRINT_ACCEL (0x01) #define PRINT_GYRO (0x02) #define PRINT_QUAT (0x04) #define ACCEL_ON (0x01) #define GYRO_ON (0x02) #define MOTION (0) #define NO_MOTION (1) #define DEFAULT_MPU_HZ (200) #define FLASH_SIZE (512) #define FLASH_MEM_START ((void*)0x1800) #define q30 1073741824.0f short gyro[3], accel[3], sensors; float Pitch; float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f; static signed char gyro_orientation[9] = {-1, 0, 0, 0,-1, 0, 0, 0, 1}; static unsigned short inv_row_2_scale(const signed char *row) { unsigned short b; if (row[0] > 0) b = 0; else if (row[0] < 0) b = 4; else if (row[1] > 0) b = 1; else if (row[1] < 0) b = 5; else if (row[2] > 0) b = 2; else if (row[2] < 0) b = 6; else b = 7; // error return b; } static unsigned short inv_orientation_matrix_to_scalar( const signed char *mtx) { unsigned short scalar; scalar = inv_row_2_scale(mtx); scalar |= inv_row_2_scale(mtx + 3) << 3; scalar |= inv_row_2_scale(mtx + 6) << 6; return scalar; } static void run_self_test(void) { int result; long gyro[3], accel[3]; result = mpu_run_self_test(gyro, accel); if (result == 0x7) { /* Test passed. We can trust the gyro data here, so let's push it down * to the DMP. */ float sens; unsigned short accel_sens; mpu_get_gyro_sens(&sens); gyro[0] = (long)(gyro[0] * sens); gyro[1] = (long)(gyro[1] * sens); gyro[2] = (long)(gyro[2] * sens); dmp_set_gyro_bias(gyro); mpu_get_accel_sens(&accel_sens); accel[0] *= accel_sens; accel[1] *= accel_sens; accel[2] *= accel_sens; dmp_set_accel_bias(accel); printf("setting bias succesfully ......rn"); } } uint8_t buffer[14]; int16_t MPU6050_FIFO[6][11]; int16_t Gx_offset=0,Gy_offset=0,Gz_offset=0; /**************************实现函数******************************************** *函数原型: void MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz) *功 能: 将新的ADC数据更新到 FIFO数组,进行滤波处理 *******************************************************************************/ void MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz) { unsigned char i ; int32_t sum=0; for(i=1;i<10;i++){ //FIFO 操作 MPU6050_FIFO[0][i-1]=MPU6050_FIFO[0]; MPU6050_FIFO[1][i-1]=MPU6050_FIFO[1]; MPU6050_FIFO[2][i-1]=MPU6050_FIFO[2]; MPU6050_FIFO[3][i-1]=MPU6050_FIFO[3]; MPU6050_FIFO[4][i-1]=MPU6050_FIFO[4]; MPU6050_FIFO[5][i-1]=MPU6050_FIFO[5]; } MPU6050_FIFO[0][9]=ax;//将新的数据放置到 数据的最后面 MPU6050_FIFO[1][9]=ay; MPU6050_FIFO[2][9]=az; MPU6050_FIFO[3][9]=gx; MPU6050_FIFO[4][9]=gy; MPU6050_FIFO[5][9]=gz; sum=0; for(i=0;i<10;i++){ //求当前数组的合,再取平均值 sum+=MPU6050_FIFO[0]; } MPU6050_FIFO[0][10]=sum/10; sum=0; for(i=0;i<10;i++){ sum+=MPU6050_FIFO[1]; } MPU6050_FIFO[1][10]=sum/10; sum=0; for(i=0;i<10;i++){ sum+=MPU6050_FIFO[2]; } MPU6050_FIFO[2][10]=sum/10; sum=0; for(i=0;i<10;i++){ sum+=MPU6050_FIFO[3]; } MPU6050_FIFO[3][10]=sum/10; sum=0; for(i=0;i<10;i++){ sum+=MPU6050_FIFO[4]; } MPU6050_FIFO[4][10]=sum/10; sum=0; for(i=0;i<10;i++){ sum+=MPU6050_FIFO[5]; } MPU6050_FIFO[5][10]=sum/10; } /**************************实现函数******************************************** *函数原型: void MPU6050_setClockSource(uint8_t source) *功 能: 设置 MPU6050 的时钟源 * CLK_SEL | Clock Source * --------+-------------------------------------- * 0 | Internal oscillator * 1 | PLL with X Gyro reference * 2 | PLL with Y Gyro reference * 3 | PLL with Z Gyro reference * 4 | PLL with external 32.768kHz reference * 5 | PLL with external 19.2MHz reference * 6 | Reserved * 7 | Stops the clock and keeps the timing generator in reset *******************************************************************************/ void MPU6050_setClockSource(uint8_t source){ IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source); } /** Set full-scale gyroscope range. * @param range New full-scale gyroscope range value * @SEE getFullScaleRange() * @see MPU6050_GYRO_FS_250 * @see MPU6050_RA_GYRO_CONFIG * @see MPU6050_GCONFIG_FS_SEL_BIT * @see MPU6050_GCONFIG_FS_SEL_LENGTH */ void MPU6050_setFullScaleGyroRange(uint8_t range) { IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range); } /**************************实现函数******************************************** *函数原型: void MPU6050_setFullScaleAccelRange(uint8_t range) *功 能: 设置 MPU6050 加速度计的最大量程 *******************************************************************************/ void MPU6050_setFullScaleAccelRange(uint8_t range) { IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range); } /**************************实现函数******************************************** *函数原型: void MPU6050_setSleepEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否进入睡眠模式 enabled =1 睡觉 enabled =0 工作 *******************************************************************************/ void MPU6050_setSleepEnabled(uint8_t enabled) { IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled); } /**************************实现函数******************************************** *函数原型: uint8_t MPU6050_getDeviceID(void) *功 能: 读取 MPU6050 WHO_AM_I 标识 将返回 0x68 *******************************************************************************/ uint8_t MPU6050_getDeviceID(void) { IICreadBytes(devAddr, MPU6050_RA_WHO_AM_I, 1, buffer); return buffer[0]; } /**************************实现函数******************************************** *函数原型: uint8_t MPU6050_testConnection(void) *功 能: 检测MPU6050 是否已经连接 *******************************************************************************/ uint8_t MPU6050_testConnection(void) { if(MPU6050_getDeviceID() == 0x68) //0b01101000; return 1; else return 0; } /**************************实现函数******************************************** *函数原型: void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机 *******************************************************************************/ void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) { IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled); } /**************************实现函数******************************************** *函数原型: void MPU6050_setI2CBypassEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机 *******************************************************************************/ void MPU6050_setI2CBypassEnabled(uint8_t enabled) { IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled); } /**************************实现函数******************************************** *函数原型: void MPU6050_initialize(void) *功 能: 初始化 MPU6050 以进入可用状态。 *******************************************************************************/ void MPU6050_initialize(void) { MPU6050_setClockSource(MPU6050_CLOCK_PLL_YGYRO); //设置时钟 MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000);//陀螺仪最大量程 +-1000度每秒 MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2); //加速度度最大量程 +-2G MPU6050_setSleepEnabled(0); //进入工作状态 MPU6050_setI2CMasterModeEnabled(0); //不让MPU6050 控制AUXI2C MPU6050_setI2CBypassEnabled(0); //主控制器的I2C与 MPU6050的AUXI2C 直通。控制器可以直接访问HMC5883L } /************************************************************************** 函数功能:MPU6050内置DMP的初始化 入口参数:无 返回 值:无 作 者:平衡小车之家 **************************************************************************/ void DMP_Init(void) { u8 temp[1]={0}; i2cRead(0x68,0x75,1,temp); printf("mpu_set_sensor complete ......rn"); if(temp[0]!=0x68)NVIC_SystemReset(); if(!mpu_init()) { if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL)) printf("mpu_set_sensor complete ......rn"); if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL)) printf("mpu_configure_fifo complete ......rn"); if(!mpu_set_sample_rate(DEFAULT_MPU_HZ)) printf("mpu_set_sample_rate complete ......rn"); if(!dmp_load_motion_driver_firmware()) printf("dmp_load_motion_driver_firmware complete ......rn"); if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation))) printf("dmp_set_orientation complete ......rn"); if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO | DMP_FEATURE_GYRO_CAL)) printf("dmp_enable_feature complete ......rn"); if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ)) printf("dmp_set_fifo_rate complete ......rn"); run_self_test(); if(!mpu_set_dmp_state(1)) printf("mpu_set_dmp_state complete ......rn"); } } /************************************************************************** 函数功能:读取MPU6050内置DMP的姿态信息 入口参数:无 返回 值:无 作 者:平衡小车之家 **************************************************************************/ void Read_DMP(void) { unsigned long sensor_timestamp; unsigned char more; long quat[4]; dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more); if (sensors & INV_WXYZ_QUAT ) { q0=quat[0] / q30; q1=quat[1] / q30; q2=quat[2] / q30; q3=quat[3] / q30; Pitch = (asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3); printf("%frn",Pitch); } } /************************************************************************** 函数功能:读取MPU6050内置温度传感器数据 入口参数:无 返回 值:摄氏温度 作 者:平衡小车之家 **************************************************************************/ int Read_Temperature(void) { float Temp; Temp=(I2C_ReadOneByte(devAddr,MPU6050_RA_TEMP_OUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_TEMP_OUT_L); if(Temp>32768) Temp-=65536; Temp=(36.53+Temp/340)*10; return (int)Temp; } //------------------End of File---------------------------- 这个是inv_mpu.h的程序,一个错误在这里 mpu6050inv_mpu.h(44): error: #169: expected a declaration mpu6050inv_mpu.h: }; /* $License: Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved. See included License.txt for License information. $ */ /** * @addtogroup DRIVERS Sensor Driver Layer * @brief Hardware drivers to communicate with sensors via I2C. * * @{ * @file inv_mpu.h * @brief An I2C-based driver for Invensense gyroscopes. * @Details This driver currently works for the following devices: * MPU6050 * MPU6500 * MPU9150 (or MPU6050 w/ AK8975 on the auxiliary bus) * MPU9250 (or MPU6500 w/ AK8963 on the auxiliary bus) */ #ifndef _INV_MPU_H_ #define _INV_MPU_H_ #define INV_X_GYRO (0x40) #define INV_Y_GYRO (0x20) #define INV_Z_GYRO (0x10) #define INV_XYZ_GYRO (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO) #define INV_XYZ_ACCEL (0x08) #define INV_XYZ_COMPASS (0x01) struct int_param_s { #if defined EMPL_TARGET_MSP430 || defined MOTION_DRIVER_TARGET_MSP430 void (*cb)(void); unsigned short pin; unsigned char lp_exit; unsigned char active_low; #elif defined EMPL_TARGET_UC3L0 unsigned long pin; void (*cb)(volatile void*); void *arg; #endif }; #define MPU_INT_STATUS_DATA_READY (0x0001) #define MPU_INT_STATUS_DMP (0x0002) #define MPU_INT_STATUS_PLL_READY (0x0004) #define MPU_INT_STATUS_I2C_MST (0x0008) #define MPU_INT_STATUS_FIFO_OVERFLOW (0x0010) #define MPU_INT_STATUS_ZMOT (0x0020) #define MPU_INT_STATUS_MOT (0x0040) #define MPU_INT_STATUS_FREE_FALL (0x0080) #define MPU_INT_STATUS_DMP_0 (0x0100) #define MPU_INT_STATUS_DMP_1 (0x0200) #define MPU_INT_STATUS_DMP_2 (0x0400) #define MPU_INT_STATUS_DMP_3 (0x0800) #define MPU_INT_STATUS_DMP_4 (0x1000) #define MPU_INT_STATUS_DMP_5 (0x2000) /* Set up APIs */ int mpu_init(struct int_param_s *int_param); int mpu_init_slave(void); int mpu_set_bypass(unsigned char bypass_on); /* Configuration APIs */ int mpu_lp_accel_mode(unsigned char rate); int mpu_lp_motion_interrupt(unsigned short thresh, unsigned char time, unsigned char lpa_freq); int mpu_set_int_level(unsigned char active_low); int mpu_set_int_latched(unsigned char enable); int mpu_set_dmp_state(unsigned char enable); int mpu_get_dmp_state(unsigned char *enabled); int mpu_get_lpf(unsigned short *lpf); int mpu_set_lpf(unsigned short lpf); int mpu_get_gyro_fsr(unsigned short *fsr); int mpu_set_gyro_fsr(unsigned short fsr); int mpu_get_accel_fsr(unsigned char *fsr); int mpu_set_accel_fsr(unsigned char fsr); int mpu_get_compass_fsr(unsigned short *fsr); int mpu_get_gyro_sens(float *sens); int mpu_get_accel_sens(unsigned short *sens); int mpu_get_sample_rate(unsigned short *rate); int mpu_set_sample_rate(unsigned short rate); int mpu_get_compass_sample_rate(unsigned short *rate); int mpu_set_compass_sample_rate(unsigned short rate); int mpu_get_fifo_config(unsigned char *sensors); int mpu_configure_fifo(unsigned char sensors); int mpu_get_power_state(unsigned char *power_on); int mpu_set_sensors(unsigned char sensors); int mpu_set_accel_bias(const long *accel_bias); /* Data getter/setter APIs */ int mpu_get_gyro_reg(short *data, unsigned long *timestamp); int mpu_get_accel_reg(short *data, unsigned long *timestamp); int mpu_get_compass_reg(short *data, unsigned long *timestamp); int mpu_get_temperature(long *data, unsigned long *timestamp); int mpu_get_int_status(short *status); int mpu_read_fifo(short *gyro, short *accel, unsigned long *timestamp, unsigned char *sensors, unsigned char *more); int mpu_read_fifo_stream(unsigned short length, unsigned char *data, unsigned char *more); int mpu_reset_fifo(void); int mpu_write_mem(unsigned short mem_addr, unsigned short length, unsigned char *data); int mpu_read_mem(unsigned short mem_addr, unsigned short length, unsigned char *data); int mpu_load_firmware(unsigned short length, const unsigned char *firmware, unsigned short start_addr, unsigned short sample_rate); int mpu_reg_dump(void); int mpu_read_reg(unsigned char reg, unsigned char *data); int mpu_run_self_test(long *gyro, long *accel); int mpu_register_tap_cb(void (*func)(unsigned char, unsigned char)); #endif /* #ifndef _INV_MPU_H_ */ 这个是inv_mpu.c这两个错误指向的是同一句话 mpu6050inv_mpu.c(105): error: #35: #error directive: Gyro driver is missing the system layer implementations. mpu6050inv_mpu.c: #error Gyro driver is missing the system layer implementations. inv_mpu.c太长了,就复制错误的这一段吧 #define log_i MPL_LOGI #define log_e MPL_LOGE /* UC3 is a 32-bit processor, so abs and labs are equivalent. */ #define labs abs #define fabs(x) (((x)>0)?(x):-(x)) #else #error Gyro driver is missing the system layer implementations. //错误指向的语句 #endif #if !defined MPU6050 && !defined MPU9150 && !defined MPU6500 && !defined MPU9250 #error Which gyro are you using? Define MPUxxxx in your compiler options. #endif 另外 mpu6050inv_mpu_dmp_motion_driver.c 和 inv_mpu.c 的错误是一致的,也这句话 |
|
|
|
|
|
|
|
|
|
|
|
编译通过了,原来是我把inv_mpu_dmp_motion_driver.c 和 inv_mpu.c 弄错了,我把官方库里面的当成那个已经移植过的里面的,现在换回来就可以编译通过了。
麻烦大伙了,等有时间就把MPU6050班弄好试试。 |
|
|
|
|
|
|
|
哎,慢慢研究吧
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1980 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1836 浏览 3 评论
4416 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1985 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2489 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 11:03 , Processed in 0.946885 second(s), Total 98, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号