您好!
在另一篇文章中、我指出了在两个不同 SPI 上生成时钟的问题、一个是50MHz 时钟、另一个是100KHz 时钟。
由于源时钟和分频器的可能性相同、这是不可能实现的。
然后、我要提出的解决方案是由 PWM 生成时钟。
需要实现反馈 SSI 驱动器。 我们只需要生成一定数量的时钟并在 SPI 输入上获取数据。
为此、我使用与 BiSS 和 EnDat 库相同的架构:在 Epwm4a / Epwm4b (互补输出)上使用 GPIO6和7
问题是我无法获得正确的信号。
第一个问题与 IDDK 示例类似、脉冲生成的开始在 Epwm11 ISR 下给出、而 Epw4 ISR 在同一组中。 然后、当 I 处于 EPwm11 ISR 下时、不会生成 epwm4的 ISR。
第二个问题是我在 Epwm4b 信号上获得"干扰"。
CH1、黄色:Epwm4A
CH4、绿色:Epwm4B
CH2蓝色:主 ISR 中断(EPwm11)
CH3红色:EPwm4中断
下面是使用的代码:
初始化阶段(与 IDDK exemple 相同)
/*时基子模块寄存器*/
ePWM->TBCTL.bit.PRDLD = TB_IMMETERY; //设置立即加载*
ePWM->TBPRD =(((((uint32_t) dV_PWM_ePWM_CLK_MHz *(uint32_t) 1000)/(uint32_t)频率)- 1);
ePWM->TBPHS.bit.TBPHS = 0;
ePWM->TBCTR = 0;
ePWM->TBCTL.bit.CTRMODE = TB_COUNT_UP;
ePWM->TBCTL.bit.HSPCLKDIV = TB_DIV1;
ePWM->TBCTL.bit.CLKDIV = TB_DIV1;
ePWM->TBCTL.bit.PHSEN = TB_DISABLE;
ePWM->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; /*同步"下流"*/
/*计数器比较子模块寄存器*/
ePWM->CMPA.bit.CMPA = 0; //初始设置占空比0%*/
ePWM->CMPCTL.bit.SHDWAMODE = CC_SHADOW;
ePWM->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
/*操作限定符子模块寄存器*/
ePWM->AQCTLA.bit.CAU = AQ_CLEAR;
ePWM->AQCTLA.bit.ZRO = AQ_SET;
/*高电平有效互补 PWM -设置死区*/
ePWM->DBCTL.bit.in_mode = DBA_ALL;
ePWM->DBCTL.bit.out_mode = DB_full_enable;
ePWM->DBCTL.bit.POLSEL = DB_ACTV_HIC;
ePWM->DBRED.ALL = 0;
ePWM->DBFED.ALL = 0;
EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD >> 1;
EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_HI; //将 PWMA 和 B 设置为 SPI Clk 的默认值*/
EPwm4Regs.TZCTL.bit.TSB = TZ_FORCE_HI;
EPwm4Regs.TZFRC.bit.OST = 1; //默认情况下,输出被禁用*/
/* PWM4 INT 用于计算时钟脉冲数*/
EPwm4Regs.ETSEL.bit.INTSEL = ET_CTRL_CMPA; // PRD 事件上的 INT *
EPwm4Regs.ETSEL.bit.INTEN = 1; //启用 INT *
EPwm4Regs.ETPS.bit.INTPRD = et_1st; //在每个事件上生成 INT *
…
INTERRUPT_REGISTER (INT_EPWM4、DV_SSI_iPwmISR);
/*清除标志*/
EPwm4Regs.ETCLR.bit.INT = 1;
在 MainISR (EPwm11)中、当需要启动 SPI 传输时:
/*初始化要生成和启用时钟输出的位数*/
DV_SSI_BitCount = 16;
/*启用 Epwm4输出*/
EALLOW;
EPwm4Regs.TZCLR.bit.OST = 1;
EDIS;
INTERRUPT_ENABLE (INT_EPWM4);
/*清除标志*/
EPwm4Regs.ETCLR.bit.INT = 1;
进入 Epwm4 ISR
中断空 DV_SSI_iPwmISR (空)
{
DV_SSI_BitCount--;
IF (DV_SSI_BitCount = 0)
{
/*禁用输出*/
EALLOW;
EPwm4Regs.TZFRC.bit.OST = 1;
EDIS;
INTERRUPT_DISABLE (INT_EPWM4);
}
/*清除标志*/
EPwm4Regs.ETCLR.bit.INT = 1;
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group3);
}
