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

📄 spwm.asm

📁 DSP的PWM波形程序,可用与TI公司的2407等DSP,用于电机控制
💻 ASM
字号:
FCL		 	.usect  	".data0",1			;保存载波频率浮点数的低位
FCH		 	.usect  	".data0",1			;保存载波频率浮点数的高位
FRL		 	.usect  	".data0",1			;保存信号频率浮点数的低位
FRH		 	.usect  	".data0",1			;保存信号频率浮点数的高位
AL		 	.usect  	".data0",1			;保存调谐度浮点数低位
AH		 	.usect  	".data0",1			;保存调谐度浮点数高位
N           	.usect  	".data0",1	   	 	;保存一个周期要输出的PWM脉冲个数
NL			.usect  	".data0",1			;保存一个周期要输出的PWM脉冲个数浮点数低位	
NH		 	.usect  	".data0",1			;保存一个周期要输出的PWM脉冲个数浮点数低位	
I		 	.usect  	".data0",1			;保存当前输出的是第几个脉冲
T3PR_TEMPL  	.usect 	".data0",1			;保存定时器3周期寄存器值的浮点数低位  
T3PR_TEMPH	.usect 	".data0",1			;保存定时器3周期寄存器值的浮点数高位  
DATIOL	     .usect 	".data0",1			;保存占空比浮点数低位
DATIOH       .usect 	".data0",1			;保存占空比浮点数低位
DFLAG		.usect  	".data0",1			;送出一个脉冲的标志寄存器
			.include  	"F2407REGS.H" 	;引用头部文件
			.ref 		F$$ITOF,F$$DIV,F$$MUL,F$$FTOI,F$$ADD,F$$LTOF,F$$SUB
			.ref	   	_sin
.def      _c_int0
;(1)建立中断向量表
       .sect	".vectors"				;定义主向量段
RSVECT		    B    _c_int0				;PM 0	Reset Vector	1
INT1	  		B    PHANTOM			;PM 2	Int level 1		4
INT2	  		B    GISR2				;PM 4	Int level 2		5
INT3	  		B    PHANTOM			;PM 6	Int level 3		6
INT4	  		B    PHANTOM			;PM 8	Int level 4		7
INT5	  		B    PHANTOM			;PM A	Int level 5		8
INT6	  		B    PHANTOM			;PM C	Int level 6		9
RESERVED    B    PHANTOM			;PM E	(Analysis Int)	10
SW_INT8     B    PHANTOM			;PM 10  	User S/W int	-
SW_INT9   	B    PHANTOM
SW_INT10   	B    PHANTOM
SW_INT11  	B    PHANTOM
SW_INT12  	B    PHANTOM
SW_INT13  	B    PHANTOM
SW_INT14  	B    PHANTOM
SW_INT15  	B    PHANTOM
SW_INT16  	B    PHANTOM
SW_INT17  	B    PHANTOM
SW_INT18  	B    PHANTOM
SW_INT19  	B    PHANTOM
SW_INT20  	B    PHANTOM
SW_INT21  	B    PHANTOM
SW_INT22  	B    PHANTOM
SW_INT23  	B    PHANTOM
SW_INT24  	B    PHANTOM
SW_INT25  	B    PHANTOM
SW_INT26  	B    PHANTOM
SW_INT27  	B    PHANTOM
SW_INT28  	B    PHANTOM
SW_INT29  	B    PHANTOM
SW_INT30  	B    PHANTOM
SW_INT31  	B    PHANTOM			;PM 3E  	User S/W int	-
;中断子向量入口定义pvecs
			.sect	".pvecs"				;定义子向量段
PVECTORS	B	PHANTOM			;Reserved pvector addr offset-0000h 
			B	PHANTOM			;Reserved pvector addr offset-0001h
			B	PHANTOM	        ;2
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	
			B	PHANTOM	  		
			B	PHANTOM			;Reserved pvector addr offset-002Eh
			B	T3GP_ISR				;Reserved pvector addr offset-002Fh  T3PINT中断
			B	PHANTOM			;Reserved pvector addr offset-0030h
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM	
  			B	PHANTOM
  			B	PHANTOM	
  			B	PHANTOM	
			B	PHANTOM			;Reserved pvector addr offset-0041h	
;(2)主程序
.text
_c_int0:    
     	CALL	SYSINIT				;调系统初始化子程序
CALL	PWM_INIT				;调PWM初始化子程序
        	LDP		#5
		SPLK		#2710H,FCL			;载波频率
		SPLK		#0,FCH
		SPLK		#032H,FRL			;信号频率
		SPLK		#0,FRH
SPLK		#3E8H,AL			;调谐度AL=A*1000
		SPLK		#0,AH
		SPLK		#0,I					;I=0
		SPLK		#1,DFLAG
        	CALL    JISUAN
LOOP:	LDP		#5
		BIT		DFLAG,BIT0
		BCND	LOOP,NTC
		LACL	DFLAG
		AND		#0FFFEH
		SACL	DFLAG
		CALL	DATIO
		B		LOOP
;(3)系统初始化程序
SYSINIT:	SETC		INTM 
		CLRC	CNF
		LDP		#0
		SPLK		#02h,IMR				;使能第1级中断2
		SPLK		#0FFFFh,IFR			;清第1级所有中断标志位
		LDP		#DP_PF1
		SPLK		#0E8h,WDCR			;禁止 WDT
		LDP 		#00E0H
SPLK 	#81FEH,SCSR1    		;CLKIN=6M,CLKOUT=24 M
RET	
;(4)EVB模块的PWM初始化程序
PWM_INIT:LDP		#DP_PF2
		LACL	MCRA
		OR		#07EH				;IOPE1~IOPE6 
		SACL	MCRC				;配置为特殊功能
		LACL	MCRC
		OR		#600h
		SACL	MCRC
		LDP		#DP_EVB
		SPLK		#0FFFFh,EVBIFRA		;清EVA的所有中断标志位
		SPLK		#0555h,ACTRB			;PWM6,4,2 为低,PWM5,3,1 为高
		SPLK		#00h,DBTCONB		;禁止死区控制
		SPLK		#1fh,CMPR4			;给比较寄存器赋初值
		SPLK		#2Fh,CMPR5
		SPLK		#3fh,CMPR6
		SPLK		#0960h,T3PR			;给周期寄存器赋初值
		LDP		#5
		SPLK		#0960h,T3PR_TEMPL
		SPLK		#0,T3PR_TEMPH
		LDP		#DP_EVB
		SPLK		#0A600h,COMCONB		;禁止比较功能
		SPLK		0,T3CNT
		SPLK		#41h,GPTCONB
		SPLK		#080h,EVBIMRA
		SPLK		#0000101101001110b,T3CON
		CLRC	INTM
		RET
;(5)将一些整数转换为浮点数子程序,得到计算占空比要用的常数
JISUAN:LDP		#5					;调谐度由整形转换为浮点
		LACL	AL
		LRLK    AR1,STACK	  		;设置 STACK指针
	 	SETC 	SXM	
CALL	F$$ITOF,AR1			;A=a×1000
CLRC	SXM
MAR		*-
LACC	*-,16
	 	ADDS	*
	 	SACL	AL
	 	SACH	AH 	
		LRLK	AR1,STACK			;A/2000=0.5 a
	 	SETC		SXM
	 	LACL	#0
	 	SACL	*+
		LACL	#44FAH				;44FA 0000h =2000
	 	SACL	*+
	 	LACL	AL
	 	SACL	*+
	 	LACL	AH
	 	SACL	*+
	 	CALL	F$$DIV
	 	MAR		*-
		LACC	*-,16
		ADDS	*
		SACL	AL
		SACH	AH
LACL	T3PR_TEMPL
LRLK    AR1,STACK
SETC 	SXM					;定时器周期寄存器
;的值转换为浮点数
CALL	F$$ITOF,AR1			
 	CLRC	SXM
 	MAR		*-
	 	LACC	*-,16
ADDS	*
SACL	T3PR_TEMPL
SACH	T3PR_TEMPH
	 	LACL	FCL					;FC值转换为浮点数
	 	LRLK    AR1,STACK 
	 	SETC 	SXM 	
	 	CALL	F$$LTOF,AR1
	 	CLRC	SXM
MAR		*-
		LACC	*-,16
 		ADDS	*
	 	SACL	FCL
	 	SACH	FCH
LACL	FRL
	 	LRLK    AR1,STACK
	 	SETC 	SXM		  			;FR值转换为浮点数
	 	CALL	F$$ITOF,AR1
	 	CLRC	SXM
		MAR		*-
	 	LACC	*-,16
	 	ADDS	*
	 	SACL	FRL
	 	SACH	FRH
	 	LRLK    AR1,STACK			;N=FC/FR
	 	LACL	FRL
		SACL	*+
		LACL	FRH
		SACL	*+
		LACL	FCL
		SACL	*+
		LACL	FCH
		SACL	*+
		CALL	F$$DIV
		MAR		*-
		LACC	*-,16
		ADDS	*
		SACL	NL
		SACH	NH					;N的浮点数
		LRLK    AR1,STACK
		SETC 	SXM
		SACL	*+
		SACH	*+
		CALL	F$$FTOI
	 	SACL	N					;N的整数
	 	LRLK	AR1,STACK
	 	SACL	*+
		LACL	NH
	 	SACL	*+
	 	LACL	#0F5C3H				;40C8F5C3h=6.282=2×3.141
	 	SACL	*+
	 	LACL	#40C8H
	 	SACL	*+
	 	CALL	F$$DIV
 MAR	*-
		LACC	*-,16
		ADDS	*
		SACL	NL
		SACH	NH
		RET
;(6)计算占空比子程序
DATIO:	LDP		#5
		LACL	I   					;I由整形转换为浮点数
		LRLK    AR1,STACK
		SETC		SXM
		CALL	F$$ITOF,AR1
		CLRC	SXM
	 	MAR		*-
	 	LACC	*-,16
	 	ADDS	*					;结果保存在 ACC
	 	LRLK	AR1,STACK			;i*2*3.14/N
	 	SACL	*+	
		SACH	*+
		LACL	NL
		SACL	*+
		LACL	NH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*
		LRLK    AR1,STACK			;sin(i*2*3.14/N)	
		SACL	*+
		SACH	*+
		CALL	_sin					;结果在 ACC	
		LRLK    AR1,STACK			;0.5a*sin(i*2*3.14/N)	
		SACL	*+
		SACH	*+
		LACL	AL
		SACL	*+
		LACL	AH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC
		LRLK    AR1,STACK			;D=0.5+A*sin(i*2*3.14/N)
		SACL	*+
		SACH	*+
		LACL	#0
		SACL	*+
		LACL	#3F00H				;3F00 0000h =0.5
		SACL    *+
		CALL	F$$ADD
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC
		LRLK	AR1,STACK
		SACL	*+
		SACH	*+
		LACL	T3PR_TEMPL
		SACL	*+
		LACL	T3PR_TEMPH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC	
LRLK    AR1,STACK			;CMPR的浮点数转换为整数
 SETC 		SXM	
 SACL		*+
SACH	*+
	 	CALL	F$$FTOI,AR1
	 	CLRC	SXM					;结果在 ACC
	 	SACL	DATIOL 
	 	LDP		#5
		LACC	I
		SUB		N
		BCND	NSPWM,GEQ
		LACC	I
		ADD		#1
		SACL	I
		B	 	RRET
NSPWM:	SPLK		#0,I					;断是否是下一个周期
RRET:	RET    
PHANTOM:KICK_DOG					;复位WD计数器
		RET
;(7)定时器3中断程序
GISR2:	SST		#0,ST0_CON1			;保存状态寄存器 
		SST		#1,ST1_CON1	
		LDP		#0E0h				;DP指针指向 PIVR 所在的数据区
		LACC	PIVR,1				;读 EVIVRB, 结果左移一位
		ADD		#PVECTORS			;加上偏移量		
		BACC
T3GP_ISR:LDP		#5 
		LACC	DFLAG
		OR		#1					;设置DFLAG.15=1
		SACL	DFLAG	
		LACL	DATIOL
		LDP		#DP_EVB
		SACL	CMPR4				;更新比较寄存器的值
		ADD		#32H
		SACL	CMPR5
		ADD		#32H
		SACL	CMPR6
		LDP		#0
		LST		#1,ST1_CON1
		LST		#0,ST0_CON1
		LDP		#DP_EVB
		SPLK		#0FFFFH,EVBIFRA
		CLRC	INTM
		RET
	END

⌨️ 快捷键说明

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