01:HAL库DMA解算舵机

news2024/11/26 5:42:12

 一:实现效果

DMA解算舵机

从下到上分别为舵机1,2,3,分别由函数Servo_SetAngle1(),Servo_SetAngle2(),Servo_SetAngle3()控制。

舵机1:偏航角Yaw:绕Z轴转动(机头水平转)

舵机2:横滚角Roll:绕X轴转动(飞机左右翻滚)

舵机3:俯仰角Pitch:绕Y轴转动(飞机上下抬头)

二:硬件介绍

1:MPU6050

/*
MPU6050的欧拉角范围可以按照以下方式清晰地表示和归纳:

Pitch角(俯仰角):
绕Y轴旋转
范围:±90°
方向:与旋转方向相反转是增大。具体来说,抬头时Pitch角为正,低头时Pitch角为负。

Roll角(横滚角):
绕X轴旋转
范围:±180°
方向:与旋转方向相反转是增大。具体来说,右滚时Roll角为正,左滚时Roll角为负。

Yaw角(偏航角):
绕Z轴旋转
范围:±180°
方向:与旋转方向相反转是增大。具体来说,右偏时Yaw角为正,左偏时Yaw角为负。

MPU6050通过其集成的三轴陀螺仪和三轴加速度计来测量这些角度。
这些角度数据对于理解物体的空间姿态和进行姿态控制非常关键。
在读取和使用这些数据时,需要特别注意它们的范围和方向性,以确保正确的数据处理和姿态控制。

*/
 

 2:舵机

 高电平宽度=某电频的持续时间

CCR=高电频

舵机的控制一般需要一个20ms的时基脉冲(周期),该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

二:软件部分 

pwm

#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <stdarg.h>

TIM_HandleTypeDef TIM_Handle;


void PWM2_Init(uint16_t psc,uint16_t arr)
{
		TIM_Handle.Instance=TIM2;
		TIM_Handle.Init.Prescaler=psc;
		TIM_Handle.Init.CounterMode=TIM_COUNTERMODE_UP;  //计数模式
		TIM_Handle.Init.Period=arr;
		TIM_Handle.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频值--不分频
		TIM_Handle.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;//自动重装载值
		HAL_TIM_PWM_Init(&TIM_Handle);
			
		TIM_OC_InitTypeDef TIM_OC_Init={0};
		TIM_OC_Init.OCMode=TIM_OCMODE_PWM1;  //模式  CNT<CCR输出有效值
		TIM_OC_Init.Pulse=0;    //CCR
		TIM_OC_Init.OCPolarity=TIM_OCPOLARITY_HIGH;   //输出极性(有效值)

		HAL_TIM_PWM_ConfigChannel(&TIM_Handle,&TIM_OC_Init,TIM_CHANNEL_1);
		HAL_TIM_PWM_ConfigChannel(&TIM_Handle,&TIM_OC_Init,TIM_CHANNEL_2);
		HAL_TIM_PWM_ConfigChannel(&TIM_Handle,&TIM_OC_Init,TIM_CHANNEL_3);

		HAL_TIM_PWM_Start(&TIM_Handle,TIM_CHANNEL_1);
		HAL_TIM_PWM_Start(&TIM_Handle,TIM_CHANNEL_2);
		HAL_TIM_PWM_Start(&TIM_Handle,TIM_CHANNEL_3);
	
}


void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
		if(htim->Instance==TIM2)
		{
			
			if(htim->Channel==TIM_CHANNEL_1)
			{
					//TIM2_CH1为PA0
				//TIM2_CH2为PA1
					//TIM2_CH3为PA2
				__HAL_RCC_GPIOA_CLK_ENABLE();
				__HAL_RCC_TIM2_CLK_ENABLE();
				GPIO_InitTypeDef GPIO_Init;
				GPIO_Init.Mode=GPIO_MODE_AF_PP;    /*复用推挽输出*/
				GPIO_Init.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
				GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;
				HAL_GPIO_Init(GPIOA,&GPIO_Init);
			}
		}
			
}

一个定时器可以开启多个,PWM的通道我们这里开启3个通道输出PWM。

在STM32F103C8T6中,定时器,它们各自拥有独立的通道和相应的捕获/比较寄存器(CCR)。关于TIM是否使用一个CCR的问题,可以明确地表示:

  1. 定时器独立性:TIM是独立的定时器,它们各自有自己的寄存器和功能设置。
  2. 通道与CCR的关系:对于通用定时器,如TIM2和TIM3,它们都具备多个通道(Channel),每个通道都对应一个捕获/比较寄存器(CCR)。例如,TIM2的通道1对应CCR1,TIM3的通道1对应CCR1,以此类推。
  3. 通道1的CCR使用情况
    • TIM2的通道1(TIM2_CH1)使用CCR1进行捕获或比较操作。
    • TIM3的通道1(TIM3_CH1)也使用CCR1进行捕获或比较操作,但这是TIM3的CCR1,与TIM2的CCR1是独立的。
  4. 总结:TIM2的通道1和TIM3的通道1不是使用一个CCR。它们各自有自己的CCR,即TIM2_CCR1和TIM3_CCR1。

这样的设计允许每个定时器独立地配置和操作其通道,从而实现更灵活和多样的功能。在编写代码时,你需要根据具体需求分别配置TIM2和TIM3的通道及其对应的CCR。

舵机

#include "stm32f1xx_hal.h"
#include "PWM.h"


void Servo_Init()
{
		PWM2_Init(72-1,20000);  //T=(72*20000)/72000 000=0.02s=20ms
}


//Angle:舵机的角度 0~180
void Servo_SetAngle1(float Angle)
{
	__HAL_TIM_SET_COMPARE(&TIM_Handle,TIM_CHANNEL_1,Angle / 180 * 2000 + 500);
}
void Servo_SetAngle2(float Angle)
{
	__HAL_TIM_SET_COMPARE(&TIM_Handle,TIM_CHANNEL_2,Angle / 180 * 2000 + 500);
}
void Servo_SetAngle3(float Angle)
{
	__HAL_TIM_SET_COMPARE(&TIM_Handle,TIM_CHANNEL_3,Angle / 180 * 2000 + 500);
}

__HAL_TIM_SET_COMPARE  读取CCR的值

主控程序

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "delay.h"
#include "UART.h"
#include "OLED.h"
#include <stdio.h>
#include <stdarg.h>
#include "IIC.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "mpu6050.h"

#include "steering_engine.h"


float Pitch,Roll,Yaw;								
uint8_t display_buf[20];

int main(void)
{

	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
	OLED_Init();
	Uart_Init(115200);
	MPU_Init();
	mpu_dmp_init();
	
	Servo_Init();
	printf("串口初始化成功\r\n");

	while(1)
	{
	
			mpu_dmp_get_data(&Pitch,&Roll,&Yaw);				//欧拉角
			sprintf((char *)display_buf,"pitch:%.2f   ",Pitch);
			OLED_ShowString(1,2,display_buf);
			sprintf((char *)display_buf,"roll:%.2f   ",Roll);
			OLED_ShowString(2,2,display_buf);
			sprintf((char *)display_buf,"yaw:%.2f   ",Yaw);
			OLED_ShowString(3,2,display_buf);
		
			//偏航角Yaw:绕Z轴转动(机头水平转)
		//横滚角Roll:绕X轴转动	(飞机左右翻滚)  
		//俯仰角Pitch:绕Y轴转动(飞机上下抬头)
	
			
				Servo_SetAngle1(Yaw+90);    //偏航角Yaw:绕Z轴转动(机头水平转)
				Servo_SetAngle2(Pitch+90);    //横滚角Roll:绕X轴转动(飞机左右翻滚)
				
				
				
				if(Pitch >= 0) 								//俯仰角Pitch:绕Y轴转动(飞机上下抬头)
				{
					
					Servo_SetAngle3(90-Pitch);   //俯仰角Pitch:绕Y轴转动(飞机上下抬头)
				}
			
				else if(Pitch <0)
				{
					float a = abs(Pitch);     
					Servo_SetAngle3(a+90);
				}
					
	}
			

}
/*
MPU6050的欧拉角范围可以按照以下方式清晰地表示和归纳:

Pitch角(俯仰角):
绕Y轴旋转
范围:±90°
方向:与旋转方向相反转是增大。具体来说,抬头时Pitch角为正,低头时Pitch角为负。

Roll角(横滚角):
绕X轴旋转
范围:±180°
方向:与旋转方向相反转是增大。具体来说,右滚时Roll角为正,左滚时Roll角为负。

Yaw角(偏航角):
绕Z轴旋转
范围:±180°
方向:与旋转方向相反转是增大。具体来说,右偏时Yaw角为正,左偏时Yaw角为负。

MPU6050通过其集成的三轴陀螺仪和三轴加速度计来测量这些角度。
这些角度数据对于理解物体的空间姿态和进行姿态控制非常关键。
在读取和使用这些数据时,需要特别注意它们的范围和方向性,以确保正确的数据处理和姿态控制。

*/


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

anaconda的基础用法

python和包以及anaconda的概念关系 环境 “好比一栋楼&#xff0c;在楼里面分配一间屋给各种‘包’放&#xff0c;每间房里面的‘包’互不影响” 激活环境 “告诉电脑&#xff0c;我现在要用这个屋子里面的‘包’来做东西了所以要进这间屋子” 移除环境 “现在这个屋子里…

基于Java的冬奥会科普平台

开头语&#xff1a;你好&#xff0c;我是计算机学姐码农小野。如果你对冬奥会科普平台感兴趣或有其他技术需求&#xff0c;欢迎随时私信我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java、B/S架构 工具&#xff1a;MyEclipse、MySQL 系统展示…

最值得入手的宠物空气净化器!希喂、352、安德迈真实测评~

随着天气越来越热&#xff0c;猫咪们也都开始掉毛啦。这时候&#xff0c;家里面到处都飘浮着猫咪们的浮毛和粑粑异味。抵抗力较差的铲屎官&#xff0c;身体就会出现一些问题&#xff0c;例如打喷嚏、咳嗽等呼吸道问题。 很多铲屎官以为用粘毛器、吸尘器等工具就能将猫咪们掉落…

欢乐钓鱼大师游戏攻略:萌新必备攻略大全!钓鱼脚本!

《欢乐钓鱼大师》是一款休闲益智类游戏&#xff0c;以钓鱼为主题&#xff0c;玩家需要通过各种钓鱼任务和挑战&#xff0c;收集不同种类的鱼类&#xff0c;并提升自己的钓鱼技术和装备。本文将为大家详细解析游戏的各个方面&#xff0c;帮助玩家更好地掌握游戏技巧&#xff0c;…

PAT B1008. 数组元素循环右移问题

题目描述 一个数组A中存有N(N>O)个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M(M≥0)个位置,即将A中的数据由( …)变换为(……)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,则应如何设计移动的方法?输…

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架&#xff0c;专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建&#xff0c;拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率&#xff0c;降低开发成本&#xff0c;…

第二证券炒股知识:新手炒股要注意什么风险?

股票商场作为现代金融商场的重要组成部分&#xff0c;招引了众多出资者的目光。但是关于新手来说炒股赚钱并不是那么简单的&#xff0c;其间蕴含着诸多危险。关于新手炒股要注意什么危险&#xff0c;中航资本下面就为大家具体介绍一下。 新手炒股要注意的危险&#xff1a; 1、…

云计算【第一阶段(16)】安装及管理程序

一、linux 应用程序基础 当我们主机安装linux操作系统 时候&#xff0c;也会同时安装一些软件或网络服务等等&#xff0c;但是随着系统一起安装的软件包毕竟他是少数的&#xff0c; 能够实现的功能也是有限的&#xff0c;那么我们相拥为主机提供更多更丰富的功能的时候&#x…

OpenAI 600万天价年薪震惊网友,全美顶尖AI公司薪酬大曝光!

最近&#xff0c;一张美国科技大厂的薪酬表曝出&#xff0c;OpenAI以500万起薪领衔。初创公司给出的薪酬&#xff0c;竟然超过了所有大型科技公司。不过初级码农&#xff0c;时薪却低至85元。 顶级公司的AI工程师能挣多少钱&#xff1f; 最近&#xff0c;这张美国科技大公司的…

“非遗+全身动作捕捉设备”如何打造交互式叙事新消费场景?

在数字化时代&#xff0c;非遗传承渠道逐渐数字化、科技化&#xff0c;利用“虚拟人全身动作捕捉设备”技术提升了非遗文化的社会能见度&#xff0c;让非遗文化重新吸引年轻人的目光。 “虚拟人全身动作捕捉设备”&#xff0c;可以让虚拟人化身虚拟主持人、虚拟主播、虚拟嘉宾…

图-多叉树的直径(hard)

目录 一、问题描述 二、解题思路 1.存储结构 2.算法描述 三、代码实现 四、刷题链接 五、参考 一、问题描述 二、解题思路 1.存储结构 使用邻接表结构来存储无向图&#xff0c;边结点存储结构为[终点&#xff0c;边长(也就是权重)] 2.算法描述 从某一个结点&#xff08;…

STM32开发过程中碰到的问题总结 - 3

文章目录 前言1. keil5升级到最新版本使用armV6编译工具链编译不通过2. 最新的keil用Jlink调试失败3. 移动了目录后跑不起来了4. 串口兼容了GNU 和arm只会&#xff0c;编译出来的成果物&#xff0c;串口输出不正常5.STM32下哪些IO口可以作为中断触发去使用6. 触发GPIO10的外部中…

Python机器学习完整流程:从数据清洗到推理落地

目录 一、引言 二、数据清洗 数据加载与初步探索 缺失值处理 异常值处理 特征编码与转换 数据集划分 三、模型训练 四、模型文件生成 五、模型部署与推理落地 六、总结 一、引言 在当今数据驱动的时代&#xff0c;机器学习已成为解决复杂问题的有力工具。而…

Django期末重点

思维导图 一、Djanog框架基础 MVT设计模式&#xff08;model模型【操作数据库】、template模板【页面展示】、view视图【处理请求和调用模型模板】&#xff09; 二、Django项目框架搭建 创建项目骨架 django-admin startproject 项目名启动服务 &#xff08;1&#xff09;p…

Eigne库安装及使用教程

文章目录 1.Eigne库介绍2.Eigne库安装3.Eigne库使用4.some examples5.参考文献 1.Eigne库介绍 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C库&#xff0c;它里面包含了很多算法。它的License是MPL2。它支持多平台。 Eigen采用源码的方式提供给用户使用&#xff0c;在…

赛氪网荣膺“创新型中小企业”称号,科技创新再显卓越实力

近日&#xff0c;北京市经济和信息化局揭晓了2024年度3月份北京市创新型中小企业的光荣名单&#xff0c;其中北京环球赛乐科技有限公司&#xff08;简称赛氪网&#xff09;脱颖而出&#xff0c;再度展现其在创新领域的卓越实力&#xff01; 作为早已跻身“高企之光”行列的佼佼…

【x264】滤波模块的简单分析

【x264】滤波模块的简单分析 1. 滤波模块概述1.1 自适应边界1.2 自适应样点级滤波器1.3 滤波过程 2. 函数入口&#xff08;fdec_filter_row&#xff09;2.1 去块滤波&#xff08;x264_frame_deblock_row&#xff09;2.1.1 强滤波函数&#xff08;deblock_edge_intra&#xff09…

Ubuntu20.04-ROS:Noetic安装

根据Ubuntu系统来选择对应的ros版本&#xff0c;在Ubuntu20.04上安装ROS-Noetic为例说明下如何安装ros 一 设置ROS源 / 终端输入 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.lis…

语言大模型:开启自然语言处理的新篇章

随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的成果。其中&#xff0c;语言大模型&#xff08;Language Models&#xff09;作为近年来崛起的一种新型神经网络模型&#xff0c;已经在文本生成、机器翻译、情感分析等多个NLP任…

计算机专业毕设-校园二手交易平台

1 项目介绍 基于SpringBoot的校园二手交易平台&#xff1a;前端Freemarker&#xff0c;后端 SpringBoot、Jpa&#xff0c;系统用户分为两类&#xff0c;管理员、学生&#xff0c;具体功能如下&#xff1a; 管理员&#xff1a; 基本功能&#xff1a;登录、修改个人信息、修改…