![Microchip Technology AN908 Using Manual Download Page 71](http://html1.mh-extra.com/html/microchip-technology/an908/an908_using-manual_1785807071.webp)
2004 Microchip Technology Inc.
DS00908A-page 71
AN908
mov.w
TcW,dPWM2
mov.w
TbW,dPWM3
return
jCalcRef30:
;; Must be Sector 4 since Sector 0 not allowed
;; Sector 4: (1,0,0) 180-240 degrees
;; T1 = -Vr1
;; T2 = -Vr2
neg.w
Vr1W,T2W
neg.w
Vr2W,T1W
rcall
CalcTimes
;; dPWM1 = Tc
;; dPWM2 = Tb
;; dPWM3 = Ta
mov.w
TcW,dPWM1
mov.w
TbW,dPWM2
mov.w
TaW,dPWM3
return
;*******************************************************************
; CalcTimes
;
; void CalcTimes(void)
; {
;
T1 = PWM*T1
;
T2 = PWM*T2
;
Tc = (PWM-T1-T2)/2
;
Tb = Ta + T1
;
Ta = Tb + T2
; }
;
; Timing: 17instruction cycles
;*******************************************************************
CalcTimes:
;; T1 = PWM*T1
;; Since T1 is in 1.15 and PWM in integer we do multiply by
;; 2*PWM*T1 as integers and use upper word of results
;; Load PWMPeriod
sl.w
_SVSVGen_iPWMPeriod,WREG
; Mul PWM * 2 to allow for
: full range of voltage
mul.us
w0,T1W,WorkDLoW
mov.w
WorkDHiW,T1W
;; T2 = PWM*T2
mul.us
w0,T2W,WorkDLoW
mov.w
WorkDHiW,T2W
;; Tc = (PWM-T1-T2)/2
;mov.w
_SVSVGen_iPWMPeriod,WorkW
mov.w
_SVSVGen_iPWMPeriod,WREG
sub.w
w0,T1W,WorkW
;PWM-T1
sub.w
WorkW,T2W,WorkW
; -T2
asr.w
WorkW,WorkW
; /2
mov.w
WorkW,TcW
; store Tc
;; Tb = Tc + T1
add.w
WorkW,T1W,WorkW
mov.w
WorkW,TbW
;; Ta = Tb + T2
add.w
WorkW,T2W,WorkW
mov.w
WorkW,TaW
return