搜索
bottom↓
回复: 68

关于PID控制电机转速的问题!

[复制链接]

出0入0汤圆

发表于 2009-5-9 20:26:41 | 显示全部楼层 |阅读模式
我是刚接触PID的新手,看了很多PID的理论知识,有一点不明白。我是用位置式PID对电机进行调速。那个PID控制器的输入量和输出控制量是什么对应关系了?或者换句话说就是输入量是什么,输出控制量是什么.。输入量是速度的偏差,假如我设定转速时5m/s,实际转速是4m/s,那么偏差就是1m/s ,把这个偏差当做输入量送到PID控制器并进过计算的输出控制量与PWM如何对应,那个输出我怎么处理,难道直接就送给电机?PID运算出的控制量需经过映射到实际控制量从而实现对系统的调节,速度的偏差如何映射成PWM?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入296汤圆

发表于 2009-5-9 21:17:23 | 显示全部楼层
PID控制是一个讲求实践的学科,如果你刚刚开始学习PID,大可以在浏览了书本知识后,
暂时将这些内容忘在脑后,从一个最基本的原则开始,慢慢发现问题,思考问题,解决
问题,并总结和体会,最终你会从实践中真正学到什么是PID。

PID入门原则很简单:
假设你的支流电机上安装了一个带AB相的旋转编码器,并且你已经能够正确独取当前的
相对脉冲信号。那么尝试这么做:
1、先尝试将电机固定在某一个位置,即如果当前脉冲数大于一个目标脉冲数,就全速
   反转,如果脉冲数小于这个目标脉冲数,就全速正转动;
2、以定长时间为单位,给目标脉冲数一个恒定增量,比如,每秒钟增加10个脉冲;观察
   现象并体会;
3、尝试解决大幅度震东问题,先从简单的比例调节开始;
4、尝试以“打提前量”的思维方式,减小振动幅度;
5、在震荡收敛的前提下,尝试加入积分环节解决静差问题;并注意以上三个环节加入时
   公式的符号。
6、用心体会,PID调节理论在多,关键是你自己体会到没有……对电机就要像自己身体的
   一个部分一样,根据声音,发热程度,现象就能知道调节哪个参数。学习的过程中,要
   大胆尝试,也要做好烧毁驱动电路的觉悟……我烧的MOS管都是论脸盆往外扔的……

出0入0汤圆

 楼主| 发表于 2009-5-9 21:52:07 | 显示全部楼层
谢谢你,傻孩子学长~~~我有点理解了,我明天就照你说的来慢慢学习~

出0入0汤圆

发表于 2009-5-9 22:22:27 | 显示全部楼层
学习了,我也在问同样的问题.

出0入0汤圆

发表于 2009-5-9 22:28:53 | 显示全部楼层
我也碰到这个问题,可控硅调压,检测的输出电压,PID计算结果要对应定时时间.

出0入0汤圆

 楼主| 发表于 2009-5-10 17:54:28 | 显示全部楼层
傻孩子学长,我照你说的第一步,我在外部中断对脉冲计数。
g_iPulesNumALl是存放编码器的脉冲数
*P_IOB_GPIO_SETUP = 0x00000004是正转
while(1)
{
   if(g_iPulesNumAll>10000)
         *P_IOB_GPIO_SETUP = 0x00000002; //电机反转
}
电机反转一会,驱动电路就烧了,每次必烧。是不是给电机反转次数太多了,那么我上面那个if判断语句应该怎么改了?

出0入296汤圆

发表于 2009-5-10 19:05:09 | 显示全部楼层
如果你的电路如此脆弱,建议先改进驱动……否则你无法实现闭环驱动的……

出0入0汤圆

发表于 2009-5-10 20:09:53 | 显示全部楼层
请教Gorgon Meducer 傻孩子,我这几天搞可控硅调压真是找不到方向了,我是用于可控硅移相调压,就是过零后延时时间调整导通角,从而调压.在可控硅输出检测电压作为PID的输入量,PID部分程序我参照了本网站的程序,采用的浮点数,我运行了大概62个us,我就不理解,PID的输出量怎么和那个延时时间对应起来.谢谢!!

PID部分程序:

double      rOut;                   //  PID Response (Output)   
double      rIn;                    //  PID Feedback (Input)  


typedef struct PID {   

        double  SetPoint;           //  设定目标 Desired Value   

        double  Proportion;         //  比例常数 Proportional Const   
        double  Integral;           //  积分常数 Integral Const   
        double  Derivative;         //  微分常数 Derivative Const   

        double  LastError;          //  Error[-1]   
        double  PrevError;          //  Error[-2]   
        double  SumError;           //  Sums of Errors   

} PID;   


double PIDCalc( PID *pp, double NextPoint )//这里是位置式算法   
{   
    double  dError,   
            Error;   

        Error = pp->SetPoint -  NextPoint;          // 偏差,   偏差=设定值-返回值
        pp->SumError += Error;                      // 积分项, 偏差和   
        dError = pp->LastError - pp->PrevError;     // 微分项  上一次误差-上上一次误差   
        pp->PrevError = pp->LastError;   
        pp->LastError = Error;   
        return (pp->Proportion * Error              // 比例项   
            +   pp->Integral * pp->SumError         // 积分项   
            +   pp->Derivative * dError             // 微分项   
        );   
}   



void PIDInit (PID *pp)   
{   
    memset ( pp,0,sizeof(PID));   
}   


主程序对PID初始化:
    PID         sPID;                 //  PID Control Structure   
      

    PIDInit ( &sPID );                //  Initialize Structure   
    sPID.Proportion = 2;              //  Set PID Coefficients   
    sPID.Integral   = 1;   
    sPID.Derivative = 1;   
    sPID.SetPoint   = 200.0;           //  Set PID Setpoint  

在过零脉冲来时做PID运算:
rIn=celiangzhi;
rOut = PIDCalc (&sPID,rIn);   //  Perform PID Interation
dingshishijian=rOut;  
celiangzhi是测量的电压;dingshishijian是定时器新的延时时间

整个程序:
#define wsfw_c


#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/delay.h>
#include <math.h>
#include <string.h>
#include <stdint.h>

#define BIT(x)        (1<<(x))           
#define NOP()        asm("nop")
#define uint unsigned int
#define uchar unsigned char


#define N 7
#define Nw 7




volatile uchar count;

volatile unsigned long avragew;
volatile uint value_bufw[Nw];  
volatile uchar countw,kw,jw;
volatile uint tempw;  

volatile uint zhongjiandianya;
volatile uchar shedingdianya;
volatile uchar celiangzhi;
volatile uchar  i;  
volatile uchar  dt;  
volatile uint   AD_RESULT;  
volatile uchar dingshia;
volatile uchar dingshib;
volatile uint dingshishijian;
volatile uchar yanshi1;
volatile uint dingshifa;
volatile uint zhengzhongduan;
volatile uint fuzhongduan;

double      rOut;                   //  PID Response (Output)   
double      rIn;                    //  PID Feedback (Input)  


typedef struct PID {   

        double  SetPoint;           //  设定目标 Desired Value   

        double  Proportion;         //  比例常数 Proportional Const   
        double  Integral;           //  积分常数 Integral Const   
        double  Derivative;         //  微分常数 Derivative Const   

        double  LastError;          //  Error[-1]   
        double  PrevError;          //  Error[-2]   
        double  SumError;           //  Sums of Errors   

} PID;   


void delay( )
{
NOP();NOP();NOP();NOP();NOP();NOP();NOP();
   
}


void ADS8320_READ( )
{
celiangzhi=celiangzhi;
           
                }


double PIDCalc( PID *pp, double NextPoint )//这里是位置式算法   
{   
    double  dError,   
            Error;   

        Error = pp->SetPoint -  NextPoint;          // 偏差,   偏差=设定值-返回值
        pp->SumError += Error;                      // 积分项, 偏差和   
        dError = pp->LastError - pp->PrevError;     // 微分项  上一次误差-上上一次误差   
        pp->PrevError = pp->LastError;   
        pp->LastError = Error;   
        return (pp->Proportion * Error              // 比例项   
            +   pp->Integral * pp->SumError         // 积分项   
            +   pp->Derivative * dError             // 微分项   
        );   
}   



void PIDInit (PID *pp)   
{   
    memset ( pp,0,sizeof(PID));   
}   





int main(void)
{


    DDRA  = 0xFF;
    DDRE  = 0xFF;PORTE=0x00;
    DDRD=0x00;  PORTD=0x00;
        DDRC=0xff;        PORTC=0x00;//0xe7;
    DDRF=0xff;        //PORTF=0xff;
        DDRG=0xff;
        PORTG|=(1<<PG3);
        //PORTG&=~(1<<PG3);


        /*******串口1采集数据********/
        UCSR1B = 0x00;
        UCSR1A = 0x00;
        UCSR1C = 0x06;
        UBRR1L = 0x33;
        UBRR1H = 0x00;
        UCSR1B = 0x98;
    /*******串口1采集数据*********/

        EICRA=0x0f;//0x0a;//0x0f;
        EICRB=0x00;
        EIMSK=0x03;
                              
   
   
        MCUCR  = 0x00;
        MCUCSR = 0x80;//禁止JTAG


    PID         sPID;                 //  PID Control Structure   
      

    PIDInit ( &sPID );                //  Initialize Structure   
    sPID.Proportion = 2;              //  Set PID Coefficients   
    sPID.Integral   = 1;   
    sPID.Derivative = 1;   
    sPID.SetPoint   = 200.0;           //  Set PID Setpoint   


         sei();//开全局中断
     wdt_enable(WDTO_2S);
while(1)
{
wdt_reset();           //喂狗  
++dingshifa;
ADS8320_READ( );

}
              

}





SIGNAL(SIG_OVERFLOW1)
{

TCCR1B=0x00;
TIMSK=0x00;
TCNT1H = 0x00;  
TCNT1L = 0x00;//初始值
PORTG&=~(1<<PG3);//可控硅导通

asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");


PORTG|=(1<<PG3);//可控硅不导通

}


SIGNAL(SIG_INTERRUPT0)
{
  PID         sPID;                   //  PID Control Structure   
//EIFR=EIFR|0x01;
++zhengzhongduan;

rIn=celiangzhi;
rOut = PIDCalc (&sPID,rIn);   //  Perform PID Interation
dingshishijian=rOut;   



TCNT1H = (dingshishijian-1)/256;  
TCNT1L = (dingshishijian-1)%256;//初始值  




TCCR1A=0x00;
TCCR1B=0x02;
//TCCR1C=0x80;

TIMSK=0x04;



}

SIGNAL(SIG_INTERRUPT1)
{

  PID         sPID;                   //  PID Control Structure   
//EIFR=EIFR|0x02;
++fuzhongduan;

rIn=celiangzhi;
rOut = PIDCalc (&sPID,rIn);   //  Perform PID Interation
dingshishijian=rOut;   



TCNT1H = (dingshishijian-1)/256;  
TCNT1L = (dingshishijian-1)%256;//初始值  


TCCR1A=0x00;
TCCR1B=0x02;

TIMSK=0x04;

}

我将定时时间做到了1个us,半波10ms,最大10*1000us.过零信号是10ms来一次.我的程序是10ms做一次PID运算.

出0入296汤圆

发表于 2009-5-10 21:46:32 | 显示全部楼层
我习惯使用的PID调节算法和你上面提供的思路不同……

出0入0汤圆

 楼主| 发表于 2009-5-11 16:00:29 | 显示全部楼层
傻孩子学长是不是把PID控制器的输出量当成一个恒量送到设定的目标脉冲数去?

出0入296汤圆

发表于 2009-5-11 16:33:22 | 显示全部楼层
不是……

出0入0汤圆

 楼主| 发表于 2009-5-12 19:34:17 | 显示全部楼层
那么PID控制器的输出量是送到什么地方去的?学长能给段代码参考下吗?

出0入296汤圆

发表于 2009-5-12 20:17:10 | 显示全部楼层
代码在我另外一个帖子里面都给出来了。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page_no=1&bbs_id=1005

这个代码只用了简单地P调解,但是基本构架已经很明确了,很容易修改为完整的PID系统。

出0入0汤圆

 楼主| 发表于 2009-5-13 18:41:13 | 显示全部楼层
傻孩子学长,不知道我的理解对不对。
     控制器的输入量是脉冲个数的偏差,那么经过PID控制器的计算得到的输出量当做是当前PWM占空比的改变量。
      打个比方,比如说输入电压r(t)为0-5V,对应的输出转速信号y(t)的范围为0-5000r/min,那么PID控制器中的比例项是不是输入电压r(t)和转速y(t)之间的比例关系的系数k=1/1000。。。。
     或者是这个比列系数K和PID控制器中的比列项没有关系,必须先将转速转换为电压,再把电压当做输入量送入到PID控制器进行计算得到控制量,也就是说输入和输出必须是相同的物理量。

    偏差经过控制器的计算得到的控制量是电压的该变量,并被附加到当前的电压上。

出0入296汤圆

发表于 2009-5-13 19:14:17 | 显示全部楼层
to 【13楼】 mtlegolas  
    和电压有什么关系……
    你的理解有一点小问题,不是“当前PWM暂空比的改变量”而就是“当前的暂空比”
    控制器的输入量是脉冲个数的偏差,那么经过PID控制器的计算得到的输出量当做是当前PWM占空比。

出0入0汤圆

 楼主| 发表于 2009-5-13 19:40:30 | 显示全部楼层
to 【14楼】 Gorgon Meducer 傻孩子
直接用电压来控制电机转速

输入电压r(t)为0-5V,对应的输出转速信号y(t)的范围为0-5000r/min。
如果PID控制器的输入量是转速的偏差话,那么PID控制器中的比例项是不是输入电压r(t)和转速y(t)之间的比例关系的系数k=1/1000。。。。
     或者是这个比列系数K和PID控制器中的比列项没有关系,必须先将转速转换为电压,再把电压当做输入量送入到PID控制器进行计算得到控制量,也就是说输入和输出必须是相同的物理量。
     还是输入量是转速的偏差,比例项和PID控制器中的比列项没有关系,也不用转换电压。。。直接把输出量送到电机

不知道这几种种理解哪种是对的

出0入296汤圆

发表于 2009-5-13 21:50:20 | 显示全部楼层
to 【15楼】 mtlegolas
    我实现的PID系统不是基于转速闭环的,而是基于位置闭环,在位置闭环基础上叠加一个速度而以。
所以我们讨论的概念不同。我的PID系统输入是一个脉冲,而不是转速的偏差,输出是一个拥有电机方向
属性的PWM值。

出0入0汤圆

发表于 2009-5-17 22:51:22 | 显示全部楼层
to 【16楼】 Gorgon Meducer 傻孩子:
你是在伺服驱动器外做的速度环吗?
否则,要实现一个位置环,其内部必有一个速度环,要实现一个速度环,其内部必有一个电流环

出0入296汤圆

发表于 2009-5-17 23:20:10 | 显示全部楼层
- -b
谁说实现一个位置环,内部必须有一个速度环……

我就是先做位置环,然后直接叠加一个速度控制……
准确说,和LM629的算法是碰巧一致的。

出0入0汤圆

发表于 2010-7-30 13:42:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-22 17:57:53 | 显示全部楼层
好文章。标记

出0入0汤圆

发表于 2010-10-8 15:17:20 | 显示全部楼层
严重关注PID的速度环。

出0入0汤圆

发表于 2011-1-11 22:54:34 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-4-3 00:02:35 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-25 15:01:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-13 17:38:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-7-30 13:10:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-30 15:02:05 | 显示全部楼层
关注PID,学习

出0入0汤圆

发表于 2012-8-31 11:07:44 | 显示全部楼层
带速度和电流PID反馈的直流无刷电机的硬件电路是怎么设计的啊???

出0入0汤圆

发表于 2012-8-31 15:53:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-5 10:09:19 | 显示全部楼层
Gorgon_Meducer 发表于 2009-5-13 19:14
to 【13楼】 mtlegolas  
    和电压有什么关系……
    你的理解有一点小问题,不是“当前PWM暂空比的改变 ...

您好!看了帖子!感觉你对PID算法很了解,有没有小车PID算法的源程序发个给我呀!邮箱是522042830@qq.com谢谢了

出0入296汤圆

发表于 2012-9-6 14:56:13 | 显示全部楼层
记忆? 发表于 2012-9-5 10:09
您好!看了帖子!感觉你对PID算法很了解,有没有小车PID算法的源程序发个给我呀!邮箱是谢谢了 ...

快4年前的东西了……手边已经没有了。

出0入0汤圆

发表于 2012-12-1 19:47:13 | 显示全部楼层
看了你们讨论还是有收获的

出0入0汤圆

发表于 2013-5-24 18:13:39 | 显示全部楼层
Gorgon_Meducer 发表于 2009-5-17 23:20
- -b
谁说实现一个位置环,内部必须有一个速度环……

傻孩子大哥,真的好欣赏你的耐心解答!

出0入0汤圆

发表于 2013-6-25 16:03:55 | 显示全部楼层
Gorgon_Meducer 发表于 2009-5-12 20:17
代码在我另外一个帖子里面都给出来了。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page ...

代码能重新发一遍吗,现在贴子没了,还有就是问下  尝试以“打提前量”的思维方式,减小振动幅度;   ,提前量指的是?

出0入296汤圆

发表于 2013-6-25 18:56:38 | 显示全部楼层
sirriam 发表于 2013-6-25 16:03
代码能重新发一遍吗,现在贴子没了,还有就是问下  尝试以“打提前量”的思维方式,减小振动幅度;   , ...

4年前的东西了……代码我也没有了……提前量这里说的不好,其实就是PID的D,其感觉就有点像电感……

出0入0汤圆

发表于 2013-6-26 15:20:30 | 显示全部楼层
哦,知道了,谢谢

出0入0汤圆

发表于 2013-8-21 01:00:50 | 显示全部楼层
谢谢 获益匪浅

出0入0汤圆

发表于 2013-8-23 10:34:19 | 显示全部楼层
mark THANKY YOU

出0入0汤圆

发表于 2013-9-28 16:58:45 | 显示全部楼层
Gorgon_Meducer 发表于 2013-6-25 18:56
4年前的东西了……代码我也没有了……提前量这里说的不好,其实就是PID的D,其感觉就有点像电感…… ...

大哥,我想问问包含速度环和位置环的电机控制这样设计对不对:用一个pid调一个速度环,再用一个pid实现位置环,然后把速度环输出当作位置环输入,这样对吗?谢谢~

出0入296汤圆

发表于 2013-9-29 12:59:27 | 显示全部楼层
jiuyouyun 发表于 2013-9-28 16:58
大哥,我想问问包含速度环和位置环的电机控制这样设计对不对:用一个pid调一个速度环,再用一个pid实现位 ...

这样可以的,但是反过来也许更容易一点。

出0入0汤圆

发表于 2013-9-29 19:42:10 | 显示全部楼层
Gorgon_Meducer 发表于 2013-9-29 12:59
这样可以的,但是反过来也许更容易一点。

反过来?什么意思?麻烦说具体点~

出0入296汤圆

发表于 2013-9-30 00:35:43 | 显示全部楼层
jiuyouyun 发表于 2013-9-29 19:42
反过来?什么意思?麻烦说具体点~

先做一个位置环,然后利用位置环来实现速度环……

为什么这么做呢,假设我们已经有了一个位置环,我们叫电机转到哪里,它就转到哪里,而且特性还很硬。
在这个基础上,我们只要以一个固定的周期修改位置环的目标位置,电机就会转起来……因为目标位置是以
固定周期来修改的,通过控制增量,就可以精确的控制速度——这是位置环在微观时间内保证的——如果增量
还不是一个常数,那么你甚至可以加入加速度的概念——这其实就是微分了。

出0入0汤圆

发表于 2013-10-1 14:08:51 | 显示全部楼层
Gorgon_Meducer 发表于 2013-9-30 00:35
先做一个位置环,然后利用位置环来实现速度环……

为什么这么做呢,假设我们已经有了一个位置环,我们叫 ...

感谢你热心回复~你的原理说的非常明白,我都看懂了。我还想问问,我的控制的最终目标是精确的位置,内嵌一个速度环也是为了更好地控制位置,那为了得到特性很硬的位置控制,是不是可以先弄一个速度环出来?然后在速度环后面加上一个位置环?非常感谢~~

出0入296汤圆

发表于 2013-10-1 15:14:12 | 显示全部楼层
jiuyouyun 发表于 2013-10-1 14:08
感谢你热心回复~你的原理说的非常明白,我都看懂了。我还想问问,我的控制的最终目标是精确的位置,内嵌 ...

精确位置不是靠速度环来实现的,位置环自己就可以做出精确的位置。如果你的电机有减速器,如果减速比比较大,或者
旋转编码器的线数比较高,根本不用担心你说的精确位置的问题,你可以算一算,一个线数的误差对应实际外部的输出距离
是多少。对于位置环,简单的 P就可以达到目的了,加入I算法以后可以减少静差——如果你想降低系统的发热,以及齿轮的
磨损,可以加入D

出0入0汤圆

发表于 2013-10-10 15:28:36 | 显示全部楼层
Gorgon_Meducer 发表于 2013-9-30 00:35
先做一个位置环,然后利用位置环来实现速度环……

为什么这么做呢,假设我们已经有了一个位置环,我们叫 ...

你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需要在开发板实现一个位置环然后经过D/A转换输出模拟量给伺服驱动器控制伺服电机运动。假设我需要控制一个轴走10cm, 这个10cm怎么给定?假设 一个脉冲走1mm的话,这个值就对应100个脉冲? 是不是每个定时周期内以一定步长给定一个位置量?就是说第一个周期给 1mm 第二个2mm 第三次给3mm ...10cm ,然后采集编码器返回的脉冲与给定位置对应的脉冲求差值,经过PID运算输出控制量。这个控制量是什么?怎么通过D/A转换给伺服驱动器作为伺服驱动器速度环的输入?自己这两天看资料有点晕,问题表达的不好,希望见谅。

出0入296汤圆

发表于 2013-10-10 16:47:53 | 显示全部楼层
gunny 发表于 2013-10-10 15:28
你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需 ...

控制量和测量量往往随着系统的不同而不同,在前面的讨论中,我们默认控制量是电压——也就是PWM,与你的DA没什么不同,
但是测量量取决于你接的传感器了,前面的讨论中默认你接的是旋转编码器。我不知道你接的什么传感器,但是传感器直接决定
了的算法。

出0入0汤圆

发表于 2013-10-10 16:52:29 | 显示全部楼层
Gorgon_Meducer 发表于 2013-10-10 16:47
控制量和测量量往往随着系统的不同而不同,在前面的讨论中,我们默认控制量是电压——也就是PWM,与你的D ...

传感器就是伺服电机自带的旋转编码器

出0入296汤圆

发表于 2013-10-10 18:34:58 | 显示全部楼层
gunny 发表于 2013-10-10 16:52
传感器就是伺服电机自带的旋转编码器

如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减速器,减速器的减速比是多少。
如果你想对应的是距离而不是角度,那么还要看你轮子的直径是多少……

出0入0汤圆

发表于 2013-10-11 15:56:17 | 显示全部楼层
Gorgon_Meducer 发表于 2013-10-10 18:34
如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减 ...

这是结构图,关于位置信息如何给定?进行PID运算,输出控制量经D/A输出模拟电压到驱动器,请您能不能详细说一下?假设编码器转一圈反馈1000个脉冲好了,对应10cm距离,10ms中断采集一次编码器反馈的脉冲(位置量)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入296汤圆

发表于 2013-10-11 16:17:41 | 显示全部楼层
gunny 发表于 2013-10-11 15:56
这是结构图,关于位置信息如何给定?进行PID运算,输出控制量经D/A输出模拟电压到驱动器,请您能不能详细 ...

控制信息还不够,D/A信息如何控制电机的?因为电机实际上有正转,反转,自由,和制动 四个控制状态,单纯的电压信息
不借助别的信号辅助通常无法做到完整的电机控制。

出0入0汤圆

发表于 2013-12-31 17:09:35 | 显示全部楼层
楼主,你能不能抽空写本关于PID控制电机的书,不需要高深的理论,完整详细的介绍你自己的一个例子就行,一步一步的;
其实很多人都想学这个,但市面上的书几乎都是讲理论的。如果你知道有什么好资料的话,麻烦推荐给大家吧。

出0入0汤圆

发表于 2014-1-4 01:35:48 | 显示全部楼层
Gorgon_Meducer 发表于 2009-5-9 21:17
PID控制是一个讲求实践的学科,如果你刚刚开始学习PID,大可以在浏览了书本知识后,
暂时将这些内容忘在脑 ...

帮忙看看这个帖子,关于PID的疑问,谢谢~
http://www.amobbs.com/thread-5565315-1-1.html

出0入0汤圆

发表于 2014-1-10 11:35:26 | 显示全部楼层
dgdzas 发表于 2013-12-31 17:09
楼主,你能不能抽空写本关于PID控制电机的书,不需要高深的理论,完整详细的介绍你自己的一个例子就行,一 ...

写错了,应该是问傻孩子的,问版主。

出0入0汤圆

发表于 2014-1-13 18:48:10 | 显示全部楼层
Mark

出0入0汤圆

发表于 2014-3-21 12:26:37 | 显示全部楼层
标记,正在感性认识pid中

出0入0汤圆

发表于 2014-3-24 15:06:26 | 显示全部楼层
Gorgon_Meducer 发表于 2013-10-10 18:34
如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减 ...

傻孩子兄,我现在调的电机需要外部可以设定速度,但是又需要快速停准。因为负载在变,现在是速度环+电流环在跑,可以做到快启快停,但是最后的停准就麻烦了,现在是位置开环,我们的精度不高,停止位+-15°就可以了,而且每次都停这里,只要停准即可,请问需要加位置环么?但是加了位置环,速度的调节貌似就不成了。如果位置开环,又很难听得准,请问有啥好方法么?

出0入296汤圆

发表于 2014-3-24 15:49:04 | 显示全部楼层
witnessiz 发表于 2014-3-24 15:06
傻孩子兄,我现在调的电机需要外部可以设定速度,但是又需要快速停准。因为负载在变,现在是速度环+电流 ...

你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)

假设你已经有位置环了,那么你思考,周期性的以固定的增量来修改位置,是不是就获得速度了呢?

出0入0汤圆

发表于 2014-3-25 15:15:21 | 显示全部楼层
Gorgon_Meducer 发表于 2014-3-24 15:49
你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)

假设你已经 ...

请问速度环调节方式是怎样呢?需要加入PID么?如果是,是将制定的信号数作为参考,将反馈的信号数作为反馈,不需要其他环(如速度环搭配)直接输出占空比么?

出0入0汤圆

发表于 2014-3-25 15:49:42 | 显示全部楼层
Gorgon_Meducer 发表于 2014-3-24 15:49
你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)

假设你已经 ...

好吧,我刚才试了一下,单个位置环好像不好调,可能是我调的不好,但是加上速度环(参数之前已整定)感觉就定位挺准的了

出0入296汤圆

发表于 2014-3-26 00:57:25 | 显示全部楼层
witnessiz 发表于 2014-3-25 15:49
好吧,我刚才试了一下,单个位置环好像不好调,可能是我调的不好,但是加上速度环(参数之前已整定)感觉 ...

我觉得你曲解了我的意思。单独的位置环就足够了。我不清楚为什么你的位置环不好调。
从原理上来说,位置环是最简单的,不像速度环还存在不同速率下速度测量的量程和精度
问题。位置环借助一个旋转编码器配合简单的P算法就可以做的有模有样,加入D和I则更好
能有效消除震荡,发热,噪音和静差问题。

出0入0汤圆

发表于 2014-3-27 08:17:23 | 显示全部楼层
Gorgon_Meducer 发表于 2014-3-26 00:57
我觉得你曲解了我的意思。单独的位置环就足够了。我不清楚为什么你的位置环不好调。
从原理上来说,位置 ...

谢谢傻孩子多日的细心回复。主要我没说清楚,我只看到了对我有用的部分。我做的电机数百W,6krpm额定速度,对速度和负载要求比较多,需要加减速块,
对负载响应的速度也要快。我现在加减速可以调的不错,但是减速快了之后位置就停不准了,所以想加位置环(简易)。但是如果只有单纯的位置环,估计很
难达到要求,或者说以我的水平很难单纯用位置环做到以上要求。我现在的想法是减速到一定速度,然后加入位置环,在接近停靠位置,直接将电机锁在那个
角度。傻孩子觉得我的方法是否合理,或者有什么好的建议呢

出0入296汤圆

发表于 2014-3-27 10:28:36 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-3-27 10:30 编辑
witnessiz 发表于 2014-3-27 08:17
谢谢傻孩子多日的细心回复。主要我没说清楚,我只看到了对我有用的部分。我做的电机数百W,6krpm额定速度 ...


那你可以直接先调一个单纯的位置环出来看看效果,完成以后你可以有两个选择:
1、使用我前面说的利用位置环来实现速度——速度其实是位置环在宏观上的现象,其实加速度和速度都很好控制
     因为速度是单位时间内位置的增量,而加速度是单位时间内速度的增量
     比如你实现了一个50Hz中断,以及一个位置环,任意时刻你可以通过SetPosition来设定目标位置,则


  1.      static int32_t s_lSpeed = 0;

  2.      int32_t GetSpeed(void)
  3.      {
  4.          int32_t lResult;
  5.          SAFE_ATOM_CODE(
  6.              lResult = s_lSpeed;
  7.          )
  8.          return lResult;
  9.      }

  10.     void SetSpeed(int32_t lSpeed)
  11.     {
  12.         SAFE_ATOM_CODE(
  13.             s_lSpeed = lSpeed;
  14.         )
  15.     }

  16.      static int32_t s_lAcceleration = 0;

  17.      int32_t GetAcceleration(void)
  18.      {
  19.          int32_t lResult;
  20.          SAFE_ATOM_CODE(
  21.              lResult = s_lAcceleration;
  22.          )
  23.          return lResult;
  24.      }


  25.      ISR(Timer_OVF_vect) {
  26.          int32_t lCurrentPosition = GetPosition();                  //!< 获取当前的目标位置
  27.          int32_t lSpeed = GetSpeed();                                //!< 获取当前的速度
  28.          int32_t lAcceleration = GetAcceleration();                //!< 获取当前加速度
  29.         
  30.          lSpeed += lAcceleration;                                        //!< 更新速度

  31.          SetSpeed( lSpeed );                                          
  32.          
  33.          lCurrentPosition += lSpeed;
  34.          
  35.          SetPosition( lCurrentPosition );                                //!< 设置新的目标位置
  36.      }
复制代码

2、按照你的设想,在接近目标的时候,并且速度在一定范围内时由位置环切换到速度环

出0入0汤圆

发表于 2014-8-5 15:42:41 | 显示全部楼层
gunny 发表于 2013-10-10 15:28
你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需 ...

你好,看你12年的贴子遇到一个STM32+HT1621 关于VLCD的问题,想问一下,STM32 3.3V,但HT1621 VLCD想用5V的情况,QQ2 7 5270136

出0入0汤圆

发表于 2014-10-24 21:42:02 | 显示全部楼层
pid的积分量是电机的惰性

出0入0汤圆

发表于 2014-11-1 01:02:27 | 显示全部楼层
PID是电工必备的知识

出0入0汤圆

发表于 2014-11-1 08:18:53 | 显示全部楼层
一般帖子我不回复  顶顶

出0入0汤圆

发表于 2014-11-4 16:35:31 | 显示全部楼层
学习了。谢谢!

出0入0汤圆

发表于 2014-11-5 07:47:31 | 显示全部楼层
用过只有一个信号的编码方式控制速度,用的可控硅移相方式,目标是直流电机,效果一般
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 18:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表