舵机pid控制中给很小的脉冲不动怎么解决

舵机pid控制中给很小的脉冲不动怎么解决,第1张

可以通过计算得到一个参考值然后调整

但是车模的安装间隙太大,计算很难精确,所以仍然需要大量的参数调试

经典的PID就是积分,微分,比例三个系数啊,看看自动控制的书,上面介绍很清楚的,也有算法的,至于系数怎么调,有计算的办法,包括车模的负载,电机的驱动力,摩擦等,但是太麻烦啦,试凑法也很快,只要你能根据现象来及时调整参数。

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为15ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。编程的时候也很简单,你将一根管脚初始化为低电平,然后写一个while循环,在循环中将该脚职位高电平,延时,再拉为低电平,如此不停的循环就是PWM波,你需要控制的是高电平产生的时间,根据高电平的时间来控制舵机的角度的,希望能帮的上你

PID是自动控制理论里的一种控制方法,PID的意思分别代表了比例、积分和微分。具体是什么意思呢?解释如下:

首先,我们有一个状态量,这个状态量在整个过程中,我们希望通过输入一个控制量,使这个状态量发生变化,并尽量的接近目标量。比如,在航线控制中,状态量是飞机当前的飞行航向,目标量是飞机为到达目标点而应该飞行的目标航向,控制量则是我们对其进行控制的方向舵面,或横滚角度。我们通过调整方向舵面、横滚角度来控制飞机的当前飞行航向,使之尽量接近为压航线而应该飞行的目标航向。

那么我们如何给出这个控制量,比如给哪个方向的、多大的方向舵量呢?最简单的考虑,是按照当前航向与目标航向的偏差大小来决定给多大的方向舵量:方向舵量p = P (目标航向 – 当前航向)。这个方向舵量p,就是PID控制里的P部分,即比例部分。

那么,是不是只要有了P,我们的控制就完成了呢?实际上有了P,在大多数情况下,我们可以控制飞机朝目标量去接近,但可能会出现一些情况,比如,当飞机的安装有偏差(我们称之为系统误差),导致我们输出一个左5方向舵给舵机的时候,飞机才能直飞;当不给方向舵,即方向舵放在中位时,飞机会右偏。我们想象一下这个时候如果只有P项控制会有什么后果:假设初始状态是飞机飞行航向和目标航向一致,按P输出飞机方向舵应该在中位。而这时候,由于系统安装误差的存在,会导致飞机偏右,于是偏离了目标航向,然后P项控制会输出一个左舵,来修正航向偏差,刚开始的时候由于偏差量很小,输出的这个左舵也很小,于是飞机继续右偏,然后导致这个左舵加大,最终到达5,使飞机直飞,但这时候的飞行航向与目标航向始终存在一个偏差,这就是P的局限,无法修正系统误差。于是I项积分控制就出场了。

I项的输出这样定义:方向舵量i = I (偏差和)。偏差和是当前航向和目标航向的偏差,每计算一次累加一次,一直累加到上次的值,再加上这次计算时当前航向和目标航向的偏差。即这个偏差和是跟以前的累积误差有关的。同样是上面的例子,I项的效果就这样体现:当飞机飞行航向与目标航向始终存在偏差时,I项将这个值累加上,比如说是5度吧,于是在P项之上,再叠加一个I5的修正量,增加了一个左舵,比如说是2,然后导致飞机的飞行航向与目标航向的偏差会小一些。也许这一次计算输出的控制量并没有完全消除误差,但下一次再计算时,如果还有误差,于是会继续再增加输出控制量,使误差再小,于是经过多次计算后,使I项始终输出一个左5的舵量,使误差归零。这就是I项的作用,消除系统误差。

D项的意思是微分。为了便于解释,我们假设不存在系统误差,I项为0。比如当目标航向为0度,当前航向为30度时,根据P项作用,会输出一个左舵,假设为左15吧,使飞机向左转向,于是当前航向逐渐减小,比如减小到20度的时候,P项输出的左舵也会减小到左10。那么,当飞机转到0度时,跟目标航向一致时,P项输出方向舵回到中立位,飞机是否就保持0度直飞了呢?XX是否定的。由于飞机的惯性,飞机在左转弯时产生了一个左转弯的速率,导致飞机航向回到目标航向无偏差且方向舵回中后,仍然还会继续左转,然后产生负的偏差,P项再输出右方向舵,然后再回中。如果P项合适,我们看到的就是一个逐渐收敛于目标航向的飞行航向,即先左过头,然后右过头,再左过头,再右过头……最后过头量越来越小,最终到达目标航向。而D项的作用,就是尽量消除这个过头量,使之尽快贴近目标航向。

D项的定义是:方向舵d = D (当前状态量 – 上一次的状态量)。在这个例子中,当飞机在从30度的航向,左转弯到0度目标航向的过程中,D项的输出实际上是转弯角速率的比例值,并且方向与P项相反,这样当飞机比较接近0度目标航向时,由于P值已经很小了,而这时候如果转弯速率不小,D项就输出一个右方向舵,抵消过快的转弯速率,阻止飞机航向到达目标航向后继续冲过头。

最后,方向舵量 = 方向舵量p + 方向舵量i + 方向舵量d,为完整的输出。根据飞行的表现,通过对P、I、D系数的调整,最终使输出的控制量能够尽快的控制状态量贴近目标量,并消除系统误差,避免过度震荡。

在完整的固定翼飞控系统中,除了航向通道需要PID控制外,其余需要控制的通道还有:副翼舵->目标横滚角、升降舵->目标俯仰角、目标俯仰角->高度差、油门舵->空速、目标航向->偏航距。

//12MHz

#include <reg51h>

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x0B1;

TL0 = 0x0E0;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期

//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void main(void)

{

InitTimer0();

P1_2=0;

while(1);

}

void Timer0Interrupt(void) interrupt 1

{

//20ms中断

TH0 = 0x0B1;

TL0 = 0x0E0;

P1_2=1;

delay();

P1_2=0;

}

吴鉴鹰单片机实战精讲中有相关问题的解释。

在单片机开发过程中,从硬件设计到软件设计几乎是开发者针对本系统特点亲自完成的。这样虽然可以降低系统成本,提高系统的适应性,但是每个系统的调试占去了总开发时间的2/3,可见调试的工作量比较大。单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。但通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试是基础,如果硬件调试不通过,软件设计则是无从做起。本文结合作者在单片机开发过程中体会,讨论硬件调试的技巧。

当硬件设计从布线到焊接安装完成之后,就开始进入硬件调试阶段,调试大体分为以下几步。

1 硬件静态的调试

11排除逻辑故障

这类故障往往由于设计和加工制板过程中工艺性错误所造成的。主要包括错线、开路、短路。排除的方法是首先将加工的印制板认真对照原理图,看两者是否一致。应特别注意电源系统检查,以防止电源短路和极性错误,并重点检查系统总线(地址总线、数据总线和控制总线)是否存在相互之间短路或与其它信号线路短路。必要时利用数字万用表的短路测试功能,可以缩短排错时间。

12排除元器件失效

造成这类错误的原因有两个:一个是元器件买来时就已坏了;另一个是由于安装错误,造成器件烧坏。可以采取检查元器件与设计要求的型号、规格和安装是否一致。在保证安装无误后,用替换方法排除错误。

13排除电源故障

在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。加电后检查各插件上引脚的电位,一般先检查VCC与GND之间电位,若在5V~48V之间属正常。若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。

2 联机仿真调试

联机仿真必须借助仿真开发装置、示波器、万用表等工具。这些工具是单片机开发的最基本工具。

信号线是联络8031和外部器件的纽带,如果信号线连结错误或时序不对,那么都会造成对外围电路读写错误。51系列单片机的信号线大体分为读、写信号线、片选信号线、时钟信号线、外部程序存贮器读选通信号(PSEN)、地址锁存信号(ALE)、复位信号等几大类。这些信号大多属于脉冲信号,对于脉冲信号借助示波器(这里指通用示波器)用常规方法很难观测到,必须采取一定措施才能观测到。应该利用软件编程的方法来实现。例如对片选信号,运行下面的小程序就可以检测出译码片选信号是否正常。

MAIN:MOVDPTR,#DPTR

;将地址送入DPTR

MOVXA,@DPTR

;将译码地址外RAM中的内容送入ACC

NOP;适当延时

SJMPMAIN;循环

执行程序后,就可以利用示波器观察芯片的片选信号引出脚(用示波器扫描时间为1μs/每格档),这时应看到周期为数微秒的负脉冲波形,若看不到则说明译码信号有错误。

对于电平类信号,观测起来就比较容易。例如对复位信号观测就可以直接利用示波器,当按下复位键时,可以看到8031的复位引脚将变为高电平;一旦松开,电平将变低。

总而言之,对于脉冲触发类的信号我们要用软件来配合,并要把程序编为死循环,再利用示波器观察;对于电平类触发信号,可以直接用示波器观察。

下面结合在自动配料控制系统中键盘、显示部分的调试过程来加以说明。本系统中的键盘、显示部分都是由并行口芯片8155扩展而成的。8155属于可编程器件,因而很难划分硬件和软件,往往在调试中即使电路安装正确没有一定的指令去指挥它工作,也是无法发现硬件的故障。因此要使用一些简单的调试程序来确定硬件的组装是否正确、功能是否完整。在本系统中采取了先对显示器调试,再对键盘调试。

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。

发一个自己原来写的简单的。

#include<reg52h>

#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; //110592MHZ晶振,05ms

TR0=1;

}

//定时器0中断程序

void Time0() interrupt 1

{

TH0=0xfe;

TL0=0x33;

if(count<jd) //判断05ms次数是否小于角度标识

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 bai ,shi,ge ;

switch(jd)

{

case 1:

bai=0;

shi=0;

ge=0;

break;

case 2:

bai=0;

shi=4;

ge=5;

break;

case 3:

bai=0;

shi=9;

ge=0;

break;

case 4:

bai=1;

shi=3;

ge=5;

break;

case 5:

bai=1;

shi=8;

ge=0;

break;

}

P0=table[bai];

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();

}

}

电路图很简单的,几个按键,再在单片机最小系统上接出一个信号线,再给舵机供上电就可以了。

首先增量式PID是位置式PID的演化。它们的主要区别在于:

1:增量式PID的计算量相对较小,因为是计算的是增量,所以对执行部件的扰动较小,一般采用带死区的控制。对于智能车的舵机控制增量式PD是不错的选择,为什么不用积分I呢?不仅仅是因为积分滞后特性,更重要的是因为根据对转向机构进行建模,得出的模型中就已经含有积分环节,所以转向舵机建议采用PD。

2:位置式PID计算量比增量式PID稍微多一点。一般用于直流电机的控制,对于智能车的驱动电机控制是一个不错的经典控制算法。

希望对你有所帮助。

以上就是关于舵机pid控制中给很小的脉冲不动怎么解决全部的内容,包括:舵机pid控制中给很小的脉冲不动怎么解决、如何用51单片机控制舵机的怎样编写程序啊大哥帮帮忙、PID算法的参数怎么确定等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9751555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存