当前位置:首页 » 操作系统 » 舵机控制算法

舵机控制算法

发布时间: 2022-06-19 16:16:01

① 辉盛MG995舵机的控制脉宽时间

舵机控制都是一样的。

基于单片机的舵机控制方法具有简单、精度高、成本低、体积小的特点,并可根据不同的舵机数量加以灵活应用。

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

图1 舵机的控制要求

舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。

单片机实现舵机转角控制
可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求。

也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。

单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。

当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。

② 摄像头组舵机PID算法的偏差ek要怎么求

不知道你的pid 表是控制什么的,我们用来控制蒸汽薄膜阀动作来控制温度的,而且一般表都有pid 自诊定,表自身能计算出适合的pid 值。我的经验是,p值最重要,一般p值越小,控制的动作反应越快,I 值和D 值只是帮助控制的效果更好。
和你说下在我们设备的一个经验值里,P=3,I=60,D=90,希望对你有所帮助。很多的控制也都是慢慢试验出来的pid 值。因为各种应用场合千差万别,不好根据公式计算出pid 值。
以下摘自网络:
PID控制方式的具体流程是计算误差和温度的变化速度进行PID计算,先以P参数和误差计算出基础输出量,在根据误差的累积值和I参数计算出修正量,最终找出控制点和温度设定点之间的平衡状态,最后在通过温度的变化速率与D参数控制温度的变化速度以防止温度的剧烈变化。进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。

③ 求教:舵机如何通过程序减速舵机的转速太快,如何通过程序给减速。

PWM就不用说了。我给你一段PID的代码:
#define AA_KPVALUE 150 #define AA_KIVALUE 100 #define AA_KDVALUE 30
typedef struct PID { sint an_Ref; //角度PID,角度设定值 sint an_FeedBack; //角度PID,角度反馈值 sint an_PreError; //角度PID,前一次,角度误差,,an_Ref - an_FeedBack sint an_PreDerror; //角度PID,前一次,角度误差之差,d_error-PreDerror; sint an_Kp; //角度PID,Ka = Kp sint an_Ki; //角度PID,Kb = Kp * ( T / Ti ) sint an_Kd; //角度PID, sint an_PreU; //舵机控制输出值}PID;

PID sPID;//申请一个PID类型的变量

void PIDInit(void)//PID初始化 { sPID.an_Ref = 0 ; sPID.an_FeedBack = 0 ; sPID.an_PreError = 0 ; sPID.an_PreDerror = 0 ; sPID.an_Kp = AA_KPVALUE; sPID.an_Ki = AA_KIVALUE; sPID.an_Kd = AA_KDVALUE; sPID.an_PreU = 0 ; }
unsigned int PIDCalc( PID *pp )//返回值赋给舵机 { sint error,d_error,dd_error; error = pp->an_Ref - pp->an_FeedBack; d_error = error - pp->an_PreError; dd_error = d_error - pp->an_PreDerror; pp->an_PreError = error; pp->an_PreDerror = d_error; pp->an_PreU +=pp->an_Kp*error+pp->an_Ki*d_error+pp->an_Kd*dd_error ; return ( pp->an_PreU ); }在主函数中初始化PID,将设定值与返回值设置好后,调用unsigned int PIDCalc( PID *pp )把返回值给舵机。
设定值就是你想要让舵机转的角度赋给sPID.an_Ref,返回值就是舵机现在的角度。因为是一个闭环控制系统,需要将角度量化以后的值返回,赋给sPID.an_FeedBack,这个算法会根据设定值与现在所处的角度计算出下一次所偏转的角度,这是一种增量式数字PID的算法。若想修改转的速度就修改宏定义中这三个参数的值,其中AA_KPVALUE影响最大。PID的东西很多,我也只是初窥门径。希望对你有所帮助

④ 如何用51单片机控制舵机的单片机程序是怎么写的希望你也能给我发一个编写程序和电路图

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。
发一个自己原来写的简单的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延时函数
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);

}
//定时器初始化
void Time0_init()
{
TMOD=0x01; //定时器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定时器0中断程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判断0.5ms次数是否小于角度标识
pwm=1; //是,pwm输出高电平
else
pwm=0; //否,输出低电平
count=count+1;
count=count%40; //次数始终保持为40,即保持周期为20ms
}
//按键扫描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按键按下则20ms周期重新开始计时
if(jd==6)
jd=5; //已经是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已经0度,保持
while(jian==0);
}
}
}
//数码管显示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
电路图很简单的,几个按键,再在单片机最小系统上接出一个信号线,再给舵机供上电就可以了。

⑤ 怎么让舵机停下来

以后程序记得写清楚点,规范化一点,还有,需要有必要的注释好不好,不然人家怎么知道你的d1是干嘛的?
这里我当做是你的笔误吧

// oji1();


前面的“//”应该没有的吧
你的意思应该是:
不断执行oji1();
同时不断检测按键之类的。
你想想,你进入了oji1();
当你按下d1后,它怎么能停下来呢,因为d1放在了oji1();的后面
而且你想要实现及时反应的话,你的算法本身就有问题。
想过另外一个算法吧。
要不就把问题补充详细点,我帮你想一个。

对了我这里有个自己以前做巡线小车的程序,拿去看看吧
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit infl1=P3^4; //inf代表红外对管,1为外,2为内。
sbit infl2=P3^5;
sbit infr2=P3^6;
sbit infr1=P3^7;
sbit pwm=P1^0; //信号线
uchar jd,count;
void time_init() //中断初始化
{
TMOD=0x01;
TH0=0xff; //高电平单位脉冲时间定为方式1,晶振频率为11.0592,0.1ms
TL0=0xa3;
IE=0x82;
TR0=1;
}
void time_ini()interrupt 1 //中断函数
{
TH0=0xff; //重新赋新值
TL0=0xa3;
if(count<jd)
pwm=1;
else pwm=0;
count++;
count=count%200; //脉冲周期20ms
}
void keyscan() //按键扫描
{
if(infr1==0)
{
jd=11;
count=0;
while(infr1==0);
}
if(infr2==0)
{
jd=13;
count=0;
while(infr2==0);
}
if(infl1==0)
{
jd=19;
count=0;
while(infl1==0);
}
if(infl2==0)
{
jd=17;
count=0;
while(infl2==0);
}
}
void main()
{
jd=15; //舵机初始角度为90度,自己定义为0度
count=0;
time_init();
while(1)
{
keyscan();
}
}

⑥ 怎么控制舵机手爪张合、抬升

舵机相对直流电机来讲,是一个精确位置控制的执行机构。通过脉冲的宽度来控制舵机的转动角度,从而控制机械手的开合与抬升。

有关舵机的具体介绍请到亿学通网站“资料下载”去下载:http://www.61mcu.com/?article-65.html 《Roboy机器人调试说明书》

该文件主要介绍了舵机控制,具体又分单个和多个舵机控制、调速算法、PWM指令、机器人动作解析等内容,让用户对人形机器人的控制方法有初步了解。

⑦ 如果控制舵机

利用单片机PWM信号进行舵机控制
[日期:2005-10-15] 来源:今日电子 作者:北京交通大学 时玮 [字体:大 中 小]

基于单片机的舵机控制方法具有简单、精度高、成本低、体积小的特点,并可根据不同的舵机数量加以灵活应用。

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

图1 舵机的控制要求

舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。

单片机实现舵机转角控制
可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求。

也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。

单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。

当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。

具体的设计过程:例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在2ms后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为18ms,再过18ms进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为2ms,等待下次中断到来,如此往复实现PWM信号输出到舵机。用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动。

为保证软件在定时中断里采集其他信号,并且使发生PWM信号的程序不影响中断程序的运行(如果这些程序所占用时间过长,有可能会发生中断程序还未结束,下次中断又到来的后果),所以需要将采集信号的函数放在长定时中断过程中执行,也就是说每经过两次中断执行一次这些程序,执行的周期还是20ms。软件流程如图2所示。

如图2 产生PWM信号的软件流程

如果系统中需要控制几个舵机的准确转动,可以用单片机和计数器进行脉冲计数产生PWM信号。

脉冲计数可以利用51单片机的内部计数器来实现,但是从软件系统的稳定性和程序结构的合理性看,宜使用外部的计数器,还可以提高CPU的工作效率。实验后从精度上考虑,对于FUTABA系列的接收机,当采用1MHz的外部晶振时,其控制电压幅值的变化为0.6mV,而且不会出现误差积累,可以满足控制舵机的要求。最后考虑数字系统的离散误差,经估算误差的范围在±0.3%内,所以采用单片机和8253、8254这样的计数器芯片的PWM信号产生电路是可靠的。图3是硬件连接图。

图3 PWA信号的计数和输出电路

基于8253产生PWM信号的程序主要包括三方面内容:一是定义8253寄存器的地址,二是控制字的写入,三是数据的写入。软件流程如图4所示,具体代码如下。
//关键程序及注释:
//定时器T0中断,向8253发送控制字和数据
void T0Int() interrupt 1
{
TH0 = 0xB1;
TL0 = 0xE0;
//20ms的时钟基准
//先写入控制字,再写入计数值
SERVO0 = 0x30; //选择计数器0,写入控制字
PWM0 = BUF0L; //先写低,后写高
PWM0 = BUF0H;
SERVO1 = 0x70; //选择计数器1,写入控制字
PWM1 = BUF1L;
PWM1 = BUF1H;
SERVO2 = 0xB0; //选择计数器2,写入控制字
PWM2 = BUF2L;
PWM2 = BUF2H;
}

图4 基于8253产生PWA信号的软件流程

当系统的主要工作任务就是控制多舵机的工作,并且使用的舵机工作周期均为20ms时,要求硬件产生的多路PWM波的周期也相同。使用51单片机的内部定时器产生脉冲计数,一般工作正脉冲宽度小于周期的1/8,这样可以在1个周期内分时启动各路PWM波的上升沿,再利用定时器中断T0确定各路PWM波的输出宽度,定时器中断T1控制20ms的基准时间。

第1次定时器中断T0按20ms的 1/8设置初值,并设置输出I/O口,第1次T0定时中断响应后,将当前输出I/O口对应的引脚输出置高电平,设置该路输出正脉冲宽度,并启动第2次定时器中断,输出I/O口指向下一个输出口。第2次定时器定时时间结束后,将当前输出引脚置低电平,设置此中断周期为20ms的1/8减去正脉冲的时间,此路PWM信号在该周期中输出完毕,往复输出。在每次循环的第16次(2×8=16)中断实行关定时中断T0的操作,最后就可以实现8路舵机控制信号的输出。

也可以采用外部计数器进行多路舵机的控制,但是因为常见的8253、8254芯片都只有3个计数器,所以当系统需要产生多路PWM信号时,使用上述方法可以减少电路,降低成本,也可以达到较高的精度。调试时注意到由于程序中脉冲宽度的调整是靠调整定时器的初值,中断程序也被分成了8个状态周期,并且需要严格的周期循环,而且运行其他中断程序代码的时间需要严格把握。

在实际应用中,采用51单片机简单方便地实现了舵机控制需要的PWM信号。对机器人舵机控制的测试表明,舵机控制系统工作稳定,PWM占空比 (0.5~2.5ms 的正脉冲宽度)和舵机的转角(-90°~90°)线性度较好。

参考文献
1 胡汉才.单片机原理及接口技术.清华大学出版社.1996
2 王时胜,姜建平.采用单片机实现PWM式D/A转换技术.电子质量.2004
3 刘歌群.卢京潮.闫建国.薛尧舜.用单片机产生7路舵机控制PWM波的方法.机械与电子.2004

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

⑧ 舵机PID控制的参数该如何确定

你好。
可以通过计算得到一个参考值然后调整.
但是车模的安装间隙太大,计算很难精确,所以仍然需要大量的参数调试.
经典的PID就是积分,微分,比例三个系数啊,看看自动控制的书,上面介绍很清楚的,也有算法的,至于系数怎么调,有计算的办法,包括车模的负载,电机的驱动力,摩擦等,但是太麻烦啦,试凑法也很快,只要你能根据现象来及时调整参数。

⑨ 数字舵机与模拟舵机有什么区别

数字舵机与模拟舵机有的区别:

1、在处理输入信号的方式不同:数字舵机是由主要由马达、减速齿轮、控制电路等组成,只需要发送一次PWM信号就能保持在规定的某个位置。

而模拟舵机是相同于传统的舵机,是需要多次发送PWM信号才能够保持在规定的位置上,实现对舵机的控制,按照规定的要求进行的速度进行转动。

2、在控制电路上不同:数字舵机的控制电路比模拟舵机多了微处理器和晶振;因此两者在控制电路的处理方式不同,同时数字舵机的性能方面上也不同于模拟舵机。

3、两者的反应速度不同:模拟舵机是需要一个短促的动力脉冲,紧接着很长时间的停顿,因此并不能够给马达过多的激励,来使其转动。

数字舵机是新型时代出现的舵机,因此数字在反应速度方面与模拟舵机相比是由优势的。因为数字舵机是拥有微处理器,所有数字舵机可以将动力脉冲发生到马达之前,对输入的信号进行的根据的设定参数进行处理。

⑩ 智能车 摄像头 舵机控制 怎么调用

传感器啊,就是摄像头采集道路信息,通过算法,得出来你的偏移量,我们之前是,先根据采集的道路信息辨识出赛道类型,s弯,大弯等,然后根本编码器测得的自身速度和自身便宜赛道的位置,给出一个小车方向和速度的期望值,貌似就是一个加速度,而不是说给了他多少,他就达到多少,就是给他一个加速度的量,比如速度加的快与慢,方向转的快慢,比如见到急弯了,自身速度还是很快,就得反转电机一小段时间,把速度迅速降下来,设为0,有惯性是降不下来速度的

热点内容
酷狗号密码忘了怎么办 发布:2024-11-07 18:03:13 浏览:87
mupdf编译 发布:2024-11-07 18:02:58 浏览:32
sql时间筛选 发布:2024-11-07 17:59:53 浏览:860
为什么开机密码老不对 发布:2024-11-07 17:49:41 浏览:228
java源码编译 发布:2024-11-07 17:34:59 浏览:916
安卓手机怎么把视频拖到电视上 发布:2024-11-07 17:33:35 浏览:55
oracle数据库开发实例 发布:2024-11-07 17:31:27 浏览:641
安卓申请内测用哪个app 发布:2024-11-07 17:14:23 浏览:493
苹果支付密码怎么改密码忘了怎么办啊 发布:2024-11-07 17:10:37 浏览:941
安卓手机伪装是什么都能看到吗 发布:2024-11-07 17:09:11 浏览:165