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

📄 qep_drv.asm

📁 这是关于有刷直流电动机PWM控制方案的源码
💻 ASM
字号:
;===========================================================================
; 文件名:	qep_drv.asm
; 模块名:	QEP_THETA_DRV
;
; 初始化程序名: QEP_THETA_DRV_INIT
;	
; 同步计数重置: QEP_INDEX_ISR_DRV
;
; 公司:	达盛科技
;
;
; 功能描述:	利用增量式编码器检测转子位置和旋转方向 
;	QEP_THETA_DRV: 依据增量式编码器输出脉冲计算转子位置
;	QEP_INDEX_ISR_DRV: 同步中断重置计数器T2
;
;				         |~~~~~~~~~~~~~~~~~~~|
; QEP A/B(EV H/W)o------>|			         |----->o  theta_elec
; polepairs      o------>|   QEP_THETA_DRV   |----->o  theta_mech
; cal_angle      o------>|  			     |----->o  dir_QEP
; mech_scale     o------>|  			     |
;			  	         |-------------------|
; QEP Index (EV H/W) o-->| QEP_INDEX_ISR_DRV |----->o  index_sync_flg
;				         |                   |----->o  QEP_cnt_idx
;				         |___________________|
;
; 目标板CPU:		x240/24x/240x
;
;=====================================================================================
; 修改纪录:
;-------------------------------------------------------------------------------------
; 最后更新日期:2005.7.5 	版本号:	Ver 1.0	
;===========================================================================

;---------------------------------------------------------------------------
; 调用时变量声明
;---------------------------------------------------------------------------
;		.ref	QEP_THETA_DRV,QEP_THETA_DRV_INIT	; function call
;		.ref	polepairs,cal_angle,mech_scale		; Inputs
;		.ref	theta_elec,theta_mech,dir_QEP		; Outputs
;
;		.ref	QEP_INDEX_ISR_DRV					; function call
;		.ref	index_sync_flg,QEP_cnt_idx			; Output
;---------------------------------------------------------------------------
; 变量声明
;---------------------------------------------------------------------------
		.def	QEP_THETA_DRV,QEP_THETA_DRV_INIT	; function call
		.def	polepairs,cal_angle,mech_scale		; Inputs
		.def	theta_elec,theta_mech,dir_QEP		; Outputs

		.def	QEP_INDEX_ISR_DRV					; function call
		.def	index_sync_flg,QEP_cnt_idx			; Output

;-------------------------------------------
; 相关变量定义
;-------------------------------------------
		.include	"x24x_app.h"

;---------------------------------------
; 变量定义
;---------------------------------------
theta_elec		.usect "qep_drv",1
theta_mech		.usect "qep_drv",1
dir_QEP			.usect "qep_drv",1
polepairs		.usect "qep_drv",1
QEP_cnt_idx		.usect "qep_drv",1
cal_angle		.usect "qep_drv",1
index_sync_flg	.usect "qep_drv",1
mech_scale		.usect "qep_drv",1
theta_raw		.usect "qep_drv",1

;---------------------------------------------------------------
; 参数设定
;---------------------------------------------------------------
POLEPAIRS_	.set	2;4		 	; 极对数
CAL_ANGLE_	.set	206;333		; 偏移角
MECH_SCALE_	.set	16776;6710	; 总计数值*1/4000 的 Q26 表示(1000线编码器)

;----------------------------------------------------
; 初始化
;----------------------------------------------------
QEP_THETA_DRV_INIT:
		ldp	#polepairs
		SPLK	#POLEPAIRS_,polepairs
		splk	#CAL_ANGLE_,cal_angle
		SPLK	#MECH_SCALE_,mech_scale
		.if (x240)
		ldp	#OCRC>>7
		lacl	OCRC
		or	#01110000b
		sacl	OCRC
		.endif
		.if (x243|x2407)
		ldp	#OCRA>>7
		lacl	OCRA
		or	#00111000b
		sacl	OCRA
		.endif
		ldp	#T2PER>>7
		SPLK	#0FFFFh,T2PER			; compatible across '240/24x/240x
		SPLK	#1001100001110000b,T2CON	; D-Up/Dn, /1, src=QEP
		SPLK	#1111000000000100b,CAPCON	; Tmr2, CAP3 pos edge, enbl
		RET

;---------------------------------------------------------
; 较位置计算程序
;---------------------------------------------------------
QEP_THETA_DRV
		ldp	#GPTCON>>7
		lacc	GPTCON,2
		and	#1,16		; Get direction bit
		ldp	#dir_QEP	;
		sach	dir_QEP	; save
		ldp	#T2CNT>>7	; read count of pulses
		lacc	T2CNT		;
		ldp	#cal_angle	;
		add	cal_angle	; add offset amount
		sacl	theta_raw	;
		LT	theta_raw	;
		MPY	mech_scale	; Q0*Q26=Q26(32bit)
		PAC			;
		and	#7FFFh,11	; modulo(360 in Q26)
		SACH	theta_mech,5; save as Q(26-16+5)=Q15
		LT	theta_mech	;
		MPY	polepairs	; Q15*Q0=Q15(32bit)
		PAC
		and	#7FFFh	; modulo(360 in Q15)
		SACL	theta_elec	; save as Q15
		RET

;---------------------------------------------------------------------------
; 同步计数重置程序
;---------------------------------------------------------------------------
QEP_INDEX_ISR_DRV:
		ldp	#T2CNT>>7
		bldd	T2CNT,#QEP_cnt_idx	; Read out QEP counter value
		SPLK	#0,T2CNT			; Clear counter
		ldp	#index_sync_flg
		SPLK	#0Fh,index_sync_flg	; Indicate Index mark alignment.
		RET

⌨️ 快捷键说明

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