OpenEdv-开源电子网

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

请问mpu60501求角度怎么求,主要是转化成角度问题。

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-5-28
在线时间
7 小时
发表于 2018-7-24 19:43:46 | 显示全部楼层 |阅读模式
10金钱
参考了原子哥程序,这是6050.c,是写加速度跟角速度的,想请问下前辈们,就像6050放在斜面上,在液晶上显示出角度来怎么搞?

最佳答案

查看完整内容[请看2#楼]

是的,看你怎么放,有可能是横滚角也可能是俯仰角。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-7-24 19:43:47 | 显示全部楼层
向日葵的告白 发表于 2018-7-25 11:52
敢问原子哥·6050放在斜面上,DMP输出的那个横滚角,就是斜面倾角吗?

是的,看你怎么放,有可能是横滚角也可能是俯仰角。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-5-28
在线时间
7 小时
 楼主| 发表于 2018-7-24 19:44:52 | 显示全部楼层
#include "mpu6050.h" #include "sys.h" #include "delay.h" #include "usart.h"    //////////////////////////////////////////////////////////////////////////////////          //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板V3 //MPU6050 驱动代码            //正点原子@alientek //技术论坛:www.openedv.com //创建日期:2015/1/17 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved                                                                           //////////////////////////////////////////////////////////////////////////////////    //初始化MPU6050 //返回值:0,成功 //    其他,错误代码 u8 MPU_Init(void) {          u8 res;   GPIO_InitTypeDef  GPIO_InitStructure;                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外设IO PORTA时钟             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;         // 端口配置   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA          GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!!                  MPU_AD0_CTRL=0;                        //控制MPU6050的AD0脚为低电平,从机地址为:0X68                  MPU_IIC_Init();//初始化IIC总线         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050   delay_ms(100);         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050          MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps         MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g         MPU_Set_Rate(50);                                                //设置采样率50Hz         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);         if(res==MPU_ADDR)//器件ID正确         {                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作                 MPU_Set_Rate(50);                                                //设置采样率为50Hz          }else return 1;         return 0; } //设置MPU6050陀螺仪传感器满量程范围 //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps //返回值:0,设置成功 //    其他,设置失败  u8 MPU_Set_Gyro_Fsr(u8 fsr) {         return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围   } //设置MPU6050加速度传感器满量程范围 //fsr:0,±2g;1,±4g;2,±8g;3,±16g //返回值:0,设置成功 //    其他,设置失败  u8 MPU_Set_Accel_Fsr(u8 fsr) {         return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围   } //设置MPU6050的数字低通滤波器 //lpf:数字低通滤波频率(Hz) //返回值: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);//设置数字低通滤波器   } //设置MPU6050的采样率(假定Fs=1KHz) //rate:4~1000(Hz) //返回值: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);        //设置数字低通滤波器          return MPU_Set_LPF(rate/2);        //自动设置LPF为采样率的一半 }  //得到温度值 //返回值:温度值(扩大了100倍) short MPU_Get_Temperature(void) {     u8 buf[2];      short raw;         float temp;         MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);      raw=((u16)buf[0]<<8)|buf[1];       temp=36.53+((double)raw)/340;       return temp*100;; } //得到陀螺仪值(原始值) //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号) //返回值:0,成功 //    其他,错误代码 u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz) {     u8 buf[6],res;           res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);         if(res==0)         {                 *gx=((u16)buf[0]<<8)|buf[1];                   *gy=((u16)buf[2]<<8)|buf[3];                   *gz=((u16)buf[4]<<8)|buf[5];         }              return res;; } //得到加速度值(原始值) //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号) //返回值:0,成功 //    其他,错误代码 u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az) {     u8 buf[6],res;           res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);         if(res==0)         {                 *ax=((u16)buf[0]<<8)|buf[1];                   *ay=((u16)buf[2]<<8)|buf[3];                   *az=((u16)buf[4]<<8)|buf[5];         }              return res;; } //IIC连续写 //addr:器件地址  //reg:寄存器地址 //len:写入长度 //buf:数据区 //返回值:0,正常 //    其他,错误代码 u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf) {         u8 i;      MPU_IIC_Start();          MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令                 if(MPU_IIC_Wait_Ack())        //等待应答         {                 MPU_IIC_Stop();                                  return 1;                         }     MPU_IIC_Send_Byte(reg);        //写寄存器地址     MPU_IIC_Wait_Ack();                //等待应答         for(i=0;i<len;i++)         {                 MPU_IIC_Send_Byte(buf);        //发送数据                 if(MPU_IIC_Wait_Ack())                //等待ACK                 {                         MPU_IIC_Stop();                                  return 1;                                  }                         }         MPU_IIC_Stop();                  return 0;         }  //IIC连续读 //addr:器件地址 //reg:要读取的寄存器地址 //len:要读取的长度 //buf:读取到的数据存储区 //返回值:0,正常 //    其他,错误代码 u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf) {           MPU_IIC_Start();          MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令                 if(MPU_IIC_Wait_Ack())        //等待应答         {                 MPU_IIC_Stop();                                  return 1;                         }     MPU_IIC_Send_Byte(reg);        //写寄存器地址     MPU_IIC_Wait_Ack();                //等待应答     MPU_IIC_Start();         MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令             MPU_IIC_Wait_Ack();                //等待应答          while(len)         {                 if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK                  else *buf=MPU_IIC_Read_Byte(1);                //读数据,发送ACK                   len--;                 buf++;          }         MPU_IIC_Stop();        //产生一个停止条件          return 0;         } //IIC写一个字节  //reg:寄存器地址 //data:数据 //返回值:0,正常 //    其他,错误代码 u8 MPU_Write_Byte(u8 reg,u8 data)                                   {      MPU_IIC_Start();          MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令                 if(MPU_IIC_Wait_Ack())        //等待应答         {                 MPU_IIC_Stop();                                  return 1;                         }     MPU_IIC_Send_Byte(reg);        //写寄存器地址     MPU_IIC_Wait_Ack();                //等待应答          MPU_IIC_Send_Byte(data);//发送数据         if(MPU_IIC_Wait_Ack())        //等待ACK         {                 MPU_IIC_Stop();                          return 1;                          }                      MPU_IIC_Stop();                  return 0; } //IIC读一个字节  //reg:寄存器地址  //返回值:读到的数据 u8 MPU_Read_Byte(u8 reg) {         u8 res;     MPU_IIC_Start();          MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令                 MPU_IIC_Wait_Ack();                //等待应答      MPU_IIC_Send_Byte(reg);        //写寄存器地址     MPU_IIC_Wait_Ack();                //等待应答     MPU_IIC_Start();         MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令             MPU_IIC_Wait_Ack();                //等待应答          res=MPU_IIC_Read_Byte(0);//读取数据,发送nACK      MPU_IIC_Stop();                        //产生一个停止条件          return res;                 }
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-7-25 01:31:42 | 显示全部楼层
我们例程就有啊,用dmp
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-5-28
在线时间
7 小时
 楼主| 发表于 2018-7-25 11:52:42 | 显示全部楼层
正点原子 发表于 2018-7-25 01:31
我们例程就有啊,用dmp

敢问原子哥·6050放在斜面上,DMP输出的那个横滚角,就是斜面倾角吗?
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-5-28
在线时间
7 小时
 楼主| 发表于 2018-7-26 15:11:20 | 显示全部楼层
ok,懂了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 05:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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