This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于数字电源库中PWMDRV_LLC_1ch_UpCntDB_Compl .asm 程序的疑问



;=============================
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中)。我有一个不明白地方,为什么在这里要对周期寄存器进行两次更新(红色标记的地方)。

我认为第一个更新是没有必要的。或者这是没有看懂吧,不知道大神能否解释一下。

  • 自己去实验一下,将第一条对周期寄存器更新的代码注释掉,发现对输出的波形是没有影响的。

    不过,在这个应用中,采用的是在计算器为零时触发的中断(计数器加法计数),执行中断服务程序时间比较充裕,或者这对TBPRD的update没有影响。

  • 自己去实验一下,将第一条对周期寄存器更新的代码注释掉,发现对输出的波形是没有影响的。

    不过,在这个应用中,采用的是在计算器为零时触发的中断(计数器加法计数),执行中断服务程序时间比较充裕,或者这对TBPRD的update没有影响。