正文

PID算法  C512006-05-05 15:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/13583.html

分享到:

典型的PID处理程序(C51)(可改为061的) --  作者:mojixing--  发布时间:2004-8-25 17:06:00--  什么是PID算法啊? --  作者:robot4359--  发布时间:2004-8-25 17:30:00--   PID是比例、积分、微分三个词语的英文缩写,PID运算用于自动控制中。 当设定值和实际值不一样时,对误差进行PID运算,运算结果输入到执行器。 这里给的是数字PID运算。 详细的东西可以看一下自动化仪表中的控制器部分 --  作者:powerint--  发布时间:2004-8-30 21:08:00--   ;//**************************************************************************************************************;//功    能: 电机控制的PID(积分分离)  PID(void)    执行时间少于70uS/932-12MHz;//设 计 者: 牟联树;//日    期: 2003.12.28;//版 本 号: 1.0;//申    明: ;//**************************************************************************************************************$NOMOD51    OCRAH  equ 0EFh    OCRAL  equ 0EEh    OCRBH  equ 0FBh    OCRBL  equ 0FAh    OCRCH  equ 0FDh    OCRCL  equ 0FCh    OCRDH  equ 0FFh    OCRDL  equ 0FEh    TCR21  equ 0f9h$include (REG52.INC)       NAME       PIDWork    ?PR?PID?PIDWork     SEGMENT    CODE    ?PR?PID_MUL?PIDWork SEGMENT    CODE    ?PR?PID_out?PIDWork SEGMENT    CODE    ?DT?PID_k?PIDWork   SEGMENT    DATA     PUBLIC   PID_Kp,PID_Ki,PID_Kd,PID_Umax,PID_Emax    PUBLIC   PID_U,PID_En1,PID_En2,PID_Temp,PID_TempL   RSEG  ?DT?PID_k?PIDWork     PID_Kp:  DS   2                    ;比例系数     PID_KpL  data PID_Kp+1     PID_Ki:  DS   2                    ;积分系数     PID_KiL  data PID_Ki+1     PID_Kd:  DS   2                    ;微分系数     PID_KdL  data PID_Kd+1                PID_Umax:  DS   2                    ;期望最大值设定   PID_UmaxL  data PID_Umax+1              PID_Emax:  DS   2                    ;积分分离的误差最大值设定   PID_EmaxL  data PID_Emax+1      PID_U:  DS   2                    ;当前的采样值      PID_UL  data PID_U+1    PID_En1:  DS   2                    ;上一次计算的误差值    PID_En1L  data PID_En1+1    PID_En2:  DS   2                    ;上一次计算的误差的误差值    PID_En2L  data PID_En2+1   PID_Temp:  DS   4                    ;计算过程中的暂存   PID_TempL  data PID_Temp+1   PID_Temp1  data PID_Temp+2  PID_Temp1L  data PID_Temp+3    PUBLIC  _PID   RSEG  ?PR?PID?PIDWork   _PID: push  acc         push  psw  clr   c                        ;有符号减法         mov   a,PID_UmaxL              ;计算当前的误差En(PID_U里暂存运算结果)         subb  a,PID_UL         mov   PID_UL,a  mov   a,PID_Umax         subb  a,PID_U         mov   PID_U,a  jnb   acc.7,PID_k         mov   a,PID_UL  cpl   a  add   a,#1  mov   r7,a  mov   a,PID_U  cpl   a  addc  a,#0  xch   a,r7         sjmp  PID_g  PID_k: mov   r7,PID_U         mov   a,PID_UL  PID_g: clr   c  subb  a,PID_EmaxL  mov   a,r7         subb  a,PID_Emax         jnb   acc.7,PID_a              ;如果En>Emax则转  mov   r7,PID_KiL               ;Ki*En         mov   r6,PID_Ki  mov   r5,PID_UL          mov   r4,PID_U  acall PID_MUL                  ;二字节伪有符号乘法(r4-r7里暂存结果)  mov   a,PID_Temp1L             ;PID加法子程序(将结果加入输出)  add   a,r7  mov   PID_Temp1L,a         mov   a,PID_Temp1         addc  a,r6  mov   PID_Temp1,a         mov   a,PID_TempL         addc  a,r5  mov   PID_TempL,a         mov   a,PID_Temp         addc  a,r4  mov   PID_Temp,a  PID_a: mov   a,PID_En1L               ;更新PID_En1         xch   a,PID_UL  mov   PID_En1L,a  mov   a,PID_En1  xch   a,PID_U  mov   PID_En1,a  clr   c                        ;有符号减法         mov   a,PID_En1L               ;计算当前的误差差(En-En1)         subb  a,PID_UL  mov   PID_UL,a  mov   a,PID_En1  subb  a,PID_U  mov   PID_U,a         mov   r7,PID_KpL               ;+Kp*(En-En1)  mov   r6,PID_Kp  mov   r5,PID_UL          mov   r4,PID_U  acall PID_MUL  mov   a,PID_Temp1L             ;PID加法子程序(将结果加入输出)  add   a,r7  mov   PID_Temp1L,a         mov   a,PID_Temp1         addc  a,r6  mov   PID_Temp1,a         mov   a,PID_TempL         addc  a,r5  mov   PID_TempL,a         mov   a,PID_Temp         addc  a,r4  mov   PID_Temp,a  clr   c                        ;有符号减法         mov   a,PID_UL                 ;计算误差差的差(En-En1-En2),同时更新En2  subb  a,PID_En2L  mov   PID_En2L,a         mov   a,PID_U  subb  a,PID_En2  mov   PID_En2,a         mov   r7,PID_KdL               ;+Kd*(En-En1-En2)         mov   r6,PID_Kd  mov   r5,PID_En2L          mov   r4,PID_En2         acall PID_MUL  mov   a,PID_Temp1L             ;PID加法子程序(将结果加入输出)  add   a,r7  mov   PID_Temp1L,a         mov   a,PID_Temp1         addc  a,r6  mov   PID_Temp1,a         mov   a,PID_TempL         addc  a,r5  mov   PID_TempL,a         mov   a,PID_Temp         addc  a,r4  mov   PID_Temp,a  pop   psw  pop   acc  ret  ret;//**************************************************************************************************************;//功    能: 电机控制电流环的PI  PI_I(void)    执行时间少于50uS/932-12MHz;//设 计 者: 牟联树;//日    期: 2003.12.28;//版 本 号: 1.0;//申    明: ;//**************************************************************************************************************       PUBLIC _PID_out       RSEG ?PR?PID_out?PIDWork_PID_out: push acc          push psw   clr  c          mov  a,r6          rrc  a          mov  r6,a          mov  a,r7          rrc  a          mov  r7,a   out_a: mov  OCRAH,r6               ;PWM更新          mov  OCRAL,r7          mov  a,r7          add  a,#25          mov  OCRBL,a          mov  a,r6          addc a,#0          mov  OCRBH,a          orl  TCR21,#080h            ;PWM更新   out_b: pop  psw   pop  acc          ret;//**************************************************************************************************************;//功    能: 整形乘法  long int PID_MUL(int a,int b)    用时13.5uS/932-12MHz;//设 计 者: 牟联树;//日    期: 2003.12.28;//版 本 号: 1.0;//申    明: ;//**************************************************************************************************************  PUBLIC _PID_MUL  RSEG ?PR?PID_MUL?PIDWork_PID_MUL:PID_MUL: push acc         push psw         clr  f0                        ;符号判断         mov  a,r4         jb   acc.7,PID_Ma         sjmp PID_MdPID_Ma: setb f0         mov  a,r5         cpl  a  add  a,#1         mov  r5,a         mov  a,r4         cpl  a  addc a,#0         mov  r4,a        PID_Md:; mov  a,r6        ; mov  c,acc.7         ;jnb  f0,PID_Mf        ; cpl  cPID_Mf:; mov  f0,c        ; jb   acc.7,PID_Mb        ; sjmp PID_Mc       PID_Mb:; clr  c        ; mov  a,r7        ; subb a,#1        ; cpl  a        ; mov  r7,a        ; mov  a,r6        ; subb a,#0        ; cpl  a        ; mov  r6,a PID_Mc: mov  a,r5         mov  b,r7         mul  ab         xch  a,r7  mov  r3,b  mov  b,r4  mul  ab  add  a,r3         mov  r3,a         mov  a,b  addc a,#0  xch  a,r5  mov  b,r6  mul  ab  addc a,r3  xch  a,r6  xch  a,r5  addc a,b  xch  a,r5  mov  b,r4  mul  ab  addc a,r5  mov  r5,a  mov  a,b  addc a,#0  mov  r4,a         jb   f0,PID_Me         pop  psw  pop  acc    retPID_Me: mov  a,r7         cpl  a         add  a,#1         mov  r7,a         mov  a,r6         cpl  a         addc a,#0         mov  r6,a         mov  a,r5         cpl  a         addc a,#0         mov  r5,a         mov  a,r4         cpl  a         addc a,#0         mov  r4,a  pop  psw  pop  acc         ret         END  

阅读(9760) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册