⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid_reg1.asm

📁 变频器程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=====================================================================================
; File name:        PID_REG1.ASM                     
;                    
; Originator:	Digital Control Systems Group
;			Texas Instruments
;
; Description:                                 
; PID Controller
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 9-15-2000	Release	Rev 1.0
;================================================================================
; Applicability: F240,F241,C242,F243,F24xx.  (Peripheral Independent).
;================================================================================
; Routine Name: pid_reg1_calc   					    Type: C Callable
;  
;  C prototype : void pid_reg1_calc(struct PIDREG1 *p);
;
;        The struct object is defined in the header file "pid_reg1.h" as follows:
;
; typedef struct 	{ int  pid_ref_reg1; 	/* Input: Reference input (Q15) */
;				  	  int  pid_fb_reg1;	 	/* Input: Feedback input (Q15) */
;				  	  int  Kp_reg1;			/* Parameter: Proportional gain (Q15) */			
;				  	  int  Ki_high_reg1;	/* Parameter: Integral gain (Q31) */
;				  	  int  Ki_low_reg1; 	/* Parameter: Integral gain (Q31) */		
;				  	  int  Kd_reg1;			/* Parameter: Derivative gain (Q15) */					  
;				  	  int  pid_out_max;		/* Parameter: Maximum PID output (Q15) */
;				  	  int  pid_out_min;		/* Parameter: Minimum PID output (Q15) */				 
;				  	  int  pid_e1_reg1;		/* History: Previous error at time = k-1 (Q15) */
;				  	  int  pid_e2_reg1;		/* History: Previous error at time = k-2 (Q15) */
;				  	  int  pid_out_reg1;	/* Output: PID output (Q15) */
;		  	  	  	  int  (*calc)();	/* Pointer to calculation function */ 
;					} PIDREG1;	                   
;	 		 
;        Frame Usage Details:
;     step   |      a      |      b       |      c       |     d     
;____________|_____________|______________|______________|_____________
;     FR0  	 |  sign_reg1  |              | 			 |     
;     FR1  	 | abs_e0_reg1 |              | 			 |     
;     FR2  	 | K0_low_reg1 |tmp2_low_reg1 |              |      	 	
;     FR3  	 | K0_high_reg1|tmp2_high_reg1|              |     
;     FR4  	 |   K1_reg1   |              |              |     
;
;
;================================================================================
                .def        _pid_reg1_calc
;================================================================================
__pid_reg1_calc_framesize .set 0005h
;================================================================================
_pid_reg1_calc:
 													; Assume now ARP=AR1
     	POPD	*+									; Keep return address
       	SAR  	AR0,*+								; Keep old frame pointer (FP)
       	SAR   	AR1,*								; Keep old stack pointer (SP)
       	LARK  	AR0,__pid_reg1_calc_framesize 			; Load AR0 with frame size	
       	LAR   	AR0,*0+,AR0							; AR0->FP0 (new FP), ARP=AR0

;================================================================================
		SBRK	#3		; ARP=AR0, AR0->FR0-3 (1st argument)		
;----------------------------------------------------------------------------------
		LAR		AR2,*	; ARP=AR0, AR0->pid_ref_reg1, AR2->pid_ref_reg1			
;----------------------------------------------------------------------------------
		ADRK	#3		; ARP=AR0, AR0->FR0, AR2->pid_ref_reg1 
;----------------------------------------------------------------------------------
		MAR		*,AR2  	; ARP=AR2, AR0->FR0, AR2->pid_ref_reg1
;----------------------------------------------------------------------------------
		SETC 	SXM		; Turn sign extension mode on
						; ARP=AR2, AR0->FR0, AR2->pid_ref_reg1
;----------------------------------------------------------------------------------
		SETC	OVM		; Set overflow mode
						; ARP=AR2, AR0->FR0, AR2->pid_ref_reg1
;----------------------------------------------------------------------------------
 		SPM     0       ; Reset product mode
       					; ARP=AR2, AR0->FR0, AR2->pid_ref_reg1 
;----------------------------------------------------------------------------------
      	LACC	*+		; ACC = pid_ref_reg1  (Q15)
      					; ARP=AR2, AR0->FR0, AR2->pid_fb_reg1
;----------------------------------------------------------------------------------
        SUB		*+,AR0	; ACC = pid_ref_reg1 - pid_fb_reg1 (Q15)
        				; ARP=AR2, AR0->FR0, AR2->Kp_reg1, ARP=AR0
;----------------------------------------------------------------------------------
		SACL	*+		; FR0=sign_reg1(pid_e0_reg1)=pid_ref_reg1-pid_fb_reg1 (Q15) 
						; ARP=AR0, AR0->FR1, AR2->Kp_reg1
;----------------------------------------------------------------------------------
		ABS				; ACC = |pid_ref_reg1 - pid_fb_reg1|  (Q15)
						; ARP=AR0, AR0->FR1, AR2->Kp_reg1
;----------------------------------------------------------------------------------
		SACL	*+,AR2	; FR1 = abs_e0_reg1 = |pid_ref_reg1 - pid_fb_reg1| (Q15) 
						; ARP=AR0, AR0->FR2, AR2->Kp_reg, ARP=AR2
;----------------------------------------------------------------------------------
		ADRK	#1		; ARP=AR2, AR0->FR2, AR2->Ki_high_reg1 
;----------------------------------------------------------------------------------
        LACC	*+,16	; ACC high = Ki_high_reg1  (Q31)
        				; ARP=AR2, AR0->FR2, AR2->Ki_low_reg1
;----------------------------------------------------------------------------------
        ADDS	*+		; ACC = Ki_high_reg1 + Ki_low_reg1  (Q31)
        				; ARP=AR2, AR0->FR2, AR2->Kd_reg1
;----------------------------------------------------------------------------------
		ADD		*,16	; ACC = Ki + Kd	 (Q31)		
                        ; ARP=AR2, AR0->FR2, AR2->Kd_reg1
;----------------------------------------------------------------------------------		
		SBRK	#3		; ARP=AR2, AR0->FR2, AR2->Kp_reg1	
;----------------------------------------------------------------------------------
        ADD		*,16,AR0 ; ACC = Kp + Ki + Kd (Q31)
        				; ARP=AR2, AR0->FR2, AR2->Kp_reg1, ARP=AR0
;----------------------------------------------------------------------------------
		SACL	*+		; FR2 = K0_low_reg1 = Kp + Ki + Kd (Q31)
						; ARP=AR0, AR0->FR3, AR2->Kp_reg1
;----------------------------------------------------------------------------------
		SACH	*+,AR2	; FR3 = K0_high_reg1 = Kp + Ki + Kd (Q31)
						; ARP=AR0, AR0->FR4, AR2->Kp_reg1, ARP=AR2
;----------------------------------------------------------------------------------
       	ADRK	#3		; ARP=AR2, AR0->FR4, AR2->Kd_reg1 
;----------------------------------------------------------------------------------
		LACC	*,16	; ACC = Kd_reg1	 (Q15)
					    ; ARP=AR2, AR0->FR4, AR2->Kd_reg1
;----------------------------------------------------------------------------------
        SFL				; ACC = 2*Kd_reg1  (Q15)
        				; ARP=AR2, AR0->FR4, AR2->Kd_reg1
;----------------------------------------------------------------------------------
       	SBRK	#3		; ARP=AR2, AR0->FR4, AR2->Kp_reg1
;----------------------------------------------------------------------------------
        ADD		*,16,AR0 ; ACC = 2*Kd_reg1 + Kp_reg1  (Q15)
        				; ARP=AR2, AR0->FR4, AR2->Kp_reg1, ARP=AR0
;----------------------------------------------------------------------------------
  		SACH	*		; FR4 = K1_reg1 = 2*Kd_reg1 + Kp_reg1  (Q15)
  						; ARP=AR0, AR0->FR4, AR2->Kp_reg1
;----------------------------------------------------------------------------------
        SBRK	#3		; ARP=AR0, AR0->FR1, AR2->Kp_reg1
;----------------------------------------------------------------------------------
       	LT		*+		; TREG = abs_e0_reg1  (Q15)
       					; ARP=AR0, AR0->FR2, AR2->Kp_reg1		
;----------------------------------------------------------------------------------
        MPYU	*		; PREG = abs_e0_reg1*K0_low_reg1
                        ; ARP=AR0, AR0->FR2, AR2->Kp_reg1
;----------------------------------------------------------------------------------
        SPH		*+		; FR2 = tmp2_low_reg1
        				; ARP=AR0, AR0->FR3, AR2->Kp_reg1	
;----------------------------------------------------------------------------------
     	MPYU	*-		; PREG = abs_e0_reg1*K0_high_reg1
     	                ; ARP=AR0, AR0->FR2, AR2->Kp_reg1
;----------------------------------------------------------------------------------
      	PAC				; ACC = abs_e0_reg1*K0_high_reg1
     	                ; ARP=AR0, AR0->FR2, AR2->Kp_reg1
;----------------------------------------------------------------------------------
		ADDS	*+		; ACC = abs_e0_reg1*K0_high_reg1 + tmp2_low_reg1
				        ; ARP=AR0, AR0->FR3, AR2->Kp_reg1
;----------------------------------------------------------------------------------
       	SACH	*-,1	; FR3 = tmp2_high_reg1 = abs_e0_reg1*K0	(Q31)
       	                ; ARP=AR0, AR0->FR2, AR2->Kp_reg1
;----------------------------------------------------------------------------------
     	SACL	*,1		; FR2 = tmp2_low_reg1 = abs_e0_reg1*K0	(Q31)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -