MPU6050九轴示例程序.doc_第1页
MPU6050九轴示例程序.doc_第2页
MPU6050九轴示例程序.doc_第3页
MPU6050九轴示例程序.doc_第4页
MPU6050九轴示例程序.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* 采用模拟IIC,移植性强;MPU6050 9轴示例程序,MPU6050作为主机操作第三方传感器,已测试,若有错误或意见欢迎指出。 * ADXL345.c 基于AVRstudio 6.0编写,改为其他空芯片时注意寄存器的改变 * CS-VDD SDO-GND * 模拟IIC读取数据,mega8主控,外部晶振 7.3728M * * MPU6050 6轴+辅助IIC扩展使用(组成9轴系统) * 程序主要演示了MPU6050 辅助IIC接口驱动第三方IIC传感器芯片, Pass-Through Mode较简单(其实就是把第三方芯片直接接到当前总线上) * I2C Master Mode看似有点多余不过可以节省控制器CPU占用资源,可以让MPU6050自己作为主机读取并产生中断以告诉控制器来读取数据 * 本程序主要以ADXL345作为mpu6050的 从机0并读取数据(最多可接5个从机) * Created: 2013-10-25 周五 23:56:29 * Author: ly */ #include #include IIC.h#include#define CLK 7372800/*/ 定义MPU6050内部地址/*#defineSMPLRT_DIV0x19/陀螺仪采样率,典型值:0x07(125Hz)#defineCONFIG0x1A/低通滤波频率,典型值:0x06(5Hz)#defineGYRO_CONFIG0x1B/陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#defineACCEL_CONFIG0x1C/加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#defineACCEL_XOUT_H0x3B#defineACCEL_XOUT_L0x3C#defineACCEL_YOUT_H0x3D#defineACCEL_YOUT_L0x3E#defineACCEL_ZOUT_H0x3F#defineACCEL_ZOUT_L0x40#defineTEMP_OUT_H0x41#defineTEMP_OUT_L0x42#defineGYRO_XOUT_H0x43#defineGYRO_XOUT_L0x44#defineGYRO_YOUT_H0x45#defineGYRO_YOUT_L0x46#defineGYRO_ZOUT_H0x47#defineGYRO_ZOUT_L0x48#definePWR_MGMT_10x6B/电源管理,典型值:0x00(正常启用)#defineWHO_AM_I0x75/IIC地址寄存器(默认数值0x68,只读)#defineSlaveAddress0xD0/IIC写入时的地址字节数据,+1为读取#define L_on PORTD |=0x80#define L_off PORTD &=0x7F #define Key (PIND&0x10)unsigned char value;void init_uart(unsigned int baud)UCSRB=0x00;UCSRA=0x00; /控制寄存器清零UCSRC=(1URSEL)|(0UPM0)|(3UCSZ0); /选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位UBRRL=(CLK/16/baud-1)%256;UBRRH=(CLK/16/baud-1)/256; /设置波特率UCSRB=(1TXEN)|(1RXEN)|(1RXCIE); /接收、发送使能,接收中断使能sei(); /全局中断开放DDRD|=0X02; /配置TX为输出(很重要)void send_date(unsigned char date)while(!(UCSRA&(1UDRE); /等待数据寄存器空UDR=date;while(!(UCSRA&(1TXC); /等待发送结束UCSRA|=(1TXC); /写1清零/初始化ADXL345,根据需要请参考pdf进行修改*void Init_ADXL345()WriteByte(0x31,0x0B); /测量范围,正负16g,13位模式WriteByte(0x2C,0x08); /速率设定为12.5 参考pdf13页WriteByte(0x2D,0x08); /选择电源模式 参考pdf24页WriteByte(0x2E,0x80); /使能 DATA_READY 中断WriteByte(0x1E,0x00); /X 偏移量 根据测试传感器的状态写入pdf29页WriteByte(0x1F,0x00); /Y 偏移量 根据测试传感器的状态写入pdf29页WriteByte(0x20,0x05); /Z 偏移量 根据测试传感器的状态写入pdf29页/* 等待延时 1200080S*/unsigned char waitkey ( unsigned int i1 )while ( i1- )if ( !Key)return 1;delay_nms ( 5 );return 0;void n_to_c(int i)/数值转为字符并通过串口输出float i1;unsigned char temp1;if(i0)i=-i;send_date(-); else send_date( ); i1=(float)i*3.9; /for 加速度测量 1 LSB 代表3.9 mgi=(int)i1;temp1=i/10000;if(temp1=0)send_date( ); else send_date(temp1+0);i %=10000;send_date(i/1000+0);send_date(.);i %=1000;send_date(i/100+0);i %=100;send_date(i/10+0);send_date(i%10+0);/小数点send_date(g);/*/初始化MPU6050/*void InitMPU6050()WriteByte(PWR_MGMT_1, 0x00);/解除休眠状态WriteByte(SMPLRT_DIV, 0x07);WriteByte(CONFIG, 0x06);WriteByte(GYRO_CONFIG, 0x18);WriteByte(ACCEL_CONFIG, 0x01);/*通过MPU6050辅助IIC接口写数据到 从机0*/*本函数针对 从机0编写,若要操作从机 1-4请查阅6050寄存器数据手册,注意从机4叫特殊只能读取一个字节的值*/void Auxiliary_I2C_Write(unsigned char add,unsigned char da)WriteByte(0x25,0x53);/写入从机0地址 写模式WriteByte(0x26,add);/数据从 I2C_SLV0_REG指定的地址WriteByte(0x27,0x81);/使能数据传输 字节长度1WriteByte(0x63,da); /要写入的值 注意先使能数据传输 后写值到I2C_SLV0_DO !int main(void) unsigned char i=0,i1=0;int temp=0;DDRD |=0xC0; PORTD &=0xBF;/LEDDDRD &= 0xEF;PORTD |=0x10;/keyDDRC |=0x30;/IIC port initinit_uart(9600);InitMPU6050();/初始化MPU6050WriteByte(0x6A,0x20);/I2C_MST_EN 使能I2C主机模式 0x20/WriteByte(0x37,0x02);/I2C_BYPASS_EN 为了直接接到辅助IIC接口,此时可不要 / Pass-Through Mode:I2C_MST_EN=0 I2C_BYPASS_EN =1即可直接接到旁路IIC,注意修改IIC读/写的从机地址 /通过 auxiliary I2C Interface 初始化ADXl345 Auxiliary_I2C_Write(0x31,0x0B); Auxiliary_I2C_Write(0x2C,0x08); Auxiliary_I2C_Write(0x2D,0x08); Auxiliary_I2C_Write(0x2E,0x80); Auxiliary_I2C_Write(0x1E,0); Auxiliary_I2C_Write(0x1F,0); Auxiliary_I2C_Write(0x20,0x05); /* /MPU6050 读取并显示,由于本程序以介绍MPU6050辅助IIC接口为主,所以屏蔽了此部分 while(1) waitkey(400); Data0=Single_Read(ACCEL_XOUT_H); Data1=Single_Read(ACCEL_XOUT_L); Data2=Single_Read(ACCEL_YOUT_H); Data3=Single_Read(ACCEL_YOUT_L); Data4=Single_Read(ACCEL_ZOUT_H); Data5=Single_Read(ACCEL_ZOUT_L); temp=(Data08)+Data1; send_date(X);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( ); temp=(Data28)+Data3; send_date(Y);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( ); temp=(Data48)+Data5; send_date(Z);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( );send_date( );send_date( ); Data0=Single_Read(GYRO_XOUT_H); Data1=Single_Read(GYRO_XOUT_L); Data2=Single_Read(GYRO_YOUT_H); Data3=Single_Read(GYRO_YOUT_L); Data4=Single_Read(GYRO_ZOUT_H); Data5=Single_Read(GYRO_ZOUT_L); temp=(Data08)+Data1; send_date(X);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( ); temp=(Data28)+Data3; send_date(Y);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( ); temp=(Data48)+Data5; send_date(Z);send_date(:);n_to_c(temp); send_date(0x0d);send_date(0x0a);/换行 */while(1)/*6050 master mode 下从从机0(0x53)读取起始位置0x32的6字节数据*/WriteByte(0x25,0xD3);/读出从机地址 读模式WriteByte(0x26,0x32);/数据从 I2C_SLV0_REG指定的地址WriteByte(0x27,0x86);/使能数据传输 字节长度6(bit 3-0 为字节数) L_on;waitkey(100);/* 在MPU6050 master mode 下读取 ADXL345 EXT_SENS_DATA_00EXT_SENS_DATA_05*/Data0=Single_Read(0x49);delay_nms(10);Data1=Single_Read(0x4A);delay_nms(10);Data2=Single_Read(0x4B);delay_nms(10);Data3=Single_Read(0x4C);delay_nms(10);Data4=Single_Read(0x4D);delay_nms(10);Data5=Single_Read(0x4E); /显示输出部分temp=(Data18)+Data0;/1 LSB 代表3.9 mgsend_date(X);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( );temp=(Data38)+Data2;/1 LSB 代表3.9 mgsend_date(Y);send_date(:);n_to_c(temp);send_date( );send_date( );send_date( );temp=(Data58)+Data4;/1 LSB 代表3.9 mgsend_date(Z);send_date(:);n_to_c(temp); send_date(0x0d);send_date(0x0a); L_off; waitkey(100); /*串口接收中断*/*捕捉同步字,接收1000字节内结束*/SIGNAL ( USART_RXC_vect )UCSRB&= ( 1RXCIE ); /关接受结束中断使能value=UDR;/send_date(value);/UCSRB|= ( 1RXCIE ); / 开接受结束中断使能IIC头文件:/ Mega8 AT 8MHz/ 模拟IIC及硬件IIC/ 模拟IIC接口定义:PC5-SCL PC4-SDA/ 注意模拟IIC写入地址等修改!#include /*模拟IIC IO */#define AT_SCL_H PORTC|=0x20 /PC5#define AT_SCL_L PORTC&=0xDF#define AT_SDA_H PORTC|=0x10 /PC4#define AT_SDA_L PORTC&=0xEF#define SDA_IN DDRC &=0xEF;PORTC |=0x10#define SDA_OUT DDRC |=0x10#define SDA_DATA (PINC&0x10)/* Address */#define WD_DEVICE_ADDR 0xD0/0xA6 MPU6050地址为0x68#define RD_DEVICE_ADDR 0XD1/0xA7 /看手册即可知道/unsigned char WD_DEVICE_ADDR=0xD0,RD_DEVICE_ADDR=0XD1; /为了改变IIC写入读出地址方便unsigned char BUF16,Data6;void delay_us(unsigned int us)/1us while(us-); asm(nop);/*unsigned int i;for (i=0;i40;i+)asm (nop);*/void delay_1ms(void) /1ms延时函数unsigned int i;for (i=0;i1140;i+)asm (nop); void delay_nms(unsigned int n) /N ms延时函数unsigned int i=0;for (i=0;in;i+)delay_1ms();/*起始信号*/void AT24C04_Start()AT_SDA_H; /拉高数据线AT_SCL_H; /拉高时钟线delay_us(5); /延时AT_SDA_L; /产生下降沿delay_us(5); /延时AT_SCL_L; /拉低时钟线/*/*停止信号*/void AT24C04_Stop()AT_SDA_L; /拉低数据线AT_SCL_H; /拉高时钟线delay_us(5); /延时AT_SDA_H; /产生上升沿delay_us(5); /延时/*/*发送应答信号入口参数:ack (0:ACK 1:NAK)*/void AT24C04_SendACK(unsigned char ack)if(ack=1)AT_SDA_H;else AT_SDA_L; /写应答信号AT_SCL_H; /拉高时钟线delay_us(5); /延时AT_SCL_L; /拉低时钟线delay_us(5); /延时/*/*接收应答信号*/unsigned char AT24C04_RecvACK()unsigned char i=0;SDA_IN;AT_SCL_H; /拉高时钟线delay_us(5); /延时/i = SDA_DATA; /读应答信号if(SDA_DATA) i=1;AT_SCL_L; /拉低时钟线delay_us(5); /延时SDA_OUT;return i;/*/*向IIC总线发送一个字节数据*/void AT24C04_SendByte(unsigned char dat)unsigned char i;for (i=0; i8; i+) /8位计数器if(dat&0x80)AT_SDA_H;else AT_SDA_L;dat = 1; /移出数据的最高位/送数据口AT_SCL_H; /拉高时钟线delay_us(5); /延时AT_SCL_L; /拉低时钟线delay_us(4); /延时 此处延时长了点AT24C04_RecvACK();/*/*从IIC总线接收一个字节数据 注意 SDA SCL IO 改变*/unsigned char AT24C04_RecvByte()unsigned char i;unsigned char dat = 0; SDA_IN;/DDRC&=0xFD; /使能内部上拉,准备读取数据for (i=0; i8; i+) /8位计数器dat 4); /读数据 /?AT_SCL_L; /拉低时钟线delay_us(4); /延时 /DDRC|=0x02;SDA_OUT;return dat;/*/*void WriteByte(unsigned char REG_Address,unsigned char REG_data) AT24C04_Start(); /起始信号 AT24C04_SendByte(WD_DEVICE_ADDR); /发送设备地址+写信号 AT24C04_SendByte(REG_Address); /内部寄存器地址,请参考中文pdf AT24C04_SendByte(REG_data); /内部寄存器数据,请参考中文pdf AT24C04_Stop(); /发送停止信号/*单字节读取内部寄存器*unsigned char Single_Read(unsigned char REG_Address) unsigned char REG_data; AT24C04_Start(); /起始信号 AT24C04_SendByte(WD_DEVICE_ADDR); /发送设备地址+写信号 AT24C04_SendByt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论