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

📄 ileg2drv.asm

📁 这是实现三相异步电动机FOC的DSP开发源代码
💻 ASM
字号:
;*************************************************************
; 文件名:	ileg2drv.asm
;
; 模块名: 	ILEG2DRV
;
; 初始化程序名: ILEG2DRV_INIT
;
; 公司:	达盛科技
;
; 功能描述:	设置ADC选项,将采样的两路电流信号通过可变的增益和偏
;           移量进行处理,获得可用电流信号。
;
;                    |~~~~~~~~~~~~~~~~~~|
; I_ch_sel  o------->|  		        |
; Ia_gain   o------->|Q13  ILEG2DRV  Q15|----->o Ia_out
; Ib_gain   o------->|Q13  	         Q15|----->o Ib_out
; Ia_offset o------->|Q15 	            |
; Ib_offset o------->|Q15 		        |
;                    |__________________|
;
; 目标板cpu:		x2407
;
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最后更新时间:2005.6.15	版本号:	Ver 1.0
;======================================================================
; 设置说明
;-----------------------------------------------------------
; 1. Ix_gain   范围 -3.999999 --> +3.99999 (i.e. Q13)
; 2. Ix_offset 范围 -0.999999 --> +0.99999 (i.e. Q15)
; 3. Ix_out    范围 -0.999999 --> +0.99999 (i.e. Q15)
;    with:
;    1.0 x (VrefHi - VrefLo) = +0.999999 (7FFFh)
;    0.5 x (VrefHi - VrefLo) =  0        (0000/FFFFh)
;    0.0 x (VrefHi - VrefLo) = -0.999999 (8000h)
;
; I_ch_sel 16进制值与 采样通道的对应关系:
; _________________________________________________
;  |	x	|	x	| Ib select	| Ia select	|
; -------------------------------------------------
;    Ia 选择:	0,1,2...F	-->	Ch0,1,2,...15
;    Ib 选择:	0,1,2...F	-->	Ch0,1,2,...15
;-----------------------------------------------------------
; 变量声明
;-----------------------------------------------------------
;		.ref	ILEG2DRV, ILEG2DRV_INIT				;子程序调用
;		.ref	Ia_gain,Ib_gain,Ia_offset,Ib_offset	;输入
;		.ref	Ia_out, Ib_out,V_ref				;输出

;-----------------------------------------------------------
; 变量声明
;-----------------------------------------------------------
		.def	ILEG2DRV, ILEG2DRV_INIT				;子程序调用
		.def	Ia_gain,Ib_gain,Ia_offset,Ib_offset	;输入
		.def	Ia_out, Ib_out,	V_ref				;输出

******************************************************
* 变量定义
******************************************************
		.include	"x24x_app.h"
******************************************************
I_ch_sel1	.usect "ileg2drv",1
I_ch_sel2	.usect "ileg2drv",1
Ia_gain		.usect "ileg2drv",1
Ib_gain		.usect "ileg2drv",1
Ia_offset	.usect "ileg2drv",1
Ib_offset	.usect "ileg2drv",1
Ia_out		.usect "ileg2drv",1
Ib_out		.usect "ileg2drv",1
V_ref		.usect "ileg2drv",1
V_gain		.usect "ileg2drv",1
V_offset	.usect "ileg2drv",1
******************************************************
* 参数设置
******************************************************
I_ch_sel1_	.set	3111h;3311H;6886h
I_ch_sel2_	.set	2233H;6CC6h;6886h

; 实验箱(6CC6h)或者'techv2407'(1331H)

ACQ_PS_		.set	0001b	; 采样时钟 p/s=1/2*(conv p/s)
CON_PS_		.set	0		; 转换时钟 p/s=1/1
CAL_		.set	0		; 自动校准寄存器 = 0
                              
Ia_offset_	.set	0;530h	; 通过 XOR 产生偏置
Ib_offset_	.set	0;430h	;
V_offset_	.set	1520;
Ia_gain_	.set	1fffh	; gain=1.0 (Q13)
Ib_gain_	.set	1fffh	; gain=1.0 (Q13)
V_gain_		.set	1fffh	; gain=1.0 (Q13)

ILEG2DRV_INIT

		LDP		#I_ch_sel1				;
		SPLK	#I_ch_sel1_,I_ch_sel1	; 设置通道选择初始化
		SPLK	#I_ch_sel2_,I_ch_sel2	;
		SPLK	#Ia_gain_,Ia_gain		; 增益设置初始化
		SPLK	#Ib_gain_,Ib_gain		;
		SPLK	#Ia_offset_,Ia_offset	; 偏置设置初始化
		SPLK	#Ib_offset_,Ib_offset	;
		SPLK	#V_offset_,V_offset		;
		SPLK	#V_gain_,V_gain			;

		ldp	#GPTCON>>7					; 设置 T1下溢触发 ADC
		lacc	GPTCON
		and	#0FE7Fh						; 
		or	#01b<<7
		sacl	GPTCON

		LDP	#CALIBRATION>>7				; 
		SPLK	#CAL_,CALIBRATION		; 初始化自动校准寄存器
		SPLK	#4000h,ADCL_CNTL1		; 复位AD模块
		SPLK	#(03000h+ACQ_PS_<<8+CON_PS_<<7),ADCL_CNTL1	; 设置 ADCL_CNTL1
		SPLK	#0342h,ADCL_CNTL2 		; 允许 EVA 启动转换
		SPLK	#7,MAXCONV				; 8 转换通道
		bldd	#I_ch_sel1,CHSELSEQ1	; 设置通道选择
		bldd	#I_ch_sel2,CHSELSEQ2

		ret

ILEG2DRV:
	
		ldp	#ADCL_CNTL2>>7		; 检查 SEQ_BSY 位,判断转换是否完成
Wait
		bit	ADCL_CNTL2,BIT12	;
		bcnd	Wait,TC			;

		LACC	ADC_RESULT2		; 读取通道1转换值
		XOR		#8000h			; 转换成 Q15
		ldp		#Ia_out
		SACL	Ia_out
  		LT		Ia_gain			; Ia_gain,Q13	
		MPY		Ia_out			; Q13 x Q15 = Q28
		PAC
		ADD		Ia_offset,13	; 加偏置,Q28
;		neg						; 正方向对应流入电机的方向
		SACH	Ia_out,3		; 最终结果转换成 Q15

		LDP		#ADC_RESULT1>>7	; 读取通道2转换值
		LACC	ADC_RESULT5
		XOR		#8000h			; 转换成 Q15
		ldp		#Ib_out
		SACL	Ib_out
		LT		Ib_gain			; Ib_gain,Q13	
		MPY		Ib_out			; Q13 x Q15 = Q28
		PAC
		ADD		Ib_offset,13	; 加偏置,Q28
;		neg						; 正方向对应流入电机的方向
		SACH	Ib_out,3		; 最终结果转换成 Q15

		LDP		#ADC_RESULT1>>7	; 读取通道3转换值
		LACC	ADC_RESULT7
		XOR		#8000h			; 转换成 Q15
		ldp		#V_ref
		SACL	V_ref
		LT		V_gain			; V_gain,Q13	
		MPY		V_ref			; Q13 x Q15 = Q28
		PAC
		ADD		V_offset,13		; 加偏置,Q28
		neg						; 如果需要可以反向
		SACH	V_ref,3			; 最终结果转换成 Q15

		bldd	I_ch_sel1,#CHSELSEQ1	; 重新设置通道选择
		bldd	I_ch_sel2,#CHSELSEQ2
	
;		ldp		#ADCL_CNTL2>>7	;通道清零 
;		lacl	ADCL_CNTL2
;		OR		#4000h
;		sacl	ADCL_CNTL2		;

		RET

⌨️ 快捷键说明

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