![Microchip Technology AN908 Скачать руководство пользователя страница 39](http://html1.mh-extra.com/html/microchip-technology/an908/an908_using-manual_1785807039.webp)
2004 Microchip Technology Inc.
DS00908A-page 39
AN908
;
Registers modified:
:
w0-w7,AccA
;
Timing:
;
72 instruction cycles
;*******************************************************************
;
;=================== CODE =====================
.section .text
;
Register usage for CurModel
.equ SignW,
w2
; track sign changes
.equ ShiftW,
w3
; # shifts before divide
.equ IqW,
w4
; Q current (1.15)
.equ KslipW,
w5
; Kslip constant (1.15)
.equ ImagW,
w7
; magnetizing current (1.15)
.global
_CurModel
.global
CurModel
_CurModel:
CurModel:
;; qdImag = qKcur * (qId - qdImag)
;; magnetizing current
mov.w
_CurMoCurMod_qdImag,w6
mov.w
_CurMoCurMod2,w7
lac
w7,A
mov.w
w6,ACCALL
mov.w
_PPark_qId,w4
sub.w
w4,w7,w4
; qId-qdImagH
mov.w
_CurMoCurMod_qKcur,w5
mac
w4*w5,A
; add Kcur*(Id-Imag) to Imag
sac
A,w7
mov.w
ACCALL,w6
mov.w
w6,_CurMoCurMod_qdImag
mov.w
w7,_CurMoCurMod2
;; qVelSlip = qKslip * qIq/qdImag
;; First make qIqW and qdImagW positive and save sign in SignW
clr
SignW
; set flag sign to positive
;; if( IqW < 0 ) => toggle SignW and set IqW = -IqW
mov.w
_PPark_qIq,IqW
cp0
IqW
bra
Z,jCurModSkip
bra
NN,jCurMod1
neg
IqW,IqW
com
SignW,SignW
; toggle sign
jCurMod1:
;; if( ImagW < 0 ) => toggle SignW and set ImagW = -ImagW
cp0
ImagW
bra
NN,jCurMod2
neg
ImagW,ImagW
com
SignW,SignW
; toggle sign
jCurMod2:
;; Calculate Kslip*|IqW| in Acc A to maintain 1.31
mov.w
_CurMoCurMod_qKslip,KslipW
mpy
IqW*KslipW,A
;; Make sure denominator is > numerator else skip term
sac
A,w0
; temporary
cp
ImagW,w0
; |qdImag| - |Kslip*qIq|
bra
LEU,jCurModSkip
; skip term: |qdImag| <= |Kslip*qIq|