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

📄 park.asm

📁 无刷直流电机的无传感器控制TI程序
💻 ASM
字号:
;===========================================================================
; File Name:	park.asm
;
; Module Name: 	PARK					      
;
; Initialization Routine: PARK_INIT
;
; Originator:	Digital Control Systems Group
;			Texas Instruments
;
; Description:	This transformation converts vectors in balanced 2-phase 
;		orthogonal stationary system into orthogonal rotating 
;		reference frame.
;
;			id = ialfa * cos_teta + ibeta * sin_teta
;			iq = -ialfa *sin_teta + ibeta * cos_teta
;
;			|~~~~~~~~~~~~~~~~~|
;	park_d	o------>|		  |----->o  park_D
;	park_q	o------>|      PARK	  |
;	theta_p	o------>|		  |----->o  park_Q
;			|_________________|
;
;	Note:	0 < theta_p < 7FFFh   (i.e. equivalent to   0 < theta_p < 360 deg  )
;
;
;
; Target dependency:	C2xx core only
;
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 9-15-2000	Release	Rev 1.0	
;===========================================================================
;(To use this Module, copy this section to main system file)
;		.ref	PARK, PARK_INIT					;function call
;		.ref	park_d, park_q, theta_p				;Inputs
;		.ref	park_D, park_Q					;Outputs
;===========================================================================
;Module definitions for external reference.
		.def	PARK, PARK_INIT					;function call
		.def	park_d, park_q, theta_p				;Inputs
		.def	park_D, park_Q					;Outputs
;===========================================================================
;Options
;--------
High_precision	.set	0	;Set to 1 for High prec / Set to 0 for low prec

;===========================================================================
		
		.ref	SINTAB_360


park_d		.usect "park",1
park_q		.usect "park",1
theta_p		.usect "park",1
park_D		.usect "park",1
park_Q		.usect "park",1
t_ptr		.usect "park",1
ip_val		.usect "park",1
cos_theta	.usect "park",1
sin_theta	.usect "park",1
nxt_entry	.usect "park",1
delta_angle	.usect "park",1
GPR0_park	.usect "park",1

;=====================================================================
PARK_INIT: 
;=====================================================================
		RET


;=====================================================================
PARK: 
;=====================================================================
;Calculate Cos(theta_p)
;--- High_precision option -------
	.if (High_precision)
	;Higher precision using look-up + interpolation method

		ldp	#theta_p
		LACC	theta_p
		ADD	#8192		;add 90 deg, i.e. COS(A)=SIN(A+90)
		AND	#07FFFh 	;Force positive wrap-around
		SACL	GPR0_park		;here 90 deg = 7FFFh/4
		LACC	GPR0_park,9

		SACH	t_ptr		;Table pointer
		SFR			;Convert Interpolation value(ip_val) to Q15
		AND	#07FFFh 	;Force ip_val to a positive number
		SACL	ip_val
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	cos_theta	;cos_theta = Cos(theta) in Q15
		ADD	#1h		;Inc Table pointer
		TBLR	nxt_entry	;Get next entry i.e. (Entry + 1)
		LACC	nxt_entry
		SUB	cos_theta	;Find Delta of 2 points
		SACL	delta_angle
		LT	delta_angle
		MPY	ip_val		;ip_val = interpolation value
		PAC
		SACH	ip_val,1
		LACC	ip_val
		ADD	cos_theta
		SACL	cos_theta	;cos_theta = Final interpolated value
	.endif
;-----------------------------------

;--- Normal precision option -------
	.if (High_precision != 1)
	;Normal precision with simple 256 word look-up

		ldp	#theta_p
		LACC	theta_p
		ADD	#8192		;add 90 deg, i.e. COS(A)=SIN(A+90)
		AND	#07FFFh 	;Force positive wrap-around
		SACL	GPR0_park		;here 90 deg = 7FFFh/4
		LACC	GPR0_park,9
		SACH	t_ptr
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	cos_theta	;cos_theta = Cos(theta_p) in Q15
	.endif
;-----------------------------------

;Calculate Sin(theta_p)
;--- High_precision option -------
	.if (High_precision)
	;Higher precision using look-up + interpolation method

		LACC	theta_p,9
		SACH	t_ptr		;Table pointer
		SFR			;Convert Interpolation value(ip_val) to Q15
		AND	#07FFFh 	;Force ip_val to a positive number
		SACL	ip_val
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	sin_theta	;sin_theta = Sin(theta) in Q15
		ADD	#1h		;Inc Table pointer
		TBLR	nxt_entry	;Get next entry i.e. (Entry + 1)
		LACC	nxt_entry
		SUB	sin_theta	;Find Delta of 2 points
		SACL	delta_angle
		LT	delta_angle
		MPY	ip_val		;ip_val = interpolation value
		PAC
		SACH	ip_val,1
		LACC	ip_val
		ADD	sin_theta
		SACL	sin_theta	;sin_theta = Final interpolated value
	.endif
;-----------------------------------

;--- Normal precision option -------
	.if (High_precision != 1)
	;Lower precision simple 256 word look-up
		LACC	theta_p,9
		SACH	t_ptr
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	sin_theta	;sin_theta = Sin(theta_p) in Q15
	.endif
;-----------------------------------

;Calculate the Park transform
		SPM	1		; SPM set for Q15 multiplication        
		ZAC			; Reset accumulator
		LT	park_q     	; TREG = ibeta
		MPY	sin_theta   	; PREG = ibeta * sin_teta
		LTA	park_d     	; ACC = ibeta * sin_teta and TREG = ialfa 
		MPY	cos_theta   	; PREG = ialfa * cos_teta
		MPYA	sin_theta   	; ACC = ibeta*sin_teta + ialfa*cos_teta and PREG=ialfa*sin_teta
		SACH	park_D		; id = ialfa * cos_teta + ibeta * sin_teta        
	
		LACC	#0          	; Clear ACC
		LT	park_q     	; TREG = ibeta
		MPYS	cos_theta   	; ACC = -ialfa*sin_teta and PREG = ibeta*cos_teta
		APAC              	; ACC = -ialfa *sin_teta + ibeta * cos_teta
		SACH	park_Q      ; iq = -ialfa *sin_teta + ibeta * cos_teta
		SPM	0           ; SPM reset
		RET    



⌨️ 快捷键说明

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