搜索
bottom↓
回复: 220

新型PID应用于电机闭环调速系统(初始版)

[复制链接]

出0入0汤圆

发表于 2007-11-13 17:27:45 | 显示全部楼层 |阅读模式
#include <mega16.h>
#include<math.h>
#include<delay.h>
#include "lcdbn.h"
uchar data1[4]={0,2,5,0};
uchar data2[4]={0,0,0,0};
uchar j,key=0;
uchar chr[]="pre:   *2%";
uchar *chr1[3]={"openc V:      ",
                "shutc V:      ",
                "acceler:      "} ;
uchar counter1=0x84;
uchar counter2=0xc8;
uchar flag;       //flag为开闭使能
int E1r;
int E2r=0,E3r=0;
uint  speedr=15,c_r=0;//maxc=700;
void init_intr(void)
{
SREG=0x80;
TIMSK=0x40;
TCCR2=0x06;
TCCR1A=0xe3; //A比较高电平,B比较低电平
TCCR1B=0x0a;
MCUCR=0x0a; ///外部INT1/0中断上升有效
GICR=0xc0;
}
////////////////////////////////////
/////左右电机pwm设置
///////////////////////////////////
void setpwmr(uchar *p)
{ uint temp1;
temp1=(uint)p[1]*10+p[2];
if(temp1<25)
{
speedr=(uint)28-temp1*28/25;
}
else
{
speedr=(uint)temp1*28/25-28;
}
temp1=1023*temp1/50;
OCR1A=temp1;
OCR1B=temp1;
}
/////转速加/减调速//////
void add(uchar*p)  
{
if(p[1]!=5)
{
p[2]++;
if(p[2]==10)
{
p[2]=0;p[1]++;
}
}
}
void sub(uchar *p)
{
uchar temp;
temp=p[1]*20+p[2]*2;
if(temp!=0)
temp=temp-2;
p[1]=temp/20;      //设定值还原//
p[2]=(temp-p[1]*20)/2;
}

void display()
{  write_string(0x80,chr);
    write_string(0xc0,chr1[key]);
    write_order(counter1+0);
    write_Data(data1[0]+0x30);
   for(j=1;j<3;j++)
     {write_order(counter1+j);
      write_Data(data1[j]+0x30);
      }
      for(j=0;j<4;j++)
     {
     write_order(counter2+j);
      write_Data(data2[j]+0x30);
      }  
}
//////速度调节////
void speed_change(void)
{
if(PINA.1==0)
{
delay_ms(100);
if(PINA.1==0)
{add(data1); }
}
if(PINA.2==0)
{delay_ms(100);
if(PINA.2==0)
{sub(data1);}
}
}
/////键盘读取////
void testkey(void)
{
uchar flag2=0;
if(PINA!=0x0f)
{  delay_ms(10);
  if(PINA!=0x0f)
  {flag2=1;}
}  

if(flag2)
{
  while(PINA.3!=0)
{   
  while(PINA.0==0)
  { delay_ms(100);
  if(PINA.0==0)
{
if(key<2)
  {key++;}
  
  else
  key=0;}
  }
  
switch (key)
{case 0:          //模式1PID调节
  flag=0;
  speed_change();
  setpwmr(data1);
  display();
  break;
case 1:          //模式2开环
  flag=1;
   speed_change();
   setpwmr(data1);
   init_intr();
   display();
break;
case 2:   
display();
break;
default:break; }
}
flag2=0;
}
}
/* void speed_convert(uint c)   //测速转化成pwm值
{
}*/
void new_pid(uint cl,uchar k) //积分分离法
{ int temp3,z,p;              //p为积分系数误差越大P越小
  if(flag)
  { E1r=speedr-cl;
  if(speedr>0&abs(E1r)<11)
  {  
  switch(abs(E1r)/2)
  {
  case 5: p=1;
  break;
  case 4: p=3;
  break;
case 3:  p=5;
  break;
case 2:  p=8;
  break;
case 1:  p=10;
  break;
default :
  break;
  }
  z=23*(E1r-E2r)+p*(E1r-2*E2r+E3r)-10*E3r;
  z=(int)z*102/k;
  temp3=OCR1A;
  temp3=temp3+z;
  OCR1A=temp3;
  OCR1B=temp3;  
  E3r=E2r;
  E2r=E1r;
  }
  }
}

/*void pid_motr(uint cr,uchar k)
{
int temp,u;
if(flag)
{
if(speedr>0)
{
E1r=speedr-cr;
if(E1r==speedr)  //E误差很大时最大额定电流加速
{ OCR1A=maxc;
OCR1B=maxc;   }
else if(abs(E1r)>0&&abs(E1r)<7)
{
u=(int)(24*E1r-35*E2r+14*E3r)*102/k;
temp=OCR1A;
temp=temp+u;
OCR1A=temp;
OCR1B=temp;
E3r=E2r;
E2r=E1r;
}
}
}
} */
////////速度数据分解///////
void speed_count(uint r)
{
  data2[3]=r%10;
  r=r/10;
  data2[2]=r%10;
  r=r/10;
  data2[1]=r%10;
  r=r/10;
  data2[0]=r%10;
}
/////采用外部中断测速//////////
interrupt[EXT_INT0]void int_0(void)
{ c_r++;
}

/////T2定时80ms对速度采样////////
interrupt[TIM2_OVF]void time_2(void)
{
   MCUCR=0x00;
   GICR=0x00;
   new_pid(c_r,500) ;
   //pid_motr(c_r,100);
   speed_count(c_r) ;
   MCUCR=0x0f; ///外部INT1/0中断上升有效
   GICR=0xc0;  
   c_r=0;

}
void initall_IO(void)
{
DDRB=0xf0;
PORTB=0x00;
DDRA=0xF0;
PORTA=0x0F;
DDRC=0XFF;
PORTC=0X00;
DDRD=0xF0;
PORTD=0x0F;
}



void main(void)
{
   initall_IO();
   init_lcd();
   while(1)
   {
   DDRA=0xF0;
   PORTA=0x0F;
  testkey();
  init_intr();  
  display();
      }
      }

PID算法公式有点错:应改为

z=100*(E1r-E2r)+p*E1r+125*(E1r-2*E2r+E3r);

经过老师的指导:速度采样用M法不适应低,所以对于调速范围大的就用M/T法,适合于高低测速!对测速还要加以数字滤波!可用一阶惯性/中值法,平均法等!

出0入0汤圆

 楼主| 发表于 2007-11-13 17:32:36 | 显示全部楼层
这个是我一个月前在我的博客发表!浏览量才800,还是在这里跟大家分享!
看大家对这类的兴趣,还有浏览量!可观的话,我还会相继发表下一版.
模糊PID;还有两种算法加在一起,可进行对比效果加上位机监控过程,
观看波形,进行在线调节参数等!
以是控制算法的思想还有流程图!我是学自动化所以在程序方面编写有点琐碎!
点击此处下载ourdev_180765.rar(文件大小:33K)

出0入0汤圆

发表于 2007-11-13 17:35:53 | 显示全部楼层
请楼主提供原理图,简单的讲解,不然这东西看着也没什么用啊!

出0入0汤圆

发表于 2007-11-13 18:03:42 | 显示全部楼层
顶! 不错的项目,PID 说起来好象简单,其实实现控制 还是相当难的!


正如楼上所说,配合电路 就更便于理解了!

出0入0汤圆

发表于 2007-11-13 18:45:49 | 显示全部楼层
请问这句怎么理解z=(int)z*102/k;

出0入0汤圆

发表于 2007-11-13 19:48:48 | 显示全部楼层
学习

出0入0汤圆

 楼主| 发表于 2007-11-13 20:11:05 | 显示全部楼层
电路也没什么!驱动器采用L298双极性控制,请注意对于功率大的电机PWM输出口要加光耦!
电机是带测束的光电编码盘电机!一个很关键问题是速度环节!开环测速要稳定!
闭环才有显著效果!这个要加数字滤波!
点击此处下载ourdev_180766.rar(文件大小:33K)

出0入0汤圆

发表于 2007-11-13 20:51:02 | 显示全部楼层
z=(int)z*102/k;,其中Z要乘102除以K是什么意思啊,102,K,表示什么啊?

出0入0汤圆

发表于 2007-11-13 21:28:23 | 显示全部楼层
狂顶,我一直想学PID控制,但是发现书上和网上给出的资料都是些原理性的东西,点到即止,
希望LZ多从原理上,接合实际运用,详细说下,我想这样大家更容易接受,先感谢LZ了!

出0入0汤圆

 楼主| 发表于 2007-11-13 21:42:51 | 显示全部楼层
控制算法的思想还有流程图!已在上面的下载文件中!如果真的要搞明的话你得多做闭环控制的实验!电机最好!
还有炉温控制!后者采用模糊更好!指导老师给广州公司做过这个项目!由于模糊适应性强,对环境抗干扰强!
所以通过算法可以逼近非线性函数!电机响应快!而温度惯性大!滞后性大!还有条件问题只能选电机!

出0入0汤圆

发表于 2007-11-14 07:18:22 | 显示全部楼层
控制量如何转化为PWM的啊,能讲讲吗?

出0入0汤圆

 楼主| 发表于 2007-11-14 08:16:37 | 显示全部楼层
这是最终算法如下程序:
输出控制量,通过量化因子,量化为比较好的控制PWM!还要加上限幅!
void new_pid(uint cl)         //积分分离法
{ int temp3,z;
   //uchar k;         
   int kp,ki,kd;            
  if(flag==1)
    {
        E1r=speedr-cl;            //读取误差E
    if(speedr>0&abs(E1r)<17)    //误差E小于18进行PID
     {  
     switch(abs(E1r)/3)         //误差E分段调节Ki,kp,kd
    {
  
      case 5:        
          kp=210;
          ki=45;
          kd=140;     
       break;                     
      case 4:  
         kp=180;
         ki=37;
         kd=137;     
       break;
     case 3:  
         kp=160;
         ki=31;
         kd=136;
       break;
     case 2:  
         kp=145;
         ki=26;
         kd=132;
      break;
     case 1:  
          kp=115;
          ki=22;
          kd=128;
       break;
    case 0:  
         kp=100;
         ki=20;
         kd=125;
      break;  
   default :
     break;
   }
  }  
else
   {
      kp=250;
      ki=10;
      kd=100;
   }
  ////////增量式PID/////////
    z=kp*(E1r-E2r)+ki*E1r+kd*(E1r-2*E2r+E3r);
    z=z/10;
    //z=z/k;      
  temp3=OCR1A;
  if(z<-500)        //防止反转
    {
        z=-500;
    }
  temp3=temp3+z;
  if(temp3>1020)    //限幅值   
    {
       temp3=1020;
    }
  OCR1A=temp3;
  OCR1B=temp3;  
  E3r=E2r;
  E2r=E1r;
   }
}

出0入0汤圆

发表于 2007-11-14 08:49:11 | 显示全部楼层
牛人,值得尊敬!

出0入0汤圆

发表于 2007-11-14 09:07:59 | 显示全部楼层
请楼主继续发表你的下一版 模糊PID,谢谢!

出0入0汤圆

 楼主| 发表于 2007-11-14 09:46:29 | 显示全部楼层
还是ouravr 的朋友热情响应!我在别的博客受冷板凳!只有人看浏览800人,没有一个人发表意见!
有点冷冰冰!先讨论完PID在搞模糊,PID这两个都在应用中!程序已完善了!先讨论一下我有程序思想先!

出0入0汤圆

发表于 2007-11-14 10:07:33 | 显示全部楼层
z为什么要除以10啊?

出0入0汤圆

发表于 2007-11-14 10:10:29 | 显示全部楼层
jasen74真热情,我支持你

出0入0汤圆

 楼主| 发表于 2007-11-14 10:31:57 | 显示全部楼层
输出控制量,通过量化因子,量化为比较好的控制PWM!通过调试的!Kp/10为测试的比例值这个我也调了很久!
现在明白就简单点!

出0入0汤圆

 楼主| 发表于 2007-11-14 10:39:57 | 显示全部楼层

出0入0汤圆

发表于 2007-11-14 21:22:54 | 显示全部楼层
这个和你发的不一样吗?增加了电流、转速采样。

出0入13汤圆

发表于 2007-11-14 22:58:34 | 显示全部楼层
请问那个上面的软件界面中的曲线显示怎么做的啊?什么控件之类?谢谢了!

出10入95汤圆

发表于 2007-11-15 11:08:15 | 显示全部楼层
楼主厉害啊!谢谢!不过两个的附件(rar压缩包)的内容是一样的,没有电路图啊!是传错了,还是.....不过还是要顶!

出0入0汤圆

 楼主| 发表于 2007-11-15 21:36:10 | 显示全部楼层
由于上次硬盘坏,资料没了!只能把别人的搬上来给大家!没空去画图!
比它复杂点!PWM输出加光耦!控制采用双极性!电机上已带有光电编码盘,
不过要用比较器整形或加个上拉电阻!就可以

出0入0汤圆

发表于 2007-11-15 22:21:35 | 显示全部楼层
能不能讲一下输出控制量,通过量化因子,具体怎么量化的啊,Z/K,这个K怎么取啊?

出0入0汤圆

发表于 2007-11-17 15:13:51 | 显示全部楼层
不错的选择

出0入0汤圆

发表于 2007-11-18 18:12:32 | 显示全部楼层
学习了

出0入0汤圆

 楼主| 发表于 2007-11-19 23:46:25 | 显示全部楼层
以下是电机调速不同模式的波形:
PID:


fuzzy:

出0入0汤圆

发表于 2007-11-20 10:51:19 | 显示全部楼层
确实不错,该给顶一下!

出0入0汤圆

发表于 2007-11-20 17:08:17 | 显示全部楼层
请教请教,那个界面上的波形和里面的表格是怎么做的?我没做过,想学学哈

出0入22汤圆

发表于 2007-11-20 17:15:49 | 显示全部楼层
谢谢搂住

出0入0汤圆

 楼主| 发表于 2007-11-20 21:40:34 | 显示全部楼层
在网上找图片,后在picture属性中背景设置图片为所用的就行!或用line循环画线!

出0入0汤圆

 楼主| 发表于 2007-11-21 23:53:19 | 显示全部楼层
对控制算法有兴趣的朋友,可以加我QQ一起讨论!学习!
最近用VB加了记录数据文件功能!可以对PID参数调节!
QQ:369627584

出0入0汤圆

发表于 2007-11-22 11:30:34 | 显示全部楼层
厉害哦!期待你的下一篇大作

出0入0汤圆

 楼主| 发表于 2007-11-22 16:54:24 | 显示全部楼层
如果是搞PID,就知道PID的响应曲线不对,不过该算法适应性强可调速度范围大!对自整定参数要进一步调节!
而模糊出现在超调是正常现象!在允许的超调范围!可以通过调节响应表或输出量化因子达到满意的曲线!

出0入0汤圆

发表于 2007-11-23 19:46:57 | 显示全部楼层
不知道楼主用的多大的电机,我也打算用L298做pid,电机暂时用的录音机里面那种小电机,是不是不大合适,而且想用matlab控制,matlab读串口,程序只要出错,串口就锁死,好麻烦,不知道楼主碰见过没有。

出0入0汤圆

 楼主| 发表于 2007-11-24 14:48:56 | 显示全部楼层
录音机的小电机!转速不够快!响应特性不好!最关键没比较准而快的测速装置!我用的电机二手还要160元的双编码盘电机!
24ms测到33个脉冲!可以在图中看到很快就起动!时间400ms已稳定!

出0入0汤圆

发表于 2007-11-24 15:46:57 | 显示全部楼层
几个参数是如何得到的?

出0入0汤圆

 楼主| 发表于 2007-11-24 21:10:38 | 显示全部楼层
从资料中推算!也有参数归一法!
请问【34楼】 KuJJ
积分:6
派别:
等级:------
来自:
怎么调用matlab的串口通信?

出0入0汤圆

发表于 2007-11-27 13:46:47 | 显示全部楼层
正在搞PID控制,研究一下!

出0入4汤圆

发表于 2007-11-27 13:51:05 | 显示全部楼层
有空研究

出0入0汤圆

发表于 2007-11-27 16:10:25 | 显示全部楼层
牛逼,厉害,顶

出0入0汤圆

发表于 2007-11-27 16:21:03 | 显示全部楼层
g=serial('COM6','BaudRate',19200); %初始化
g.InputBufferSize=1024;                %设置缓冲
g.timeout=1;                        %设置超时
fopen(g);                        %开
m=fscanf(g,'%d');                %读取数据
Fprintf(g,'%s','OK','async')        %发送数据
fclose(g);                        %关
%delete(g);                        %删除

matlab主要就这些常见串口命令了,如有不足,各位补充

出0入0汤圆

 楼主| 发表于 2007-11-27 19:43:09 | 显示全部楼层
谢谢KuJJ!matlab还有更强的功能!作控制界面demo模块中有该功能!

出0入0汤圆

 楼主| 发表于 2007-12-4 12:37:07 | 显示全部楼层
已发表模糊PID的贴了!大家有兴趣看一看!(模糊PID应用)

出0入0汤圆

 楼主| 发表于 2007-12-6 15:05:30 | 显示全部楼层
利用该方法进行PID控制器参数的整定步骤如下:(1)首先预选择一个足够短的采样周期让系统工作﹔(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期﹔(3)在一定的控制度下通过公式计算得到PID控制器的参数。
PID参数的设定:是靠经验及工艺的熟悉,参考测量值跟踪与设定值曲线,从而调整P\I\D的大小。

  PID控制器参数的工程整定,各种调节系统中P.I.D参数经验数据以下可参照:
  温度T: P=20~60%,T=180~600s,D=3-180s
  压力P: P=30~70%,T=24~180s,
  液位L: P=20~80%,T=60~300s,
  流量L: P=40~100%,T=6~60s。


  书上的常用口诀:
  
  参数整定找最佳,从小到大顺序查
  先是比例后积分,最后再把微分加
  曲线振荡很频繁,比例度盘要放大
  曲线漂浮绕大湾,比例度盘往小扳
  曲线偏离回复慢,积分时间往下降
  曲线波动周期长,积分时间再加长
  曲线振荡频率快,先把微分降下来
  动差大来波动慢。微分时间应加长
  理想曲线两个波,前高后低4比1
  一看二调多分析,调节质量不会低
下面以PID调节器为例,具体说明经验法的整定步骤:
    ⑴让调节器参数积分系数S0=0,实际微分系数k=0,控制系统投入闭环运行,由小到大改变比例系数S1,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。
    ⑵取比例系数S1为当前的值乘以0.83,由小到大增加积分系数S0,同样让扰动信号作阶跃变化,直至求得满意的控制过程。
   (3)积分系数S0保持不变,改变比例系数S1,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数S1增大一些,再调整积分系数S0,力求改善控制过程。如此反复试凑,直到找到满意的比例系数S1和积分系数S0为止。
    ⑷引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止。
    注意:仿真系统所采用的PID调节器与传统的工业 PID调节器有所不同,各个参数之间相互隔离,互不影响,因而用其观察调节规律十分方便。
    PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右。小惯量如:一个小电机带
    一水泵进行压力闭环控制,一般只用PI控制。P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的。
  
   我提供一种增量式PID供大家参考

   △U(k)=Ae(k)-Be(k-1)+Ce(k-2)
   A=Kp(1+T/Ti+Td/T)
   B=Kp(1+2Td/T)
   C=KpTd/T
   T采样周期 Td微分时间 Ti积分时间

出0入0汤圆

发表于 2007-12-7 04:59:36 | 显示全部楼层
强,学习中,谢谢

出0入0汤圆

发表于 2007-12-7 14:27:52 | 显示全部楼层
厉害,学习一下!

出0入0汤圆

发表于 2007-12-7 16:14:54 | 显示全部楼层
PID说起来感觉很简单,但一直不知道怎么应用的产品上,如调节电机的速度,也知道把速度环为内环,电流环为外环,具体到怎么把参数经过PID后转为 PWM调节,多长时间调节一次还是没有搞懂。

下面是一个 用C语言写的PID控制的算法程序 给大家参考
/---------------------------------------------------------------------
// CalcPID()
// Calculates PID compensator algorithm and determines new value for
// PWM duty cycle
//---------------------------------------------------------------------

void CalcPID(void)
{
if(!stat.saturated) // If output is not saturated,
   integral.l += error.l;  // modify the integral value.
   

// Calculate the PID compensator.

ypid.l = (long)error.i[0]*(long)kp + integral.l*(long)ki +
         (long)mvelocity*(long)kd;     


if(ypid.ub[3] & 0x80)     // If PID result is negative
{
if((ypid.ub[3] < 0xff) || !(ypid.ub[2] & 0x80))
  ypid.ul = 0xff800000;   // Limit result to 24-bit value
}

else           // If PID result is positive
{
if(ypid.ub[3] || (ypid.ub[2] > 0x7f))
  ypid.ul = 0x007fffff;   // Limit result to 24-bit value
}

ypid.b[0] = ypid.b[1];     // Shift PID result right to
ypid.b[1] = ypid.b[2];     // get upper 16 bits.

stat.saturated = 0;      // Clear saturation flag and see
if(ypid.i[0] > 500)      // if present duty cycle output
{           // exceeds limits.
ypid.i[0] = 500;
stat.saturated = 1;
}

if(ypid.i[0] < -500)
{
ypid.i[0] = -500;
stat.saturated = 1;
}

ypid.i[0] += 512;       // Add offset to get positive
            // duty cycle value.
            
SetDCPWM1(ypid.i[0]);     // Write the new duty cycle.
}

出0入0汤圆

 楼主| 发表于 2007-12-7 22:21:10 | 显示全部楼层
应用于温度,转速,压力,工业炉温等场合;检测温度,转速,压力等传感器做为采样量,而执行对象可以是电机(转速,位置控制),
加热器:电热棒  ,电磁伐开关量(控制流量)!
要注意:PID有位置与增量式之分:一般用增量式(转速,温度控制 )  位置:电磁伐开关量,位置控制!
本例采用增量式,也可以用位置式!

出0入0汤圆

 楼主| 发表于 2007-12-7 22:38:11 | 显示全部楼层
调节时间也就是采样(T>2Tm)要符合香农定理!Tm为电机响应时间.一般速度采样10ms左右,电流采样时间3ms左右.
还有pwmr工作频率:fs>4fc(fc电流截止频率),比电机固有频率高时振荡小.对于小电机采用pwm控制很难实现电流环.
双极性控制pwm频率如果跟电机固有频率差不多时噪音很大,其实在调频率时发觉双极控制响应快原因是电机停时平均电压:U/2电机还是在振荡工作中.缺点:频率小电机来振荡明显,频率高噪音大等!只是本人一点小经验!

出0入0汤圆

发表于 2007-12-7 23:03:58 | 显示全部楼层
强贴,留名。学的是自动化,可是还是看不懂,没好好学啊!光把单片机学好也不行啊!

出0入0汤圆

发表于 2007-12-8 09:23:21 | 显示全部楼层
一直都想搞PID,市面上的书都没有个具体的示例,顶。。。。。。

出0入0汤圆

发表于 2007-12-8 09:38:14 | 显示全部楼层
楼主,有空写一篇使用PID入门级别的文档吧,毕竟你现在理论和实践都有。
市面上的书籍都是讲通篇的大理论,没有使用价值。也不知道怎么用到实际的项目上来。

出0入0汤圆

 楼主| 发表于 2007-12-8 09:39:17 | 显示全部楼层
最好就用matlab来做仿真,用程度做个控制对象!画波形曲线,在先进PID书中有相应的程序.或sumilink 做个电机模型或找出电机模块再把你的程序做成模块在sumilink中仿真看波形跟真实差不多!

出0入0汤圆

 楼主| 发表于 2007-12-8 10:49:33 | 显示全部楼层
好文共享!贴为(VB常用算法),希望对大家以后编程有用处!

出0入0汤圆

发表于 2007-12-30 03:43:15 | 显示全部楼层
up!

出0入0汤圆

发表于 2007-12-30 11:20:32 | 显示全部楼层
楼主能搞一个 “PID的恒温装置” 来普及一下PID嘛?  好多书上都用这个例子,但只是很浅的说说。

强烈请求楼主

出0入0汤圆

发表于 2007-12-30 12:10:42 | 显示全部楼层
呵呵,PID算法好理解,关键是执行机构要得力。这是我做PID控制的感受,不知道大家的感觉怎么样?

出0入0汤圆

发表于 2008-1-6 18:15:30 | 显示全部楼层
正在研究PID调速,对于搞电子的人难点就是:
怎么把PID的输入/输出量与PWM的占空比联系起来

出0入147汤圆

发表于 2008-1-6 19:12:50 | 显示全部楼层
不错,正在准备智能车比赛,留个记号

出0入0汤圆

发表于 2008-1-6 19:41:44 | 显示全部楼层
好贴要顶

出0入0汤圆

发表于 2008-1-6 20:36:05 | 显示全部楼层
狂顶一下!!!

出0入0汤圆

发表于 2008-1-7 15:05:16 | 显示全部楼层
做个记号

出0入0汤圆

 楼主| 发表于 2008-1-7 19:53:07 | 显示全部楼层
PWM是脉宽调制,通过PWM的占空比来调节电枢的平均电压.
转速与PWM联系:通过L298用PWM调制的方法,把恒定的直流电源电压调制成频率一定、宽度可变的脉冲电压,从而可以改变平均输出电压的大小,以调节电机转速.
控制精度:M16的PWM为10位控制精度相对较高,原因电机的转速0~1500r/min,而采样时间为10ms测得光电编码盘脉冲个数没能达到10的精度!
所以通过PWM调速,采用PID来计算不同时间输出的PWM;达到快速的让电机响应,更稳定,曲线平滑!

出0入0汤圆

发表于 2008-1-8 13:59:31 | 显示全部楼层
void PID_Limit(PDS_PIDCell pid , PDS_StepLimitPara sp)
{
        pid->CurrOut = pid->LastOut +                                                                  //U(k-1)
                          (pid->CurrErr - pid->LastErr) * pid->KpVal_Up / pid->KxVal_Dn +                  //△ Up
                          (pid->CurrErr + pid->LastErr) * pid->KiVal_Up / (pid->KxVal_Dn * 2) +            //△ Ui
                                  (pid->CurrErr - 2*pid->LastErr + pid->LastErr1) * pid->KdVal_Up / pid->KxVal_Dn; //△ Ud

        //修正当前计算的输出值, 有效偏差修正.
        pid->CurrOut = StepLimit(pid->CurrOut ,
                                     pid->LastOut ,
                                                         sp->UpRate   ,
                                                         sp->DnRate   ,
                                                         sp->MaxVal   ,
                                                         sp->MinVal );

        pid->LastErr1 = pid->LastErr;
        pid->LastErr  = pid->CurrErr;
        pid->LastOut  = pid->CurrOut;
}

出0入0汤圆

发表于 2008-1-8 15:54:26 | 显示全部楼层
好文啊,怎么能不顶啊。

出0入22汤圆

发表于 2008-1-8 16:51:13 | 显示全部楼层
谢谢楼主,收藏了。

出0入0汤圆

 楼主| 发表于 2008-1-8 17:30:19 | 显示全部楼层
我建议大家还是看下面的PID算法:不要被结构体指针所迷惑,不过构体指针很好用,应用灵活.特别对模块化的函数多个返回值很好用,就是通过构体指针来返回多个数值可读又可写!而对另一个非模块化的函数可用全局变量做函数的多个输出,但本人感觉程序大的,函数调用公共变量,特别是中断调用公共变量.出现不可预测现象,公共变量可以被中断函数修改等,程序可能跑飞!
自整定PID算法:
void new_pid(uint cl)         //积分分离法
{ int temp3,z;
   //uchar k;         
   int kp,ki,kd;            
  if(flag==1)
    {
        E1r=speedr-cl;            //读取误差E
    if(speedr>0&abs(E1r)<17)    //误差E小于18进行PID
     {   
     switch(abs(E1r)/3)         //误差E分段调节Ki,kp,kd
    {
   
      case 5:         
          kp=210; ki=45; kd=140;      
       break;                     
      case 4:   
         kp=180; ki=37; kd=137;      
       break;  
     case 3:   
         kp=160; ki=31; kd=136;
       break;
     case 2:   
         kp=145; ki=26; kd=132;
      break;
     case 1:   
          kp=115; ki=22;  kd=128;
       break;
    case 0:   
         kp=100; ki=20; kd=125;
      break;   
   default :
     break;
   }
  }   
else
   {  
      kp=250; ki=10; kd=100;
   }
  ////////增量式PID/////////
    z=kp*(E1r-E2r)+ki*E1r+kd*(E1r-2*E2r+E3r);
    z=z/10;
    //z=z/k;      
  temp3=OCR1A;
  if(z<-500)        //防止反转
    {
        z=-500;
    }
  temp3=temp3+z;
  if(temp3>1020)    //限幅值   
    {
       temp3=1020;
    }
  OCR1A=temp3;
  OCR1B=temp3;   
  E3r=E2r;
  E2r=E1r;
   }
}

出0入0汤圆

发表于 2008-1-9 16:04:13 | 显示全部楼层
欢迎楼主继续开专贴阐述!

出0入0汤圆

发表于 2008-1-9 16:14:15 | 显示全部楼层
自动化

出0入0汤圆

发表于 2008-1-10 10:45:04 | 显示全部楼层
很好,谢谢

出0入0汤圆

发表于 2008-1-10 11:22:59 | 显示全部楼层
好文..

出0入0汤圆

发表于 2008-1-10 13:59:26 | 显示全部楼层
谢谢楼主,不顶不行啊。

出0入0汤圆

发表于 2008-1-23 09:47:21 | 显示全部楼层
初学者之人, 多多指教

出0入0汤圆

发表于 2008-1-27 15:26:27 | 显示全部楼层
这东西在什么场合下应用广呢?据说这个比较难

出0入0汤圆

发表于 2008-1-29 09:57:45 | 显示全部楼层
LZ,请问你什么时候毕业呀?有没有意向去处了?

出0入0汤圆

 楼主| 发表于 2008-1-29 19:36:04 | 显示全部楼层
本人2008毕业自动化专业。工作意想:智能控制,电子电力,从事自动化相关的公司!大家如果有何好的推荐!

出0入0汤圆

发表于 2008-1-29 19:52:27 | 显示全部楼层
可以专攻电机控制~
无感无刷、无刷伺服、PMSM等~

出0入0汤圆

 楼主| 发表于 2008-1-29 19:54:42 | 显示全部楼层
yinyong75你好!本人在OURAVR发表的贴子http://www.ouravr.com/bbs/bbs_list.jsp?search_text=jasen74&search_mode=3&bbs_id=9999!
毕业设计为基于DSP异步电机矢量控制!将发表电力电子报刊!
请问贵公司的详细内容能否发到我邮箱:54jslin@163.com

出0入0汤圆

发表于 2008-1-29 22:16:02 | 显示全部楼层
做个标记

出0入0汤圆

发表于 2008-6-7 13:48:09 | 显示全部楼层
谢谢,收藏先!

出0入0汤圆

发表于 2008-6-7 16:23:21 | 显示全部楼层
同行的作品一定要顶

出0入0汤圆

发表于 2008-6-7 17:20:17 | 显示全部楼层
有没有控制温度的啊,我现在在弄温度的,以前没弄过,不知道怎么处理啊
希望能和你交流下MSN:eaglelpx@live.cn

出0入0汤圆

发表于 2008-6-7 17:50:27 | 显示全部楼层
顶一顶!

出0入0汤圆

发表于 2008-6-13 09:23:44 | 显示全部楼层
好贴

出0入0汤圆

发表于 2008-8-13 08:23:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-13 08:41:18 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2008-8-13 09:10:29 | 显示全部楼层
mark 学习

出0入0汤圆

发表于 2008-8-28 15:28:55 | 显示全部楼层
顶!,多指教,俺也在搞这pid

出0入0汤圆

发表于 2008-8-28 16:11:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-28 16:58:15 | 显示全部楼层
收藏了
谢谢
好的 资料正用到

出0入0汤圆

发表于 2008-8-28 17:29:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-29 00:38:12 | 显示全部楼层
帮顶,我现在正在研究PID控制,这个程序正好用于参考,多谢楼主啦

出0入0汤圆

发表于 2008-8-30 09:52:46 | 显示全部楼层
刚刚开始搞PID,记下慢慢研究

出0入0汤圆

发表于 2008-8-30 10:44:17 | 显示全部楼层
感谢楼主

出0入0汤圆

发表于 2008-8-30 13:57:33 | 显示全部楼层
刚刚开始搞PID,记下慢慢研究 正好要用到
必须认真学习啊!!!!强顶!!!

出0入0汤圆

发表于 2008-9-10 16:27:36 | 显示全部楼层
楼主~资料很平平  学自动化的都知道  而你的语气却。。。一直在强调有多少人看
(并不是攻击你的意思)

出0入0汤圆

发表于 2008-9-10 22:09:03 | 显示全部楼层
能否提供温度PID控制方式?

出0入0汤圆

发表于 2009-4-22 16:26:22 | 显示全部楼层
电路可以看一下不?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-5 10:47

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

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