赞
踩
在进行智能车竞赛时,舵机的学习过程至关重要,以下是在这一过程中需要注意的几个关键步骤。
舵机主要由直流电机、变速齿轮组、电位器、控制板所构成,舵机的输出轴与电位器是同轴的,当舵机收到控制信号之后会驱动电机转动,从而带动齿轮组转动,齿轮组会带动输出轴和电位器转动,当输出轴转动到指定位置时电机停止转动。其中电位器的作用实际上是检测输出轴位置,
因此舵机内部是一个闭环调节的系统,这样才能保证舵机在来回转动的过程中不会出现累积误差。
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值,重复上面步骤,直到舵机没有打死,然后重新测定转向占空比的范围、舵机中值。
文章分为三个层次
速通版是希望通过简化的步骤搭建出寻迹小车,进而了解整个智能车是如何实现的,快速上手,为后续参与智能车竞赛做基础。
如果只是为了完成学校智能车初期培训,做出能简单循迹的小车,可以看这个速通版。
全程引导篇是讲了做出能够完赛的智能车的整个过程,大部分文章只是简单点拨一下,但是附上了相关的文章链接,方便根据自己的情况深入了解。
全程引导篇,能够带你比较系统地了解整个智能车的制作过程,推荐备赛初期或者有车模之后学习。
详细讲解篇是全程引导篇的补充,由于全程引导篇是引导性质,文章内容只是点拨,缺乏相应的原理或代码讲解,因此写详细讲解篇作为补充。
详细讲解篇会渗透在全程引导篇中。
智能车模块详解——数据存储与读写(eeprom/flash)
(更新中)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。