智能车入门——舵机

news2024/10/2 22:29:58

在进行智能车竞赛时,舵机的学习过程至关重要,以下是在这一过程中需要注意的几个关键步骤。


 

 


舵机概念与结构

舵机主要由直流电机、变速齿轮组、电位器、控制板所构成,舵机的输出轴与电位器是同轴的,当舵机收到控制信号之后会驱动电机转动,从而带动齿轮组转动,齿轮组会带动输出轴和电位器转动,当输出轴转动到指定位置时电机停止转动。其中电位器的作用实际上是检测输出轴位置,

因此舵机内部是一个闭环调节的系统,这样才能保证舵机在来回转动的过程中不会出现累积误差。

1.1 电机

舵机的核心是一个电机,通常是直流电机。这个电机负责驱动舵机的运动。

1.2 齿轮系统

舵机中通常包含齿轮系统,通过齿轮传动将电机的高速旋转转换为较低速度但更高扭矩的旋转,以提供更为精细的运动控制。

1.3 位置反馈装置

舵机内置位置反馈装置,例如电位器或编码器,用于实时监测舵机的当前位置。这个信息在控制中非常关键,确保舵机能够按照预期的位置运动。

1.4 控制电路

舵机还包括一个控制电路,用于接收外部信号并控制电机的运动,以达到设定的目标位置。

1.5 硬件连线

舵机通常有三根线,分别是电源线、地线和控制信号线。

电源线连接到电源,提供电机所需的电能。一般舵机的电源电压在4.8V到7.4V之间。

地线连接到系统的电地,确保电流回路完整。

控制信号线是通过PWM信号进行通信的线路,负责传递控制信息以确定舵机的位置。

 


 

舵机的工作原理

舵机的工作原理基于闭环反馈系统。当接收到控制信号后,内部的位置反馈装置会监测当前位置,与控制信号中设定的目标位置进行比较。电机会根据比较结果进行调整,以实现准确的位置控制。控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。


 

舵机的控制原理

舵机的控制原理涉及到控制信号的脉冲宽度。

舵机分为数字舵机与模拟舵机,数字舵机的信号频率为50-300赫兹都可以正常使用,模拟舵机的信号频率为50赫兹,一般数字和模拟舵机的信号高电平时间范围都是0.5毫秒至2.5毫秒。

0.5毫秒舵机转动至0度,2.5毫秒舵机转动至180度。

通过单片机输出PWM信号,然后改变PWM信号的高电平时间就可以控制舵机转动到指定的位置了。

通常,舵机接收的PWM信号周期为20毫秒,脉冲宽度在0.5毫秒到2.5毫秒之间,其中1.5毫秒位置通常是舵机的中性位置。通过调整脉冲宽度,可以控制舵机的转动角度。

 舵机的控制与PWM信号的脉冲宽度存在直接关系。PWM脉冲的占空比直接决定了输出轴的位置不同的脉冲宽度对应不同的角度,例如最小脉冲宽度对应舵机的最左位置,最大脉冲宽度对应最右位置。这种映射关系允许通过微调PWM信号来实现对舵机位置的精准控制。

简单来说:PWM信号通过信号线控制舵机的输出量;

 舵机的转角与脉冲宽度之间存在一种映射关系,通常是线性关系。这个关系可以通过舵机的技术规格表来确定,不同型号的舵机可能有略微不同的映射关系。


 

舵机中值获取(装车前)

pwm_init(S_MOTOR_PIN,50,duty);

我们设定舵机频率为50HZ,PWM最大占空比PWM_DUTY_MAX为10000;

那么可求,舵机周期=1s/50hz=20ms。

由上文可知,周期20ms时,脉冲宽度在1.5ms时处于中值,

此时

duty_mid = 1.5*10000/20=750;

同理可求

duty_min = 0.5*10000/20=250;

duty_max = 2.5*10000/20=1250;

舵机中值为750  舵机最小值为250   最大值为1250  ,

这里的最大值、最小值指的是舵机器件的,当舵机安装到车模上后,由于因为机械限位,导致可活动范围小很多,因此用于转向的dutymax、dutymin  需要重新测量。


#include "headfile.h"  

#define S_MOTOR_PIN   PWM4_MODULE2_CHA_C30       //定义舵机引脚   

uint16 duty;  

int main(void)  

{  

    DisableGlobalIRQ();  

    board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口  

      

    systick_delay_ms(100);  //延时100ms,等待主板其他外设上电成功  

      

    //舵机居中   1.5ms/20ms * PWM_DUTY_MAX(PWM_DUTY_MAX是PWM的满占空比时候的值) PWM_DUTY_MAX在fsl_pwm.h文件中  

    duty = 1.5*10000/20;  
      
    pwm_init(S_MOTOR_PIN,50,duty);  

    //特别提示这里的舵机居中是在没有安装在车模上的时候,才能使用这个居中方式。  

    //如果舵机已经安装在车模上,切勿使用本程序,因为舵机由于机械限位,导致可活动范围小很多。  

     

    EnableGlobalIRQ(0);  
  

    while(1)  

    {  

        pwm_duty(S_MOTOR_PIN,750);  


    }  

}  

 

此时程序将舵机占空比设置为750,然后下载,上电,使舵机转到中值,然后安装舵机,扣上圆盘即可。

 


舵机中值矫正(装车后)

 通过上文获得的舵机中值可能因为车模机械结构的原因,并不能使前轮完美对称,因此需要微调。

效果就是最简单地就是推一下车,车能笔直地前进。

这里可以用肉眼看,小车运动没有偏移,

个人喜欢看陀螺仪的值,如果车走的直,那么偏航角就应该是0

	ips114_showstr(0,4,(const char*)("gyroz:"));
	ips114_showstr(0,5,(const char*)("Angle:"));
	ips114_showint16(80,4,treat_gyro_z);
	ips114_showfloat(80,5,ICMIntegrate.TurnAngle_I,3,2);
	if(KeyCenter==onepress){KeyCenter=nopress;ParamsAdjustShort(&ServoAdd,120,2,1);}
	ips114_showint16(80,0,ServoOut);	

矫正方法很简单粗暴,就是一点点地更改duty的值,直到符合效果。

这里推荐结合按键调参模块,节省反反复复改参、下载的步骤。

智能车模块详解——按键及按键调参

uint16 duty;  

int main(void)  

{  

    DisableGlobalIRQ();  

    board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口  


    duty = 750;  
      
    pwm_init(S_MOTOR_PIN,50,duty);  

    EnableGlobalIRQ(0);    

    while(1)  

    {  

        pwm_duty(S_MOTOR_PIN,duty);  

    }  

}  

 舵机中值获取(装车后补救)

 如果没有使舵机打到中值,就已经装好车了,那么应该怎么办?

最好的方法就是,拆了舵机圆盘,按照上面的步骤重新操作。

如果不想的话,可以按照下面的方法操作。

首先拔掉板子上的舵机信号线,然后下载上面的代码,设置占空比在一个合理的范围。

然后使用试触法,在接上舵机信号线时,如果舵机打死,立刻拔掉线,再调整duty值,重复上面步骤,直到舵机没有打死,然后重新测定转向占空比的范围、舵机中值。

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

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

相关文章

Uptime Kuma 企业微信群机器人告警

curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa \-H Content-Type: application/json \-d {"msgtype": "text","text": {"content": "hello world"}}企业微信群机器人ke…

装饰器设计模式是什么?什么是 Decorator 装饰器设计模式?Python 装饰器设计模式示例代码

什么是 Decorator 装饰器设计模式? 装饰器模式是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时不改变其结构。这种模式实现了对对象的包装,称为装饰器,并且可以在运行时动态地添加、修改或删除对象的行为…

PyTorch深度学习实战——人体姿态估计

PyTorch深度学习实战——人体姿态估计 0. 前言1. 人体姿态估计2. 使用 Detectron2 实现人体姿态估计相关链接 0. 前言 我们已经学习了如何执行实例分割,在本节中,我们将了解如何利用 Detectron2 对图像执行人体姿态估计,检测图像中人物的身体…

2023亚太杯数学建模A题思路 - 采果机器人的图像识别技术

# 1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国,年产量约为3500万吨。与此同时,中国也是世 界上最大的苹果出口国,全球每两个苹果中就有一个,全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…

【开源】基于Vue.js的民宿预定管理系统

项目编号: S 058 ,文末获取源码。 \color{red}{项目编号:S058,文末获取源码。} 项目编号:S058,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色…

SpringBoot整合RabbitMQ中交换机的使用(完成消息的发送和接收案例)

系列文章目录 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. List<HashMap<String,String>>实现自定义字符串排序(key排序、Val…

雷电模拟器打开指针位置无效果解决方法(开发者模式)

预期效果 1.打开文件所在位置 2.进入vms目录 3.新建一个名为debug的txt格式的文件 4.打开开发者模式里面指针位置的选项 5.重启模拟器 6.噔噔噔噔~

教你如何将Web项目部署到Linux中

文章目录 前言0. 什么是部署1. 调整代码达成一致2. 数据库建表3. 构建项目并打包4. 拷贝到 Tomcat 中5. 效果总结 前言 在我们完成了一个Web项目后, 我们该怎样将项目部署到 Linux 系统中呢? 本文就来简单讲解一下. 文章已部署本人的博客系统代码展开讲解. 关注收藏, 开始学…

【数据库】数据库中的备份与恢复,保障容灾时的数据一致性与完整性

数据库的备份机制 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期…

postman定义公共函数这样写,测试组长直呼牛逼!!!

postman定义公共函数 在postman中,如下面的代码: 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}:实际结果: ${actual} , 期望结果:${expected}]actualexpected…

YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:卫星遥感目标检测数据集说明:卫星遥感多类别检测数据集,真实场景的高质量图片数据,数据场景丰富,含网球场、棒球场、篮球场、田径场、储罐、车辆、桥、飞机、船等类别标签说明:使用lableimg标…

Mysql中自增主键是如何工作的

自增主键的特点是当表中每新增一条记录时,主键值会根据自增步长自动叠加,通常会将自增步长设置1,也就是说自增主键值是连续的。那么MySQL自增主键值一定会连续吗?今天这篇文章就来说说这个问题,看看什么情况下自增主键…

灵活运用Vue 3中的setup函数—深入解析Composition API

新建项目,项目主入口为App.vue(主组件),新建child.vue(子组件)。 1.1 setup 执行 时机问题 1.在主组件里引入子组件和ref: import {ref} from vue import child from ./components/child.vue2…

数据科学导论——数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

【20年扬大真题】试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)

【20年扬大真题】 试写一算法在带头结点的单链表结构上实现线性表操作LENGTH&#xff08;L&#xff09;。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #include<malloc.h> //单链表定义 //链表结点 int A[10] { 1,2,3,4,5,6,…

Java生成一个区域内的经纬度随机点的方式

准备&#xff1a; 1、四个角点&#xff08;四个点确定一个框&#xff09; 2、想要细分程度 &#xff08;这里说的是经纬度&#xff0c;这里没有对经纬度做更细的区分&#xff09; 如&#xff1a;0.000001约等于0.1m&#xff0c;0.00001约等于1m&#xff0c;0.0001约等于10m 。。…

小黑子—Maven高级

Maven高级篇 二 小黑子的Maven高级篇学习1. 分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 抽取domain层1.2.2 抽取dao层 2. 依赖管理2.1 依赖传递2.2 可选依赖2.3 排除依赖 3. 继承与聚合3.1 聚合3.2 继承3.3 总结 4. 属性4.1 配置文件加载属性4.2 版本管理 5. 多环境…

浅谈JDK动态代理(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 到目前为止&#xff0c…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

梦开始的地方——Adobe Premiere Pro

今天&#xff0c;我们来说说一款老生常谈的相信也是很多人都经常迫切需要的软件。Adobe Premiere Pro&#xff0c;简称Pr&#xff0c;是由Adobe公司开发的一款视频编辑软件。 Premiere Pro是视频编辑爱好者和专业人士必不可少的视频编辑工具。它可以提升您的创作能力和创作自由…