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.

[参考译文] TMS320F2.8377万S:ePWM看起来超级奇怪?

Guru**** 2487425 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653622/tms320f28377s-epwm-looking-super-strange

部件号:TMS320F2.8377万S

您好,

我的ePWM信号有问题,或者可能是我的ADC有问题? 我对这件事很陌生,很难告诉我我做了什么错。 首先,我只想在任何配置中启动ePWM,它看起来工作正常,我用它来控制二极管的亮度。 但是我想看看它的实际外观,于是我用一根带ADC的电线连接它,以查看它在CCS调试模式下的轨迹。 这是我得到的:

我认为这不是一个好的结果,我相信它应该是完全稳定的,而我得到的却是一个完全混乱的结果,当我刷新结果时,它有时甚至变得更奇怪。

以下是CCS中图形的属性:

下面是我的代码:


#include "F28x_Project.h"


void Init_EPwm2Gpio(void);
void Init_Clocks(void);
void Configure_EPwm2Regs(void);
void Configure_ADC(void);
void Configure_ePWM_trig_ADC(void);
void SetupADCEpwm (UINT16通道);


#define results_buffer_size 256

UINT16 AdcaResults[results_buffer_size];
UINT16结果索引;
volatile UINT16 bufferFull;

int main (void)
{


InitSysCtrl(); //inicjalizacja zegarow,watchdoga,pll itp。 // Nie wnikałem za bardzo

init_epwm2gpio(); // konfiguracja gpio do epwm2
init_Clocks();
configure_EPwm2Regs(); // Konfiguracja epwm2


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 这是我不能真正理解的部分,但我相信这里的情况不是////////////////////
色调;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectorTable();
//////////////////////////////////////////////////////////////////////////


Configure_ADC();
configure_ePWM_trig_ADC();
SetupADCEpwm (2);


对于(;;)
{
AdcaResults[resultsIndex+]= AdcaResultRegs.ADCRESULT1;
IF (results_buffer_size <= resultsIndex)
{
结果索引=0;
缓冲区完全= 1;
}
}
}

void Init_epwm2Gpio()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//在GPIO2上禁用上拉(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//在GPIO3上禁用上拉(EPWM2B)

//使用GPIO寄存器配置ePWM-2引脚
//这指定了哪些GPIO引脚将是EPWM2功能引脚。
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将GPIO2配置为EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;//将GPIO3配置为EPWM2B
EDIS;
}

void Init_Clocks()
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //设置时,所有PWM模块的PWM时基开始计数。
CpuSysRegs.PCLKCR2.bit.EPWM2=1; // ePWM时钟启用
CpuSysRegs.PCLKCR2.bit.EPWM1=1; // epwm1 wyzwala ADC,epwm2 do diody
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
EDIS;
}

void Configure_EPwm2Regs()
{
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //甘利辛力
EPwm2Regs.TBPRD = 5000; // Przy 200MHz taktowania plytki,podzieleniu przez cztery (2*2),okres 5000 powinien dac 100us podstawy
EPwm2Regs.TBPHS.bit.TBPHS = 0; // faza rowna 0
EPwm2Regs.TBCTR = 0; // resettowanie licznika
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2; // Oba dziela przez DWA,lacznie przez cztery

EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0x0;//CC_immediate;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0x0;//CC_immediate;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


EPwm2Regs.CMPA.bit.CMPA = 2500; //计数器比较
EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR; // zeruj pwma na poczatku okresu
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // jak CC jest rowny lincznikowi PWM到ustalam akcje,w tym przypadku Stan wysoki

}

void Configure_ADC(void){

EALLOW;

//写入配置
AdcaRegs.ADCCTL2.bit.prescale =6;//将ADCCLK除法器设置为/4
AdcSetMode (ADC_ADCA,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);

//将脉冲位置设置为延迟
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//打开ADC的电源
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//延迟1毫秒,以使ADC有时间开机
DELAY _US (1000);

EDIS;
}

void Configure_ePWM_trig_ADC(void)
{
EALLOW;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较值设置为2048个计数

EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;// 100:在计时器递增时启用等于CMPA的事件时基计数器,或在计时器递增时启用等于CMPC的事件时基计数器
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲
EDIS;
}


void SetupADCEpwm (UINT16通道)
{
UINT16 acqps;

//
//根据分辨率确定最小采集窗口(在SYSCLKS中)
//
IF (ADC_Resolution _12位== AdcaRegs.ADCCTL2.bit.Resolution)
{
acqps =14;//75ns
}
ELSE //分辨率为16位
{
acqps =63;//320ns
}


EALLOW;
AdcaRegs.ADCSOC1CTL.bit.CHSEL =通道;//wybierajac通道=2,SOC1 bedzie pobierac wartosc z adcina2 i zapisywac je w adcresult1.
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//样例窗口为100 SYSCLK周期
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
EDIS;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Wojciech:

    如果我理解正确,ADC每4096个周期触发一次,并且采样ePWM的周期为5000个周期,所以基本上是在两个类似周期之间得到的心搏频率。 尝试使用ADC采样周期<<采样ePWM的周期。 也许每50个周期尝试一次类似的操作,以便您在每个ePWM周期持续获得10个样本?