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.

TMS320F28035: EPWM模块怎么在一个周期内产生两个ADC的触发脉冲

Part Number: TMS320F28035
Other Parts Discussed in Thread: C2000WARE

采用增减计数模式时,看技术手册里只能在CAU或CAD时产生ADC的触发信号,有没有什么其他的办法能实现在递增和递减的时候都在CMPA处产生触发?

  • 如果是一个PWM的没办法触发两次ADC。但是可以配置两个PWM模块,PWM1在递增的CMPA处输出触发信号,PWM2在递减的CMPA处输出触发信号。

  • 那配置ADC的时候怎么设置两个EPWM模块触发一个ADC呢

  • 这个配置SOC触发同一个ADC就可以了。

    例程也可以参考一下:C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f2803x\examples\c28\adc_soc

  • 那这样子采样结果存储在两个RESULT中,我提取的时候怎么办呢

  • 额,采样结果已经有了,怎么处理不是软件编程的事吗?你是有什么顾虑?

  • 就比如我递增的时候采样结果存储在ADCRESULT1,递减的时候采样结果存储在ADCRESULT2,那我提取的时候用了i=AdcResult.ADCRESULT1,Result2的结果怎么提取呢

  • 还是说直接i=AdcResult.ADCRESULT1,i=AdcResult.ADCRESULT2,这样就可以了?

  • 是要同时对一个周期的两个采样值做处理,还是单个做处理就可以了?

    如果是前者,那定义两个变量就可以了,这个比较简单。

    如果是后者,只定义一个变量的话需要确保计算完成之前变量的值没有更新,也就是结果寄存器的值没有更新。也就是要在下一次采样完成前完成计算。不过如果你的计算不复杂的话应该几乎不会有什么问题。

  • 是单个做处理,如果可以确保计算完成之后才采样另一个值,那是不是就是i=AdcResult.ADCRESULT1,i=AdcResult.ADCRESULT2这样子呢?

  • 是的,我觉得每次数据更新前能完成赋值和计算的话这样做就可以了

  • 嗯嗯好的,我去试试,感谢!

  • 客气了,如果觉得我的回复能帮助你解决问题的话还请点击一下绿色的“问题已解决”按钮。

    如有新的问题,建议重新发帖提问。

  • 不好意思,还有一个问题,i=AdcResult.ADCRESULT1,i=AdcResult.ADCRESULT2这样子的话,那我想要用③处的采样值去进行计算的时候,它会不会被②的值覆盖,导致递增的CMPA处的采样值都没能进入计算?

  • 你好,3处应该是ADCRESULT1的值了吧?

    前面说用两个PWM去触发ADC的时候忘了说可以加上一个PWM同步,也就是将PWM2跟PWM1进行同步。这样的话3就不可能被2覆盖,只可能2被3覆盖。

  • 我用的EPWM1A和EPWM1B来触发的,这还需要同步吗

  • 同一个模块不需要。

  • 我用这样的方法,但是好像一个周期只采到了一次,能麻烦您看一下这个程序这样有什么问题吗?

    EPwm1Regs.TBCTL.bit.CTRMODE =2; // 增减计数
    EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位加载
    EPwm1Regs.TBCTL.bit.HSPCLKDIV =0; // 高速外设时钟基准分频系数
    EPwm1Regs.TBCTL.bit.CLKDIV = 1; // 时间基准时钟分频,TBCLK=SYSCLK/(HSPCLKDIV*CLKDIV)
    EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;

    //设置周期寄存器,计数器清零
    EPwm1Regs.TBPRD =1000; // 载波频率 30M/(2*1000)=15kHz
    EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位设为0
    EPwm1Regs.TBCTR = 0; // 初始化计数器

    // 设置比较寄存器
    EPwm1Regs.CMPA.half.CMPA = 500; // CMPA初始为最小占空比
    //设置寄存器映射
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // 使能映射
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 2; // 计数器为 zero 或者 PRD 时加载映射寄存器

    // 设置比较匹配后有效电平
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 1:输出高电平;2:输出高电平
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // 周期匹配时置为低电平


    /*死区时间设置1us*/
    EPwm1Regs.DBCTL.bit.IN_MODE = 0;
    EPwm1Regs.DBCTL.bit.POLSEL = 2;
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm1Regs.DBRED = 10;
    EPwm1Regs.DBFED = 10;

    EPwm1Regs.ETSEL.bit.SOCAEN= 1; // Enable SOC on A group, Enable EPWMxSOCA pulse.
    EPwm1Regs.ETSEL.bit.SOCASEL= 4; // Enable event time-base counter equal to CMPA when the timer is incrementing.
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event

    EPwm1Regs.ETSEL.bit.SOCBEN = 1; // Enable SOC on B group, Enable EPWMxSOCB pulse.
    EPwm1Regs.ETSEL.bit.SOCBSEL = 5; // Enable event time-base counter equal to CMPA when the timer is decrementing.
    EPwm1Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event
    EPwm1Regs.ETSEL.bit.INTEN = 0; // 禁止中断

    /*ADC采样通道设置*/
    AdcRegs.ADCSOC10CTL.bit.CHSEL = 0x0A; //ADCINB2,转换结果ADCRESULT10
    AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0x05; //set SOC10 start trigger on EPWM1A
    AdcRegs.ADCSOC10CTL.bit.ACQPS = 0x06; //set SOC10 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

    AdcRegs.ADCSOC11CTL.bit.CHSEL = 0x0A; //ADCINB2,转换结果ADCRESULT11
    AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0x06; //set SOC11 start trigger on EPWM1B
    AdcRegs.ADCSOC11CTL.bit.ACQPS = 0x06; //set SOC11 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

    ILf2Cur1 = AdcResult.ADCRESULT10;
    ILf2Cur1 = AdcResult.ADCRESULT11;
    ILf2Cur = -_IQmpy(_IQ12toIQ(ILf2Cur1),_IQ(3.3))+_IQ(1.5909);

  • 你好,你这还是只设置了一个PWM模块啊,只用了PWM1?

  • 用的PWM1A和PWM1B

  • 就是触发的时候用的EPWM1SOCA和EPWM1SOCB

  • 你好,现在的情况是ADCRESULT10或者ADCRESULT11只有一个结果寄存器有数值吗?还是说两个的数值是相同的?

  • 嗷嗷,我明白了,我进行了两次采样,但没有两次都进中断,已经解决啦,感谢解答!

  • 感谢反馈。是只开了一个IER吗?

  • 对,我的意思是你用了两个中断,但只开了一个IER吗?

  • IER |=M_INT1;

    IER |=M_INT2;

    这样子算是用两个IER吗