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.

关于HVLLC汇编代码的几点疑问求助

Other Parts Discussed in Thread: CONTROLSUITE, TIDM-RESLLC-DCDC

HVLLC工程中使用的数字电源库汇编代码文件PWMDRV_LLC_1ch_UpCntDB_Comp.asm中以下代码:

;=============================
PWMDRV_LLC_1ch_UpCntDB_Compl .macro
;=============================
MOVW DP, #_PWMDRV_LLC_1ch_UpCntDB_Compl_Duty2 ; load DP for net pointer
MOVL XAR0, @_PWMDRV_LLC_1ch_UpCntDB_Compl_Duty2 ; Load net pointer address to XAR0
MOVL XAR1, @_PWMDRV_LLC_1ch_UpCntDB_Compl_Period2 ; Load net pointer address to XAR1

MOVL ACC, *XAR1
SFR ACC, #14 ; ACC>>14: AL = Period (Q10)
MOVW DP, #_EPwm2Regs.TBPRD
MOV @_EPwm2Regs.TBPRD, AL ; Update period register

MOVL XT, @_EPwm2Regs.TBPRD ; 注意这里是MOVL指令,即XT=TBPRD<<16
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, #_EPwm2Regs.CMPA
MOV @_EPwm2Regs.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, #_EPwm2Regs.CMPB
MOV @_EPwm2Regs.CMPB, T ; Update CMPB = Duty midpoint

MOVL ACC, *XAR1
SFR ACC, #14 ; ACC>>14: AL = Period (Q10)
MOVW DP, #_EPwm2Regs.DBFED
SUB AL, @_EPwm2Regs.DBFED ; use FED value to create Falling Edge Margin (advance falling edge)
MOVW DP, #_EPwm2Regs.TBPRD
MOV @_EPwm2Regs.TBPRD, AL ; Update period register (with FEM)

.endm

我的疑问是:

(1)EPwm的相关寄存器,如TBPRD等不是EALLOW保护的吗?这里并没有体现。我把这段代码在CCS3.3中实际在芯片仿真单步执行时发现TBPRD寄存器并没有用计算出的值更新(写不进去),是否与EALLOW有关?(确认计算结果是对的,只是写不进去而已)

(2)请帮忙确认一下最终的计算结果及解答疑问。

           CMPA = period - duty *period

           CMPB= 0.5*period*duty-13+period-duty*period=period-0.5*period*duty-13,注释说是第一次的采样bug补偿,怎么理解?

            TBPRD = period - FED,注释说使用FED来生成下降沿margin,怎么理解?

  • 等了一天了没人回答,-_-||

    我的疑问:EPWM2A和EPWM3A的比较匹配仅仅用来做了一下触发ADC采样电流,对EPWM2和EPWM3的CMPB做补偿有何意义?而且13这个补偿数如何得来的?

  • 你说的TBPRD寄存器没更新,然后“PWMDRV_LLC_1ch_UpCntDB_Compl_Period2”是已经更新了对吗?ACC, AL每一步都能正常走吗?

    TBPRD寄存器不受EALLOW保护,所以不是这个原因。

  • F2802x和F2803x的ADC对于同一个触发源触发的一系列采样,比如通道A0,A1,A2,其第一个采样A0是不能保证准确的,这是芯片的一个bug,所以这里要-13(dummy conversion耗时13cycle),后续的转换就是准确的。

  • 还有这个bug?一直不知道呢。您指的是第一次还是说每次都会不可靠?

    如果是软件触发呢?第一个采样通道的结果也会不可靠吗?

    对了,上面的一个关于PWM周期寄存器没有更新的问题应该是软件问题,我为了测试方便硬件初始化部分代码取消了,也就是---PWM没有使能。

  • 每一组的第一个都不可靠,比如你软件触发A0,A1,A2,PWM触发B3,B4,B5,那么A0和B3不保证正确。让ADC工作在30MHz可以解决这个问题。

    下面文档链接的第8面有。

    http://www.ti.com/lit/er/sprz295n/sprz295n.pdf

  • 如果我一个触发只采样1个通道,按你说的第一个通道就可能不准,那还怎么弄?

    比如软件触发A0,PWM1触发A1,PWM2触发A2,这A0 A1 A2都不准了?

    你连接的文档里面是针对F2803x的,F2802x的是哪个文档?我特地下载了最新的F2803x的系统控制及中断文档,里面表示目前最新的版本仍是A,也就是说,这个问题到现在还没Fix?要知道F2802x,比如F28020只有40MHz时钟,如何解决这个问题? 丢弃第一个采样数据绝不是解决办法,F28020的AD是0.5us/通道,

    这个已经很慢了,再来重复采样一次,可能正确的采样时刻已经过了!

  • F28027.

    http://www.ti.com/lit/er/sprz292n/sprz292n.pdf

    现有的办法只能是重复采样,丢弃第一个数据。你写的什么软件需要这么多不同的触发源?绝大多数应用都是一个触发源触发多个通道顺序采样就好了。

  • TI的HVLLC套件例程代码:

    // ADC Trigger Selection
    TrigSel[0] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA
    TrigSel[1] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA

    TrigSel[2] = ADCTRIG_EPWM2_SOCA; // ePWM2, ADCSOCA
    TrigSel[3] = ADCTRIG_EPWM2_SOCA; // ePWM2, ADCSOCA

    TrigSel[4] = ADCTRIG_EPWM3_SOCA; // ePWM3, ADCSOCA
    TrigSel[5] = ADCTRIG_EPWM3_SOCA; // ePWM3, ADCSOCA

    TrigSel[6] = ADCTRIG_EPWM4_SOCA; // ePWM4, ADCSOCA
    TrigSel[7] = ADCTRIG_EPWM4_SOCA; // ePWM4, ADCSOCA

    这里用了4个trigger来触发采样,每次都用2个通道来采样相同的信号,也是这个原因吧,每组的第一个数据都需要丢弃对吧?

  • 您好源程序哪儿下载啊的?

    知道了在controlSUITE里面谢谢

    https://www.ti.com.cn/tool/cn/TIDM-RESLLC-DCDC