PID控制的51汇编程序
2012-10-24
标签: PID


        ;//**************************************************************************************************************
        ;//功能: 电机控制的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)
        NAMEPIDWork
        ?PR?PID?PIDWorkSEGMENTCODE
        ?PR?PID_MUL?PIDWork SEGMENTCODE
        ?PR?PID_out?PIDWork SEGMENTCODE
        ?DT?PID_k?PIDWorkSEGMENTDATA
        PUBLICPID_Kp,PID_Ki,PID_Kd,PID_Umax,PID_Emax
        PUBLICPID_U,PID_En1,PID_En2,PID_Temp,PID_TempL
        RSEG?DT?PID_k?PIDWork
PID_Kp: DS2            ;比例系数
        PID_KpLdata PID_Kp+1
PID_Ki: DS2            ;积分系数
        PID_KiLdata PID_Ki+1
PID_Kd: DS2            ;微分系数
        PID_KdLdata PID_Kd+1
PID_Umax:
        
        
        DS2            ;期望最大值设定
        PID_UmaxLdata PID_Umax+1
PID_Emax:
        
        
        DS2            ;积分分离的误差最大值设定
        PID_EmaxLdata PID_Emax+1
PID_U:  DS2            ;当前的采样值
        PID_ULdata PID_U+1
PID_En1:DS2            ;上一次计算的误差值
        PID_En1Ldata PID_En1+1
PID_En2:DS2            ;上一次计算的误差的误差值
        PID_En2Ldata PID_En2+1
PID_Temp:
        
        
        DS4            ;计算过程中的暂存
        PID_TempLdata PID_Temp+1
        PID_Temp1data PID_Temp+2
        PID_Temp1Ldata 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
        
        ;//**************************************************************************************************************
        ;//功能: 电机控制电流环的PIPI_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
        ; movc,acc.7
        ;jnbf0,PID_Mf
        ; cplc
PID_Mf: ;movf0,c
        ; jbacc.7,PID_Mb
        ; sjmp PID_Mc
PID_Mb: ;clrc
        ; mov a,r7
        ; subb a,#1
        ; cpla
        ; mov r7,a
        ; mov a,r6
        ; subb a,#0
        ; cpla
        ; 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
        


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号