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

📄 pwm_m.c

📁 使用芯片为TI公司的DSP2812。该程序用以完成对直流电机的控制
💻 C
字号:
//
//      TMDX ALPHA RELEASE
//      Intended for product evaluation purposes
//
//###########################################################################
//
// FILE:	DSP28_Example.c
//
// TITLE:	DSP28 CPU_Timer example program.
//
//###########################################################################
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  0.55| 06 May 2002 | S.S. | EzDSP Alpha Release
//  0.57| 27 May 2002 | L.H. | No change
//###########################################################################

// Step 0.  Include required header files
         // DSP28_Device.h: device specific definitions #include statements for
         // all of the peripheral .h definition files.
         // DSP28_Example.h is specific for the given example.  

#include "DSP28_Device.h"
#include "math.h"

#define FC 3000 //In Hz PWM Frequency
#define FR 50   //In Hz sinewave Frequency



//#define KeyAdd	GpioDataRegs.GPADAT.bit.GPIOA0
#define KeyAdd	GpioDataRegs.GPADAT.bit.GPIOA4
#define KeySub  GpioDataRegs.GPADAT.bit.GPIOA1
#define KeyNeg  GpioDataRegs.GPADAT.bit.GPIOA2
#define KeyPos	GpioDataRegs.GPADAT.bit.GPIOA3

#define Add 0x01
#define Sub 0x02
#define Neg 0x04
#define Pos 0x08



unsigned char flag;
//unsigned int kb1;
unsigned int changePWM;
unsigned int F_PosNeg;
unsigned int kb; 




void InitTimer1(void);
interrupt void ISRTIMER1(void);
unsigned char ScanKey(void);
unsigned int  PWchange(void);
void KeyGpio(void);
void Delay1(int t);




void InitTimer1(void)
{
        EvaRegs.EVAIFRA.bit.T1PINT = 1;
	EvaRegs.EVAIMRA.bit.T1PINT = 1;		
	PieCtrl.PIEIER2.bit.INTx4 = 1; 
	
        EALLOW;	
	PieVectTable.T1PINT = &ISRTIMER1;
	
	EDIS;   	
	IER |= M_INT2;	
}

void main(void)
{
	/*初始化系统*/
	
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	
	/*初始化PIE控制寄存器*/
	InitPieCtrl();
	
	/*初始化PIE矢量表*/
	InitPieVectTable();	
	
	/*初始化EV*/
	InitEv();
	
	InitTimer1();
	
    /*开中断*/
	IER |= M_INT14;
	
	EINT;
	ERTM;
	
///*************************/////
// The following two functions are used to set the width 
//     and frequency of PWM repectively.
   // changePWM = EvaRegs.T1PR;
   ////////////////////////////
   //50%占空比运行

   InitGpio();
   KeyGpio();
   changePWM = 0x0005;
   F_PosNeg = 1;         
   EvaRegs.T2CMPR = EvaRegs.T2PR;
   EvaRegs.T1CMPR = 0x7FF; 
   
    while(1)
    {  
	  
	PWchange();	
	 
	}

} 	

interrupt void ISRTIMER1(void)
{  
	EvaRegs.EVAIFRA.bit.T1PINT = 1;
	PieCtrl.PIEACK.bit.ACK2 = 1;

}
void KeyGpio(void)
{
    EALLOW;
    //GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 0;
    GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4 = 0;
    GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1 = 0;
    GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2 = 0;
    GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3 = 0;      
    //GpioMuxRegs.GPADIR.all=0xFFF0;
    GpioMuxRegs.GPADIR.all=0xFFE1;
    GpioMuxRegs.GPAQUAL.all = 0x0080;    	

   
    EDIS;
}
void Delay1(int t)
{
  int  i,j;
    for(i=0;i<t;i++)
    { for(j=0;j<2;j++); }
}



unsigned char ScanKey(void)
{
    unsigned int keytmp;
    unsigned char KeyData;
    

    //GpioDataRegs.GPASET.all = 0x000F;
    GpioDataRegs.GPASET.all = 0x001E;
    //GpioDataRegs.GPACLEAR.all = 0xFFF0;
    GpioDataRegs.GPACLEAR.all = 0xFFE1; 
        
    keytmp = GpioDataRegs.GPADAT.all;
   
    //if(keytmp == 0x000F)
    if(keytmp == 0x001E)
           {
                flag = 0;
     
                while(flag == 0)
                       {
                             //keytmp = GpioDataRegs.GPADAT.all & 0x000F;
                             keytmp = GpioDataRegs.GPADAT.all & 0x001E;
                             flag = 1;
                        }
      
            } 
     
     switch(keytmp)
     {
     //case 0x000E:
     case 0x000E:
          KeyData = Add;
          break;
     //case 0x000D:
     case 0x001C:
          KeyData = Sub;
          break;
     //case 0x000B:
     case 0x001A:
          KeyData = Neg;
           F_PosNeg = 0; 
          break;
     //case 0x0007:
     case 0x0016:
          KeyData = Pos;
          F_PosNeg = 1;
          break;
     default:
          KeyData = 0x00;
          break;
     
     }
   
     return(KeyData);   
}

unsigned int PWchange(void)
{
  

  //加按键程序,调节T1CMPR
  //kb = ScanKey();
  do
    {
     kb = ScanKey();
    }while(kb == 0x00);
  if(kb== Pos)
    { 
     //正转调速
            
     EvaRegs.T2CMPR = EvaRegs.T2PR;
     EvaRegs.T1CMPR = 0xF00;         
    }
  else if(kb == Neg)
    { 
     //反转调速
     
     EvaRegs.T1CMPR = EvaRegs.T1PR;
     EvaRegs.T2CMPR = 0x0F00;        
     }
   else 
       {
             
           switch(kb)
           {
           case Add:
                   Delay1(10000);
                   if(kb == Add )
                     {
                           do
                              {
                                   Delay1(8000);
                                   -- changePWM;
                                   if(changePWM < 0x0001)
                                        {changePWM = 0;}
                                   else
                                        {
                                         if(F_PosNeg == 1)
                                             {
                                                EvaRegs.T1CMPR = changePWM;  
                                                EvaRegs.T2CMPR = EvaRegs.T2PR;
                                              }
                                         else
                                             {
                                                EvaRegs.T2CMPR = changePWM;
                                                EvaRegs.T1CMPR = EvaRegs.T1PR;
                                             }
                                         }
                               } while(ScanKey() == Add);
                      }
   
                   break;
               
           case Sub:
                   Delay1(10000);
                   if(kb == Sub)
                     {
                              do
                                    {
                                        Delay1(8000);
                                        ++changePWM;
                                        if(changePWM > 0x0FFE )
                                                {changePWM = 0x0FFF;} 
                                        else
                                                {  
                                                     if(F_PosNeg == 1)
                                                          {
                                                               EvaRegs.T1CMPR = changePWM;  
                                                               EvaRegs.T2CMPR = EvaRegs.T2PR;
                                                          }
                                                      else 
                                                          {
                                                               EvaRegs.T2CMPR = changePWM;  
                                                               EvaRegs.T1CMPR = EvaRegs.T1PR;
                                                          }
                                                 }
                                    } while(ScanKey() == Sub);
                      }
   
                   break;  
             default: 
                   break;  
            
             }
     
       
       }
       return(changePWM);
}

	

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

⌨️ 快捷键说明

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