⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example_281xevpwm.c

📁 用tms320f2812实现对三相晶闸管的调节,实现交直流的变换
💻 C
字号:
#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File


// Prototype statements for functions found within this file.

interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);


void init_eva(void);


Uint32 EvaTimer1InterruptCount;
Uint32 EvaTimer2InterruptCount;




//延时30度
void delay(void)
{  
  //EvaRegs.T2CON.bit.TENABLE = 1;  
  EvaRegs.T2CON.all = 0x0a42;
  //EvaRegs.T2CON.bit.TECMPR = 1;
  
  while(EvaTimer2InterruptCount != 10);
  
  EvaTimer2InterruptCount = 0;  
  
  //EvaRegs.T2CON.bit.TENABLE = 0;
  EvaRegs.T2CON.all = 0x0a00;
  //EvaRegs.T2CON.bit.TECMPR = 0;
}

/*
void InitCAP(void)
{
 
 EvaRegs.CAP1FIFO=0x0000;
 
 EvaRegs.CAPFIFOA.all = 0x0000;
 
 EvaRegs.CAPCONA.all = 0x0280;   //捕获单元1为检测上升沿,选择Timer1为时钟,禁止捕捉单元1和2
 
 EvaRegs.EVAIMRC.bit.CAP1INT = 0;//屏蔽CAP1的外设中断请求
 
// EvaRegs.T1CON.all = 0x0a42; 
  
}
*/
//发10个小脉冲总长为30度
void purpose1(void)
{
 EvaRegs.ACTRA.all = 0x0401;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void purpose2(void)
{
 EvaRegs.ACTRA.all = 0x0005;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void purpose3(void)
{
 EvaRegs.ACTRA.all = 0x0014;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void purpose4(void)
{
 EvaRegs.ACTRA.all = 0x0050;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void purpose5(void)
{
 EvaRegs.ACTRA.all = 0x0140;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void purpose6(void)
{
 EvaRegs.ACTRA.all = 0x0500;
 
 EvaRegs.T1CON.bit.TECMPR = 1;
 
 EvaRegs.T1CON.bit.TENABLE = 1;
 
 while(EvaTimer1InterruptCount !=10);
 
 EvaTimer1InterruptCount = 0;
 
 EvaRegs.T1CON.bit.TECMPR = 0;
 
 EvaRegs.T1CON.bit.TENABLE = 0;
}

void main(void)
{
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();
   
   // Disable CPU interrupts 
   DINT;
   
   InitPieCtrl();
   // Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
  
   IFR = 0x0000;
  
   InitPieVectTable();
   
// Initialize only GPAMUX and GPBMUX for this test
   EALLOW;
   // Enable PWM pins
   GpioMuxRegs.GPAMUX.all = 0x013f; // EVA PWM 1-6  pins,使能CAP1
// GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins
   PieVectTable.T1PINT = &eva_timer1_isr;
   
   PieVectTable.T2PINT = &eva_timer2_isr;
   
   EDIS;
   
   EvaTimer1InterruptCount = 0;
   
   EvaTimer2InterruptCount = 0;
   
   init_eva();
   
   PieCtrlRegs.PIEIER2.all = M_INT4;
   
   PieCtrlRegs.PIEIER3.all = M_INT1;
   
   IER |= (M_INT2 | M_INT3); 
   
   EINT;
   
   ERTM;
   
   
 //  InitCAP();
   
  // EvaRegs.T1CNT = 0x0000;
   
  // EvaRegs.CAPCONA.bit.CAP12EN = 1;         //捕获到一个值
   
  for(;;)
  
  {
 //  EvaRegs.CAPCONA.bit.CAP12EN = 1;       //使能CAP1
   
  // while((EvaRegs.EVAIFRC.bit.CAP1INT) ==1)  //捕获到上升沿跳变
   
 //  {
    EvaRegs.EVAIFRC.bit.CAP1INT = 1;   //复位CAP1中断标志位
          
    delay();
    
    purpose1();
   
    delay();
   
    purpose2();
    
    delay();
    
    purpose3();
    
    delay();
    
    purpose4();
    
    delay();
    
    purpose5();
    
    delay();
    
    purpose6();
   
//   }
  }
}


void init_eva(void)
{
   // Initalize the timers
   // Initalize EVA Timer1 
   EvaRegs.T1PR = 0x0823;       // Timer1 period
   EvaRegs.T1CMPR = 0x0411;     // Timer1 compare
   
   EvaRegs.EVAIMRA.bit.T1PINT = 1;
   EvaRegs.EVAIFRA.bit.T1PINT = 1;
   
   
   EvaRegs.T1CNT = 0x0000;      // Timer1 counter
   // TMODE = continuous up/down
   // Timer enable
   // Timer compare enable
   EvaRegs.T1CON.all = 0x0a00;   //连续增减模式,4分频,禁止定时器比较使能



  // Enable compare for PWM1-PWM4
  EvaRegs.CMPR1 = 0x0411;
  EvaRegs.CMPR2 = 0x0411;
  EvaRegs.CMPR3 = 0x0411;
 
//  EvaRegs.ACTRA.all = 0x0555;
  EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
  EvaRegs.COMCONA.all = 0xA600;
 
 
  EvaRegs.T2PR = 0x0823;       // Timer2 period
  EvaRegs.T2CMPR = 0x0411;     // Timer2 compare
  
  EvaRegs.EVAIMRB.bit.T2PINT = 1;
  EvaRegs.EVAIFRB.bit.T2PINT = 1;
  
  EvaRegs.T2CNT = 0x0000;      // Timer2 counter
  // TMODE = continuous up/down
  // Timer enable
  // Timer compare enable
  EvaRegs.T2CON.all = 0x0a00; 
/*
   
 while(EvaTimer1InterruptCount != 10);
 //EvaRegs.EVAIMRA.bit.T1PINT = 0;

 EvaTimer1InterruptCount = 0;
 //EvaRegs.EVAIMRA.bit.T1PINT = 0;

  PieCtrlRegs.PIEIER2.all = M_INT4;
//  PieCtrlRegs.PIEIER3.all = M_INT1;
   
   IER |= (M_INT2 );//| M_INT1); 
   
   EINT;
   ERTM;
 */ 
} 



interrupt void eva_timer1_isr(void)
 {
 EvaTimer1InterruptCount++;
// EvaRegs.EVAIMRA.bit.T1PINT = 1;
 EvaRegs.EVAIFRA.all = BIT7;
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
  
 // while(EvaTimer1InterruptCount != 10);
 
 // EvaTimer1InterruptCount = 0;
 }
 

interrupt void eva_timer2_isr(void)
 {
 EvaTimer2InterruptCount++;
 //EvaRegs.EVAIMRB.bit.T2PINT = 1;
 EvaRegs.EVAIFRB.all = BIT0;
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

 }


// No ISR's used in this example


//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -