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

📄 mainproject.c

📁 dsp经典代码 dsp经典代码 dsp经典代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include	"regs2407.h"
#include	"float.h"
#include	"math.h"  
//#include	"HZTABLE.h" 
#define pi  3.1415926


float cap[2]={0,0};            //用于保存cap4两次捕捉的数值
float ss=0;
unsigned int number=0;          //T1PR的数值,计算频率后由number=30m/(fre*256)得出
float adcin1[256],adcin4[256],
      adcin6[256],adcin7[256],sin_tab[256],cos_tab[256],adcin5[256],adcin2[256],adcin3[256];             //adc采样数据的7个存储区,分别保存1~7通道采样结果
//unsigned int *presult1,*presult2,*presult3,*presult4,*presult5,*presult6,*presult7;       //         7个指针分别指向adc 1~7数据缓冲寄存器
int boxing1[256],boxing2[256];
int bbb[320];                //显示9个单元  16*9
int clear1[64],clear2[64];

float w[256],dataR[256],dataI[256],clear3[256],clear4[256];
int newconvert=0;            //采样保存结果标志位
int adcount=0;              //采样次数
int cursor_reg=0;             //显示屏选择控制寄存
int flag_set=0;               //XINT2中断,用于响应按键
float fre;                   //输入信号频率
//float sin_tab[256],cos_tab[256];
float Vmax=-5;
float Imax=-5;

float VITUREu=0;
float VITUREi=0;

float Spower=0;
float Ppower;
float Qpower=0;
float Qz;           //功率因素角

int flag_show=0;

//void key_scane(void);
void shuju(int x);

int m=0;
extern unsigned int hzk168[];

void delay10ms(void)
 {int i;for(i=4000;i>0;i--) i=i;}

void enable()
{
	asm(" CLRC INTM "); 
}

void disable()
{
    asm(" setc INTM "); 
}


//ADC初始化
void iniadc(void)
{
   
    ADCCTRL1 =0X2fc0;                //连续转换模式
//   ADCCTRL1 =0X2000;                //启动停止转换模式

   
   MAXCONV =0X0002;                //每次完成7个转换通道
//   MAXCONV =0X0000; 
//   CHSELSEQ1 =0X0001;       

   CHSELSEQ1 =0X210;              //转换顺序1~7
//   CHSELSEQ2 =0X0763;
      
   
   
/*   *presult1=RESULT1;
   presult2=RESULT2;
   presult3=RESULT3;
   presult4=RESULT4;
   presult5=RESULT5;
   presult6=RESULT6;
   presult7=RESULT7;
*/   
   EVAIMRA =0x0080;               //使能T1PINT
//   EVAIMRA |=0x0100; 
   EVAIFRA  =0XFFFF;
   T1CNT    =0;
   T1PR     =number; 
   GPTCONA  =0X2100; 
//   T1PR     =1825;   
   
//   ADCCTRL2 =0x4700;                 //EVA事件启动转换,转换完成中断    
   ADCCTRL2 =0X2000;                 //向SOC位写1启动转换

   T1CON    =0X1140;              // 连续增计数方式,启动计数器 2分频           
//   T1CON    =0X1146; 
} 



//cap4初始化--测量频率
void inicap4(void)
{
    
    
    CAPFIFOB=0X0000;
    
    T3PR = 0xffff; 
    T3CNT=0;           //每中断一次读一次计数器的值
    
       
    WSGR=0X0000;
    CAPCONB=0X0A240;  
 //   T3CON=0X1e4c;      //连续增计数,使能定时器操作,16分频,cpu时钟,计数器等于0或周期寄存器重载
    T3CON=0X174c;         //128分频
    m=0;
    cap[0]=0;
    cap[1]=0;
}


void inixint2(void)
{
   XINT2CR =0XFFF5;

}


//系统初始化
void initial() 
{   
	asm(" setc SXM");
	asm(" clrc OVM") ;
	asm(" clrc CNF") ;	
	SCSR1 = 0x02ff;		//CLOCK=40M
//    SCSR1 = 0x12ff;     //cpu进入LPM1模式、系统时钟频率2*fin、ADC,SCI,SPI,CAN,EVB,EVA模块时钟使能
	SCSR2 = 0X000E; 
//  SCSR2 = 0X000a;     //禁止引导ROM,SARAM映射到片内数据空间
	WDCR = 0x6F;		//不使能看门狗 
	WDKEY= 0x055;
    WDKEY= 0x0AA;  
    
            
    EVBIMRA |=0X0080;
    EVBIMRC |=0X0001;
    
    EVBIFRA=0XFFFF;
    EVBIFRC  =0XFFFF;
        
    IFR  =0XFFFF;
    PIRQR0=0;
    PIRQR1=0;
    PIRQR2=0;
    PIACKR0=0;
    PIACKR1=0;
    PIACKR2=0;
    IMR = 0x0B;
//    IMR |= 0x01;
    
    
    MCRB=0X0100;          //IOPC4~IOPC7 XINT2
//	MCRB = 0; 
	MCRC |=0x0880;    //IOPE7配置为CAP4
	
	PADATDIR = 0xf8ff;	//IOPA3~7:output
    PDDATDIR = 0x0000;  //XINT2:input

	PCDATDIR = 0x010f;	//IOPC0:output,IOPC4~IOPC7:input
	
//	PEDATDIR = 0x60ff;	//IOPE5~6:output
	PFDATDIR = 0x66db;	//IOPF6,5,2,1:output   
    PEDATDIR &=0x7f00;   //IOPE7配置为输入
    
    
    GPTCONB = 0x48;
	T4CON = 0x1046;	//T4工作于连续增/计数模式,使用cpu时钟,计数器等于周期寄存器时重载	
	T4CNT = 0;
    T4PR = 1000;		//40KHz
    T4CMPR=800;
    
} 


void interrupt c_dummy1(void)
{   //EVBIFRA=0xFFFE;
	asm(" CLRC INTM "); 
//	return;
}  



void interrupt TPINT(void)  
{
    
    switch(PIVR)
	{   
		case 0x002f:                 //T3周期中断
		    { 
//             ss++;
		     EVBIFRA |=0XFFFF;
		     break;
		    } 
		
		case 0x0027:                   //T1周期中断
		    {
              newconvert=1;           //设置保存标志;
		      EVAIFRA  =0XFFFF;
		      break;
		    }
		     
		default:break;
	}                             
	asm(" CLRC INTM "); 
	return;

}


void interrupt CAP4(void)
{
    
    switch(PIVR)
	{   
		case 0x0036:
		    
//		     T3CON |=0X0040;
		     cap[m]=CAP4FBOT;
//		     t[m]=ss;
		     m++;
		     EVBIFRC |=0x01;
		     
//		     t3=0;		         	   
		     break;
		default:break;
	}                             
	asm(" CLRC INTM "); 
	T3CNT=0; 
	return;

}

void interrupt XINT2(void)
{
   switch(PIVR)
	{   
		case 0x0011:
		     flag_set=1;

		     EVBIFRC |=0x01;
		     XINT2CR |=0x8000;
//		     key_scane();
		     
		     break;
//		case 0x0004:
//		     newconvert=1;           //设置保存标志;
//             ADCCTRL2 |=0X4200;        
		     
		     break;
		default:break;
	}                             
	asm(" CLRC INTM "); 
	return;

}



//频率计算
void frequency(void)
{
         
//    fre=(float)(18750/cap[1]);  
        fre=(float)(31250/cap[1]);  
    fre=fre*40; 
    number=(unsigned int)(78125/fre);          //每个周期采样数为256
}


//采样结果保存

void adc(void)
{
   unsigned int work;
   
   if(newconvert==1)
     {
       newconvert=0;
       
       work=RESULT1;               //取通道1结果
       work>>=6;                      //移位去掉低6位
       adcin1[adcount]=(float)work*0.0032258-1.66;          //保存结果,0.0032258为每点基准数
       boxing1[adcount]=work;
       
       work=RESULT2;
       work>>=6;                      
       adcin2[adcount]=(float)work*0.0032258-1.66;
       boxing2[adcount]=work;
/*       
       work=RESULT3;
       work>>=6;                      
       adcin3[adcount]=(float)work*0.0032258;
      
       work=RESULT4;
       work>>=6;                      
       adcin4[adcount]=(float)(work*0.0032258);          
       
       work=RESULT5;
       work>>=6;                      
       adcin5[adcount]=(float)work*0.0032258;
       
       work=RESULT6;
       work>>=6;                      
       adcin6[adcount]=(float)work*0.0032258;
       
       work=RESULT7;
       work>>=6;                      
       adcin7[adcount]=(float)work*0.0032258;
*/        
       adcount++;
       

     
     }

}


void show(int a[],int clear[])
{
      int i,j,k,xxx,dd,fu,x,y,aaa,cc,b[64];
      
 /*    for(i=1;i<14;i++)
       {
        for(j=90;j<131;j++) 
         {
          for(k=0;k<8;k++)
             {
                 Clear_boxing(i,j,k);
              } 
         }
       }      */
     
      for(i=0;i<64;i++)
        {
          b[i]=a[i*4];        
        } 
       
       
       
      
      for(i=1;i<=13;i++)    //显示横坐标
        {
          for(j=0;j<8;j++)
             {
                boxing_show(i,110,j);
              }                 
        }
        
        for(i=90;i<=130;i++)    //显示纵坐标
         {
             boxing_show(1,i,7);     
         }
      

     
       for(i=0;i<64;i++)
        {
          j=(int)(i/8);
          fu=-1;
          xxx=b[i]-511;
          if(xxx<0)
            {
              xxx=-xxx;
              fu=1;
            }
          dd=xxx;
          y=(int)(dd/16);          //纵坐标
          x=i-j*8;                 //横坐标
          aaa=7-x;
          cc=110+fu*y;
          if(cc!=clear[i])   Clear_boxing(j+1,clear[i],aaa);        //如果和上次采样值不同,则把上次显示清出
          boxing_show(j+1,cc,aaa);           
          clear[i]=cc;
          
        
        }     
}





void v_i(int x)
{
  
   float vcompare,icompare;
  
   int i,y,Nv,Ni,zzz;
   float *p,*r,pow=0;
   y=x+1;
   
    switch(x)
	{   
		case 0x001:                 
		    { 
             p=adcin1;
		     break;
		    } 
		
		case 0x002:                 
		    {
		     p=adcin2;
		     break;
		    }
		case 0x003:              
		    { 
             p=adcin3;
		     break;
		    } 
			
		default:break;
	}
   
   switch(y)
     {
        	case 0x002:                 
		    {
		     r=adcin2;
		     break;
		    }
		case 0x003:                
		    { 
             r=adcin3;
		     break;
		    } 
		
		case 0x006:                  
		    {
		     r=adcin6;
		     break;
		    }
     
       	default:break;
     }
        
  
  
  for(i=0;i<256;i++)        //电压、电流最大值计算
  
    {
      vcompare=*(p+i);
      icompare=*(r+i);
       if(Vmax<vcompare)  Vmax=vcompare;
       if(Imax<icompare)  Imax=icompare;  
    }

     
     
     

   for(i=0;i<256;i++)            //电压、电流有效值计算   
     {
       VITUREu=VITUREu+(*(p+i))*(*(p+i));
       VITUREi=VITUREi+(*(r+i))*(*(r+i));     
     }
   VITUREu=(float)sqrt(VITUREu/256); 
   VITUREi=(float)sqrt(VITUREi/256);
   
 
       
   for(i=0;i<256;i++)            //有功功率

     {
       Spower=Spower+(*(p+i))*(*(r+i));     
     }
   Spower=Spower/256;

   
   Ppower=VITUREu*VITUREi;     //电压、电流视在功率计算
   
   
   Qpower=(float)sqrt(Ppower*Ppower-Spower*Spower);   //电压、电流无功功率计算
   

   Qz=Spower/Ppower;         //功率因数COSλ计算
     
  

}


void sin_cos(void)
{


       int i;
/********** 以下为256点三角函数存储表 ************/     

    float pi1[]={
          1.000000000,0.999698819,0.998795456,0.997290457,
          0.995184727,0.992479535,0.98917651, 0.985277642,
          0.98078528, 0.97570213, 0.970031253,0.963776066,
          0.956940336,0.949528181,0.941544065,0.932992799,
          0.923879533,0.914209756,0.903989293,0.893224301,
          0.881921264,0.870086991,0.85772861, 0.844853565,
          0.831469612,0.817584813,0.803207531,0.788346428,
          0.773010453,0.757208847,0.740951125,0.724247083,
          0.707106781,0.689540545,0.671558955,0.653172843,
          0.634393284,0.615231591,0.595699304,0.575808191,
          0.555570233,0.53499762, 0.514102744,0.492898192,
          0.471396737,0.44961133, 0.427555093,0.405241314,
          0.382683432,0.359895037,0.336889853,0.31368174,
          0.290284677,0.266712757,0.24298018, 0.21910124,
          0.195090322,0.170961889,0.146730474,0.122410675,
          0.09801714, 0.073564564,0.049067674,0.024541229,
          },
     pi2[]={
          0.00000000,  0.024541229, 0.049067674, 0.073564564, 0.09801714,
          0.122410675, 0.146730474, 0.170961889, 0.195090322,
          0.21910124,  0.24298018,  0.266712757, 0.290284677,
          0.31368174,  0.336889853, 0.359895037, 0.382683432,
          0.405241314, 0.427555093, 0.44961133,  0.471396737,
          0.492898192, 0.514102744, 0.53499762,  0.555570233,
          0.575808191, 0.595699304, 0.615231591, 0.634393284,
          0.653172843, 0.671558955, 0.689540545, 0.707106781,
          0.724247083, 0.740951125, 0.757208847, 0.773010453,
          0.788346428, 0.803207531, 0.817584813, 0.831469612,
          0.844853565, 0.85772861,  0.870086991, 0.881921264,
          0.893224301, 0.903989293, 0.914209756, 0.923879533,
          0.932992799, 0.941544065, 0.949528181, 0.956940336,
          0.963776066, 0.970031253, 0.97570213,  0.98078528,
          0.985277642, 0.98917651,  0.992479535, 0.995184727,
          0.997290457, 0.998795456, 0.999698819,
         }; 
   for(i=0;i<64;i++)   
      {
        sin_tab[i]=pi2[i];
        sin_tab[i+64]=pi1[i];
        sin_tab[i+128]=-pi2[i];
        sin_tab[i+192]=-pi1[i]; 
        cos_tab[i]=pi1[i];
        cos_tab[i+64]=-pi2[i];
        cos_tab[i+128]=-pi1[i];
        cos_tab[i+192]=pi2[i];        
   }
   
}   


//电压显示
void show_voltage(int x)
{

   flag_show=1;
   ClearScreen();

   
   
//----------以下为液晶屏左边,显示电压数据-----------
   
   ShowHZ1616(5,1,4);   //电
   ShowHZ1616(7,1,5);   //压
   ShowHZ168(9,1,x);    //1,2,3
   
   
   ShowHZ1616(1,20,24);   //最
   ShowHZ1616(3,20,25);   //大
   ShowHZ1616(5,20,26);   //值
   ShowHZ168(7,20,14);    //:
   ShowHZ168(9,20,15);    //.   

   ShowHZ1616(1,37,27);   //有
   ShowHZ1616(3,37,28);   //效
   ShowHZ1616(5,37,26);   //值
   ShowHZ168(7,37,14);    //:
   ShowHZ168(9,37,15);    //.   

   ShowHZ1616(20,1,4);   //电
   ShowHZ1616(22,1,6);   //流
   ShowHZ168(24,1,x+3);    //1,2,3  
   
   ShowHZ1616(16,20,24);   //最
   ShowHZ1616(18,20,25);   //大
   ShowHZ1616(20,20,26);   //值
   ShowHZ168(22,20,14);    //:
   ShowHZ168(24,20,15);    //.  

   ShowHZ1616(16,37,27);   //有
   ShowHZ1616(18,37,28);   //效
   ShowHZ1616(20,37,26);   //值
   ShowHZ168(22,37,14);    //:
   ShowHZ168(24,37,15);    //.  

   ShowHZ1616(1,54,27);   //有
   ShowHZ1616(3,54,31);   //功
   ShowHZ1616(5,54,31);   //功
   ShowHZ1616(7,54,8);   //率
   ShowHZ168(9,54,14);    //:
   ShowHZ168(11,54,15);    //.   

   ShowHZ1616(16,54,30);   //无
   ShowHZ1616(18,54,31);   //功
   ShowHZ1616(20,54,31);   //功
   ShowHZ1616(22,54,8);   //率
   ShowHZ168(24,54,14);    //:
   ShowHZ168(26,54,15);    //.  

   ShowHZ1616(1,71,31);   //功
   ShowHZ1616(3,71,8);   //率
   ShowHZ1616(5,71,32);   //因
   ShowHZ1616(7,71,10);   //数
   ShowHZ168(9,71,14);    //:
   ShowHZ168(11,71,15);    //.     

    ShowHZ1616(16,71,7);   //频
    ShowHZ1616(18,71,8);   //率
    ShowHZ168(20,71,14);    //:
    ShowHZ168(24,71,15);    //.
    
    
    shuju(x); 

}     
   
void shuju(int x)   
{   
   float max,viture,powe,qpowe,ppp;
   int i,j,k,l,o;
   v_i(x);

⌨️ 快捷键说明

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