器件型号:LAUNCHXL-F28377S
大家好、
在我写的程序中,我希望 ePWM 中的比较子模块接收一个外部正弦波,我向 ADC 引脚提供该正弦波,以便我可以获得正弦 PWM 调制。 实际上、我组合了两个程序(ePWM_UP 和 ADC_ePWM)、这两个程序在单独运行时工作良好、但组合它们时不会生成 PWM 脉冲。
只是想知道做这件事是不是正确的… { EPwm3Regs.CMPA.bit.CMPA =(unsigned int) AdcaResults;}因为采样的正弦波存储在 AdcaResults 中。
#include "F28x_Project.h"
void ConfigureADC (void);
void ConfigureEPWM (void);
void InitEPwm3Example (void);
void InitEPwm2Example (void);
void SetupADCeppwm (uint16通道); //unsigned Integer
interrupt void adca1_ISR (void);//此函数将在循环
#define results_buffer_size 256 // 32位
uint16 AdcaResults[results_buffer_size];
uint16 resultsIndex;
volatile Uint16 bufferFull;
void main (void)
{
InitSysCtrl (void)();
InitGpio (InitGo)
CpuSysRegs.PCLKCR2.bit.EPWM3=1;
InitEPwm3Gpio();
InitEPwm2Gpio();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable ();
EALLOW;
PieVectTable.ADCA1_INT =&adca1_ISR;//用于 ADCA 中断1
EDIS 的函数;
EALLOW;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
CpuSysRegs.PCLKCR0.bit.TBCLKIS =0;CpuSysRegs.TCLKCR0;
InitEPwm3Examples();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
ConfigureADC();
ConfigureEPWM ();
SetupADCepwm (0);
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)
{
AdcaResults[resultsIndex]= 0;//消除垃圾值......
}
resultsIndex = 0;
bufferFull = 0;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
执行
{
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA (ETSEL--Event Trigger 以触发 ADC)
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
while (!bufferFull);// while bufferFull=1不运行此循环
bufferFull = 0;//清除缓冲区已满标志
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
asm (");
}while (1);
}
void ConfigureADC (void)
{
EALLOW;
AdcRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);//将 ADCCTL1.ADCCADCCADCCTL1.ADCCADCCADCL.ADCCADCCADCL.ADCADDR1.ADTR1.ADCCADTR1.ADTR1.ADCCES1.ADCCADTR1.ADTR1.ADCCADTR1.ADTR1.ADCCAD
DELAY_US (1000);
EDIS;
}
//
ConfigureEPWM -配置 ePWM SOC 和比较值
//
void ConfigureEPWM (void)
{
EALLOW;
//假设 ePWM 时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//在组
EPwm1Regs.ETSEL.bit.SOP= 1上禁用 SOC;//选择 EPWM1Regs.pc.SOP= 1
; //在第一个事件
EPwm1Regs.CMPA.bit.CMPA = 0x0800时生成脉冲; //将比较 A 值设置为2048个计数
EPwm1Regs.TBPRD = 0x1000; //将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数
器 EDIS;
}
void SetupADCepwm (uint16通道)
{
uint16 acqps;
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则//分辨率为16位
{
acqps = 63;//320ns
}
EALLOW;
AdcaRegs.ADCSO0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcaRegs.ADCSO0CTL.bit.ACQPS = acqps;//采样窗口为100 SYSCLK 周期
AdcaRegs.ADCSO0CTL.bit.INC1INT1.ADC1INT1.ADCESL.ADC1=
ADC1INT1.ADC1INT1.ADC1/ ADC1INT1.ADC1INT1.ADC1INT1.ADC1.ADC1INT1.ADC1.ADC1INT1.ADCESL.BIT.ADC1.ADC1.ADC1INT1.ADC1.ADC1.ADC1INT1.ADC1.ADC1.ADC1.ADC1INT1.ADC1.ADC1INT1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.
//确保 INT1标志被清除
EDIS;
}
中断空 adca1_ISR (空)
{
AdcResults [resultsIndex++]= AdcResultRegs.ADCRESULT0;
if (results_buffer_size <= resultsIndex)
{
resultsIndex = 0;
bufferFull = 1;
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
if (1 = AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;//清除 INT1溢出标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
}
PieCtrlRegs.PIEACK.all = PIEACK_Group1;
}
void InitEPwm3Examples()
{
EPwm3Regs.TBPRD = 4000; //设置定时器周期
EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
EPwm3Regs.TBCTR = 0x0000; //清除计数器
EPwm3Regs.CMPA.bit.CMPA =(无符号整型)结果;
//
////设置 TBCLK
//
EPwm3Regs.TBCTL.bit.SYNCOSEL = 01; //同步输出选择
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //计数模式选择
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT
EPwm3Regs.TBCTL.bit.CLKDIV 的比率= TB_DIV1;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每零加载一次寄存
器 EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADDORE;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;EPwm3Regs.CMPCTL.BIT
= LOTL.CMODE.LOADDR.CLADDR.RDE_ZERO;EPwm_TL.CMOCTR = CC_TL.R
//
//设置操作
//
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // CTR = CMPA on Up Count (EPWMA-A)时的操作
// EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; // CTR = CMPA ON 递减计数时的动作(ePWM-A)
// EPwm3Regs.AQCTLA.bit.PRD = AQ_SET; // CTR = PRD (ePWM-A)
EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR 时的动作; // CTR = ZRO 时的操作(ePWM-A)
EPwm3Regs.AQCTLB.bit.CAU = AQ_SET; // CTR = CMPA on Up Count (EPWM-B)
EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR 时的操作; // CTR = CMPA ON 递减计数时的动作(EPWM-B)
// EPwm3Regs.AQCTLB.bit.PRD = AQ_SET; // CTR = PRD (EPWM-B)时的操作
// EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // CTR = ZRO 时的操作(EPWM-B)
//
////低电平有效 PWM -设置死区
//
EPwm3Regs.DBCTL.bit.out_mode = DB_full_enable;//启用死区输出模式
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //去带极性选择
EPwm3Regs.DBCTL.bit.in_mode = DBA_ALL; //在模式
EPwm3Regs.DBRED.bit.DBRED 中启用死区=2*100; //上升沿死区
EPwm3Regs.DBFED.bit.DBFED = 2*100; //下降沿死区
}
//
文件结束
//