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

📄 bldcref.asm

📁 无刷直流电机开环程序 电机功率500w 4对极
💻 ASM
字号:
***********BLDC MOTOR CONTROL FOR MACHANGSHAN-PCB*****************
;TI周期匹配启动ADC--ADCINT
;CAP捕获中断
;电流调节采用P,COMP(k)=COMP(k-1)+K*ek,同时COMP还设极限范围[0,500],即BANG-BANG
;速度调节采用PI,得到速度调节输出IG,它作为电流调节的参考值
;速度调节输出的公式为IG(k)=IG(k-1)+KP*(e(k)-e(k-1))+KI*T*ek
;速度调节频率为1250个PWM周期,由VCOUNT比较的值决定
;--------------------------------------------------------
;|	****	***300H开始的6个单元中存放的变量***   ****	|
;--------------------------------------------------------
;地址 |	变量				|  地址 |	变量			|
;--------------------------------------------------------
;300H |第k次捕捉时间		|303H	|第k次速度偏差		|
;--------------------------------------------------------
;301H |第k-1次捕捉时间		|304H	|第k-1次速度偏差	|
;--------------------------------------------------------
;302H |两次时间差			|305H	|两次偏差之差		|
;--------------------------------------------------------
;速度调节所需的参数存放在数据区300H开始的6个单元中,AR2作为数据的地址指针
;
;
*********************************
	.include "LF2407.H"
	.bss 	KP,1		;KP FOR SPEED
	.bss 	KI,1		;KI FOR SPEED
	.bss 	CAPT,1		;换相控制字
	.bss 	COMP,1		;比较值
	.bss 	IA,1		;
	.bss 	IB,1		
	.bss 	IC,1		
	.bss 	IG,1		;电流参考值
	.bss 	VG,1		;速度参考值
	.bss 	VCOUNT,1	;速度调节循环计数器
	.bss 	STACK,1		;软件堆栈初始地址
	
	.def 	_c_int0
	.sect 	"vectors"
revect 	b 	_c_int0
int1 	b 	PHANTOM
int2 	b 	PHANTOM
int3 	b 	PHANTOM
int4 	b 	CAPINT		;捕获中断
int5 	b 	PHANTOM
int6 	b 	ADCINT		;ADC中断
;-------------------------
	.TEXT
_c_int0:
	LDP #0
	SETC 	INTM
	SETC 	SXM
	CLRC 	OVM
	CLRC 	CNF
;AR*
	LAR	AR2,#0300H
	LAR AR1,STACK
;SYSTEM
	LDP	#0
	SPLK 	#0,IMR
	SPLK 	#0FFFFH,IFR
	LDP 	#0E0H
	SPLK 	#068H,WDCR	
	SPLK 	#208DH,SCSR1 	;40MHZ
;IO
	LDP	#0E1H
	SPLK 	#0FF8H,MCRA
;EVA
	LDP 	#0E8H
	SPLK 	#0FFFFH,T2PR
	SPLK 	#0,T2CNT
	SPLK 	#10C0H,T2CON	;T1 ENABLE
	;-----------
	SPLK 	#0100H,GPTCONA	;T1 CONTROL AD
	SPLK 	#0,T1CNT
	SPLK 	#1000,T1PR			;f=20KHz,50uS
	SPLK 	#0840H,T1CON	;连续增计数,不分频
	;-----------
	SPLK 	#0A200H,COMCONA
	SPLK 	#0FFFH,ACTRA
	SPLK 	#04F0H,DBTCONA	;1.6uS
	SPLK 	#500,CMPR1
	SPLK 	#500,CMPR2
	SPLK 	#500,CMPR3
	SPLK 	#0B0FCH,CAPCONA
	SPLK 	#0,CAPFIFOA
	;--------------
	LDP #0
	SPLK 	#000BH,IMR
	LACC 	IMR
	SACL 	IFR
	LDP 	#0E8H
	LACC 	EVAIFRA
	SACL 	EVAIFRA
	LACC 	EVAIFRB
	SACL 	EVAIFRB	
	LACC 	EVAIFRC
	SACL 	EVAIFRC	
	SPLK 	#0100H,EVAIMRA
	SPLK	#0,EVAIMRB
	SPLK 	#7,EVAIMRC
;ADC
	LDP	#0E1H
	SPLK 	#4000H,ADCTRL1	
	NOP
	SPLK 	#0900H,ADCTRL1
	SPLK 	#4000H,ADCTRL2
	NOP
	SPLK 	#0500H,ADCTRL2
	SPLK 	#1H,MAXCONV	
	SPLK 	#0001H,CHSELSEQ1;??????????
;VARITY
	SPLK 	#0H,IG
	SPLK 	#0H,VG
	SPLK 	#0H,COMP
	SPLK 	#0H,VCOUNT
	SPLK 	#0H,CAPT
;ENABLE INTS
	CLRC	INTM
;检测转子初始位置
	LDP 	#0E8H
	SPLK 	#8000H,CAPCONA
	SPLK 	#00FFH,CAPFIFOA
	LDP		#0E1H
	SPLK 	#0FC00H,MCRA
	SPLK 	#0,PADATDIR
	LACC 	PADATDIR
	AND 	#038H
	LDP 	#0
	SACL 	CAPT
	LACC 	CAPT,13
	SACH 	CAPT
	LDP 	#0E1H
	SPLK 	#0FF8H,MCRA
	LDP 	#0E8H
	SPLK 	#0B0FCH,CAPCONA
	SPLK 	#00FFH,CAPFIFOA
;-----------**************----------------
LOOP:
 	NOP
	B 	LOOP
;---------*******************-------------
PHANTOM
	CLRC 	INTM
	NOP
	RET
;--------------------------
ADCINT
	INT_PUSH
	LDP #4
	LACC 	VCOUNT
	SUB 	#1250	;每1250个PWM周期进行一次速度调节,即周期为62.5mS		
	BCND 	NO_SPEED_REG,NEQ
	CALL  SPEED_REG
NO_SPEED_REG
	LACC 	VCOUNT
	ADD 	#1
	SACL 	VCOUNT	
	LDP 	#0E0H
	LACC 	PIVR
	SACL 	PIVR	
	LDP 	#0E8H
	LACC 	EVAIFRA
	SACL 	EVAIFRA
	LDP 	#0E1H
	LACC 	ADCTRL2
	OR 		#0202H
	SACL 	ADCTRL2
	;电流调节,P
	CLRC SXM
;
;-重写-?????????????????
;

	CALL 	SEQUENCE
	LDP 	#0E8H
	SACL 	EVAIFRA
	SACL 	EVAIFRA
	INT_POP
	CLRC INTM
	RET
;-------------------------------
CAPINT
	INT_PUSH
	;速度参数计算
	MAR 	*,AR2
	LACL 	T2CNT
	SACL 	*+
	SUB 	*+
	SACL 	*-
	ADD 	*
	SACL 	*-
	;获取换相控制字
	LDP 	#0E8H
	SPLK 	#8000H,CAPCONA
	SPLK 	#00FFH,CAPFIFOA
	LDP 	#0E1H
	SPLK 	#0FC00H,MCRA
	SPLK 	#0H,PADATDIR
	LACC 	PADATDIR
	AND 	#038H
	LDP 	#0
	SACL 	CAPT
	LACC 	CAPT,13
	SACH 	CAPT
	;换相
	CALL SEQUENCE
	LDP #0E1H
	SPLK 	#0FF8H,MCRA
	LDP 	#0E8H
	SPLK 	#0B0FCH,CAPCONA
	SPLK 	#00FFH,CAPFIFOA
	INT_POP
	LDP	#0E8H
	LACC 	EVAIFRC
	SACL 	EVAIFRC
	CLRC INTM
	RET
;------------------------------------
;换相或修改占空比子程序
SEQUENCE
	
	LDP #0
	LACC 	CAPT
	SUB 	#1
	SFL          	;(CAPT-1)*2       WHY?
	ADD 	#CAPT_DETER	
	BACC
CAPT_DETER
	B 	FALLING3
	B 	FALLING1
	B 	RISING2
	B 	FALLING2
	B 	RISING1
RISING3
	LACC 	COMP
	LDP 	#0E8H
	SPLK 	0EF7H,ACTRA
	SACL 	CMPR3
	SACL 	CMPR1
	SPLK 	#0,CMPR2
	B 	ENDD
FALLING3
	LACC COMP
	LDP 	#0E8H
	SPLK 	#07FDH,ACTRA
	SACL 	CMPR1
	SACL 	CMPR3
	SPLK 	#0,CMPR2
	B 	ENDD
RISING2
	LACC 	COMP
	LDP 	#0E8H
	SPLK 	07DFH,ACTRA
	SACL 	CMPR3
	SACL 	CMPR2
	SPLK 	#0,CMPR1
	B 	ENDD
FALLING2
	LACC COMP
	LDP 	#0E8H
	SPLK 	#0D7FH,ACTRA
	SACL 	CMPR2
	SACL 	CMPR3
	SPLK 	#0,CMPR1	
	B 	ENDD
RISING1
	LACC 	COMP
	LDP 	#0E8H
	SPLK 	0F7DH,ACTRA
	SACL 	CMPR1
	SACL 	CMPR2
	SPLK 	#0,CMPR3
	B 	ENDD
FALLING1
	LACC COMP
	LDP 	#0E8H
	SPLK 	#0FD7H,ACTRA
	SACL 	CMPR2
	SACL 	CMPR1
	SPLK 	#0,CMPR3	
	B 	ENDD	
ENDD
	RET
;-------------------------------
;SPEED PI
SPEED_REG
	MAR 	*,AR2
	LAR	 	AR2,#0302H 	;捕获时间增量
	LDP 	#0
	SPLK 	#0,VCOUNT	;计数器清0
	CLRC SXM
	LACC #0
	OR 	#0FFFFH		;ACC=FFFFH无符号数
	RPT 	#15
	SUBC 	*		;除以捕获时间增量
	AND		#0FFFFH		;屏蔽高16位
	SUB 	#VG
	NEG				;求补
	SETC 	SXM
	LAR 	AR2,#0303H	;第k次速度偏差
	SACL 	*+
	SUB 	*+
	SACL  	*
	LT 		*
	MPY 	KP
	LAR 	AR2,#0303H
	LTP 	*		;积存ACC,同时LT AR2所指的值
	MPY 	KI		
	LTD 	*		;积累加
	ADD 	IG,4	;累加
	SFR				;右移4位(由于乘T)
	SFR
	SFR
	SFR
	SACL 	IG
	LAR 	AR2,#0303H
	RET
	.END 	
	

⌨️ 快捷键说明

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