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

📄 newmacro.h

📁 foc 通信程序源码
💻 H
字号:
;==========================================================
;所用宏
;----------------------------------------------------------
STOP:		.MACRO				;停机模块
		LDP 	#0E1H			;7080H-70FFH
		LACL	PADATDIR
		AND	#1111111111110111B
		SACL	PADATDIR		;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)


		LDP	#0E8H
		LACL	COMCON
		AND	#1111110111111111B
		SACL	COMCON			;禁止PWM输出
		
		LDP     #0E8H
                SPLK	#0,CMPR1	
		SPLK	#0,CMPR2

                LDP	#4			;200H-027FH
		SPLK	#0,RunFlag	
		.ENDM

;--------------------------------------------------------------------
RUN:		.MACRO				;运行宏

        LDP	#4			;200H-027FH
		SPLK	#1,RunFlag   
		
		;IOPA3 output 0
		LDP 	#0E1H			;7080H-70FFH
		LACL	PADATDIR		;;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)
		OR	    #1000B
		SACL	PADATDIR		;;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)  
		

		LDP 	#0E1H			;7080H-70FFH
		LACC	#1111111111111011B			
		AND	PADATDIR
		SACL	PADATDIR		;PADATDIR.2(IOPA2)=UNCLOCK	
		
		LACC	#100B		
		OR	PADATDIR
		SACL	PADATDIR		;将UNLOCK置低再置高

		LDP	#0E8H
		LACL	COMCON
		OR	#1000000000B
		SACL	COMCON			;允许PWM输出
		.ENDM
;----------------------------------------------------------
ALARM:		.MACRO				;ALARM模块
		
		LDP 	#0E1H			;7080H-70FFH
		LACL	PCDATDIR		;PCDATDIR.6(IOPC6)=ALARM
		OR	#1000000B
		SACL	PCDATDIR		;PCDATDIR.6(IOPC6)=ALARM
		
		.ENDM
;-----------------------------------------------------------------------
DISALARM:	.MACRO				;DISALARM模块		
		LDP 	#0E1H			;7080H-70FFH
		LACL	PCDATDIR		;PCDATDIR.6(IOPC6)=ALARM
		AND	#1111111110111111B
		SACL	PCDATDIR		;PCDATDIR.6(IOPC6)=ALARM		
		.ENDM
;------------------------------------------------------------------------
SHORT:		.MACRO              ;short the start resistance,IOPB7 OUTPUT 1
		LDP	#0E1H
		LACC	PBDATDIR
		OR	#80H			;PBDATDIR.7(IOPB7)
		SACL	PBDATDIR		
		.ENDM
;-----------------------------------------------------------------------
DISSHORT:	.MACRO
		LDP	#0E1H
		LACC	PBDATDIR
		AND	#0FF7FH			;;PBDATDIR.7(IOPB7)
		SACL	PBDATDIR
		.ENDM
;========================================================================
Y1ON		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		OR	#10B			;PCDATDIR.1(IOPC1)=RUN(Y1)
		SACL	PCDATDIR
		.ENDM
		
Y1OFF		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		AND	#1111111111111101B	;PCDATDIR.1(IOPC1)=RUN(Y1)
		SACL	PCDATDIR
		.ENDM
		
Y2ON		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		OR	#1B		;PCDATDIR.0(IOPC0)=FAI(Y2)
		SACL	PCDATDIR
		.ENDM
		
Y2OFF		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		AND	#1111111111111110B	;PCDATDIR.0(IOPC0)=FAI(Y2)
		SACL	PCDATDIR
		.ENDM	
		
Y3ON		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		OR	#10000000B		;PCDATDIR.7(IOPC7)=FDT(Y3)
		SACL	PCDATDIR
		.ENDM
		
Y3OFF		.MACRO
		LDP	#0E1H
		LACC	PCDATDIR
		AND	#1111111101111111B	;PCDATDIR.7(IOPC7)=FDT(Y3)
		SACL	PCDATDIR
		.ENDM						
;========================================================================
SVPWM		.MACRO
;------------------------------------------------------------------		
;空间矢量模块(七段式)
;(Vsalfa_ref,Vsbeta_ref,vdc)--->(SVPWM发出)
;------------------------------------------------------------------
;专用变量: Vref1,Vref2,Vref3,vdcinvt,X,Y,Z,sector,
;	   t1,t2,taon,tbon,tcon(都不需要赋初值)
;临时变量:TEMP,
;引用常量:SQRT3by2,PWMPRD
;------------------------------------------------------------------	
; 3/2变换		
; Vref1 = vSbe_ref                                 
; Vref2 = (-vSbe_ref + sqrt(3) * vSal_ref) / 2     
; Vref3 = (-vSbe_ref - sqrt(3) * vSal_ref) / 2 
;------------------------------------------------------------------			
		ldp	#4
		lt 	Vsalfa_ref
		mpy 	#SQRT3by2
		pac
		sub 	Vsbeta_ref,11
		sach 	Vref2,4 		;4.12 format
		pac
		neg                            ;取负
		sub 	Vsbeta_ref,11
		sach 	Vref3,4 		;4.12 format
		lacl 	Vsbeta_ref
		sacl 	Vref1 
;------------------------------------------------------------------			
;计算vdcinvt(scale=2^4)    
;vdc(scale=2^5)
;vdcinvt=1000*(537.4*2^5)*2^4/vdc=10667000H/vdc
;------------------------------------------------------------------		
CHANGE1		lacc	#1066H,15
		sfl			;1000*(537.4*2^5)*2^4*2^6=10667000H
		or	#7000H		;当Vdc=537.4时输出380V线电压	
		RPT	#15
		SUBC	vdc			
		sacl	VDCinvT
		
;------------------------------------------------------------------			
;计算X,Y,Z(包含vdc反馈)
;------------------------------------------------------------------		
		LT	VDCinvT		;(scale=2^4)
		mpy 	Vref1		;(scale=2^12)
		pac			
		sach 	X
		
		mpy	Vref3
		pac
		neg
		sach	Y
		
		mpy	Vref2
		pac
		neg
		sach	Z
		
;------------------------------------------------------------------
;60 degrees sector determination
;------------------------------------------------------------------
		setc sxm		
		zac
				
		bit 	Vref1,BIT15
		bcnd 	Vref1_neg,TC 	;If Vref1<0 do not set bit 1 of sector
		or 	#1		
Vref1_neg
		bit 	Vref2,BIT15
		bcnd 	Vref2_neg,TC 	;If Vref2<0 do not set bit 2 of sector
		or 	#2		
Vref2_neg
		bit 	Vref3,BIT15
		bcnd 	Vref3_neg,TC 	;If Vref3<0 do not set bit 3 of sector		
		or 	#4
		
Vref3_neg	sacl 	sector
;------------------------------------------------------------------
;t1 and t2 calculation depending on the sector number
;------------------------------------------------------------------
		
		lacc	sector,1					
		add	#(bsector-2)
		bacc
bsector		b	sector1
		b	sector2
		b	sector3
		b	sector4
		b	sector5
		b	sector6

sector1		lacc	Z
		sacl 	t1
		lacc 	Y
		sacl 	t2
		b 	t1t2out
		
sector2		Lacc 	Y
		sacl 	t1
		lacc 	X
		neg
		sacl 	t2	
		b 	t1t2out
		
sector3		lacc 	Z
		neg
		sacl 	t1
		lacc 	X
		sacl 	t2
		b 	t1t2out
		
sector4		lacc 	X
		neg
		sacl 	t1
		lacc 	Z
		sacl 	t2
		b 	t1t2out
		
sector5		lacc 	X
		sacl 	t1
		lacc 	Y
		neg	
		sacl	t2
		b 	t1t2out
		
sector6		lacc 	Y
		neg
		sacl 	t1
		lacc 	Z
		neg
		sacl 	t2
		
t1t2out		nop
;------------------------------------------------------------------
;END t1 and t2 calculation
;------------------------------------------------------------------
		lacc 	t1 		;if t1+t2>PWMPRD we have to saturate
		add 	t2
		sacl 	TEMP
		sub	#PWMPRD
		bcnd 	nosaturation,LEQ

saturation	lacc 	#PWMPRD,15 	;divide PWMPRD by (t1+t2)
		rpt 	#15
		subc 	TEMP
		sacl 	TEMP
		lt 	TEMP
		mpy 	t1 		;t1 (saturated)=t1*(PWMPRD/(t1+t2))
		pac
		sach 	t1,1
		mpy 	t2 		;t2 (saturated)=t2*(PWMPRD/(t1+t2))
		pac
		sach 	t2,1
nosaturation	nop
;------------------------------------------------------------------
;taon,tbon and tcon calculation

		ldp #4
		
		lacc 	#PWMPRD		;calculate the commutation
					;instants taon, tbon and tcon
		sub 	t1		;of the 3 PWM channels
		sub 	t2		;taon=(PWMPRD-t1-t2)/2
		sfr
		sacl 	taon
		add 	t1		;tbon=taon+t1
		sacl 	tbon
		add 	t2		;tcon=tbon+t2
		sacl 	tcon

;------------------------------------------------------------------
;sector switching

		lacc	sector,1					
		add	#(bpush-2)
		bacc
bpush		b	push1
		b	push2
		b	push3
		b	push4
		b	push5
		b	push6

push1		lacc    tbon
		ldp 	#0E8H
		sacl	CMPR1
		ldp 	#4
		lacc 	taon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	tcon
		ldp	#0e8h
		sacl 	CMPR3
		B 	ChangeAngle
		
push2		lacc    taon
		ldp 	#0E8H
		sacl	CMPR1		
		ldp 	#4
		lacc 	tcon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	tbon
		ldp	#0e8h
		sacl 	CMPR3		
		b 	ChangeAngle
		
push3		lacc    taon
		ldp 	#0E8H
		sacl	CMPR1
		ldp 	#4
		lacc 	tbon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	tcon
		ldp	#0e8h
		sacl 	CMPR3
		b 	ChangeAngle
		
push4		lacc    tcon
		ldp 	#0E8H
		sacl	CMPR1
		ldp 	#4
		lacc 	tbon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	taon
		ldp	#0e8h
		sacl 	CMPR3		
		b 	ChangeAngle
		
push5		lacc    tcon
		ldp 	#0E8H
		sacl	CMPR1
		ldp 	#4
		lacc 	taon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	tbon
		ldp	#0e8h
		sacl 	CMPR3
		b 	ChangeAngle
		
push6		lacc    tbon
		ldp 	#0E8H
		sacl	CMPR1
		ldp 	#4
		lacc 	tcon
		ldp 	#0e8h
		sacl 	CMPR2
		ldp 	#4
		lacc 	taon
		ldp	#0e8h
		sacl 	CMPR3
		b 	ChangeAngle
		.ENDM
;=================================================================
SinCosAngle	.MACRO
;------------------------------------------------------------------
;(Angle)--->(CosAngle,SinAngle)
;------------------------------------------------------------------
		ldp	#4
		LACL	Angle			;磁通角度扇区
		sub	#900
		BCND	QUADRANT1,LT
		sub	#900
		BCND	QUADRANT2,LT
		sub	#900
		BCND	QUADRANT3,LT
		sub	#900
		BCND	QUADRANT4,LT
		
QUADRANT1	LACL	Angle
        	ADD	#SINCOSTAB
        	TBLR	SinAngle
        	LACC	#900
        	SUB	Angle
        	ADD	#SINCOSTAB
        	TBLR	CosAngle
        	B	SinCosCalEnd
        	
QUADRANT2	LACC	#1800
		sub	Angle
        	ADD	#SINCOSTAB
        	TBLR	SinAngle
        	LACC	Angle
        	SUB	#900
        	ADD	#SINCOSTAB
        	TBLR	CosAngle
        	lacc	CosAngle
        	neg
        	sacl	CosAngle
        	B	SinCosCalEnd	

QUADRANT3	LACC	Angle
		sub	#1800
        	ADD	#SINCOSTAB
        	TBLR	SinAngle
        	lacc	SinAngle
        	neg
        	sacl	SinAngle
        	LACC	#2700
        	SUB	Angle
        	ADD	#SINCOSTAB
        	TBLR	CosAngle
        	lacc	CosAngle
        	neg
        	sacl	CosAngle
        	B	SinCosCalEnd
        	
QUADRANT4	LACC	#3600
		sub	Angle
        	ADD	#SINCOSTAB
        	TBLR	SinAngle
        	lacc	SinAngle
        	neg
        	sacl	SinAngle
        	LACC	Angle
        	SUB	#2700
        	ADD	#SINCOSTAB
        	TBLR	CosAngle
        	B	SinCosCalEnd        	        		
		


SinCosCalEnd	nop
		.ENDM	

;=============================================================================

⌨️ 快捷键说明

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