您好:
我使用 epwm1递增计数模式、生成 EPWM1SYNCPER、输出到 CMPSS 模块、斜坡发生器到 DAC 负极、正极连接到1.1V、通过数字滤波器、输出 CTRIPOUTH、
从理论上讲、接收 EPWM1SYNCPER 信号后的输出结果应先为低电平、然后为高电平、实际信号完全不同、实际信号完全不同、379D 也是如此。

测试结果:
通道1 : EPWM1SYNCPER
通道 2 : CRTIPOUTH (OUTPUTXABR 输出)
通道 3 : DAC +

预期结果:

以下是我的设置:
/******* 委员会 /
void Board_init()
{
EALLOW;
PinMux_init();
SYNC_INIT();
CMPSS_INIT();
ePWM_init();
OUTPUTXBAR_INIT();
EDIS;
}
空 PinMux_init()
{
//
// EPWM1 -> myEPWM1 Pinmux
//
GPIO_setPinConfig (GPIO_0_EPWM1A);
GPIO_setPinConfig (GPIO_1_EPWM1B);
//
// OUTPUTXBAR1 -> myOUTPUTXBAR1引脚多路复用
//
GPIO_setPinConfig (GPIO_2_OUTPUTXBAR1);
//
// OUTPUTXBAR3 -> myOUTPUTXBAR2引脚多路复用
//
GPIO_setPinConfig (GPIO_14_OUTPUTXBAR3);
}
void CMPSS 初始化(){
//myCMPSS0初始化
//设置高比较器的配置。
CMPSS_CONFIGHighComparator (myCMPSS0_BASE、(CMPSS_INSRC_DAC));
//设置高比较器的配置。
CMPSS_CONFIGLowComparator (myCMPSS0_BASE、(CMPSS_INSRC_DAC));
//设置内部比较器 DAC 的配置。
//- ePWM 模块必须在使用这里之前进行配置。
CMPSS_CONFIGDAC (myCMPSS0_BASE、(CMPSS_DACVAL_PWMSYNC | CMPSS_DACREF_VDDA | CMPSS_DACSRC_RAMP));
//设置高比较器的内部 DAC 值。
CMPSS_setDACValueHigh (myCMPSS0_BASE、0U);
//设置低比较器的内部 DAC 的值。
CMPSS_setDACValueLow (myCMPSS0_BASE、0U);
//配置高比较器的数字滤波器。
CMPSS_CONFIGFilterHigh (myCMPSS0_BASE、1U、1U、1U);
//配置低比较器的数字滤波器。
CMPSS_CONFIGFilterLow (myCMPSS0_BASE、0U、1U、1U);
//初始化高比较器的数字滤波器。
CMPSS_initFilterHigh (myCMPSS0_BASE);
//设置高电平比较器的输出信号配置。
CMPSS_CONFIGOutputsHigh (myCMPSS0_BASE、(CMPSS_TRIPOUT_FILTER | CMPSS_TRIP_FILTER));
//设置低电平比较器的输出信号配置。
CMPSS_CONFIGOutputsLow (myCMPSS0_BASE、(CMPSS_TRIPOUT_ASYNC_COMP | CMPSS_TRIP_ASYNC_COMP));
//设置比较器迟滞设置。
CMPSS_set迟滞(myCMPSS0_BASE、0U);
//配置比较器子系统的斜坡发生器。
CMPSS_CONFIGRAMP (myCMPSS0_BASE、3000U、1U、1U、1U、true);
//禁用 PWMSYNC 上高比较器数字滤波器输出锁存的复位
CMPSS_disableLatchResetOnPWMSYNCHigh (myCMPSS0_BASE);
//禁用 PWMSYNC 上低比较器数字滤波器输出锁存的复位
CMPSS_disableLatchResetOnPWMSYNCLow (myCMPSS0_BASE);
//设置保持复位跳闸的 EPWM 模块消隐信号。
CMPSS_CONFIG消 隐(myCMPSS0_BASE、1U);
//禁用 ePWM 消隐信号,使跳闸保持在复位状态。
CMPSS_disableBlanking (myCMPSS0_BASE);
//配置数字滤波器锁存器是否由 PWMSYNC 复位
CMPSS_CONFIGLatchOnPWMSYNC (myCMPSS0_BASE、true、false);
//启用 CMPSS 模块。
CMPSS_enableModule (myCMPSS0_BASE);
// CMPSS DAC 加电延迟。
DEVICE_DELAY_US (500);
}
void ePWM_init(){
ePWM_setClockPrescaler (myEPWM1_base、ePWM_CLOCK 分频器_2、ePWM_HSCLOCK_divider);
ePWM_setClockPrescaler (myEPWM1_base、ePWM_CLOCK 分频器_2、ePWM_HSCLOCK_divider);
ePWM_setTimeBasePeriod (myEPWM1_base、2000);
ePWM_setTimeBaseCounter (myEPWM1_base、0);
ePWM_setTimeBaseCounterMode (myEPWM1_base、ePWM_COUNTER_MODE_UP);
ePWM_DisablePhaseShiftLoad (myEPWM1_base);
ePWM_setPhaseShift (myEPWM1_base、0);
ePWM_enableSyncOutPulseSource (myEPWM1_base、ePWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
ePWM_setCounterCompareValue (myEPWM1_base、ePWM_COUNTER_COMPARE_A、1000);
ePWM_setCounterCompareShadowImage LoadMode (myEPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setCounterCompareValue (myEPWM1_base、ePWM_COUNTER_COMPARE_B、1000);
ePWM_setCounterCompareShadowImage LoadMode (myEPWM1_base、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setCounterCompareValue (myEPWM1_base、ePWM_COUNTER_COMPARE_C、300);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_zero);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_period);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_cmPA);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_zero);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_period);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_cmPA);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);
ePWM_enableInterrupt (myEPWM1_base);
ePWM_setInterruptSource (myEPWM1_base、ePWM_INT_TBCTR_U_CMPA);
ePWM_setInterruptEventCount (myEPWM1_BASE、3);
}
void OUTPUTXBAR_init (){
//myOUTPUTXBAR1初始化
Xbar_setOutputLatchMode (OUTPUTXBAR_BASE、XBAR_Output1、false);
Xbar_invertOutputSignal (OUTPUTXBAR_base、XBAR_Output1、false);
//Mux 配置
Xbar_setOutputMuxConfig (OUTPUTXBAR_base、XBAR_Output1、XBAR_OUT_MUX14_EXTSYNCOUT);
Xbar_enableOutputMux (OUTPUTXBAR_base、XBAR_Output1、XBAR_MUX14);
//myOUTPUTXBAR2初始化
Xbar_setOutputLatchMode (OUTPUTXBAR_BASE、XBAR_OUTPUT3、false);
Xbar_invertOutputSignal (OUTPUTXBAR_base、XBAR_OUTPUT3、false);
//Mux 配置
Xbar_setOutputMuxConfig (OUTPUTXBAR_base、XBAR_OUTPUT3、XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH);
Xbar_enableOutputMux (OUTPUTXBAR_base、XBAR_OUTPUT3、XBAR_MUX00);
}
void sync_init(){
SYSCTL_setSyncOutputConfig (SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT);
// SOCA
SYSCTL_enableExtADCSOCSOURCE (0);
// SOCB
SYSCTL_enableExtADCSOCSOURCE (0);
}
/******* //board.c /
/******* //main.c /
#include "driverlib.h"
#include "device.h"
#include "board.h"
typedef 结构
{
uint32_t epwmModule;
uint16_t epwmCompADirection;
uint16_t epwmCompBDirection;
uint16_t epwmTimerIntCount;
uint16_t epwmMaxCompA;
uint16_t epwmMinCompA;
uint16_t epwmMaxCompB;
uint16_t epwmMinCompB;
} epwmInfo;
epwmInfo epwm1Info;
volatile uint16_t compAVal、compBVal;
#define EPWM1_TIMER_TBPRD 2000 //周期寄存器
#define EPWM1_MAX_CMPA 1950
#define EPWM1_MIN_CMPA 50
#define EPWM1_MAX_CMPB 1950
#define EPWM1_MIN_CMPB 50.
#define ePWM_CMP_UP 1.
#define ePWM_CMP_DOWN 0
//
// updateCompare -更新指定 ePWM 的比较值
//
// epwm1ISR -用于更新比较值的 EPWM1 ISR
//
_interrupt void epwm1ISR (void)
{
//
//清除此计时器的 INT 标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM1_base);
//
//确认此中断以接收来自组3的更多中断
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group3);
}
// initEPWM1信息
//
空 initEPWM1()
{
//
//此示例用于跟踪的信息
CMPA/CMPB 值的方向//
//移动、最小和最大允许值和
//指向正确 ePWM 寄存器的指针
//
//首先增大 CMPA & CMPB
epwm1Info.epwmCompADirection = ePWM_CMP_UP;
epwm1Info.epwmCompBDirection = ePWM_CMP_UP;
//清除中断计数器
epwm1Info.epwmTimerIntCount = 0;
//将 base 设置为 ePWM1
epwm1Info.epwmModule = myEPWM1_base;
//设置最小值/最大 CMPA/CMP 值
epwm1Info.epwmMaxCompA = EPWM1_MAX_CMPA;
epwm1Info.epwmMinCompA = EPWM1_MIN_CMPA;
epwm1Info.epwmMaxCompB = EPWM1_MAX_CMPB;
epwm1Info.epwmMinCompB = EPWM1_MIN_CMPB;
}
void Test_init()
{
EALLOW;
HWREG (0x00005C80 + 0x4)|= 0xC000;
EDIS;
}
//
//主函
//
uint32_t vTestCount = 0;
uint32_t bTestFlag = 0;
uint16_t vData = 1;
uint32_t vRAMPVALUE = 0、vRAMPVALUE2 = 0;
void main (void)
{
//
//初始化设备时钟和外设
//
device_init();
//
//禁用引脚锁定并启用内部上拉。
//
DEVICE_initGPIO();
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();
//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
INTERRUPT_REGISTER (INT_EPWM1、epwm1ISR);
//
//禁用同步(也冻结 PWM 的时钟)
//
SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
//
//配置 GPIO 引脚和 ePWM 模块
//
Board_init();
//Test_init();
initEPWM1();
//
//启用到 PWM 的同步和时钟
//
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
//
//启用此示例所需的中断
//
INTERRUPT_ENABLE (INT_EPWM1);
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//空闲循环。 只需坐下来循环(可选):
//
for (;;)
{
vTestCount++;
IF (bTestFlag)
{
bTestFlag = 0;
}
// vRAMPVALUE = HWREG (0x00005C80 + 0x10);
// vRAMPVALUE2 = HWREGH (0x00005C80 + 0x10);
}
}
/******* //main.c /
