还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
MPU6050使用专注驱动三百年linuxwindowsandroid..各种好品质,治肾亏不含糖陀螺仪MPU6050是采用IA2C的协议通信的,把MPU6050的寄存器的值读出来就可以用了,废话不多说,我先给一下MPU6050寄存器的地址#defineSMPLRT_DIV0x19#defineCONFIGOxlA#defineACCEL_CONFIGOxlC#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#defineWHO_AM_I0x75#defineSlaveAddressOxDO那么我们要用MPU6050读哪个寄存器的值,一些初始化的我就不说了,可以去网上都找的到解释,我主要说一下MPU6050具体使用,有没看至ACCEL这个是“加速”的意思,还有那个GYRO这个是角速度的意思,我们要读的就是ACCEL_XOUT_LACCEL_YOUT_HACCEL_YOUT_LACCEL_ZOUT_HACCEL_ZOUT_L这是X轴,Y轴,Z轴的加速度,读这些寄存器就能获得,LH表示低8位和高8位,是一个16位的数值,这个数值怎么变化你可以实验下,到时再看看陀螺仪原理另外GYRO也一样,分别是XYZ轴的角速度现在就会问?获得了这个寄存器的值怎么个用法?那到底怎么用呢??让强大的后宫告诉你,朕有后宫三千……我举个例子,有没有小时候玩过陀螺,青龙白虎……我假如在陀螺的中间插一根棍子那根棍子在陀螺旋转的时候会跟着转,这个时候,当陀螺向左转时,GYRO_ZOUT=65513GYRO_ZOUT=0GYRO_ZOUT=0这个值是我乱取的,不过大概是这个范围,速度越快会在65536的基础上减小的更多,不过不会减到65536/2当陀螺向右转时,GYRO_ZOUT=57GYRO_ZOUT=0GYRO_ZOUT=0速度越快会在0的基础上增力U的更多,不过不会加到65536/2怎么样,陀螺仪角速度是不是明白了???爽不爽然后就是加速度的,这个比较简单,比如陀螺向X轴前进(这时没有Y轴和Z轴的分速度,这句话好理解,别说你高中学的是文科),那么ACCEL_XOUT=65513GPIO_ResetBitsGPIOBGPI0_Pin_7;ifa20000b20000{a-=10000;b-=10000;}i++;a=100;b=100;voidleftvoida=100;whilea6900z=GetDataGYRO_ZOUT_H;ifz0a=a+z;GPIO_ResetBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;delay_ms200;a=100;b=100;i=1000;whilei1010z=GetDataGYRO_ZOUT_H;ifz=10000a=a+65535+3-2-z;elseb=b+z-3;ifabGPIO_ResetBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;elseGPIO_SetBitsGPIOBGPIO_Pin_6;GPI0_ResetBitsGPI0BGPI0_Pin_7;ifa20000b20000{a-=10000;b-二10000;}i=i+l;a=100;whilea=6900z=GetDataGYRO_ZOUT_H;ifz0a=a+z;GPIO_ResetBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;delay_ms200;i=1000;a=100;b=100;whilei1050color;z=GetDataGYRO_ZOUT_H;ifz=10000a=a+65535+3-2-z;elseb=b+z-3;ifabGPIO_ResetBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;elseGPIO_SetBitsGPIOBGPIO_Pin_6;GPIO_ResetBitsGPIOBGPIO_Pin_7;ifa20000b20000{a-=10000;b-=10000;}i++;a=100;b=100;OK完毕!ACCEL_YOUT=0ACCEL_ZOUT=0向X轴后退,那么ACCEL_XOUT=57ACCEL_YOUT=0ACCEL_ZOUT=Oo不会曾力口至lj65536/2与角速度同理OK获取到了值,又知道这个值的范围,那么怎么用当然就可以知道了下面给一份代码主控是STM32的直接复制粘贴可以使用,功能是小车走直线,自动校正,就是你一脚向小车飞过去,小车也会回到原来轨道,这里作为例子一・・H文件#ifndef_MPU6050_H#define_MPU6050_H#includesys.h#defineSMPLRT_DIV0x19#defineCONFIGOxlAdefineGYRO_CONFIGOx1BdefineACCEL.CONFIGOx1CdefineACCEL_XOUT_H0x3BdefineACCEL_XOUT_L0x3CdefineACCEL_YOUT_H0x3DdefineACCEL_YOUT_L0x3EdefineACCEL_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#defineWHO_AM_I0x75#defineSlaveAddressOxDO//7*7*7*7**1**1*7*7^7*//rTwrTwrT*rTw*7*rTw#defineSDA」N{GPIOB-CRH=OXFFFFOFFF;GPIOB-CRH|=8«12;}#defineSDA_OUT{GPIOB-CRH=OXFFFFOFFF;GPIOB-CRH|=3«12;}PBout12//SCLPBoutll//SDAPBinllvoidITC_Initvoid;voidI2C_Startvoid;voidI2C_Stopvoid;voidI2C_SendACKvoid;voidI2C_RecvACKvoid;voidI2C_SendByteu8dat;u8I2C_RecvBytevoid;voidSingle_WriteI2Cu8REG_Addressu8REG_data;u8Single_ReadI2Cu8REG_Address;voidInitMPU6050void;ul6GetDatau8REG_Address;#endif二.第一个C文件#includempu
6050.h#includedelay.h”//1**1**4**X»*!**1**1**1**.1•*L»/t*7**1**7**T**T**T**T**T**7*//*1*■£*//•:、♦卜*t*卜・卜[••卜♦卜♦卜♦卜・卜•卜•卜♦卜♦卜*7*•卜//si*/7*4*rj*rj*rj*rj*rj*voidIIC_InitvoidGPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOBENABLE;GPIOInitStructure.GPIOPin=GPIOPin12|GPIOPin11|GPIOPin6|GPTOPin7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO」nitGPIOBGPIO_lnitStructure;GPIO_SetBitsGPIOBGPIO_Pin_11;GPIO_SetBitsGPIOBGPIO_Pin_12;GPIO_SetBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;//SCL=1;//SDA=1;voidI2C_StartvoidGPIO_SetBitsGPIOBGPIO_Pin_l1;//SDAGPIO_SetBitsGPIOBGPIO_Pin_12;//SCL//SDA=1;//SCL=1;dclay_us5;GPTO_ResetBitsGPIOBGPIO_Pin_l1;//SDA//SDA=0;delay_us5;//SCL=0;GPIO_ResetBitsGPIOBGPIO_Pin_12;//SCL//*1*\L■£*—J****■£■]**!*.X**1*■]*1*■・*1**1*.X*■]/t*Tw*•*»**Tw«•*T«*Tw«•*T**7**TwrTwrT**Tw*Tw*Tw*Tw*TwTw«•*T*«•*1**T»*Tw*7**Tw*TwrTw«•//*1*•£,*.1**t*\]*1*■,*!•*1«■,*.1**.1**1*L**t**1**1*■,*.1**.1*■】*1**1**1**1^•£,*!•*1•*1**t*•£*\1*1*/t^7**T**T**T**T**T»*TmW,*T»*Z**
7、*T**T»*X**Tw*T»*Tw*7**T**T**Tm*7**T»W,*T»*TwvoidI2C_StopvoidGPIO_ResetBitsGPIOBGPIO_Pin_ll;//SDAGPIO_SetBitsGPIOBGPIO_Pin_12;//SCLdelay_us5;GPIO_SetBitsGPIOBGPIO_Pin_l1;//SDAdelay_us5;//•X*/t*7**T*//•!*•!*■!**!*••*1*■!**1****•1*■!*\!**1*•!*■!*■!*•!**1**1*■1*/r*7*«•«•*T**7**Tw«•*7*;•*7**TwTw*Tw*Tw•;•・;•*Iw•1••[•••*7**TwrTw«•*7*rTw*TwvoidI2C_SendACKvoidGPIO_SetBitsGPIOBGPIO_Pin_ll;//SDAGPIO_SetBitsGPIOBGPIO_Pin_12;//SCLdelay_us5;GPIO_ResetBitsGPIOBGPIO_Pin_12;//SCL//SCL=0;delay_us5;//■■£*.X*%1*■[••]*•£\■]**1**1*.\.X*■£*•£*■]//*7*rT»rTw«•«•*T**T»T«rT»*T**T«rTw*TwrTwrT*Tw*Tw«•*T**
7、*7**T*•1•*1*•]•*7**T»rTw*Tw*
7、*T»*T»*Tw*Tw////*Jw..、rj*,[■*J、*J、..、..、*J、*J、..、•卜•卜•门•卜,.、..、•卜,R•卜q、..、,命,J**J、..、..、*Jw•卜voidI2C_RecvACKvoidGPIO_SetBitsGPIOBGPIO_Pin_12;//SCL//SCL=1;delay_us5;//CY=SDA;GPIO_ResetBitsGPIOBGPIO_Pin_12;//SCL//SCL=0;delay_us5;//returnCY;//*1*k£*^1*k1k1kJk1k1kJk1*k1k1k1k1k1*k**vl*kJ*//.卜•[、?、*4**7^
1、•卜I、
1、*4****
1、卜■[、*4**3^***1i[、*1*、***卜//*.1**X»*!*1**;1•kJ**.!**.!**L»*!**1**L**!*X**1**.1**.1**.!**L»/f*T»*T**T**T**T**T**T**T**T**T**7**T**7*voidI2C_SendByteu8datu8i;fori=0;i8;i++ifdat0x80»7GPIO_SetBitsGPIOBGPIO_Pin_ll;//SDAelseGPIO_ResetBitsGPlOBGPIO_Pin_ll;//SDA//SDA=dat0x80»7;dat«=1;GPIO_SetBitsGPIOBGPIO_Pin_l2;//SCL//SCL=1;delay_us5;GPIO_ResetBitsGPIOBGPIO_Pin_12;//SCL=0;delay_us5;I2C_RecvACK;//*1**1#■!**£*■!**1*■!*■!**1**1*—*£**1*■£*■!*//•:、♦卜*t*卜・卜[•♦;■•卜♦卜•;•■;■♦卜♦卜・卜•;•■;■•卜*x*•卜♦卜♦卜♦;、*.»♦;、*7*•■、•[•♦[••卜//si*/7rj**4**j*rj*rj*rj*rj*rj*u8I2C_RecvBytevoidu8i;u8dat=0;GPIO_SetBitsGPIOBGPIO_Pin_ll;//SDA//SDA=1;SDA」N;fori=0;i8;i++dat«=1;GPIO_SetBitsGPIOBGPIO_Pin_12;//SCL//SCL=1;delay_us5;dat|=SDAI;GPIO_ResetBitsGPIOBGPIO_Pin_12;//SCL//SCL=0;delay_us5;SDA_OUT;returndat;//kJ**L**.!*/f//*1**1**1**1**J*.],1*1**1**1*.],*1**1**1*/t*•*»**Tw«•*Tw«•*T**7**TwrTwrT**Tw*Tw*TwTw«•*T*«•*T*****T*«•voidSinglc_WritcI2Cu8REG_Addrcssu8REG_dataI2C_Start;I2C_SendByteSlaveAddress;I2C_SendByteREG_Address;I2C_SendByteREG_data;I2C_Stop;}//*1*•£,*.1**t*\]*1**1«■,*.1**.1**1*L**t**1**1*■,*.1**.1*■】*1**1*■£-£**1**X**1*•£»■]/t^7**T**T**T*W,*T»*
7、*T**X**Tw*T»*Tw*7**T**T*//■•*X**1**1*■!*■!**1*■*£*•£**1**1**1*//一]••.、•.••[••卜•[•一[•一]•.・卜•.、•[••卜•[••卜•1••卜*Jw•.••;••卜•[••卜■]•.••.••卜•.••.••卜•[■•卜u8Single_ReadI2Cu8REG.Addressu8REG_data;I2C_Start;I2C_SendByteSlaveAddress;I2C_SendByteREG_Address;I2C_Start;I2C_SendByteSlaveAddress+1;REG_data=I2C_RecvByte;I2C_SendACK;I2C_Stop;returnREG_data;//4*1**L*■]*1**1**1**]■]■,*L**L»*1**L**L**[“,■”*L*■[*f*\]*1**1**L»■]*1**L**L*/t*7**T»*T**7**T**T**T**7**T»*T**T**T**T**T**T»*Tw*T»*T**T»*7**T»*T*/尸6E%»-MPU6050//k1vl*si*k1kJ*k£^*1*k1k1****k1f!rr*、•
1、■卜.[、■、J、q、•卜[、rr*rr*ri•[、.J、.卜•卜r7*rjri•卜.卜*7*rr*ri*rjwq、、•卜voidInitMPU6050voidSingle_WriteI2CPWR_MGMT_l0x00;Single_WriteI2CSMPLRT_DIV0x07;Single_WriteI2CCONFIG0x06;Single_WriteI2CGYRO_CONFIG0x18;Single_WriteI2CACCEL_CONFIG0x01;//*1**!**1*—*£**i**r*■£*■!*■!**1*■!**£**1*\!*■[・*1*•1*■*1*■£**X**1**x*\1*■!*■1*//♦;••.••;■•卜•卜•1•■卜♦卜•,■♦;•♦卜♦1••;•;、•;•卜♦[••卜•[、*i*■卜•;••;••卜■卜•[、*1*■卜•;•*•*•;■•卜•[•;•*x*•卜1•//*1**1**1*k|7,7,*1**1**1*-!**1**£**1**l*k|k!7,41**1**1**£**l*7,*1*■!**1**1**L*k|*i*1**1k|k|ik1**1**1**1*kJ*k17,7,■!**1**1**£**1*7,7,■1**J*1**1//rj*W、q.q、*2**2**4*q.、q.q、〃、q.rj*q.q.*2*?、力、*2**4*、〃、rj*q、q、*j**2**4**4**j*//■1**1*■■£*1**1^*1**1*■£*■]•£■[*1**1*•£*■].\]■■,・*•*1«■!.•[■]■]■]・■•*“*■]•].■]•£*■〜■].\].■,・*•*■£*//*Tw*
7、*T*rTwT*«•*1**7,*7**T»«•*7**7■*7**T**Twri*«•«•«•*Z**7•*7**T*«•«•«•«•«•*7**T»rTw*7*»T»rT»*Tw*Tw«•*1**7•*7**T*rTw«•«•*7**T**
7、*T*Tw«•*1**7,*7**T»Twu16GetDatau8REG_Addressu8HL;H=Single_ReadI2CREG_Address;L=Singlc_RcadI2CREG_Addrcss+l;returnH«8+L;三.第二个C文件includenled.hn#includedelay.h#includekey.h#includensys.hn#includeIcd.h#includenusart.hincludendhtll.hn#includenmpu
6050.h#includetimer.h#includenstm32fl0x_tim.hn#includencar.hnexternu8TIM3CH1_CAPTURE_STA;externul6TIM3CH1_CAPTURE_VAL;u32temp=O;u8temperature;u8humidity;ul6a=l00b=100c=100z=0i=1000;voidcarinitvoidGPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOEENABLE;GPIO」nitStructur已GPIO_Pin=GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPlO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitGPIOEGPIO_InitStructure;GPIO_SetBitsGPIOEGPIO_Pin_3;voidzhixianvoidz=GetDataGYRO_ZOUT_H;ifz=10000a=a+65535+3-2・z;〃我只有这里一个注释,就是上面我说的,使用就在这里・_・elseb=b+z-3;ifabGPI0_ResetBitsGPI0BGPI0_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;elseGPI0_SetBitsGPI0BGPI0_Pin_6;GPI0_ResetBitsGPI0BGPI0_Pin_7;ifa20000b20000{a-=10000;b-=10000;}voidrightvoida=100;whilea6800z=GetDataGYRO_ZOUT_H;ifz10000a=a+65535+2-z;GPIO_SetBitsGPIOBGPIO_Pin_6;GPIO_ResetBitsGPIOBGPIO_Pin_7;delay_ms200;i=1000;a=100;b=100;whilei1050z=GetDataGYRO_ZOUT_H;ifz=10000a=a+65535+3-2-z;elseb=b+z-3;ifabGPI0_ResetBitsGPI0BGPI0_Pin_6;GPIO_SetBitsGPIOBGPIO_Pin_7;elseGPI0_SetBitsGPI0BGPI0_Pin_6;GPI0_ResetBitsGPI0BGPI0_Pin_7;ifa20000b20000{a-=10000;b-=10000;}i++;a=100;whilea6800z=GetDataGYRO_ZOUT_H;ifz10000a=a+65535+2-z;GP10_SetBitsGPI0BGP10_Pin_6;GPIO_ResetBitsGPIOBGPIO_Pin_7;delay_ms200;i=1000;a=100;b=100;whilei1100{color;z=GetDataGYRO_ZOUT_H;ifz=10000a=a+65535+3-2-z;elseb=b+z-3;ifabGPIO_RcsctBitsGPIOBGPIO_Pin_6;GPIO_SetBitsGPIOBGPTO_Pin_7;elseGPIO_SetBitsGPIOBGPIO_Pin_6;。
个人认证
优秀文档
获得点赞 0