这些是我自己常用的代码,比官方的要简洁些,主要是自用,还有相关模块,使用代码。
具体文件可以去我github上下载。
MPU-6050 简介
供电电源:3-5v(内部低压差稳压)
通信方式:标准IIC通信协议
芯片内置16bit AD转换器,16位数据输出
陀螺仪范围:±250 500 1000 2000 °/s
加速度范围:±2±4±8±16g
MPU-6000(MPU-6000数据手册)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术
InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。
MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。
MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。
特征
- 以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。
- 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。
- 可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。
- 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。
- 数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。
- 运动处理数据库支持Android、Linux与Windows
- 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。
- 以数位输出的温度传感器
- 以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS
- 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。
- VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5%
- 陀螺仪运作电流:5mA,陀螺仪待命电流:5A;加速器运作电流:350A,加速器省电模式电流: 20A@10Hz
- 高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface)
- 内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。
- 使用者亲自测试
- 10,000 g 碰撞容忍度
- 为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN)
源码main函数
#include "systemInit.h"
#include <uart.h>
#include <ctype.h>
#include <string.h>
#include "uartGetPut.h"
#include <stdio.h>
#include <timer.h>
#include <adc.h>
#include <stdio.h>
#define PART_LM3S1138
#include <pin_map.h>
unsigned char Re_buf[11],counter=0;
unsigned char ucStra[6],ucStrw[6],ucStrAngle[6];
float Value[9];
void delay(int a){
int x,y;
for(x=0;x<a;x++)
for(y=0;y<255;y++);
}
void DataTreating()
{
//float Value[8];
// char a[40];
// char b[40];
char c[40];
Value[0] = ((short)(ucStra[1]<<8| ucStra[0]))/32768.0*16;
Value[1] = ((short)(ucStra[3]<<8| ucStra[2]))/32768.0*16;
Value[2] = ((short)(ucStra[5]<<8| ucStra[4]))/32768.0*16;
Value[3] = ((short)(ucStrw[1]<<8| ucStrw[0]))/32768.0*2000;
Value[4] = ((short)(ucStrw[3]<<8| ucStrw[2]))/32768.0*2000;
Value[5] = ((short)(ucStrw[5]<<8| ucStrw[4]))/32768.0*2000;
Value[6] = ((short)(ucStrAngle[1]<<8| ucStrAngle[0]))/32768.0*180;
Value[7] = ((short)(ucStrAngle[3]<<8| ucStrAngle[2]))/32768.0*180;
Value[8] = ((short)(ucStrAngle[5]<<8| ucStrAngle[4]))/32768.0*180;
//sprintf(a,"加速度是x:%.2f y:%.2f z:%.2f \r\n",Value[0],Value[1],Value[2]);
// sprintf(b,"角速度是x:%.2f y:%.2f z:%.2f \r\n",Value[3],Value[4],Value[5]);
sprintf(c,"角度是x:%.2f y:%.2f z:%.2f \r\n",Value[6],Value[7],Value[8]);
//uartPuts(a);
// uartPuts(b);
uartPuts(c);
delay(10);
}
// 主函数(程序入口)
int main(void)
{
//float Value[8];
jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:晶振,6MHz
uartInit(); // UART初始化
for (;;)
{
DataTreating();
}
}
// UART2中断服务函数
void UART0_ISR(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true); // 读取当前中断状态
UARTIntClear(UART0_BASE, ulStatus); // 清除中断状态
if ((ulStatus & UART_INT_RX) || (ulStatus & UART_INT_RT)) // 若是接收中断或者
{ for(;;)
{Re_buf[counter]= uartGetc0();
if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头
counter++;
if(counter==11) //接收到11个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
switch(Re_buf [1])
{
case 0x51:
ucStra[0]=Re_buf[2];
ucStra[1]=Re_buf[3];
ucStra[2]=Re_buf[4];
ucStra[3]=Re_buf[5];
ucStra[4]=Re_buf[6];
ucStra[5]=Re_buf[7];
break;
case 0x52:
ucStrw[0]=Re_buf[2];
ucStrw[1]=Re_buf[3];
ucStrw[2]=Re_buf[4];
ucStrw[3]=Re_buf[5];
ucStrw[4]=Re_buf[6];
ucStrw[5]=Re_buf[7];
break;
case 0x53:
ucStrAngle[0]=Re_buf[2];
ucStrAngle[1]=Re_buf[3];
ucStrAngle[2]=Re_buf[4];
ucStrAngle[3]=Re_buf[5];
ucStrAngle[4]=Re_buf[6];
ucStrAngle[5]=Re_buf[7];
break;
}
//DataTreating();
}
break;
}
}
}
startup_ewarm.c(修改优先级)
这里用的是UART0 传输文件。
具体的就不讲解了,地址后期会附上