开发板:STM32F103RCT6最小系统开发板
舵机 :SG90
运动处理传感器 : MPU-6050

云台

云台是安装、固定摄像机的支撑设备,固定云台可以用来调整摄像机的水平和俯仰的角度,电动云台由电动机接受来自控制器的信号精确的定位,可以扫描监视区域。

舵机

舵机是一种位置(角度)伺服的驱动器,适用于需要角度不断变化并可以保持的控制系统。

实现效果

在本项目中,MPU6050与舵机的结合无论处于什么位置,舵机上的扇叶始终保持与地面水平。

舵机处理:

舵机有三条导线:电源、地和控制线。
舵机的控制信号是PWM信号,利用占空比的变化,改变舵机的位置。
本次设计中使用TIM3_CH3输出PWM波形改变舵机的位置。代码的编写还是比较简单的,我首先使用按键控制改变PWM的占空比,观察舵机的而变化,脉冲方波信号的周期为20ms,按键每按下一次,高电平的时间增加0.1ms,测试发现当0.5ms时舵机位置开始变化,每按下一次,位置变化一丢丢,当到2.3的时候回旋转一圈,但没有返回刚开始的位置,并且此时舵机有一种卡住的感觉,当高电平的时间继续增加到2.5ms时,舵机恢复到刚开始的位置,具体的原因我还没有搞清楚。
这里还有一个需要注意的问题,可能也是我习惯不好,刚开始我搞了一会儿发现舵机的变化极其不规律,因为我平常只使用烧录器给开发板供电。而舵机需要的电压在4-6V,虽然插在了5V的引脚上,但供电仍然不够,之后使用USB线给开发板供电之后才测试出来了这些结果。

MPU-6050分析

RA是要读或写的寄存器的地址。
IIC协议:


本项目使用软件模拟I2C的电平变化传输数据。需要编写出起始信号、终止信号、应答、非应答、传或接收一个字节、传输或接受多个字节的函数,这些函数网上很多,也并不复杂,因此不在赘述。
当MPU6050做从机时,当AD0为低电平时,MPU6050的地址为0x68,为高电平时为0x69。也可以通过读WHO_AM_I寄存器得到器件ID,
下面列出一下常用的MPU6050寄存器的地址

/***********************************************************************/
//寄存器地址
#define MPU6050_PWR                 0x6b    //电源
#define MPU6050_SMPLRT_DIV          0x19    //取样时钟
#define MPU6050_CONFIG              0x1a    //低通滤波
#define MPU6050_GYRO_CONFIG         0x1b    //陀螺仪量程(bit3,4)(0-250,1-500,2-1000,3-2000)
#define MPU6050_ACCEL_CONFIG        0x1c    //加速度计量程(bit3,4)(0-2g,1-4g,2-8g,3-16g)#define MPU6050_RA_TITO_EN          0X23    //设备各种FIFO使能
#define MPU6050_RA_INT_ENABLE       0X38    //中断使能
#define MPU6050_RA_INT_PIN_CFG      0X37    //中断引脚配置寄存器
#define MPU6050_RA_USER_CTRL        0X6A    //使能FIFO缓存区、I2C主机模式喝主要接口
#define MPU6050_RA_PWR_MGMT_1       0X6B    //用户配置电源模式和时钟源
#define MPU6050_RA_PWR_MGMT_2       0X6C    //允许用户配置加速度计在低功耗模式下换器的频率#define MPU6050_DEVICE_ID_REG       0x75    //WHO_AM_I寄存器#define MPU6050_RA_ACCEL_XOUT_H     0x3B    //加速度
#define MPU6050_RA_ACCEL_XOUT_L     0x3C
#define MPU6050_RA_ACCEL_YOUT_H     0x3D
#define MPU6050_RA_ACCEL_YOUT_L     0x3E
#define MPU6050_RA_ACCEL_ZOUT_H     0x3F
#define MPU6050_RA_ACCEL_ZOUT_L     0x40#define MPU6050_RA_TEMP_OUT_H       0x41    //温度
#define MPU6050_RA_TEMP_OUT_L       0x42#define MPU6050_RA_GYRO_XOUT_H      0x43    //转速陀螺仪
#define MPU6050_RA_GYRO_XOUT_L      0x44
#define MPU6050_RA_GYRO_YOUT_H      0x45
#define MPU6050_RA_GYRO_YOUT_L      0x46
#define MPU6050_RA_GYRO_ZOUT_H      0x47
#define MPU6050_RA_GYRO_ZOUT_L      0x48/****************************************************************************************************/

下面时MPU6050的初始化函数

//初始化MPU6050
//返回值: 0,成功
//        其他,错误代码
u8 MPU_Init(void)
{u8 res;IIC_Init();//初始化IIC总线I2C_Write_Byte(MPU6050_PWR,0X80);//复位MPU6050delay_ms(100);I2C_Write_Byte(MPU6050_PWR,0X00);//唤醒MPU6050MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
//    MPU_Set_Accel_Fsr(0); //加速度传感器 ±2gMPU_Set_Rate(50); //设置采样率50HZI2C_Write_Byte(MPU6050_RA_INT_ENABLE,0X00); //关闭所有中断I2C_Write_Byte(MPU6050_RA_USER_CTRL,0X00);//I2C主模式关闭I2C_Write_Byte(MPU6050_RA_TITO_EN,0X00);//关闭FIFOI2C_Write_Byte(MPU6050_RA_INT_PIN_CFG,0X80);//INT引脚低电平有效res=I2C_Read_Byte(MPU6050_DEVICE_ID_REG);if(res==(u8)MPU_ADDR)//器件ID正确{I2C_Write_Byte(MPU6050_RA_PWR_MGMT_1,0X01);//设置CLKSEL,PLL X 轴为参考I2C_Write_Byte(MPU6050_RA_PWR_MGMT_2,0X00);//加速度陀螺仪都工作MPU_Set_Rate(50); //设置采样率为50HZ}else return 1;return 0;
}

初始化完成后读温度、陀螺仪、加速度计可得到相对应的值。
下面说一下云台的实现,通过读取到的这些数据可以得到三个角度:偏航角(Yaw)、俯仰角(Pitch)、横滚角(Roll)。
本次简易云台的实现只使用了俯仰角来实现。其实具体使用哪个角完全看你的MPU6050怎么和云台结合。通过我之前使用按键可以找到数字舵机旋转一周改变的PWM的范围,然后找到平衡时候的PWM,而云台转动的过程中,通过MPU6050得到的角度,乘上旋转一度需要的PWM弥补回来,就可以一直达到平衡的效果
代码实现非常简单

TIM_SetCompare3(TIM3,(2300-Angle_y*12));

这里2300和12都是通过自己的实验得到的。
下面简单介绍一下如何通过加速度计得到俯仰角和横滚角。

根据百度百科的定义,atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。而俯仰角是机体坐标系y轴与水平面的夹角。因此利用图中最下面的公式便可以求出来俯仰角和横滚角,
而偏航角的求值我是利用陀螺仪求出角速度,然后利用定时器计算时间,对角速度积分求得的,最后,云台的实现要看MPU6050如何与舵机结合,然后才能确定需要使用哪一个角度,但这样求得的角度可能会没有那么准确,但对于一个简易的云台来说,完全足够了。经过亲自测试。效果还行。
以后有机会了,学习一下卡尔曼滤波之类的MPU6050的角度求法。

配套源码
https://download.csdn.net/download/weixin_44845857/20377503

简易云台制作记录(内含MPU6050角度的求法)相关推荐

  1. Xd设计与制作记录贴:记录我的艺术设计基础期末大作业

    Xd设计与制作记录贴:记录我的艺术设计基础期末大作业 通过艺术设计基础这门课的学习,我掌握了一些PPT的制作技巧和Xd入门操作方法. 期末大作业是要根据以前课上讨论的主题做一个能展现自己设计思路的工程 ...

  2. 浅析简易网页制作的准备工作

    还记得最初开始网页制作的时候还是新手,面对自己第一个网页制作无论是网页设计还是制作流程都十分上心.对于一个新手来说,网页制作需要充分了解它的制作流程和准备工作,那么网页制作究竟都要涉及哪些方面准备呢? ...

  3. 如何在python制作计算器_Python简易计算器制作方法代码详解

    主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...

  4. kali木马 简易木马制作与应用

    Kali--木马(一) 学习web渗透过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流. -- 简易木马制作与应用 -- 一.流程 首先确定靶机和攻击主机可以连通 利用msf ...

  5. 华为小熊派开发记录STM32+MPU6050+WIFI8266

    华为小熊派开发记录STM32+MPU6050+WIFI8266 前言 STM32CubeMX+MDK+LiteOS MPU6050 WIFI8266 华为云使用 其它 前言 忽悠下参加了物联网开发比赛 ...

  6. 基于DOS的简易俄罗斯方块制作

    制作一个简易的俄罗斯方块,未调用graphics库(装了半天不成功),完全的黑框操作 基本思路: 1.利二维数组表示地图(也可以利用一维数组,此处利用的是一维数组) 0.表示没有方格,1.表示正在下落 ...

  7. 程序源码分享-51单片机用LCD1602显示MPU6050角度数据

    硬件方面选择的是51单片机,显示屏LCD1602,姿态传感器MPU6050的型号为维特智能的JY60,具体设计思路见笔者的文章基于单片机的云台姿态测量系统设计. STM32将mpu6050的数据DAC ...

  8. HTML5 form表单 调查问卷制作(内含超详细代码解读)

    HTML 表单技术练习:制作调查问卷(内含超详细代码解读) 这一篇来记录HTML5表单API的学习,以制作调查问卷为例,效果如图: 注:完整代码见文章末尾处. 一.表单标签form 1.常用属性 常用 ...

  9. 粘贴铜箔简易实验电路制作

    ▌01 简易电路 在博文 单管发报机的神奇之处-身兼两职 中,显示作者使用粘贴铜箔的方式制作简易发报机电路. 不过作为高频电路,这种制作只是为了显示电路的工作原理,但对于电路工作本身会产生很大的干扰和 ...

最新文章

  1. Oracle DBA课程系列笔记(19)
  2. 史上最全异常检测算法概述
  3. mAP@.5 含义:
  4. 开发日记-20190506 关键词 汇编语言(五)Hello World!
  5. 《博客园精华集》Sharepoint+MOSS分册第2轮筛选结果文章列表
  6. $emit传递多个参数_Go语言参数传递方式
  7. java实践_Java怪异实践
  8. python机制_python异常机制个人理解(参考网上资料)
  9. 面向模式的分析和设计(POAD)
  10. AttributeError: module ‘tensorflow‘ has no attribute ‘xxx‘
  11. YARN调试过程中的常见问题
  12. 真人节目《通灵之战》的观后感
  13. eclisp导入jsp项目之基础
  14. 光纤OTDR测试是端到端损耗原理
  15. 分享一个查看U盘闪存的工具,SA们别买到假货了!
  16. 解决Jmeter CA证书不受信任无法问题(导致代理服务器无法录制脚本)
  17. 5分钟了解《代码整洁之道》精华
  18. jQuery append( ) 方法
  19. 深度神经网络和人工神经网络区别
  20. FormData是什么

热门文章

  1. 如何通过Python分析中国演员排名?他第一你认可吗?
  2. 解决echarts设置x轴、y轴刻度起始值、终止值以及步长
  3. 如何实现GridView分页功能?
  4. 智能硬件的最小可行产品「MVP」
  5. Unity UGUI无限列表(Infinite List)
  6. 【转】COleDateTime类型的应用
  7. HP服务器350g5怎么安装系统,hp DL380 g5创建raid阵列安装系统准备工作
  8. Git代码版本控制工具
  9. 有孚网络吕鑫:融媒体数据管理的实践与探讨
  10. 第十四章 习题14-11-习题14-20