;=============================
PWMDRV_LLC_1ch_UpCntDB_Compl .macro n
;=============================
MOVW DP, #_PWMDRV_LLC_1ch_UpCntDB_Compl_Duty:n: ; load DP for net pointer
MOVL XAR0, @_PWMDRV_LLC_1ch_UpCntDB_Compl_Duty:n: ; Load net pointer address to XAR0
MOVL XAR1, @_PWMDRV_LLC_1ch_UpCntDB_Compl_Period:n: ; Load net pointer address to XAR1
MOVL ACC, *XAR1
SFR ACC, #14 ; ACC>>14: AL = Period (Q10)
MOVW DP, #_EPwm:n:Regs.TBPRD
MOV @_EPwm:n:Regs.TBPRD, AL ; Update period register
MOVL XT, @_EPwm:n:Regs.TBPRD
QMPYL ACC, XT, *XAR0 ; ACC = (I16Q16) * (I8Q24) = (I24Q40): upper 32-bits -> ACC = (I24Q8)
SFR ACC, #8 ; ACC>>8: AL = Duty*Period (Q16)
SUB @T, AL ; T = Period - Duty*Period
MOVW DP, #_EPwm:n:Regs.CMPA
MOV @_EPwm:n:Regs.CMPA.half.CMPA, T ; Update CMPA
ROR ACC ; AL = Duty*Period/2
SUB ACC, #13 ; compensate for 1st sample bug
ADD @T, AL
MOVW DP, #_EPwm:n:Regs.CMPB
MOV @_EPwm:n:Regs.CMPB, T ; Update CMPB = Duty midpoint
MOVL ACC, *XAR1
SFR ACC, #14 ; ACC>>14: AL = Period (Q10)
MOVW DP, #_EPwm:n:Regs.DBFED
SUB AL, @_EPwm:n:Regs.DBFED ; use FED value to create Falling Edge Margin (advance falling edge)
MOVW DP, #_EPwm:n:Regs.TBPRD
MOV @_EPwm:n:Regs.TBPRD, AL ; Update period register (with FEM)
.endm
这个数字电源库的源程序(在PWMDRV_LLC_1ch_UpCntDB_Compl .asm中)。我有一个不明白地方,为什么在这里要对周期寄存器进行两次更新(红色标记的地方)。
我认为第一个更新是没有必要的。或者这是没有看懂吧,不知道大神能否解释一下。