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

📄 park.asm

📁 DSP关于F2407的实例程序
💻 ASM
字号:
;=====================================================================
; Filename	: 	PARK.asm
; Module Name	: 	PARK			      
; Description:	PARK变换
;	ISM0 = Ialfa0 * cos_PARK_Theta + Ibeta0 * sin_PARK_Theta
;	IST0 = Ibeta0 * cos_PARK_Theta - Ialfa0 * sin_PARK_Theta
;	PARK_Theta = ThetaS1 + OmigaS1 * Tpwm
;
;				|~~~~~~~~~~~~~~~|
;	alfa0(Q11)	o---->	|		|----->o  ISM0(Q11)
;	Ibeta0(Q11)	o---->	|      PARK	|
;	PARK_Theta	o---->	|		|----->o  IST0(Q11)
;				|______________	|
;
; Note: 0 < PARK_Theta < 7FFFh   (i.e. equivalent to 0 < PARK_Theta < 360 deg)
; Modify: 2004.6.16
;=====================================================================
		.include "f2407.h"
		.global	SINTAB_360				;sin table		
		.global	PARK,PARK_INIT				;function call
		.global	PDPINTA_INIT
		
		.global	Ialfa0,Ibeta0,PARK_Theta		;Inputs
		.global	ISM0,IST0,IST1,IST2			;Outputs
		.global TEMP
		.global Tpwm,ThetaS1,OmigaS1
		.global	t_ptr,ip_val,cos_PARK_Theta,sin_PARK_Theta,nxt_entry,delta_angle ;计算sin,cos时所用到变量
;=================================================================
PARK_INIT: 
;=================================================================	
		LDP	#DP_DATA
		SPLK	#0,OmigaS1
		SPLK	#16384,Tpwm	;Tpwm=0.2mS(Q15)
		RET	
;=================================================================
PARK: 
;=================================================================
		SETC	SXM					; Sign extension mode
		SPM	1
;-----------------------------------------------------------------
;Calculate PARK_Theta
;PARK_Theta = ThetaS1 + OmigaS1 * Tpwm
		LDP	#DP_DATA
		LT	OmigaS1
		MPY	Tpwm
		SPH	TEMP
		LACC	TEMP
		ADD	ThetaS1
		AND	#7FFFH
		SACL	PARK_Theta		
;-----------------------------------------------------------------	
;Calculate Sin(PARK_Theta) using look-up + interpolation method
		LDP	#DP_DATA
		
		LACC	PARK_Theta,9
		SACH	t_ptr			;Table pointer = PARK_Theta * 256 /0x7FFFH
		
		SFR				;Convert Interpolation value(ip_val) to Q15
		AND	#07FFFh 		;Force ip_val to a positive number
		SACL	ip_val			;ip_val存插值,Q15带符号数,这里是巧妙的地方,好好理解!
		
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	sin_PARK_Theta		;sin_PARK_Theta = Sin(PARK_Theta) in Q15
		ADD	#1h			;Inc Table pointer
		TBLR	nxt_entry		;Get next entry i.e. (Entry + 1)
		LACC	nxt_entry
		SUB	sin_PARK_Theta		;Find Delta of 2 points
		SACL	delta_angle
		LT	delta_angle
		MPY	ip_val			;ip_val = interpolation value
		PAC
		
		SACH	ip_val			;PM=1,去掉了一个符号位。ip_val和sin_PARK_Theta同Q格式。
		LACC	ip_val
		ADD	sin_PARK_Theta
		SACL	sin_PARK_Theta		;最终结果,Q15	
;-----------------------------------------------------------------
;Calculate Cos(PARK_Theta) using look-up + interpolation method
		LACC	PARK_Theta
		ADD	#8192			;COS(A)=SIN(A+90)
		AND	#7FFFH			;A+90>360时取低15位,相当于减去360。
		SACL	TEMP
		
		LACC	TEMP,9
		SACH	t_ptr			;Table pointer = PARK_Theta * 256 /0x7FFFH
		
		SFR
		AND	#7FFFH			;求差值
		SACL	ip_val
		
		LACC	#SINTAB_360
		ADD	t_ptr
		TBLR	cos_PARK_Theta		
		ADD	#1
		TBLR	nxt_entry
		LACC	nxt_entry
		SUB	cos_PARK_Theta		;差值,不一定正负。
		SACL	delta_angle
		LT	delta_angle		;Q15
		MPY	ip_val
		PAC				
		SACH	ip_val			;因为delta_angle是Q15格式,PM=1,ip_val和sin_PARK_Theta同Q格式。
		
		LACC	ip_val
		ADD	cos_PARK_Theta		;由cos的性质,相加不会溢出。
		SACL	cos_PARK_Theta		;最终结果,Q15		
;-----------------------------------------------------------------
; Calculate the Park transform 
; 根据matlab计算,ISM0、IST0和Ialfa0、Ibeta0同量纲。
; ISM0 = Ialfa0 * cos_PARK_Theta + Ibeta0 * sin_PARK_Theta
		LT	cos_PARK_Theta
		MPY	Ialfa0
		PAC
		LT	sin_PARK_Theta
		MPY	Ibeta0
		APAC			;不会溢出
		SACH	ISM0		;ISM0结果(Q11)
;		LACC	ISM0  
;		ADD	#200
;		BCND	IST_CAL,GEQ
;		B	PDPINTA_INIT	;ISM0为负时不正常,保护。
; IST0 = Ibeta0 * cos_PARK_Theta - Ialfa0 * sin_PARK_Theta
IST_CAL:	
		;SETC	SXM
;		LDP	#DP_DATA
;		LACC	IST2
;		SACL	IST1			;IST0->IST1存上一次结果。
		
		LT	cos_PARK_Theta
		MPY	Ibeta0
		PAC
		LT	sin_PARK_Theta
		MPY	Ialfa0
		SPAC			;不会溢出
		SACH	IST0		;IST0结果(Q11)
		
		SACH	IST2
;		LACC	IST2
;		SUB	IST1
;		ABS
;		SUB	#8000			;还是不行,8000的话,闭环计算还是有问题。看来不能这样滤波。
;		BCND	IST_ENDCAL,LT		;前后两个采样差值超过8000,则进行高频尖刺滤波。
;		LACC	IST1
;		SACL	IST2			;滤波,把前一次值当成当前值。
		
;		LACC	IST0  
;		ADD	#200
;		BCND	IST_ENDCAL,GEQ
;		B	PDPINTA_INIT	;IST0为负时不正常,保护。
;--------------------------------------------------------------------
IST_ENDCAL:
		SPM	0	; SPM reset
		RET

⌨️ 快捷键说明

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