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.

[参考译文] LAUNCHXL-F28377S:C2000上具有 ADC 基准的正弦 PWM (不工作)

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/836431/launchxl-f28377s-sine-pwm-on-c2000-with-reference-from-adc-not-working

器件型号: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; //下降沿死区

}

//

文件结束

// 

 

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

    你(们)好

    [引用 user="Mohd Farooqi">只想知道这样做是否正确..... {  EPwm3Regs.CMPA.bit.CMPA =(unsigned  int) AdcaResults;}因为采样的正弦波存储在 AdcaResults 中。

    您需要将 ADC 结果写入 CMPA 寄存器、并进行一些缩放。 上述一致性不正确,因为 AdcResults 是一个数组。  在触发每个 SOC 转换的 ADC ISR 中、可以使用以下语句。 您可能还需要 调整 ADC 结果、以便在 将 CMPA 值写入比较寄存器之前、使其小于您使用的 PWM 周期。

    interrupt voidadca1_isr(void)
    {
       AdcaResults[resultsIndex] = AdcaResultRegs.ADCRESULT0;
       EPwm3Regs.CMPA.bit.CMPA = (unsigned int) AdcaResults[resultsIndex++];
    谢谢
    Vasudha

     

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

    Vasudha、您好!

    感谢你的帮助。 在进行您建议的校正后、我将获得 PWM 脉冲。 但是在调试时,它会显示以下内容:

    C28xx_CPU1:GEL 输出:
    内存映射初始化完成
    IcePick_C_0:读取长度为0xc8的第0页上的0x0处的存储器块时遇到问题


    此外、您还谈到了信号的缩放、这是我可以使用的一种计算方法。

    再次感谢

    此致  

    法鲁奇