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

📄 sy bldc motor control v2.c

📁 机遇TMS20LF2812无刷电机开环运行程序
💻 C
字号:
/*///////////////////////////////////////////////////
上海三意电机驱动技术有限公司
MCK2812LV 直流无刷马达驱动程序
SUPPORT2 Yangj编写 V1.1  2006.3.29
本程序在220V 3400转 5对级直流无刷电机调试下通过
////////////////////////////////////////////////////*/
#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File

#define C_TIME 20
#define pwm_half_per 7500 /*3750 pwm=20khz*//*sytemclk=150MHz*/
                          /*1875 pwm=40kHz*/

#define pole 2  /*电机的级对数*/
#define timer2_per 60000//234375/* timer2 period with a 1/128 timer prescaler and 150MHz CPUCLK*/ 
#define PI 3.1415926
unsigned int adc_res;
unsigned int dir=1;
unsigned int ldd=0;
unsigned int PWM_DUTY=6800;

unsigned int I_result[2048];
unsigned int i=0;
unsigned int hall=0x000;
unsigned int time_cnt=C_TIME;
unsigned int hallspeed=0;
unsigned int prehall=0;
unsigned int speed;
unsigned int a=0,b=0,c=0,d=0;
unsigned int displaytime=0;
unsigned int displayflag=0;
// Prototype statements for functions found within this file.
void init_eva(void);
void eva_timer1_isr(void);
void eva_timer2_isr(void);
void DisplaySpeed(void);

//void init_evb(void);

// Global counts used in this example


void main(void)
{

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO: 
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example  

// Initialize only GPAMUX and GPBMUX for this test
   EALLOW;
   // Enable PWM pins
   GpioMuxRegs.GPAMUX.all = 0x003F; // EVA PWM 1-6  pins
   GpioMuxRegs.GPBMUX.all = 0x0000; // EVB PWM 7-12 pins
   GpioMuxRegs.GPAQUAL.all=0x0000;
   GpioMuxRegs.GPADIR.bit.GPIOA10=0;//cap3 as input
   GpioMuxRegs.GPADIR.bit.GPIOA8=0;//cap1 as input
   GpioMuxRegs.GPADIR.bit.GPIOA9=0;//cap2 as input
   GpioMuxRegs.GPBDIR.bit.GPIOB12 =1;
   EDIS;
    
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts 
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.  
// This function is found in the DSP281x_PieCtrl.c file.
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   
  // Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.T1PINT = &eva_timer1_isr;
   PieVectTable.T2PINT = &eva_timer2_isr;
 
   EDIS;  



// Disable CPU interrupts and clear all CPU interrupt flags:
 

// Initialize the PIE vector table with pointers to the shell Interrupt 
// Service Routines (ISR).  
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
   InitPieVectTable();
   EvaRegs.T1CON.all=0x0000;
   EvaRegs.T2CON.all=0x0000;//disable time1 and timer2
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
   init_eva();
   BC7281Init();
//   init_evb();

// Step 5. User specific code, enable interrupts:
 // Enable PIE group 2 interrupt 4 for T1PINT
    PieCtrlRegs.PIEIER2.all = M_INT4;
    // Enable PIE group 3 interrupt 1 for T2PINT
    PieCtrlRegs.PIEIER3.all = M_INT1;    


    // Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
    // and INT5 for T4PINT:
    IER |= (M_INT2 | M_INT3);

    // Enable global Interrupts and higher priority real-time debug events:
    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM
    EvaRegs.EVAIMRA.bit.T1PINT = 1;
    EvaRegs.EVAIFRA.bit.T1PINT = 1;
    EvaRegs.EVAIMRB.bit.T2PINT = 1;
    EvaRegs.EVAIFRB.bit.T2PINT = 1;
  // Just sit and loop forever:
  // PWM pins can be observed with a scope.	
   
  for(;;)
  {
      if (displayflag==1)
    {
    displayflag=0;
    DisplaySpeed();
    }
  }

}

void init_eva()
{

 // EVA Configure T1PWM, T2PWM, PWM1-PWM6 
// Initalize the timers
   

   EvaRegs.GPTCONA.bit.TCMPOE = 1;//0
   EvaRegs.GPTCONA.bit.T1PIN = 1;//0
   EvaRegs.GPTCONA.bit.T2PIN = 1;//0
   // Initalize EVA Timer1 
   EvaRegs.T1PR = pwm_half_per;       // Timer1 period 
   EvaRegs.T1CMPR = PWM_DUTY;     // Timer1 compare
   EvaRegs.T1CNT = 0x0000;      // Timer1 counter
   EvaRegs.DBTCONA.all=0x0000;      //deadband units off
   EvaRegs.ACTRA.all  =0x0fff; //pwm pin set active high*/
   // Enable compare for PWM1-PWM6
   EvaRegs.CMPR1=PWM_DUTY;
   EvaRegs.CMPR2=PWM_DUTY;
   EvaRegs.CMPR3=PWM_DUTY;
   EvaRegs.COMCONA.all = 0xA600;
   EvaRegs.T1CON.all = 0x5042;//0x840   


 // Initalize EVA Timer2 
  EvaRegs.T2PR = timer2_per;       // Timer2 period
  //EvaRegs.T2CMPR = 0x3C00;     // Timer2 compare
  EvaRegs.T2CNT = 0x0000;      // Timer2 counter
  // TMODE = continuous up/down
  // Timer enable
  // Timer compare enable
  EvaRegs.T2CON.all = 0xf40;   
  // Setup T1PWM and T2PWM
  // Drive T1/T2 PWM by compare logic

  
 
    
  // Compare action control.  Action that takes place
  // on a cmpare event
  // output pin 1 CMPR1 - active high
  // output pin 2 CMPR1 - active low
  // output pin 3 CMPR2 - active high
  // output pin 4 CMPR2 - active low
  // output pin 5 CMPR3 - active high
  // output pin 6 CMPR3 - active low
 
  EvaRegs.DBTCONA.all = 0x1000; // Disable deadband
 


} 


 void eva_timer1_isr(void)
{
   
   EvaRegs.EVAIMRA.bit.T1PINT = 1;

   EvaRegs.EVAIFRA.all = BIT7;
 
   hall=(++GpioDataRegs.GPADAT.bit.GPIOA10)<<1;
   hall=((++GpioDataRegs.GPADAT.bit.GPIOA9)+hall)<<1;
   hall=(++GpioDataRegs.GPADAT.bit.GPIOA8)+hall;
   hall=hall<<3;
   if (prehall!=hall)
     {
        prehall=hall;
        hallspeed++;
     }       
     switch(hall)
      {
   
			case 0x08:    
			{   
				if(dir==0)/*PWM1-PWM6   ANC*/
				{EvaRegs.ACTRA.all =0x0606;//0x0c02
				EvaRegs.CMPR3=pwm_half_per-10;
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR2=PWM_DUTY;}
				else/*pwm5-pwm2*/
			    {
			    EvaRegs.ACTRA.all =0x0606; //0x020c
				EvaRegs.CMPR3=PWM_DUTY;
				EvaRegs.CMPR1=pwm_half_per-10;
				EvaRegs.CMPR2=PWM_DUTY;
				
				}
				break;
			}
			case 0x18:	/*PWM3-PWM6     BNC*/
			{
				if(dir==0)
				{EvaRegs.ACTRA.all =0x0660;//0xc20
				EvaRegs.CMPR3=pwm_half_per-10;
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR2=PWM_DUTY;}
				
				
				else/*pwm5-pwm4*/
				{
				EvaRegs.ACTRA.all =0x0660;//0x02c0
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR2=pwm_half_per-10;
				EvaRegs.CMPR3=PWM_DUTY;
				
				}

				break;
			}
			case 0x10:	/*PWM3-PWM2		BNA*/
			{
				if(dir==0)
				{EvaRegs.ACTRA.all =0x0066;//0x002c
				EvaRegs.CMPR1=pwm_half_per-10;
				EvaRegs.CMPR3=PWM_DUTY;
				EvaRegs.CMPR2=PWM_DUTY;}
				else
				{EvaRegs.ACTRA.all =0x0066;//0x00c2/*pwm1-pwm4*/
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR3=PWM_DUTY;
				EvaRegs.CMPR2=pwm_half_per-10;
         
                }
				
				break;
			}
			case 0x30:	/*PWM5-PWM2		CNA*/
			{
				if(dir==0)
				{EvaRegs.ACTRA.all =0x0606;//0x020c
				EvaRegs.CMPR1=pwm_half_per-10;
				EvaRegs.CMPR3=PWM_DUTY;
				EvaRegs.CMPR2=PWM_DUTY;}
				else
				{EvaRegs.ACTRA.all =0x0606;//0x0c02/*pwm1-pwm6*/
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR3=pwm_half_per-10;
				EvaRegs.CMPR2=PWM_DUTY;
				
				}
				break;
			}
			case 0x20:	/*PWM5-PWM4		CNB*/
			{
				if(dir==0)
				{
				 EvaRegs.ACTRA.all =0x0660;//0x02c0
				 EvaRegs.CMPR2=pwm_half_per-10;
				 EvaRegs.CMPR1=PWM_DUTY;
				 EvaRegs.CMPR3=PWM_DUTY;
				}
				else
				{EvaRegs.ACTRA.all =0x0660;//0x0c20/*pwm3-pwm6*/
                 EvaRegs.CMPR2=PWM_DUTY;
				 EvaRegs.CMPR1=PWM_DUTY;
				 EvaRegs.CMPR3=pwm_half_per-10;


                 }
				break;
			}
			case 0x28:	/*PWM1-PWM4		ANB*/
			{
				if(dir==0)
				{
				EvaRegs.ACTRA.all =0x0066;//0x00c2
				EvaRegs.CMPR2=pwm_half_per-10;
				EvaRegs.CMPR1=PWM_DUTY;
				EvaRegs.CMPR3=PWM_DUTY;}
				
				else
				{
				EvaRegs.ACTRA.all =0x0066;//0x002c/*pwm2-pwm3*/
				EvaRegs.CMPR2=PWM_DUTY;
				EvaRegs.CMPR1=pwm_half_per-10;
				EvaRegs.CMPR3=PWM_DUTY;
				
				}
				break;
			}
			default:
			{
				EvaRegs.ACTRA.all =0x0fff;
			}
        }
      
   
 //  EvaRegs.CMPR1=PWM_DUTY;
 //  EvaRegs.CMPR2=PWM_DUTY;
 //  EvaRegs.CMPR3=PWM_DUTY;
    
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}



void eva_timer2_isr(void)
{
  GpioDataRegs.GPBDAT.bit.GPIOB12++;
  // Enable more interrupts from this timer
  EvaRegs.EVAIMRB.bit.T2PINT = 1;
 
  EvaRegs.EVAIFRB.all = BIT0;
  speed=(int)hallspeed/0.205/6/pole*60;
  hallspeed=0;
  displaytime++;
  if (displaytime>=10) 
    {
     displayflag=1;
     displaytime=0;
     }
  // Acknowledge interrupt to receive more interrupts from PIE group 3
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}


void DisplaySpeed(void)
{

   int count1;

   /* int tmr;
	unsigned char lett;
    static unsigned char* displaystring;*/

   count1=speed;
   // delay_loop();
   d=(int)(count1/1000);
   count1=count1-d*1000;
   c=(int)(count1/100);
   count1=count1-c*100;
   b=(int)(count1/10);
   count1=count1-b*10;
   a=(int)(count1);
   
	//a=0x0;b=0x1;c=0x2;d=0x3;
	if(a==16) a=0;
    if(b==16) b=0;
	if(c==16) c=0;
	if(d==16) d=0;

	BC7281Write(0x15,(0x10+c++));
	BC7281Write(0x15,d++);
    BC7281Write(0x15,(0x20+b++));
	BC7281Write(0x15,(0x30+a++));
	



}

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

⌨️ 快捷键说明

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