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

📄 wuweizhi.c

📁 该代码是用vc编写的基于dsp2812电机控制的代码
💻 C
字号:
#include "DSP28_Device.h"     // DSP281x Headerfile Include File

interrupt void t1pint_isr(void);
interrupt void t2pint_isr(void);
interrupt void  cap_isr(void);
interrupt void  pdpinta_isr(void);
void delay(int m);

unsigned int t1prd=117;//20K
unsigned int t2prd=59;//40K频率
unsigned int u,v,w;//u,v,w三相电压
unsigned int dccurent;//直流母线电流
unsigned int dcvoltage;//直流母线电压
unsigned int speedad;//可调电阻的电压采样,用来设定转速
unsigned int capstastus;//定义cap口的电平
unsigned int huangxiang[6]={0xf7d,0x7fd,0x7df,0xfd7,0xdf7,0xd7f};//逆时针旋转换向字
Uint32 Time,T2cnt,Speed,count=0;
unsigned Pole=2;//极对数
Uint32 Sum=0,Average=8000;
unsigned int l=0,nn=0;
unsigned int dir=0;
unsigned int pwm=20;
int t1=0;

Uint32 delaytime=14;//延迟时间赋初值
unsigned int Average1=200;
unsigned int flag1=0;//用于判断是否该延时的标志

unsigned int test[1000];//测试用
unsigned int test1[100];//测试用


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

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE矢量表*/
	InitPieVectTable();	
	
	/*初始化GPIO*/
	Gpioinit();
	
	/*初始化AD*/
	InitAdc();
	
	/*初始化PWM*/
	Init_eva_pwm(); 
    
    /*初始化CAP*/
    Capinit();	
	
	EALLOW;  // This is needed to write to EALLOW protected register
    PieVectTable.CAPINT1=&cap_isr;
    PieVectTable.CAPINT2=&cap_isr;
    PieVectTable.CAPINT3=&cap_isr;
    PieVectTable.T1PINT=&t1pint_isr;
    PieVectTable.T2PINT=&t2pint_isr;
    PieVectTable.PDPINTA=&pdpinta_isr;    
    EDIS;    // This is needed to disable write to EALL
	
	PieCtrl.PIEIER2.bit.INTx4=1;//T1pint中断
    PieCtrl.PIEIER3.bit.INTx1=1;//T2pint中断
    PieCtrl.PIEIER3.bit.INTx5=1;//Cap1中断
    PieCtrl.PIEIER3.bit.INTx6=1;//Cap2中断
    PieCtrl.PIEIER3.bit.INTx7=1;//Cap3中断
    PieCtrl.PIEIER1.bit.INTx1=1;//pdpinta中断    	
	/* 设置IER寄存器 */

	IER |= M_INT1;
    IER |= M_INT2; // t1pint enable
    IER |= M_INT3; // capture enable    
   for(kk=0;kk<24;kk++)
   {
   		EvaRegs.ACTR.all = huangxiang[kk%6];
   		delay(1000);
   }
   
   EvaRegs.CMPR1 = 15;
   EvaRegs.CMPR2 = 15;
   EvaRegs.CMPR3 = 15; 
   EDIS;  
  
   IER |= M_INT2; // t1pint enable
   IER |= M_INT3; // capture enable
   EINT;          // Enable Global interrupt INTM
   ERTM;          // Enable Global realtime interrupt DBGM

   while(1)
   {
       
   }
     
}

interrupt void  t2pint_isr(void)
{
  count++; 
  if(flag1==1)
  {
  	delaytime--; 
  	if(delaytime==0)
  	{  		
  	    switch(capstastus)//ir2136 的hin和lin是反向的
   	    {
   		  
   		   case 1: EvaRegs.ACTR.all=0x7fd;break;//h3 fall
   		   case 2: EvaRegs.ACTR.all=0xfd7;break;//h1 fall
   		   case 3: EvaRegs.ACTR.all=0x7df;break;//h2 rise
   		   case 4: EvaRegs.ACTR.all=0xd7f;break;//h2 fall
   		   case 5: EvaRegs.ACTR.all=0xf7d;break;//h1 rise
   		   case 6: EvaRegs.ACTR.all=0xdf7;break;//h3 rise
   		  
   		}  
   		flag1=0;   	
   	}   
  }
  EvaRegs.EVAIFRB.bit.T2PINT=1;//清除中断标志
  EvaRegs.EVAIMRB.bit.T2PINT=1;//中断允许    
  PieCtrl.PIEACK.bit.ACK3=1;//向cpu申请中断
}


interrupt void  cap_isr(void)
{  
   /*****以下用来检测传感器的输出电平,用来换向****/
   Uint32 kkk=t2prd;
   EALLOW;
   GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=0;//设定cap1~3为gpio
   GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=0;
   GpioMuxRegs.GPAMUX.bit.CAP3QI1_GPIOA10=0;   
   GpioMuxRegs.GPADIR.bit.GPIOA8=0;//设定cap1~3为输入
   GpioMuxRegs.GPADIR.bit.GPIOA9=0;
   GpioMuxRegs.GPADIR.bit.GPIOA10=0;   
   capstastus=(GpioDataRegs.GPADAT.all&0x0700)>>8;
    
   /*************************/
   /*以下用来计算转速*/
 
   T2cnt=EvaRegs.T2CNT;//读取定时器2的值
   Time=kkk*count+ T2cnt;//获得运转1相所需时间        
   Sum+=Time;
   delaytime=Average1/2;//30度角延迟的时间  
   
   l++;
   
   if(l==12)
   {
     	Average=Sum/12;
     	Average1=Average/59;
        l=0;    	
    	Sum=0;    	
    
    	Speed=kkk*39724*60/(Average*6*Pole);//计算转速(40k实际为39724hz)  
    	test[nn]=Speed;//测试用,存储速度值
    	nn++;
   		if(nn==1000)
   		{
     		nn=0;      
   		}  
    }
    
    flag1=1;    
    count=0;
    EvaRegs.T2CON.all = 0x1400;//关闭定时器2   
    EvaRegs.T2CNT = 0x0000;
    EvaRegs.T2CON.all = 0x1440;//启动定时器2  
    /*************************/
    
    GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=1;//重新设定cap1~3为gpio
    GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=1;
    GpioMuxRegs.GPAMUX.bit.CAP3QI1_GPIOA10=1; 
   
    EvaRegs.EVAIFRC.all = 7 ; // 清捕捉中断
    EvaRegs.CAPFIFO.all = 0x01500; // 清空捕捉堆栈   
    PieCtrl.PIEACK.bit.ACK3=1;//cap1中断向cpu申请中断
    EDIS;
}

interrupt void  t1pint_isr(void)
{
  dcvoltage=(AdcRegs.RESULT0)>>4;  
  dccurent=(AdcRegs.RESULT1)>>4;  
  
       
  AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1; //清除状态字
  AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位seq1
  
  EvaRegs.EVAIFRA.bit.T1PINT=1;//清除中断标志
  EvaRegs.EVAIMRA.bit.T1PINT=1;//中断允许 
   
  PieCtrl.PIEACK.bit.ACK2=1;//向cpu申请中断

}

interrupt void  pdpinta_isr(void)
{
  
  	EvaRegs.EVAIFRA.bit.PDPINTA=1;//清除PDPINTA中断标志
  	PieCtrl.PIEACK.bit.ACK1=1;//向cpu申请中断
  	
    stopmotor();
    GpioDataRegs.GPADAT.bit.GPIOA12 =1;//故障显示
  	EvaRegs.COMCONA.bit.FCOMPOE=1;//重新使能比较输出
 
}

void delay(int m)
{
    int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<75;j++)
		{}
	}
}//###########################################################################



⌨️ 快捷键说明

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