dsp30代码 下载本文

;无

;局部堆栈使用: ;0

;修改的寄存器: : w0-w7,AccA ;执行时间: ; 72个指令周期

;******************************************************************* ;

;=================== 代码 =====================

.section .text

;用于 CurModel的寄存器

.equ SignW, w2 ; 跟踪符号变化

.equ ShiftW, w3 ; 执行除法之前的移位位数 .equ IqW, w4 ; Q电流( 1.15)

.equ KslipW, w5 ; Kslip常数( 1.15) .equ ImagW, w7 ; 励磁电流( 1.15)

.global _CurModel

.global CurModel

_CurModel: CurModel:

;; qdImag = qdImag + qKcur * (qId - qdImag) ;; 励磁电流

mov.w _CurModelParm+CurMod_qdImag,w6

mov.w _CurModelParm+CurMod_qdImag+2,w7

lac w7,A

mov.w w6,ACCALL

mov.w _ParkParm+Park_qId,w4 sub.w w4,w7,w4 ; qId-qdImagH

mov.w _CurModelParm+CurMod_qKcur,w5

mac w4*w5,A ; 将 Kcur*(Id-Imag)加到 Imag sac A,w7

mov.w ACCALL,w6

mov.w w6,_CurModelParm+CurMod_qdImag mov.w w7,_CurModelParm+CurMod_qdImag+2

;; qVelSlip = qKslip * qIq/qdImag

;; 首先将 qIqW 和 qdImagW置为正数,并将符号位存放在 SignW中 clr SignW ; 将标志符号设定为正

;; if( IqW < 0 ) => 翻转 SignW并设定 IqW = -IqW

mov.w _ParkParm+Park_qIq,IqW

cp0 IqW

bra Z,jCurModSkip

bra NN,jCurMod1

neg IqW,IqW

com SignW,SignW ;翻转符号位 jCurMod1:

;; if( ImagW < 0 ) => 翻转 SignW并设定 ImagW = -ImagW

cp0 ImagW

bra NN,jCurMod2

neg ImagW,ImagW

com SignW,SignW ;翻转符号位 jCurMod2:

;; 在 Acc A中计算 Kslip*|IqW|以保持 1.31格式

mov.w _CurModelParm+CurMod_qKslip,KslipW

mpy IqW*KslipW,A

;; 确保 denominator > numerator,否则跳过项 sac A,w0 ; 暂时的

cp ImagW,w0 ; |qdImag| - |Kslip*qIq|

bra LEU,jCurModSkip ; 跳过项: |qdImag| <= |Kslip*qIq|

;; 在 6010 (芯片本身的错误)以后版本中将不再需要。 clr.w ShiftW

;; 计算不将最高有效位直接置 1(保留符号位)的情况下,可将 ImagW移位多少位。 ;;

ff1l ImagW,ShiftW

sub.w ShiftW,#2,ShiftW ; 为将 1放入 bit 14,需要移位的位数

;; 移位:ImagW = ImagW << ShiftW sl ImagW,ShiftW,ImagW

;; 对 AccA进行移位,需要将 (-ShiftW)左移。 neg ShiftW,ShiftW

;; |Kslip*qIq| = |Kslip*qIq| << ShiftW sftac A,ShiftW

;; 执行除法操作 |qKslip*qIq|/|ImagW|。此时结果将为正且 < 1.0,同时具有最高的精度。 ;; ;;

sac A,w6 repeat #17

divf w6,ImagW ; w0 = KslipW*IqW/ImagW, w1 = remainder

;; 限制最大转差速度

mov.w _CurModelParm+CurMod_qMaxSlipVel,w1 cp w1,w0 ; qMaxSlipSpeed - | Kslip*qIq/qdImag | bra NN,jCurMod4

;; 结果太大 :用 qMaxSlipSpeed代替 mov.w w1,w0 bra jCurMod4

jCurModSkip:

;; 整个项被跳过 -将其置为 = 0 clr.w w0

jCurMod4:

;; 设定正确的符号 btsc SignW,#0 neg w0,w0

;; 用于测试

mov.w w0,_CurModelParm+CurMod_qVelSlip

;; 加入机械转速

mov.w _CurModelParm+CurMod_qVelMech,w4 add.w w0,w4,w4

mov.w w4,_CurModelParm+CurMod_qVelFlux