-- 作者: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_Md PID_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 c PID_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 ret PID_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 |
评论