请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377S Thread 中讨论的其他器件:controlSUITE
我想将 EPWM1与 EPWM10同步、即每个模块之间的相位延迟为0。 我已经使用互补的 A 和 B 信号实现了死区输出、但我无法同步各个模块的输出。 我参考了有关同步的数据表流程图,了解了模块以三人一组的形式排列的情况,我可以配置每个模块的 SYNCOUTPUT 等 我在这里附上我的代码,我在哪里做错了。
//包含的文件
//
#include "driverlib.h"
#include "device.h"
#define Base10 EPWM10_BASE
#define BASE2 EPWM2_base
#define base6 EPWM6_BASE
#define DELAY 0X080U
#define TIME_BASE 0X1388 //等同于5000U
//
// Main
////// INITWM1 void (EPWM6_BASE)#define DEPTID
(void EPWM3_INITU);INITWM3 (void EPWM32_INITU) void (void EPWM3(void);EPWM3_INITU void (void);EPWM32_EPWM3(void (void)
_interrupt void epwm1ISR (void);
__interrupt void epwm2ISR (void);
__interrupt void epwm3ISR (void);
int i=2000;
int set=0;
_Bool enable=1;
void main (void)
{
//
//初始化设备时钟和外设
//
device_init();
//
//禁用引脚锁定并启用内部上拉。
//
DEVICE_initGPIO();
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
INTERRUPT_initVectorTable ();
// Interrupt_register (INT_EPWM1、epwm1ISR);
INTERRUPT_REGISTER (INT_EPWM10、epwm2ISR);
// Interrupt_register (INT_EPWM3、&epwm3ISR);
initgpio ();
sysctl_disablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);
//initEPWM1 ();
//initEPWM2();
//initEPWM3();
initEPWMgen(EPWM1_base, 1);
initEPWM2_BASE,0);initEPWM3_BASE
(0);initEPWMgen(EPWM3_base, 0);
initEPWM4_BASE (1);
initEPWM5_BASE (0);
initEPWM6_BASE (0);initEPWM6_BASE、0);
initEPWMgen (EPWM7_BASE、1);
initEPWM8_BASE (0);
initEPWMgen (EPWM9_BASE、0);
initEPWMgen (EPWM10_BASE、1);
//同步
ePWM_setSyncOutPulseMode (EPWM1_base、ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
ePWM_setSyncOutPulseMode (EPWM2_base、 ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM3_base、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM4_base、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);ePWM_SYNC_ON EPWMxSYNC_ON
ePWM_setSyncOutPulseMode (EPWM5_base、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM6_BASE、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM7_BASE、EPWM7_EPWM0_PULSEIN) ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM8_BASE、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
ePWM_setSyncOutPulseMode (EPWM9_BASE、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);EPWMxSYNPIN
ePWM_setSyncOutPulseMode (EPWM10_BASE、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM4、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);SYSCTL_SYSCTL_SYNCOUT_SYSCUT_IN_SYSCUT_SYSCUT_SYNCOUT_SYSCUT_SYNCOUT_EN_SYSCUT_SYNCOUT
SYSCTL_SYNC_IN_SRC_EPWM4SYNCOUT);
SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM10、SYSCTL_SYNC_IN_SRC_EPWM7SYNCOUT);
//
启用 PWM 的同步和时钟
//
EPSCTL_ENABLEPeripheral (SYSCTL_SYNCT_INT_EPWINT
);//启用 EPWM3_Interrupt (SYSCT_EPWINT
);/SYSCTCM1_INT_EPWINT (SYNT_INT_EPWINT)
ERTM;
for (;;)
{
while (set=0);
set=0;
}
}
void initgpio(void){
GPIO_setPadConfig (18、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_18_EPWM10A);
GPIO_setPadConfig (19、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_19_EPWM10B);
GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_2_EPWM2A);
GPIO_setPadConfig (3、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_3_EPWM2B);
GPIO_setPadConfig (10、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_10_EPWM6A);
GPIO_setPadConfig (11、GPIO_PIN_TYPE_STD);
GPIO_setPinConfig (GPIO_11_EPWM6B);
}
void initEPWMgen (uint32_t q、uint32_t sync)
{
ePWM_setCountModeAfterSync (q、ePWM_COUNT_MODE_UP_After_SYNC);
//
//设置 TBCLK
//
ePWM_setTimeBasePeriod (q、time_base);
不需要相移
ePWM_setPhaseShift (q、0U);
ePWM_enablePhaseShiftLoad (q);
ePWM_setTimeBaseCounter (q、0U);
//
//设置比较值
//
ePWM_setCounterCompareValue (q、
ePWM_COUNTER_COMPARE_A、
i);
//
//设置计数器模式
//
ePWM_setTimeBaseCounterMode (q、ePWM_COUNTER_MODE_UP_DOWN);
ePWM_DisablePhaseShiftLoad (q);
ePWM_setClockPrescaler (q、
ePWM_CLOCK 分频器_1、
ePWM_HSCLOCK_DEVIDER_1);
//
//设置隐藏
//
EPWM_setCounterCompareShadowImage 装载模式(q、
ePWM_COUNTER_COMPARE_A、
ePWM_COMP_LOAD_ON_CNTR_ZERO);
//
//设置操作
//注意:ePWM_B 未设置为与 A 互补
ePWM_setActionQualifierAction (q、
ePWM_AQ_OUTPUT A、
ePWM_AQ_OUTPUT 高电平、
ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (q、
ePWM_AQ_OUTPUT A、
ePWM_AQ_OUTPUT 低电平、
ePWM_AQ_output_on_timebase_down_CMPA);
ePWM_setDeadBandOutputSwapMode (q、ePWM_DB_OUTPUT A、false);
ePWM_setDeadBandOutputSwapMode (q、ePWM_DB_output_B、false);
//我们不必交换
ePWM_setDeadBandDelayMode (q、ePWM_DB_RED、true);
ePWM_setDeadBandDelayMode (q、ePWM_DB_FED、true);
逆变器桥臂的//配置设置
ePWM_setDeadBandDelayPolarity (q、ePWM_DB_RED、ePWM_DB_Polarity、ACTIVE_HIGH);
ePWM_setDeadBandDelayPolarity (q、ePWM_DB_FED、ePWM_DB_Polarity、ACTIVE_LOW);
ePWM_setRisingEdgeDeadBandDelayInput (q、ePWM_DB_INPUT_EPWMA);
ePWM_setFallingEdgeDeadBandDelayInput (q、ePWM_DB_INPUT_EPWMA);
//我认为只有在运行时更改 db 时,这些才有效
ePWM_setDeadBandControlShadowImage LoadMode (q、ePWM_DB_LOAD_FREEZE);
ePWM_disableDeadBandControlShadowImage LoadMode (q);
//显而易见
ePWM_setDeadBandCounterClock (q、ePWM_DB_COUNTER_clock_full_cycle);
ePWM_setRisingEdgeDelayCount (q、delay);
ePWM_setFallingEdgeDelayCount (q、delay);
}
__interrupt void epwm2ISR (void)
{
//
//更新 CMPA 和 CMPB 值
//
// ePWM_setSyncOutPulseMode (BASE2、ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
//
//清除此计时器的 INT 标志
//
ePWM_clearEventTriggerInterruptFlag (Base10);
//
//确认中断组
//
interrupt_clearACKGroup (interrupt_ACK_Group3);
}
//
//文件结束
//