OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2910|回复: 2

使用stm32f103读取多个9250的数据

[复制链接]

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-6-29
在线时间
16 小时
发表于 2019-7-18 21:14:23 | 显示全部楼层 |阅读模式
7金钱
小弟我最近在尝试用stm32读取多个mpu9250输出欧拉角,我通过将两片9250的AD0接口分别接到stm32板子的PA5和PA6上,然后分别置PA5和PA6以低电平,同时置另一个以高电平,以此来分别读取两个9250的数据,但是得到的数据却是串在一起的,就是显示的a,b数据都是一样的,而且无论动哪一片9250,两个数据都会一起改变(但是我用不带磁力计修正的6050的程序分别读取9250就没有这个问题),不知道有没有大佬做过类似的功能,能指点一下小弟到底是哪里有问题吗?真的感激不尽。下面的是主函数,图片是mpl库函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "mpu9250.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "mpuiic.h"

int main(void)
{
        float pitch,roll,yaw;                 //欧拉角
        short aacx,aacy,aacz;                //加速度计原始数据
        short gyrox,gyroy,gyroz;        //陀螺仪原始数据
       
        IIC_Init();
        delay_init();                 
        uart_init(115200);
  GPIO_InitTypeDef GPIO_InitStructure;
       
  //配置GPIOA5
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PA.5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.5
       
        //配置GPIOA6
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA.6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.6
       
        LED_Init();
       
        //GPIOA5初始化
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);
        GPIO_SetBits(GPIOA,GPIO_Pin_6);
        while(mpu_dmp_init())
        {   
                delay_ms(200);
                LED=1;
        }
       
        //GPIO6初始化
        GPIO_ResetBits(GPIOA,GPIO_Pin_6);
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
        while(mpu_dmp_init())
        {   
                delay_ms(200);
                LED=1;
        }
       
       
    while(1)
    {
                GPIO_ResetBits(GPIOA,GPIO_Pin_5);
          GPIO_SetBits(GPIOA,GPIO_Pin_6);
                delay_ms(20);
                mpu_mpl_get_data(&pitch,&roll,&yaw);
                printf("a:%f,%f,%f   ",pitch,roll,yaw);
//        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);                //得到加速度计数据
//        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);                //得到陀螺仪数据
               
                delay_ms(20);
                GPIO_ResetBits(GPIOA,GPIO_Pin_6);
          GPIO_SetBits(GPIOA,GPIO_Pin_5);
                delay_ms(20);
                mpu_mpl_get_data(&pitch,&roll,&yaw);
                printf("b:%f,%f,%f\r\n",pitch,roll,yaw);
//        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);                //得到加速度计数据
//        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);                //得到陀螺仪数据

                       
                       
                }
               
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-6-29
在线时间
16 小时
 楼主| 发表于 2019-7-18 21:15:46 | 显示全部楼层
下面的是mpl获取欧拉角的函数

u8 mpu_mpl_get_data(float *pitch,float *roll,float *yaw)
{
        unsigned long sensor_timestamp,timestamp;
        short gyro[3], accel_short[3],compass_short[3],sensors;
        unsigned char more;
        long compass[3],accel[3],quat[4],temperature;
    long data[9];
    int8_t accuracy;

//        if(dmp_read_fifo(gyro, accel_short, quat, &sensor_timestamp, &sensors,&more)){
//                printf("%d\r\n",dmp_read_fifo(gyro, accel_short, quat, &sensor_timestamp, &sensors,&more));
//                return 1;         
//       
//        }
          while(dmp_read_fifo(gyro, accel_short, quat, &sensor_timestamp, &sensors,&more)){};
    if(sensors&INV_XYZ_GYRO)
    {
        inv_build_gyro(gyro,sensor_timestamp);          //把新数据发送给MPL
        mpu_get_temperature(&temperature,&sensor_timestamp);
        inv_build_temp(temperature,sensor_timestamp);   //把温度值发给MPL,只有陀螺仪需要温度值
    }

    if(sensors&INV_XYZ_ACCEL)
    {
        accel[0] = (long)accel_short[0];
        accel[1] = (long)accel_short[1];
        accel[2] = (long)accel_short[2];
        inv_build_accel(accel,0,sensor_timestamp);      //把加速度值发给MPL
    }

    if (!mpu_get_compass_reg(compass_short, &sensor_timestamp))
    {
        compass[0]=(long)compass_short[0];
        compass[1]=(long)compass_short[1];
        compass[2]=(long)compass_short[2];
        inv_build_compass(compass,0,sensor_timestamp); //把磁力计值发给MPL
    }
    inv_execute_on_data();
    inv_get_sensor_type_euler(data,&accuracy,&timestamp);

    *roll  = (data[0]/q16);
    *pitch = -(data[1]/q16);
    *yaw   = -data[2] / q16;
        return 0;
}



读取的数据

读取的数据
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-7-19 02:14:04 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表