STM32传感器模块编程实践(四)舵机+MPU6050陀螺仪模块融合云台模型

文章目录

    • 一.概要
    • 二.实验模型原理
      • 1.硬件连接原理框图
      • 2.控制原理
    • 三.实验模型控制流程
    • 四.云台模型程序
    • 五.实验效果视频
    • 六.小结

一.概要

云台主要用来固定摄像头。准确地说,云台是一种可以多角度调节的支撑设备,类似于人的脖子可以支撑着脑袋,并通过转动来调节视野。
云台电机可以被用于相机、无人机和摄像机等设备上,以实现平滑稳定的拍摄效果,无人机在飞行过程中,尤其是遇到风力干扰或进行复杂飞行动作时,机身容易产生震动和晃动。而云台的存在可以有效地隔离这些抖动,保证挂载在上面的相机或摄像头能够拍摄出稳定、清晰的画面。这对于航拍、侦察、监测等需要高质量影像的任务至关重要。

本文就做了一个简单的云台模型,采用STM32F103C8T6单片机+舵机+陀螺仪模块,实现一个简易云台,随着陀螺仪模块倾斜多少度,舵机就转动到多少度。

在这里插入图片描述

二.实验模型原理

1.硬件连接原理框图

在这里插入图片描述

模型主要分为三部分:主芯片单元,倾斜测量单元,执行动作单元。

在这里插入图片描述

图中主控芯片为STM32F103C8T6单片机,倾斜测量为MPU6050陀螺仪模块,执行传感器为SG90舵机。

信号线连接:MPU6050陀螺仪模块信号脚SCL脚接到单片机的PB10脚,SDA脚接到单片机的PB11脚。SG90(180度)舵机的信号脚橙色线接到单片机的PA6脚。

2.控制原理

陀螺仪模块测量模块跟水平方向的夹角,如果大于0度,单片机驱动舵机也转到响应的角度,如果陀螺仪模块的倾斜角度没有变化,舵机角度保持不变,如果陀螺仪模块回到0度,舵机也相应转到0度。

陀螺仪模块测倾角原理:

MPU6050含3轴的加速度与3轴的陀螺仪,我们只要取单轴的加速度值,就能计算在某一方向上的倾斜角度。
在这里插入图片描述

舵机控制原理:
SG90舵机,首先,控制引脚是三根线,分别是GND(棕色)、VCC(红色)、PWM(黄色),控制方式也是一样的PWM时序,具体的方法如下:

(1)采用PWM控制的方式来进行舵机的旋转
(2)舵机的控制需要MCU产生一个20ms周期的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。
(3)高电平时间跟舵机旋转的角度对应关系:
0.5ms-------------0度;对应函数中占空比为2.5%
1.0ms------------45度;对应函数中占空比为5.0%
1.5ms------------90度;对应函数中占空比为7.5%
2.0ms-----------135度;对应函数中占空比为10.0%
2.5ms-----------180度;对应函数中占空比为12.5%

三.实验模型控制流程

1.单片机先通过IIC口读取陀螺仪的角度。

2.计算陀螺仪的倾斜角度,如果有倾斜,驱动PA6引脚输出20ms周期控制舵机旋转到响应的角度。

3.如果倾斜角度回到0,控制舵机旋转到0度。

四.云台模型程序

板子与MPU6050陀螺仪模块用杜邦线连接:
板子G-----模块GND
板子3.3---模块VCC
板子B10---模块SCL
板子B11---模块SDA板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线

USB线需要接小系统板,给板子供5V。
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述

配置IIC引脚
在这里插入图片描述

配置PWM输出,定时器3通道1,周期20ms
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

主要程序:

short Accel[3];
short Gyro [3];
short Temp;
float AccelData[3];//单位g
float GyroData[3];//单位mdps
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t Pluse_Time=1000;//1毫秒脉冲,单位是ustypedef struct Angle
{double X_Angle;double Y_Angle;double Z_Angle;} MPU6050_Angle;
MPU6050_Angle data;
double Angle_Old;
/****************************************************************************** 
* 函数介绍: 计算 x, y, z 三轴的倾角 
* 输入参数: 无 
* 输出参数: data:角度结构体 
* 返回值 : 无 
******************************************************************************/
void MPU6050_Get_Angle(MPU6050_Angle *data)
{   /* 计算x, y, z 轴倾角,返回弧度值*/data->X_Angle = acos(AccelData[0]/1000);data->Y_Angle = acos(AccelData[1]/1000);data->Z_Angle = acos(AccelData[2]/1000);/* 弧度值转换为角度值 */data->X_Angle = data->X_Angle * 57.29577;data->Y_Angle = data->Y_Angle * 57.29577;data->Z_Angle = data->Z_Angle * 57.29577;
} /*** 函数功能: 读取MPU6050的加速度数据* 输入参数: 无* 返 回 值: 无* 说    明: 无*/ 
void MPU6050ReadAcc(short *accData)
{uint8_t buf[6];MPU6050_ReadData(MPU6050_ACC_OUT, &buf[0], 6);accData[0] = (buf[0] << 8) | buf[1];accData[1] = (buf[2] << 8) | buf[3];accData[2] = (buf[4] << 8) | buf[5];
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();//IIC初始化MX_TIM3_Init();//配置定时器,20ms周期PWM波,初始化高电平是1msMPU6050_Init();//MPU6050初始化配置,中断使能配置if(MPU6050ReadID() == 0)//读取MPU6050 ID{	while(1);}/* USER CODE BEGIN 2 */if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出MX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(300);//等待300msHAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */MPU6050ReadAcc(Accel);//读取加速度数据for( int i=0;i<3;i++){if(Accel[i]>=0){AccelData[i]=Accel[i]*2000/32768;//转换成单位mg}else{AccelData[i]=-(-Accel[i]+1)*2000/32768;}	}	MPU6050_Get_Angle(&data);//计算倾角,通过X_Angle来控制舵机转角if(abs((int)Angle_Old-(int)data.X_Angle)>3)//当前角度与存储的角度差值大于3度,进行动作,主要是防止手抖动{	//以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间)://t=0.5ms(占空比2.5%)---------0°;//t=1.0ms(占空比5%)-----------45°;//t=1.5ms(占空比7.5%)---------90°;//t=2.0ms(占空比10%)---------135°;//t=2.5ms(占空比12.5%)-------180°;		Pluse_Time=500+((float)data.X_Angle/18)*200;//高电平时间=0.5ms+(角度/180°)×2msHAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出MX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(50);HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	}Angle_Old=data.X_Angle;//把目前读到的角度值存下来,以便下次比较使用}/* USER CODE END 3 */
}void MX_TIM3_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};htim3.Instance = TIM3;htim3.Init.Prescaler = 71;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 19999;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = Pluse_Time;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}HAL_TIM_MspPostInit(&htim3);}

五.实验效果视频

演示效果

六.小结

融合了舵机,陀螺仪模块的控制,对STM32的单片机的定时器PWM功能,IIC通讯,陀螺仪的产品有更深的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446461.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java_ EE (网络编程)

网络编程基本概念: 计算机网络计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。从其…

利用弹性盒子完成移动端布局(第二次实验作业)

需要实现的效果如下&#xff1a; 下面是首先是这个项目的框架&#xff1a; 然后是html页面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

springboot系列--web相关知识探索五

一、前言 web相关知识探索四中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索四中主要研究了复杂参数底层绑定原理。本次主要是研…

flask项目框架搭建

目录结构 blueprints python包&#xff0c;蓝图文件&#xff0c;相当于路由组的概念,方便模块化开发 例如auth.py文件 from flask import Blueprint, render_templatebp Blueprint("auth", __name__, url_prefix"/auth")bp.route("/login") d…

【双指针算法】移动零

1.题目解析 2.算法分析 可以归结为数组划分/数组分块&#xff08;采用双指针算法&#xff09;-->利用数组下标充当指针 &#xff08;1&#xff09;首先定义两个指针 dest&#xff1a;已处理的区间内&#xff0c;非零元素的最后一个位置cur&#xff1a;从左往右扫描数组&…

工业软件界面盲目追求美观性,或许是误入歧途。

在工业软件领域&#xff0c;界面盲目追求美观性确实可能是误入歧途。 工业软件的核心目的是为了满足工业生产、管理和控制等实际需求。 首先&#xff0c;实用性和功能性应该是工业软件界面设计的首要考虑因素。界面需要清晰地展示关键数据、操作按钮和流程指示&#xff0c;以…

K8s-services+pod详解1

一、Service 我们能够利用Deployment创建一组Pod来提供具有高可用性的服务。 虽然每个Pod都会分配一个单独的Pod IP&#xff0c;然而却存在如下两问题&#xff1a; Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP&#xff0c;外部无法访问 这样对于访问这…

SpringBoot原理篇

目录 配置优先级 bean的管理 获取bean bean作用域 第三方bean 法一 法二 SpringBoot原理 起步依赖 自动配置 概述 方案 ComponentScan 组件扫描 lmport 导入 原理分析 源码跟踪 Conditional 案例 配置优先级 虽然springboot支持多种格式配置文件&#xff0c…

Python画笔案例-081 绘制 3D红球

1、绘制 3D红球 通过 python 的turtle 库绘制 3D红球,如下图: 2、实现代码 绘制 3D红球,以下为实现代码: """3D红球.py本程序不断地打直径越来越小,亮度越来越高的圆点。最后就形成了有种3D效果的圆球。 """ import turtle from coloradd …

亚马逊测评:虚拟支付卡的使用

在亚马逊测评自养号体系中&#xff0c;虚拟支付卡的使用越来越普遍&#xff0c;成为了一种重要的支付工具。以下是对虚拟支付卡的详细分析&#xff0c;包括其背景、使用方式、优势以及注意事项。 一、为什么要使用虚拟支付卡 亚马逊平台对支付方式有严格的规定&#xff0c;要求…

C# (.net6)实现Redis发布和订阅简单案例

概念&#xff1a; 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅&#xff08;Pub/Sub&#xff09;是 Redis 支持的一种消息传递模式&#xff0c;其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。 多个客户端可以订阅一个相同的频道…

geometry()、frameGeometry()、pos()、size()、rect()的区别

QWidget为单独的窗口展示 QWidget的这几个方法都与窗口的几何信息有关&#xff0c;作为单独的窗口展示时&#xff0c;我们来看一下他们的一些区别 geometry()&#xff1a;获取的矩形不包括窗口自带的标题栏&#xff0c;只包括窗口的内容区frameGeometry()&#xff1a;获取的矩…

Spring Boot知识管理系统:技术与方法论

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

昇思MindSpore进阶教程--数据处理性能优化(中)

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 shuffle性能优化 shuffle操作主要是对有…

vue3中HTML标签元素使用ref的作用

首先我们需要两个界面 APP.vue主界面 <template><!-- html --><div class"app"><h1 ref"title">您好啊&#xff01;</h1><button click"printTitle">点我</button> <refTest/></div> &…

【无人机设计与控制】PID_积分滑模_积分反步四旋翼无人机轨迹跟踪控制算法

摘要 本文基于四旋翼无人机设计与控制&#xff0c;提出了一种结合PID控制、积分滑模控制以及积分反步控制的轨迹跟踪算法。该算法通过调节无人机的运动轨迹&#xff0c;提升其在复杂环境下的稳定性与抗扰动能力。实验结果表明&#xff0c;该算法能有效改善无人机的轨迹跟踪精度…

Python Django 查询集的延迟加载特性

Django 查询集的延迟加载特性 一、引言 在 Django 的开发过程中&#xff0c;查询集&#xff08;QuerySet&#xff09;是我们与数据库进行交互的重要工具。查询集提供了一种高效的方式来检索和操作数据库中的数据&#xff0c;且能够进行懒加载&#xff08;Lazy Loading&#x…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

【数据结构】:破译排序算法--数字世界的秩序密码(一)

文章目录 一.排序算法概述1.定义和目的2.排序算法的分类2.1比较排序2.2非比较排序 二.插入排序算法1.InsertSort直接插入排序1.1.插入排序原理1.2.插入排序过程1.3.代码实现1.4.复杂度和稳定性 2.ShellSort希尔排序2.1.希尔排序原理2.2.希尔排序过程2.3.代码实现2.4.复杂度和稳…

【.net core使用minio大文件分片上传】.net core使用minio大文件分片上传以及断点续传、秒传思路

版本&#xff1a;.net core 7 需求&#xff1a;net限制了上传的大小&#xff0c;只能上传25M上下的文件&#xff0c;如果上传一个八十多兆的文件&#xff0c;swagger接口报错&#xff0c;如果前端调用上传接口&#xff0c;会报CORS跨域错误&#xff0c;这篇文章介绍怎么使用分片…