大家好!
我想用到335的4个pwm比较器,是需要时基同步,然后中断函数只写epwm1的中断函数,。
1,请问epwm2,epwm3,epwm4从epwm1时基启动同步的话需要加设那几个寄存器的位呢?
2,中断函数只写epwm1使能中断,然后epwm2,epwm3,epwm4的比较值在额epwm1中断里更新,然后要求epwm2,epwm3.epwm4也产生pwm波?又需要如何设置呢?
谢谢啊
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.
大家好!
我想用到335的4个pwm比较器,是需要时基同步,然后中断函数只写epwm1的中断函数,。
1,请问epwm2,epwm3,epwm4从epwm1时基启动同步的话需要加设那几个寄存器的位呢?
2,中断函数只写epwm1使能中断,然后epwm2,epwm3,epwm4的比较值在额epwm1中断里更新,然后要求epwm2,epwm3.epwm4也产生pwm波?又需要如何设置呢?
谢谢啊
1. 需要配置PMW1的同步输出是PWM2的同步输入,依次类推。 需要配置PWM234的相位,如果都是从零开始的话,可以保持不变。需要设置在PWM1的Counter在什么时候同步,0还是CMPB等,依次类推。
具体寄存器,需要看文档,不看文档在论坛上无法得到完整的答案,这里只有提示。
2. 在PWM1里的ISR进行设置即可。更改PWM234的CMP值。
Jones Chen!
你好!麻烦你看下我这样的设置 哪里有问题啊
EPwm1Regs.TBPRD = TP; // Set timer period
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 00;
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm1Regs.TBSTS.bit.SYNCI = 1;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event
EPwm2Regs.TBPRD =TP; // Set timer period
EPwm2Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm2Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4; // Slow just to observe on the scope
EPwm2Regs.TBCTL.bit.SYNCOSEL =TB_SYNC_IN;
EPwm2Regs.TBSTS.bit.SYNCI = 1;
Jones Chen!我设置了epwm1的寄存器 和epwm2的寄存器有疑问的地方,有些没有写出的应该没问题,麻烦你看下 谢谢啊
我只能给你一个例子,关于您代码上的问题还是需要自己查找。
PWM1是基准给PWM2做同步:
void HAL_afe_epwmCfg()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
// Configure ePWM4 for ADC SOC
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on EPwm1A group for now - enable when ADC needed
EPwm1Regs.ETSEL.bit.SOCBEN = 0; // Disable SOC on EPwm1B group for now - enable when ADC needed
EPwm2Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on EPwm1A group for now - enable when ADC needed
EPwm2Regs.ETSEL.bit.SOCBEN = 0; // Disable SOC on EPwm1B group for now - enable when ADC needed
EPwm1Regs.ETSEL.bit.SOCASEL= 1; // EPwm1 SOCA--Zero
EPwm1Regs.ETSEL.bit.SOCBSEL= 2; // EPwm1 SOCB--Prd
EPwm2Regs.ETSEL.bit.SOCASEL= 2; // EPwm2SOCA--Zero
EPwm2Regs.ETSEL.bit.SOCBSEL= 1; // EPwm2 SOCB--Prd
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event
EPwm2Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm2Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event
EPwm1Regs.TBPRD = XXXX;
EPwm2Regs.TBPRD = XXXX;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // count up and down to trigger SOC
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // count up and down to trigger SOC
// Setup TBCLK
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync out @ counter=zero
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBPHS.half.TBPHS = 240; // Phase is 90
EPwm2Regs.TBCTR = 0x0000; // Clear counter
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // enable phase loading//Jones added
EPwm2Regs.TBCTL.bit.PHSDIR= 1; // count up when sync//Jones added
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync out @ counter=zero
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
您好 我看了文档 跟您的例子有点差点 就是您的例子或者时基同步不用设置TBCTL寄存器的位
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm1Regs.TBSTS.bit.SYNCI = 1;
这两个么,这两个为可以不用管不? 我看到您只设置了
EPwm1Regs.ETSEL.bit.SOCASEL= 1;
再次麻烦您了 谢谢!
SYNCI是PWM1的输入同步允许,我的程序里面的SYNC是本身产生的。
历程里面的是允许外部同步信号输入的。
SOCASEL这是PWM触发ADC,跟同步无关。
Jones Chen你好,想向你请教个问题。我想对两片DSP的epwm时基进行同步。
按datasheet上介绍,首先,我设置第一片dsp芯片的EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO,
同时配置第一片dsp的GPIO33为epwmsynco同步信号输出(GpioDataRegs.GPBCLEAR.bit.GPIO33 = 1;EALLOW;GpioCtrlRegs.GPBPUD.bit.GPIO33 = 1;EDIS;GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 2;);
但是示波器观察,GPIO33没有信号输出。所以后续的第二片DSP就没有办法得到同步信号输入了。
不知道若想将epwmsynco输出到dsp外部,应该怎么样配置?