找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5559|回复: 5
打印 上一主题 下一主题
收起左侧

MPU6050匿名小四轴飞控源码资料包 bee_source好用版

[复制链接]
跳转到指定楼层
楼主
新手来分享一下!互相学习,MPU6050 bee_source好用版,
编译,下载,运行,连接飞控串口和FTDI串口,串口波特率500K,上位机打开高级收码,在上位机飞控状态标签可以看到变化的传感器数据,3D显示可以跟随roll和pitch的变化而变化,因为没有写yaw的上传,所以yaw保持零度...此时打开飞控波形按钮,打开波形显示页面,并打开相应波形开关,1到3为加速度,4到6为陀螺仪,10和11为roll和pitch,就可以看到变化的波形.


完整代码下载:
bee_source好用版.7z (578.51 KB, 下载次数: 79)



stm32源程序:
  1. #include "MPU6050.h"
  2. #include "ANO_Tech_STM32F10x_I2C.h"
  3. #include "tim.h"

  4. u8                                                mpu6050_buffer[14];                                        //iic读取后存放数据
  5. S_INT16_XYZ                GYRO_OFFSET,ACC_OFFSET;                        //零漂
  6. u8                                                GYRO_OFFSET_OK = 1;
  7. u8                                                ACC_OFFSET_OK = 1;
  8. S_INT16_XYZ                MPU6050_ACC_LAST,MPU6050_GYRO_LAST;                //最新一次读取值

  9. void Delay_ms_mpu(u16 nms)
  10. {       
  11.         u8 delay_cnt = TIM3_IRQCNT;
  12.         while((delay_cnt+(nms*2)) > TIM3_IRQCNT);
  13. }
  14. /**************************实现函数********************************************
  15. //将iic读取到得数据分拆,放入相应寄存器
  16. *******************************************************************************/
  17. void MPU6050_Dataanl(void)
  18. {
  19.         MPU6050_ACC_LAST.X=((((int16_t)mpu6050_buffer[0]) << 8) | mpu6050_buffer[1]) - ACC_OFFSET.X;
  20.         MPU6050_ACC_LAST.Y=((((int16_t)mpu6050_buffer[2]) << 8) | mpu6050_buffer[3]) - ACC_OFFSET.Y;
  21.         MPU6050_ACC_LAST.Z=((((int16_t)mpu6050_buffer[4]) << 8) | mpu6050_buffer[5]) - ACC_OFFSET.Z;
  22.         //跳过温度ADC
  23.         MPU6050_GYRO_LAST.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9]) - GYRO_OFFSET.X;
  24.         MPU6050_GYRO_LAST.Y=((((int16_t)mpu6050_buffer[10]) << 8) | mpu6050_buffer[11]) - GYRO_OFFSET.Y;
  25.         MPU6050_GYRO_LAST.Z=((((int16_t)mpu6050_buffer[12]) << 8) | mpu6050_buffer[13]) - GYRO_OFFSET.Z;
  26.        
  27.         if(!GYRO_OFFSET_OK)
  28.         {
  29.                 static int32_t        tempgx=0,tempgy=0,tempgz=0;
  30.                 static uint8_t cnt_g=0;
  31. //                 LED1_ON;
  32.                 if(cnt_g==0)
  33.                 {
  34.                         GYRO_OFFSET.X=0;
  35.                         GYRO_OFFSET.Y=0;
  36.                         GYRO_OFFSET.Z=0;
  37.                         tempgx = 0;
  38.                         tempgy = 0;
  39.                         tempgz = 0;
  40.                         cnt_g = 1;
  41.                         return;
  42.                 }
  43.                 tempgx+= MPU6050_GYRO_LAST.X;
  44.                 tempgy+= MPU6050_GYRO_LAST.Y;
  45.                 tempgz+= MPU6050_GYRO_LAST.Z;
  46.                 if(cnt_g==200)
  47.                 {
  48.                         GYRO_OFFSET.X=tempgx/cnt_g;
  49.                         GYRO_OFFSET.Y=tempgy/cnt_g;
  50.                         GYRO_OFFSET.Z=tempgz/cnt_g;
  51.                         cnt_g = 0;
  52.                         GYRO_OFFSET_OK = 1;
  53. //                        EE_SAVE_GYRO_OFFSET();//保存数据
  54.                         return;
  55.                 }
  56.                 cnt_g++;
  57.         }
  58.         if(!ACC_OFFSET_OK)
  59.         {
  60.                 static int32_t        tempax=0,tempay=0,tempaz=0;
  61.                 static uint8_t cnt_a=0;
  62. //                 LED1_ON;
  63.                 if(cnt_a==0)
  64.                 {
  65.                         ACC_OFFSET.X = 0;
  66.                         ACC_OFFSET.Y = 0;
  67.                         ACC_OFFSET.Z = 0;
  68.                         tempax = 0;
  69.                         tempay = 0;
  70.                         tempaz = 0;
  71.                         cnt_a = 1;
  72.                         return;
  73.                 }
  74.                 tempax+= MPU6050_ACC_LAST.X;
  75.                 tempay+= MPU6050_ACC_LAST.Y;
  76.                 //tempaz+= MPU6050_ACC_LAST.Z;
  77.                 if(cnt_a==200)
  78.                 {
  79.                         ACC_OFFSET.X=tempax/cnt_a;
  80.                         ACC_OFFSET.Y=tempay/cnt_a;
  81.                         ACC_OFFSET.Z=tempaz/cnt_a;
  82.                         cnt_a = 0;
  83.                         ACC_OFFSET_OK = 1;
  84. //                        EE_SAVE_ACC_OFFSET();//保存数据
  85.                         return;
  86.                 }
  87.                 cnt_a++;               
  88.         }
  89. }
  90. /**************************实现函数********************************************
  91. //将iic读取到得数据分拆,放入相应寄存器,更新MPU6050_Last
  92. *******************************************************************************/
  93. void MPU6050_Read(void)
  94. {
  95.         ANO_Tech_I2C1_Read_Int(devAddr,MPU6050_RA_ACCEL_XOUT_H,14,mpu6050_buffer);
  96. }
  97. /**************************实现函数********************************************
  98. *函数原型:                u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data)
  99. *功  能:            读 修改 写 指定设备 指定寄存器一个字节 中的1个位
  100. 输入        dev  目标设备地址
  101. reg           寄存器地址
  102. bitNum  要修改目标字节的bitNum位
  103. data  为0 时,目标位将被清0 否则将被置位
  104. 返回   成功 为1
  105. 失败为0
  106. *******************************************************************************/
  107. void IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data){
  108.         u8 b;
  109.         ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
  110.         b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
  111.         ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
  112. }
  113. /**************************实现函数********************************************
  114. *函数原型:                u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
  115. *功  能:            读 修改 写 指定设备 指定寄存器一个字节 中的多个位
  116. 输入        dev  目标设备地址
  117. reg           寄存器地址
  118. bitStart  目标字节的起始位
  119. length   位长度
  120. data    存放改变目标字节位的值
  121. 返回   成功 为1
  122. 失败为0
  123. *******************************************************************************/
  124. void IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
  125. {
  126.        
  127.         u8 b,mask;
  128.         ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
  129.         mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1);
  130.         data <<= (8 - length);
  131.         data >>= (7 - bitStart);
  132.         b &= mask;
  133.         b |= data;
  134.         ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
  135. }
  136. /**************************实现函数********************************************
  137. *函数原型:                void MPU6050_setClockSource(uint8_t source)
  138. *功  能:            设置  MPU6050 的时钟源
  139. * CLK_SEL | Clock Source
  140. * --------+--------------------------------------
  141. * 0       | Internal oscillator
  142. * 1       | PLL with X Gyro reference
  143. * 2       | PLL with Y Gyro reference
  144. * 3       | PLL with Z Gyro reference
  145. * 4       | PLL with external 32.768kHz reference
  146. * 5       | PLL with external 19.2MHz reference
  147. * 6       | Reserved
  148. * 7       | Stops the clock and keeps the timing generator in reset
  149. *******************************************************************************/
  150. void MPU6050_setClockSource(uint8_t source){
  151.         IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source);
  152.        
  153. }
  154. /** Set full-scale gyroscope range.
  155. * @param range New full-scale gyroscope range value
  156. * @see getFullScaleRange()
  157. * @see MPU6050_GYRO_FS_250
  158. * @see MPU6050_RA_GYRO_CONFIG
  159. * @see MPU6050_GCONFIG_FS_SEL_BIT
  160. * @see MPU6050_GCONFIG_FS_SEL_LENGTH
  161. */
  162. void MPU6050_setFullScaleGyroRange(uint8_t range) {
  163.         IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
  164. }

  165. /**************************实现函数********************************************
  166. *函数原型:                void MPU6050_setFullScaleAccelRange(uint8_t range)
  167. *功  能:            设置  MPU6050 加速度计的最大量程
  168. *******************************************************************************/
  169. void MPU6050_setFullScaleAccelRange(uint8_t range) {
  170.         IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
  171. }
  172. /**************************实现函数********************************************
  173. *函数原型:                void MPU6050_setSleepEnabled(uint8_t enabled)
  174. *功  能:            设置  MPU6050 是否进入睡眠模式
  175. enabled =1   睡觉
  176. enabled =0   工作
  177. *******************************************************************************/
  178. void MPU6050_setSleepEnabled(uint8_t enabled) {
  179.         IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
  180. }

  181. /**************************实现函数********************************************
  182. *函数原型:                void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)
  183. *功  能:            设置 MPU6050 是否为AUX I2C线的主机
  184. *******************************************************************************/
  185. void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) {
  186.         IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
  187. }

  188. /**************************实现函数********************************************
  189. *函数原型:                void MPU6050_setI2CBypassEnabled(uint8_t enabled)
  190. *功  能:            设置 MPU6050 是否为AUX I2C线的主机
  191. *******************************************************************************/
  192. void MPU6050_setI2CBypassEnabled(uint8_t enabled) {
  193.         IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
  194. }

  195. void MPU6050_setDLPF(uint8_t mode)
  196. {
  197.         IICwriteBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode);
  198. }
  199. /**************************实现函数********************************************
  200. *函数原型:                void MPU6050_initialize(void)
  201. *功  能:            初始化         MPU6050 以进入可用状态。
  202. *******************************************************************************/
  203. void MPU6050_Init(void)
  204. {
  205.                 ANO_Tech_I2C1_Write_1Byte(0xd0,0x19,0x07);//1khz
  206.                

  207. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



评分

参与人数 3黑币 +60 收起 理由
number1man + 6 赞一个!
hxj + 4 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-5-5 23:06 | 只看该作者
好资料,51黑有你更精彩。
回复

使用道具 举报

板凳
ID:194383 发表于 2017-5-7 22:50 | 只看该作者
admin 发表于 2017-5-5 23:06
好资料,51黑有你更精彩。

那才给那么低的分
回复

使用道具 举报

地板
ID:221145 发表于 2017-10-16 17:32 | 只看该作者
好资料
回复

使用道具 举报

5#
ID:305368 发表于 2018-9-9 15:52 | 只看该作者
好资料
回复

使用道具 举报

6#
ID:305368 发表于 2018-9-9 15:53 | 只看该作者
好资料,优秀
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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