• 大小: 10KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: 28335  epwm  

资源简介

利用28335的epwm模块产生pwm波形,并触发内部的AD采样。产生三相PWM波,并触发三路AD采样

资源截图

代码片段和文件信息


  #include “DSP2833x_Device.h“
  #include “DSP2833x_Examples.h“
  #include “DSP2833x_EPwm.h“ 

void InitEPWM1(void);  
void InitEPWM2(void);
void InitEPWM3(void);
void InitADC_init(void);
interrupt void epwm1_isr(void);

 Uint16 resultA;
 Uint16 resultB;
 Uint16 resultC;


#define ADC_SHCLK  0xf   // S/H width in ADC module periods
#define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS   = 15MHz/(1*2)
#define ADC_usDELAY  5000L
void main(void)
{

 
  //第一步,初始化系统控制
  InitSysCtrl();

  EALLOW;
   #if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
     #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
   #endif
   #if (CPU_FRQ_100MHZ)
     #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz
   #endif
   EDIS;
  EALLOW;
  SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)=15MHZ
  EDIS;
  //第二步,初始化GPIO为ePWM1,ePWM2,ePWM3
  InitEPwm1Gpio();
  InitEPwm2Gpio();
  InitEPwm3Gpio();

  //第三步,清所有中断
  DINT;

  //初始化PIE控制
  InitPieCtrl();

  //禁止CPU中断并清空所有CPU中断标志位
  IER = 0x0000;
  IFR = 0x0000;

  //初始化PIE向量表
  InitPieVectTable();

  //将中断指向中断函数
  EALLOW;  
  PieVectTable.EPWM1_INT = &epwm1_isr;
  EDIS;

  //第四步,初始化片内外设,这里初始化ePWM1,2,3
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
   EDIS;

   InitEPWM1();
   InitEPWM2();
   InitEPWM3();

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
   EDIS;
   
   //使能连接到ePWM1,2,3的CPU中断
   IER |= M_INT3;

   //使能ePWM在PIE的中断:Group3,中断1-3
   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
 

   EINT; //使能全局中断INTM
   ERTM; //使能全局实时中断DBGM
   InitAdc();
   InitADC_init();

   for(;;)
   {
       asm(“          NOP“);
   }


}

void InitADC_init(void)
{
  AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;//设置采样窗口时间:(15+1)*ADCCLK
  AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1;//允许SEQ1被ePWMxSOCA触发信号启动
  AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //在每一个SEQ1序列结束设置INT_SEQ1
  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//SEQ1的中断使能


  AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;//ADC内核时钟分频:HSPCLK/2=6.25MHZ
  AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1选择级联模式
  
  AdcRegs.ADCTRL1.bit.CONT_RUN=0; //启动-停止模式
  AdcRegs.ADCMAXCONV.bit.MAX_CONV1=2;//设置最大转换通道为2+1=3次
  AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//顺序采样
  
  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;  //通道选择ADCAIN0
  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;  //通道选择ADCAIN0
  AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;  //通道选择ADCAIN0
  
  AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3;     //带隙和参考电路上电
  DELAY_US(1);
  AdcRegs.ADCTRL3.bit.ADCPWDN = 1;       //模拟内核的除带隙和参考电路之外所有模拟电路上电
  DELAY_US(ADC_usDELAY);
  AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;       //清除SEQ1中断标志位
  
}

interrupt void epwm1_isr(void)
{
  while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
  resultA = (AdcRegs.ADCRESULT0>>4);
  resultB = (AdcRegs.ADCRESULT1>>4);
  resultC = (AdcRegs.ADCR

评论

共有 条评论