dsp30代码 下载本文

;===================================================== ; 等效的 C代码 ;{

; register short Pos, Delta; ;

; Pos = POSCNT; ;

; Delta = Pos - EncoderParm.iPrevCnt; ; EncoderParm.iPrevCnt = Pos; ;

; if( iDelta >= 0 ) ;{

; // Delta > 0因为 ; // 1) vel > 0或

; // 2) Vel < 0且编码器计数值出现翻转返回。 ;

; if( Delta >= EncoderParm.iCntsPerRev/2 ) ;{

; // Delta >= EncoderParm.iCntsPerRev/2 => 负转速,出现翻转返回 ;

; Delta -= EncoderParm.iCntsPerRev; ;} ;} ; else ;{

; // Delta < 0因为 ; // 1) vel < 0或

; // 2) Vel > 0并出现翻转返回 ;;

; if( Delta < -EncoderParm.iCntsPerRev/2 ) ;{

; // Delta < -EncoderParm.iCntsPerRev/2 => 正转速,出现翻转返回 ;

; Delta += EncoderParm.iCntsPerRev; ;} ;} ;

; EncoderParm.iAccumCnt += Delta; ;

; EncoderParm.iVelCntDwn--; ; if(EncoderParm.iVelCntDwn) ; return; ;

; iVelCntDwn = iIrpPerCalc;

; qVelMech = qKvel * iAccumCnt * 2^Nvel; ; EncoderParm.iAccumCnt = 0; ;}

;=================== 代码 ===================== ; CalcVelIrp的寄存器使用

.equ PosW, w0 ; 当前位置: POSCNT .equ WorkW, w4 ; 工作寄存器

.equ DeltaW, w6 ; NewCnt - PrevCnt .global _CalcVelIrp .global CalcVelIrp _CalcVelIrp: CalcVelIrp:

;; 保存寄存器内容 push w0 push w4 push w6

;; Pos = uTestPos; .ifdef SIMU

mov.w _uTestPos,PosW ; 编码器值 ?? .else

mov.w POSCNT,PosW ; 编码器值 .endif

mov.w _EncoderParm+Encod_iPrevCnt,WorkW

;; 用新的 cnt更新前一个 cnt。

mov.w PosW,_EncoderParm+Encod_iPrevCnt

;; 计算 Delta = New - Prev sub.w PosW,WorkW,DeltaW bra N,jEncoder5 ; Delta < 0

;; Delta > 0因为

;; 1) vel > 0或