jasen74 发表于 2007-11-13 17:27:45

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

#include <mega16.h>
#include<math.h>
#include<delay.h>
#include "lcdbn.h"
uchar data1={0,2,5,0};
uchar data2={0,0,0,0};
uchar j,key=0;
uchar chr[]="pre:   *2%";
uchar *chr1={"openc V:      ",
                "shutc V:      ",
                "acceler:      "} ;
uchar counter1=0x84;
uchar counter2=0xc8;
uchar flag;       //flag为开闭使能
int E1r;
int E2r=0,E3r=0;
uintspeedr=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*10+p;
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!=5)
{
p++;
if(p==10)
{
p=0;p++;
}
}
}
void sub(uchar *p)
{
uchar temp;
temp=p*20+p*2;
if(temp!=0)
temp=temp-2;
p=temp/20;      //设定值还原//
p=(temp-p*20)/2;
}

void display()
{write_string(0x80,chr);
    write_string(0xc0,chr1);
    write_order(counter1+0);
    write_Data(data1+0x30);
   for(j=1;j<3;j++)
   {write_order(counter1+j);
      write_Data(data1+0x30);
      }
      for(j=0;j<4;j++)
   {
   write_order(counter2+j);
      write_Data(data2+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=r%10;
r=r/10;
data2=r%10;
r=r/10;
data2=r%10;
r=r/10;
data2=r%10;
}
/////采用外部中断测速//////////
interruptvoid int_0(void)
{ c_r++;
}

/////T2定时80ms对速度采样////////
interruptvoid 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法,适合于高低测速!对测速还要加以数字滤波!可用一阶惯性/中值法,平均法等!

jasen74 发表于 2007-11-13 17:32:36

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

steven 发表于 2007-11-13 17:35:53

请楼主提供原理图,简单的讲解,不然这东西看着也没什么用啊!

highnose 发表于 2007-11-13 18:03:42

顶! 不错的项目,PID 说起来好象简单,其实实现控制 还是相当难的!


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

wenfengcom 发表于 2007-11-13 18:45:49

请问这句怎么理解z=(int)z*102/k;

yaya001 发表于 2007-11-13 19:48:48

学习

jasen74 发表于 2007-11-13 20:11:05

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

wenfengcom 发表于 2007-11-13 20:51:02

z=(int)z*102/k;,其中Z要乘102除以K是什么意思啊,102,K,表示什么啊?

hsj210 发表于 2007-11-13 21:28:23

狂顶,我一直想学PID控制,但是发现书上和网上给出的资料都是些原理性的东西,点到即止,
希望LZ多从原理上,接合实际运用,详细说下,我想这样大家更容易接受,先感谢LZ了!

jasen74 发表于 2007-11-13 21:42:51

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

wenfengcom 发表于 2007-11-14 07:18:22

控制量如何转化为PWM的啊,能讲讲吗?

jasen74 发表于 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;
   }
}

ba_wang_mao 发表于 2007-11-14 08:49:11

牛人,值得尊敬!

FreeDriver 发表于 2007-11-14 09:07:59

请楼主继续发表你的下一版 模糊PID,谢谢!

jasen74 发表于 2007-11-14 09:46:29

还是ouravr 的朋友热情响应!我在别的博客受冷板凳!只有人看浏览800人,没有一个人发表意见!
有点冷冰冰!先讨论完PID在搞模糊,PID这两个都在应用中!程序已完善了!先讨论一下我有程序思想先!

wenfengcom 发表于 2007-11-14 10:07:33

z为什么要除以10啊?

sunmake 发表于 2007-11-14 10:10:29

jasen74真热情,我支持你

jasen74 发表于 2007-11-14 10:31:57

输出控制量,通过量化因子,量化为比较好的控制PWM!通过调试的!Kp/10为测试的比例值这个我也调了很久!
现在明白就简单点!

jasen74 发表于 2007-11-14 10:39:57

http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_180830.jpg

cbcb128 发表于 2007-11-14 21:22:54

这个和你发的不一样吗?增加了电流、转速采样。

liao-ljj 发表于 2007-11-14 22:58:34

请问那个上面的软件界面中的曲线显示怎么做的啊?什么控件之类?谢谢了!

ddcour 发表于 2007-11-15 11:08:15

楼主厉害啊!谢谢!不过两个的附件(rar压缩包)的内容是一样的,没有电路图啊!是传错了,还是.....不过还是要顶!

jasen74 发表于 2007-11-15 21:36:10

由于上次硬盘坏,资料没了!只能把别人的搬上来给大家!没空去画图!
比它复杂点!PWM输出加光耦!控制采用双极性!电机上已带有光电编码盘,
不过要用比较器整形或加个上拉电阻!就可以
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_181021.jpg

wenfengcom 发表于 2007-11-15 22:21:35

能不能讲一下输出控制量,通过量化因子,具体怎么量化的啊,Z/K,这个K怎么取啊?

hjzz 发表于 2007-11-17 15:13:51

不错的选择

cjbcjb 发表于 2007-11-18 18:12:32

学习了

jasen74 发表于 2007-11-19 23:46:25

以下是电机调速不同模式的波形:
PID:
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_182033.jpg
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_182034.jpg
fuzzy:
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_182035.jpg

fuanzwg 发表于 2007-11-20 10:51:19

确实不错,该给顶一下!

Feeling_MCU 发表于 2007-11-20 17:08:17

请教请教,那个界面上的波形和里面的表格是怎么做的?我没做过,想学学哈

zxq6 发表于 2007-11-20 17:15:49

谢谢搂住

jasen74 发表于 2007-11-20 21:40:34

在网上找图片,后在picture属性中背景设置图片为所用的就行!或用line循环画线!

jasen74 发表于 2007-11-21 23:53:19

对控制算法有兴趣的朋友,可以加我QQ一起讨论!学习!
最近用VB加了记录数据文件功能!可以对PID参数调节!
QQ:369627584

hjzz 发表于 2007-11-22 11:30:34

厉害哦!期待你的下一篇大作

jasen74 发表于 2007-11-22 16:54:24

如果是搞PID,就知道PID的响应曲线不对,不过该算法适应性强可调速度范围大!对自整定参数要进一步调节!
而模糊出现在超调是正常现象!在允许的超调范围!可以通过调节响应表或输出量化因子达到满意的曲线!

KuJJ 发表于 2007-11-23 19:46:57

不知道楼主用的多大的电机,我也打算用L298做pid,电机暂时用的录音机里面那种小电机,是不是不大合适,而且想用matlab控制,matlab读串口,程序只要出错,串口就锁死,好麻烦,不知道楼主碰见过没有。

jasen74 发表于 2007-11-24 14:48:56

录音机的小电机!转速不够快!响应特性不好!最关键没比较准而快的测速装置!我用的电机二手还要160元的双编码盘电机!
24ms测到33个脉冲!可以在图中看到很快就起动!时间400ms已稳定!

feiyue 发表于 2007-11-24 15:46:57

几个参数是如何得到的?

jasen74 发表于 2007-11-24 21:10:38

从资料中推算!也有参数归一法!
请问【34楼】 KuJJ
积分:6
派别:
等级:------
来自:
怎么调用matlab的串口通信?

feiyue 发表于 2007-11-27 13:46:47

正在搞PID控制,研究一下!

chendaon 发表于 2007-11-27 13:51:05

有空研究

feng6543210 发表于 2007-11-27 16:10:25

牛逼,厉害,顶

KuJJ 发表于 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主要就这些常见串口命令了,如有不足,各位补充

jasen74 发表于 2007-11-27 19:43:09

谢谢KuJJ!matlab还有更强的功能!作控制界面demo模块中有该功能!

jasen74 发表于 2007-12-4 12:37:07

已发表模糊PID的贴了!大家有兴趣看一看!(模糊PID应用)

jasen74 发表于 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积分时间

dxjk 发表于 2007-12-7 04:59:36

强,学习中,谢谢

LQH32316812 发表于 2007-12-7 14:27:52

厉害,学习一下!

microcon 发表于 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*(long)kp + integral.l*(long)ki +
         (long)mvelocity*(long)kd;   


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

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

ypid.b = ypid.b;   // Shift PID result right to
ypid.b = ypid.b;   // get upper 16 bits.

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

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

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

jasen74 发表于 2007-12-7 22:21:10

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

jasen74 发表于 2007-12-7 22:38:11

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

flyunlimit 发表于 2007-12-7 23:03:58

强贴,留名。学的是自动化,可是还是看不懂,没好好学啊!光把单片机学好也不行啊!

dgdzov 发表于 2007-12-8 09:23:21

一直都想搞PID,市面上的书都没有个具体的示例,顶。。。。。。

dgdzov 发表于 2007-12-8 09:38:14

楼主,有空写一篇使用PID入门级别的文档吧,毕竟你现在理论和实践都有。
市面上的书籍都是讲通篇的大理论,没有使用价值。也不知道怎么用到实际的项目上来。

jasen74 发表于 2007-12-8 09:39:17

最好就用matlab来做仿真,用程度做个控制对象!画波形曲线,在先进PID书中有相应的程序.或sumilink 做个电机模型或找出电机模块再把你的程序做成模块在sumilink中仿真看波形跟真实差不多!

jasen74 发表于 2007-12-8 10:49:33

好文共享!贴为(VB常用算法),希望对大家以后编程有用处!

frozenstar 发表于 2007-12-30 03:43:15

up!

highnose 发表于 2007-12-30 11:20:32

楼主能搞一个 “PID的恒温装置” 来普及一下PID嘛?好多书上都用这个例子,但只是很浅的说说。

强烈请求楼主

astankvai 发表于 2007-12-30 12:10:42

呵呵,PID算法好理解,关键是执行机构要得力。这是我做PID控制的感受,不知道大家的感觉怎么样?

bigflower 发表于 2008-1-6 18:15:30

正在研究PID调速,对于搞电子的人难点就是:
怎么把PID的输入/输出量与PWM的占空比联系起来

dreampet 发表于 2008-1-6 19:12:50

不错,正在准备智能车比赛,留个记号

lvhaian 发表于 2008-1-6 19:41:44

好贴要顶

kaif_w 发表于 2008-1-6 20:36:05

狂顶一下!!!

our_avr 发表于 2008-1-7 15:05:16

做个记号

jasen74 发表于 2008-1-7 19:53:07

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

nomoneyiv 发表于 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;
}

joson 发表于 2008-1-8 15:54:26

好文啊,怎么能不顶啊。

zxq6 发表于 2008-1-8 16:51:13

谢谢楼主,收藏了。

jasen74 发表于 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;
   }
}

eagle1979 发表于 2008-1-9 16:04:13

欢迎楼主继续开专贴阐述!

wqm8181 发表于 2008-1-9 16:14:15

自动化

wentao 发表于 2008-1-10 10:45:04

很好,谢谢

totoko163 发表于 2008-1-10 11:22:59

好文..

shaoshunda 发表于 2008-1-10 13:59:26

谢谢楼主,不顶不行啊。

enjoycy 发表于 2008-1-23 09:47:21

初学者之人, 多多指教

sctwp 发表于 2008-1-27 15:26:27

这东西在什么场合下应用广呢?据说这个比较难

yinyong75 发表于 2008-1-29 09:57:45

LZ,请问你什么时候毕业呀?有没有意向去处了?

jasen74 发表于 2008-1-29 19:36:04

本人2008毕业自动化专业。工作意想:智能控制,电子电力,从事自动化相关的公司!大家如果有何好的推荐!

gyroscope 发表于 2008-1-29 19:52:27

可以专攻电机控制~
无感无刷、无刷伺服、PMSM等~

jasen74 发表于 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

liuswallow 发表于 2008-1-29 22:16:02

做个标记

cds828 发表于 2008-6-7 13:48:09

谢谢,收藏先!

foggy 发表于 2008-6-7 16:23:21

同行的作品一定要顶

eaglelpx 发表于 2008-6-7 17:20:17

有没有控制温度的啊,我现在在弄温度的,以前没弄过,不知道怎么处理啊
希望能和你交流下MSN:eaglelpx@live.cn

kalo 发表于 2008-6-7 17:50:27

顶一顶!

duqinglin 发表于 2008-6-13 09:23:44

好贴

avr_appli 发表于 2008-8-13 08:23:01

mark

wisebaby 发表于 2008-8-13 08:41:18

谢谢

spy2008 发表于 2008-8-13 09:10:29

mark 学习

mrliuxiao 发表于 2008-8-28 15:28:55

顶!,多指教,俺也在搞这pid

indi 发表于 2008-8-28 16:11:06

mark

zldiy 发表于 2008-8-28 16:58:15

收藏了
谢谢
好的 资料正用到

spaceaky 发表于 2008-8-28 17:29:04

mark

caozhaojun 发表于 2008-8-29 00:38:12

帮顶,我现在正在研究PID控制,这个程序正好用于参考,多谢楼主啦

endlesslzx 发表于 2008-8-30 09:52:46

刚刚开始搞PID,记下慢慢研究

djl310 发表于 2008-8-30 10:44:17

感谢楼主

ylshu 发表于 2008-8-30 13:57:33

刚刚开始搞PID,记下慢慢研究 正好要用到
必须认真学习啊!!!!强顶!!!

llsenyue 发表于 2008-9-10 16:27:36

楼主~资料很平平学自动化的都知道而你的语气却。。。一直在强调有多少人看
(并不是攻击你的意思)

soco_da 发表于 2008-9-10 22:09:03

能否提供温度PID控制方式?

deepin 发表于 2009-4-22 16:26:22

电路可以看一下不?

lilolog 发表于 2009-4-22 18:36:22

马克一下
页: [1] 2 3
查看完整版本: 新型PID应用于电机闭环调速系统(初始版)