请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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;
}
