电机应用-舵机

news2024/11/28 18:56:49

目录

舵机

分类

结构

工作原理

控制原理

参数

舵机基本控制实验(MG996R舵机)

MG996R舵机规格

硬件电路

TIM4配置

测试环节


舵机

分类

按照舵机的控制电路分类:模拟舵机数字舵机

模拟舵机和数字舵机的机械结构是完全相同的。

模拟舵机的控制电路为纯模拟电路,需要一直发送目标信号,才能转到指定的位置,响应速度较慢,无反应区较大

数字舵机内部控制电路则加上了微控制器,只需要发送一次目标信号,即可到达指定位置,响应速度比模拟舵机更快,无反应区更小

按照使用对象不同分类:航模舵机车模舵机船模舵机机器人舵机

航模舵机一般要求速度快、精度高

车模舵机、船模舵机一般要求具有大扭矩和防水性好

按照内部机械材质分类:塑料齿舵机金属齿舵机

塑料齿舵机内部的传动齿轮是塑料的,重量轻价格便宜,但是扭矩一般较小无法做大;

金属齿舵机的扭矩更大且舵机更耐用,但成本较高

按照外部接口和舵机的控制方式分类:PWM舵机串行总线舵机

结构

舵机主要组成:外壳、舵盘、直流电机、减速齿轮组、角度传感器、控制驱动电路和接口线缆等。

角度传感器负责舵机的位置反馈,直接装在舵机的主输出轴上,将轴旋转后产生的角度变化变成电压信号发回控制电路。

控制驱动电路用来接收外部接口传来的信号、接收角度传感器反馈的电压值、驱动直流电机旋转。

减速齿轮组用来降低直流电机的转速和放大扭矩。

常见的廉价舵机通常采用小型的直流有刷电机和塑料材质减速齿轮组,传感器一般使用电位器返回模拟电压。而稍贵的会使用金属齿轮组,高端的舵机内部甚至会采用无刷电机和磁电编码器。

工作原理

模拟舵机和数字舵机内部电路不同,所以原理上稍有不同。

模拟舵机内部的控制驱动电路板从外界接收控制信号,经过处理后变为一个直流偏置电压(在控制板内部有一个基准电压,这个基准电压由电位器产生并反馈到控制板),将外界获得的直流偏置电压与电位器的基准电压进行比较获得电压差,并输出到电机驱动芯片驱动电机。(电压差的正负决定了电机的正反转,电压差的大小决定了旋转的角度,当电压差为0时,电机停止转动)

舵机内部是闭环控制的,所以这一类电机实际上是一种位置(角度)伺服的简化版伺服电机,将工业伺服电机的三闭环控制简化成了只有一个位置闭环。舵机本质上属于伺服电机,英文叫Servo或RC Servo。

控制原理

舵机三根线:正极线、负极线、信号线。

舵机的控制通常采用PWM信号,例如需要一个周期为20ms的脉冲宽度调制(PWM),脉冲宽度部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分,总间隔为2ms。当脉冲宽度为1.5ms时,舵机旋转至中间角度;大于1.5ms时舵机旋转角度增大;小于1.5ms时舵机旋转角度减小。舵机分90°、180°、270°、360°。以180°舵机为例看下图。

图中脉冲宽度和舵机旋转角度为线性关系,其它舵机控制脉冲也类似。

参数

舵机旋转速度单位:sec/60°,即舵机旋转60°需要的时间。如果控制脉冲变化宽度大,变化速度快,舵机就有可能在一次脉冲的变化过程中还没有转到目标角度时,脉冲就再次发生了变化。舵机的旋转速度一般为0.16sec/60°、0.12sec/60°等。舵机的选择速度还与工作电压有关,在允许的电压范围内,电压越大速度越快,电压越小速度越慢。

舵机扭矩单位:KG*CM。可以理解为在舵盘上距离舵机轴中心水平距离1cm处,舵机能够带动的物体重量。

通常说的55g舵机、9g舵机等,55g和9g指的是舵机本身的重量。

舵机基本控制实验(MG996R舵机)

MG996R舵机规格

尺寸:40.5*20*41mm

重量:55g

速度:4.8V@0.12±0.01sec/60°--6.0V@0.11±0.01sec/60°

扭力:4.8V@11kg*cm--6.0V@13kg*cm

电压:4.8V~6V

空载工作电流:220±20mA

堵转工作电流:2000±30mA

响应脉宽时间≤5usec

角度偏差:回中差≤1°,左右各45°,误差≤3°

齿轮:5级金属齿轮组

连接线长度:300mm

接口规格:JR/FP通用

硬件电路

电机开发板预留了两个舵机接口,实验只使用其中一个,舵机由TIM4_CH1控制。

TIM4配置

TIM_HandleTypeDef htim4;

/* TIM4 init function */
void MX_TIM4_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

    htim4.Instance 					= TIM4;
    htim4.Init.Prescaler 			= 1679;
    htim4.Init.CounterMode 			= TIM_COUNTERMODE_UP;
    htim4.Init.Period 				= 999;
    htim4.Init.ClockDivision 		= TIM_CLOCKDIVISION_DIV1;
    htim4.Init.AutoReloadPreload 	= TIM_AUTORELOAD_PRELOAD_ENABLE;
    if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
    {
        Error_Handler();
    }

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
    {
        Error_Handler();
    }

    if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
    {
        Error_Handler();
    }

    sMasterConfig.MasterOutputTrigger 	= TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode 		= TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }

    sConfigOC.OCMode 		= TIM_OCMODE_PWM2;
    sConfigOC.Pulse 		= 25;
    sConfigOC.OCPolarity 	= TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode 	= TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }

    HAL_TIM_MspPostInit(&htim4);
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *tim_baseHandle)
{
    if (tim_baseHandle->Instance == TIM4)
    {
        __HAL_RCC_TIM4_CLK_ENABLE();
    }
}

void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};

    if (timHandle->Instance == TIM4)
    {
        __HAL_RCC_GPIOD_CLK_ENABLE();
		
        /**TIM4 GPIO Configuration
        PD12     ------> TIM4_CH1
        */
        GPIO_InitStruct.Pin 		= GPIO_PIN_12;
        GPIO_InitStruct.Mode 		= GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull 		= GPIO_NOPULL;
        GPIO_InitStruct.Speed 		= GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate 	= GPIO_AF2_TIM4;
        HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
    }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *tim_baseHandle)
{
    if (tim_baseHandle->Instance == TIM4)
    {
        __HAL_RCC_TIM4_CLK_DISABLE();
    }
}

测试环节

/**
  * @brief  设置舵机占空比
  * @param  angle: 占空比,(0.5/20.0*PWM_PERIOD_COUNT 到 2.5/20.0*PWM_PERIOD_COUNT)
  * @retval 无
  */
void set_steering_gear_dutyfactor(uint16_t dutyfactor)
{
#if 1
    {
        /* 对超过范围的占空比进行边界处理 */
        dutyfactor = 0.5 / 20.0 * 1000 > dutyfactor ? 0.5 / 20.0 * 1000 : dutyfactor;
        dutyfactor = 2.5 / 20.0 * 1000 < dutyfactor ? 2.5 / 20.0 * 1000 : dutyfactor;
    }
#endif

	__HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure, TIM_CHANNEL_1, dutyfactor);
}

/**
  * @brief  设置舵机角度
  * @param  angle: 角度,(0 到 180(舵机为0°-180°))
  * @retval 无
  */
void set_steering_gear_angle(uint16_t angle_temp)
{
    angle_temp = (0.5 + angle_temp / 180.0 * (2.5 - 0.5)) / 20.0 * 1000;    // 计算角度对应的占空比
    set_steering_gear_dutyfactor(angle_temp);    							// 设置占空比
}

__IO uint16_t ChannelPulse = 0.5 / 20.0 * 1000;

void test(void)
{
	初始化
	
	/*开始输出PWM*/
    HAL_TIM_PWM_Start(&htim4, PWM_CHANNEL_1);
	
	while(1)
	{
		/* 处理数据 */
		if (Key_Scan(KEY1_GPIO_PORT, KEY1_PIN) == KEY_ON)
		{
			ChannelPulse -= 10;    							// 减少占空比
	
			// 检查占空比的合法性
			ChannelPulse = 0.5 / 20.0 * 1000 > ChannelPulse ? 0.5 / 20.0 * 1000 : ChannelPulse; 	
	
			set_steering_gear_dutyfactor(ChannelPulse);    	// 设置占空比
		}
	
		/* 处理数据 */
		if (Key_Scan(KEY2_GPIO_PORT, KEY2_PIN) == KEY_ON)
		{
			ChannelPulse += 10;    							// 增加占空比
	
			// 检查占空比的合法性
			ChannelPulse = 2.5 / 20.0 * 1000 < ChannelPulse ? 2.5 / 20.0 * 1000 : ChannelPulse; 	
	
			set_steering_gear_dutyfactor(ChannelPulse);    	// 设置占空比
		}	
	}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	// 串口可接收角度,存到变量angle_temp
	if (angle_temp >= 0 && angle_temp <= 180)
    {
        printf("角度: %d\r\n", angle_temp);
        ChannelPulse = (0.5 + angle_temp / 180.0 * (2.5 - 0.5)) / 20.0 * 1000;    // 更新按钮控制的占空比
        set_steering_gear_angle(angle_temp);
    }
}

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

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

相关文章

【Linux语音控制 安卓设备刷短视频 orangePi zero2 H616 (已开源) 】.md uptada:23/11/07

文章目录 H616_实现Ubuntu语音控制安卓设备刷短视频小美效果展示H616 ubuntu系统 安装adb智能公元 SU-03T 离线语音模组 固件制作配合串口实现 小美_控制安卓刷抖音 H616_实现Ubuntu语音控制安卓设备刷短视频 注意&#xff1a;orangePi zero2 H616 安装系统为ubuntu 小美效果…

与创新者同行,Apache Doris in 2023

在刚刚过去的 Doris Summit Asia 2023 峰会上&#xff0c;Apache Doris PMC 成员、飞轮科技技术副总裁衣国垒带来了“与创新者同行”的主题演讲&#xff0c;回顾了 Apache Doris 在过去一年所取得的技术突破与社区发展&#xff0c;重新思考了在面对海量数据实时分析上的挑战与机…

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…

面试题:说一下线程、线程锁与线程池

文章目录 前言一、线程1.线程概念2.线程与进程的关系3.定义4.wait()和sleep()5.线程的状态及其他API 二、线程锁1. 普通锁机制2. Lock 三、线程同步工具类1. CountDowmLatch闭锁&#xff1a;2. CyclicBarrier栅栏&#xff1a;3. Exchanger交换机&#xff1a;4. 信号量 四、线程…

C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

su root失败 sudo su成功进入root

目录 0.场景 1.su root输入密码kali失败 2.对kali用户暂时提权 3.问题原因 0.场景 刚刚安装好kali&#xff0c;想使用su root切换进入root账户 1.su root输入密码kali失败 2.对kali用户暂时提权 只要你的用户在sudoers里面&#xff0c;就可以输入当前用户密码暂时变成root…

QT学习_14_一种开线程来实现串口通信方法

基于QT的上位机软件&#xff0c;和下位机一般都存在通信。 但如果是在主窗体类里面实现通信&#xff0c;往往会和主线程争抢CPU&#xff0c;导致通信非常容易出现异常。 最好的方式是给通信程序单独开一个线程来实现&#xff0c;而主窗体类&#xff08;主线程&#xff09;则主要…

全自动内衣洗衣机什么牌子好?好用又便宜的内衣洗衣机测评

在内衣洗衣机越来越受欢迎的今天&#xff0c;不少朋友都在犹豫要不要买一台内衣洗衣机&#xff0c;专门来清洗一些自身的贴身衣物&#xff0c;这个问题的答案是很有必要的&#xff0c;因为目前市场上的大型洗衣机只是起到了清洁的作用&#xff0c;并不能有效地清洁干净我们的贴…

云渲染3ds Max过程中,本地电脑可以断网或关机吗?

云渲染在近年来被越来越多的设计师所采用&#xff0c;因为它可以显著提高渲染速度&#xff0c;节省大量时间和精力。然而&#xff0c;一些用户不清楚云渲染的工作原理&#xff0c;也不知道在使用3ds Max、Maya等软件进行云渲染时&#xff0c;我们的本地电脑是否可以断网或关机。…

网络爬虫代理ip有什么好处?爬虫工作使用代理IP有哪些优势?

在爬虫工作中&#xff0c;使用代理IP有很多好处&#xff0c;可以帮助爬虫程序更加高效地完成任务。以下是使用代理IP的几个优势&#xff1a; 1. 增加匿名性 使用代理IP可以隐藏爬虫程序的真正IP地址&#xff0c;增加匿名性&#xff0c;避免被目标网站封禁。通过代理IP&#xff…

专门为Web应用程序提供安全保护的设备-WAF

互联网网站面临着多种威胁&#xff0c;包括网络钓鱼和人为的恶意攻击等。这些威胁可能会导致数据泄露、系统崩溃等严重后果。 因此&#xff0c;我们需要采取更多有效的措施来保护网站的安全。其中WAF&#xff08;Web application firewall&#xff0c;Web应用防火墙&#xff0…

边缘计算多角色智能计量插座:用电监测和资产管理的未来智能化引擎

目前主流的智能插座涵盖了红外遥控&#xff08;控制空调和电视等带有红外标准的电器&#xff09;&#xff0c;配备着测温、测湿等仓库应用场景&#xff0c;配备了人体红外或者毫米波雷达作为联动控制&#xff0c;但是大家有没有思考一个问题&#xff0c;就是随着对接的深入&…

CentOS7安装Xrdp以便Windows远程桌面连接

Centos7已经安装了桌面环境&#xff0c;想要Windows系统远程连接到桌面。 1&#xff0c;which vncserver 如果返回no vncserver,则需要安装 2&#xff0c;yum -y install tigervnc* 3&#xff0c;安装Xrdp yum install epel* -y yum --enablerepoepel -y install xrdp 4…

ruoyi-vue前端数据字典值引用与回显(列表中回显,多选框回显)

1. 列表中回显&#xff1a; 代码&#xff1a; <el-table v-if"refreshTable" v-loading"loading" :data"deptList" row-key"deptId" :default-expand-all"isExpandAll" :tree-props"{children: children, hasChil…

网络安全(黑客技术)-高效自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

【云备份|| 日志 day5】文件热点管理模块

云备份day5 热点管理模块 热点管理模块 服务器端的热点文件管理是对上传的非热点文件进行压缩存储&#xff0c;节省磁盘空间。 而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内&#xff0c;比如如果一个文件一天都没有被访问过我们就认为这是一个非…

c++ 信奥编程 1129:统计数字字符个数

#include<bits/stdc.h> using namespace std; int main() {string arr; //定义变量 arr getline(cin, arr); //通过函数输入并存储到变量中 int a 0; // 定义变量a&#xff0c;并赋初值0for(int i 0; i < arr.length(); i){ if(arr[i] < 57 && arr[i] &…

2023年【北京市安全员-A证】最新解析及北京市安全员-A证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年北京市安全员-A证最新解析为正在备考北京市安全员-A证操作证的学员准备的理论考试专题&#xff0c;每个月更新的北京市安全员-A证复审模拟考试祝您顺利通过北京市安全员-A证考试。 1、【多选题】《中华人民共和…

【C语法学习】20 - 文件访问顺序

文章目录 0 前言1 文件位置指示符2 rewind()2.1 函数原型2.2 参数2.3 返回值2.4 使用说明 3 ftell()函数3.1 函数原型3.2 参数3.3 返回值 4 fseek()4.1 函数原型4.2 参数4.3 返回值 5 示例5.1 示例15.2 示例2 0 前言 C语言文件访问分为顺序文件访问和随机文件访问。 1 文件位…

「Verilog学习笔记」使用子模块实现三输入数的大小比较

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 题目要求编写子模块实现两个输入数的大小比较并输出较小值&#xff0c;可以使用if-else语句实现。同时要求在主模块中实现三个输入数值的大小比较&#xff0c;假设三个…