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

📄 nihe.c

📁 完成两路带有三差信号的拟合输出
💻 C
字号:
#include"F206_Addr.h"
#include"FLOAT.h" 

       
#include"ioports.h"
#include<math.h>
#include<stdio.h>
#include<stdlib.h>

/*#define IOSR   0xFFF6h*/  
/*#define IOSR_VAL 0x0004h*/ 
/*#define ASPCR 0xFFF5h*/
/*#define ASPCR_UAL 0xE003h*/

/*ioport unsigned port0000; */
float c[5][32], d[32][1], dd[5][1],a2[32],b2[32],x[5];
float a,g,p,q,cc,dd2,tt;
int i,j,k,m,sp;
 
float aa[5][5];
float ddd[5][1];
float a1[32]={2.4300,2.4299,2.4298,2.4295,2.4290,2.4285,2.4278,2.4270,2.4261,2.4251,
               2.4239,2.4227,2.4213,2.4197,2.4181,2.4164,2.4145,2.4125,2.4104,2.4081,
               2.4058,2.4033,2.4007,2.3980,2.3952,2.3922,2.3892,2.3860,2.3827,2.3793,
               2.3757,2.3721};
       
float b1[32]={1.6000,1.6086,1.6172,1.6258,1.6342,1.6427,1.6510,1.6593,1.6676,
      1.6758,1.6840,1.6920,1.7001,1.7080,1.7160,1.7238,1.7316,1.7393,
      1.7470,1.7546,1.7621,1.7695,1.7769,1.7843,1.7915,1.7987,1.8058,
      1.8129,1.8199,1.8268,1.8336,1.8404}; 

/*interrupt void read_AD(void)
{
 for(sp=0;sp<32;sp++)
 {while((IOSR&0x4)==4)
  a1[sp]=port0000;
  while((IOSR&0x4)==0) {};
   } 
}   */
main()
{
 while(1) 
 {
  asm(" setc intm "); 
  
     /*volatile int ASPCR=(volatile int )0xFFF5h;*/
    /**(volatile int *)ASPCR=0xE003h; */                         
   /*  *(volatile int *)IOSR=0xFFF6h;             /* *(volatile int*)*/

/* for(sp=0;sp<32;sp++)
 {while((IOSR&0x4h)==4)
  a1[sp]=port0000;
  while((IOSR&0x4)==0) {};
   } */
  	 
   
 /*  while(1)
		
	a1[0]=ADPORT;
	while(1)
		{   
		
	for(sp=1;sp<32;sp++)
	{
		
		a1[sp]=ADPORT; }  }  */
 /* a1[32]={2.4300,2.4299,2.4298,2.4295,2.4290,2.4285,2.4278,2.4270,2.4261,2.4251,
               2.4239,2.4227,2.4213,2.4197,2.4181,2.4164,2.4145,2.4125,2.4104,2.4081,
               2.4058,2.4033,2.4007,2.3980,2.3952,2.3922,2.3892,2.3860,2.3827,2.3793,
               2.3757,2.3721};
  b1[32]={1.6000,1.6086,1.6172,1.6258,1.6342,1.6427,1.6510,1.6593,1.6676,
      1.6758,1.6840,1.6920,1.7001,1.7080,1.7160,1.7238,1.7316,1.7393,
      1.7470,1.7546,1.7621,1.7695,1.7769,1.7843,1.7915,1.7987,1.8058,
      1.8129,1.8199,1.8268,1.8336,1.8404};  */       
 for (i=0;i<=31;i++)
  { c[0][i]=b1[i]*b1[i];
    c[1][i]=a1[i]*b1[i];
    c[2][i]=a1[i];
    c[3][i]=b1[i];
    c[4][i]=1;
   }

 for(i=0;i<32;i++)
  {d[i][1]=a1[i]*a1[i];
    }


 for(j=0;j<5;j++)
  {for(k=0;k<5;k++)
   {for(m=0;m<32;m++)
    {cc=c[j][m]*c[k][m];
      aa[j][k]=aa[j][k]+cc;}
      }
   }

 for(i=0;i<5;i++)
 {for(j=0;j<32;j++)
  {dd2=c[i][j]*dd[j][1];
   ddd[i][1]=ddd[i][1]+dd2;
    }
   }
/*高斯迭代求解*/

for(i=0;i<5;i++)
{if(aa[i][i]==0)
   aa[i][i]=0.001;
}
for(k=0;k<4;k++)
{for(i=k+1;i<5;i++)
  {aa[i][k]=-aa[i][k]/aa[k][k];
   ddd[i][1]=ddd[i][1]+aa[i][k]*ddd[k][1];
   for(j=k+1;j<5;j++)
    {aa[i][j]=aa[i][j]+aa[i][k]*aa[k][j];
      }
   }
}

x[4]=ddd[4][1]/aa[4][4];
for(k=3;k>=0;k--)
{tt=0;
  for(j=k+1;j<5;j++)
   {tt=aa[k][j]*x[j]+tt;
     }
 x[k]=(ddd[k][1]-tt)/aa[k][k];
}




a=asin(-x[1]/sqrt(-4*x[0]));

g=sqrt(-x[0]);
p=(2*x[0]*x[2]-x[3]*x[1])/(x[1]*x[1]+4*x[0]);
q=(-2*x[3]-x[2]*x[1])/(x[1]*x[1]+4*x[0]);




for(i=0;i<32;i++)
{a2[i]=a1[i]-p;
}
for(i=0;i<32;i++)
{b2[i]=(a2[i]*sin(a)+g*(b1[i]-q))/cos(a);
}

}

}      









/**************************************************************
* 本程序根据Heydemann算法对带有三差的数据进行补偿             *
* AD转换由外部信号开启,dsp根据IO2口的电平变化判断是否接收数据*
* 对每采集的32个数据进行拟合,纠正三差误差,输出32个数据      *
***************************************************************/


#include"F206_Addr.h"               /*定义寄存器地址:GREG为0x0005,IOSR为portFFF6,ASPCR为portFFF5,ADPORT为port0000*/
#include"FLOAT.h" 
#include"ioports.h"                 /*定义了访问IO口的两个宏和相关函数,inport和outport宏是访问I/O口最方便的方法*/
#include<math.h>                    /*定义了三角,指数,双曲等数学函数,三角函数以弧度作为单位。*/
#include<stdio.h>
#include<stdlib.h>                  /*说明了多个函数,宏,和数据类型*/

/*.....................................定义变量...................................*/

float c[5][32], d[32][1], dd[5][1],a2[32],b2[32],x[5];   /* 定义算法中的变量,类型为浮点型*/
float a,g,p,q,cc,dd2,tt;
int i,j,k,m,sp;
 
float aa[5][5];                      /*存放矩阵c和c的转秩的乘积,为5×5的矩阵*/
float ddd[5][1];                     /*存放矩阵c和y相乘的结果,为5×1的矩阵*/
float a1[32];                        /*存放AD转换后输入的32个数*/
float b1[32];                        /*存放AD转换后输入的32个数*/

/*.....................................主函数......................................*/   

main()                                          
{
 while(1)                            /*循环条件为一,是程序循环运行*/
 {
  asm("setc intm");                  /*屏蔽中断*/
     
  /* *(volatile int *)ASPCR=0xE003h; */   /*ASPCR复位值为0x0000h,此时IO2配置为输入,可不必设置*/                       

/*...................................数据输入并按算法赋值.................................*/
   
  for(sp=0;sp<32;sp++)
    {while((IOSR&0x0004h)==4)         /*如果IO2为高电平,进行ad数据采集*/
       a1[sp]=ADPORT;
     while((IOSR&0x0004)==0) {};      /*如果IO2为低电平,不操作*/
    }

  for (i=0;i<=31;i++)                 /* 赋值,如式2-16*/
    { c[0][i]=b1[i]*b1[i];
      c[1][i]=a1[i]*b1[i];
      c[2][i]=a1[i];
      c[3][i]=b1[i];
      c[4][i]=1;
    }

  for(i=0;i<32;i++)                   /* 赋值,如式2-16*/
    {d[i][1]=a1[i]*a1[i];
    }

  for(j=0;j<5;j++)                    /*求c和c转秩的乘积,得到5*5矩阵,存放到aa[5][5]中*/
    {for(k=0;k<5;k++)
      {for(m=0;m<32;m++)
        {cc=c[j][m]*c[k][m];
         aa[j][k]=aa[j][k]+cc;
        }
      }
    }

  for(i=0;i<5;i++)                    /*求c和y的积,得到5*1矩阵,存放到ddd[5][1]*/
    {for(j=0;j<32;j++)
      {dd2=c[i][j]*dd[j][1];
       ddd[i][1]=ddd[i][1]+dd2;
      }
    }

/*.........................................高斯迭代求解...................................*/

  for(i=0;i<5;i++)
    {if(aa[i][i]==0)                  /*排除对角线上数据为零的情况*/
     aa[i][i]=0.001;
    }

  for(k=0;k<4;k++)                    /*进行高斯迭代,化为上三角行列式*/
    {for(i=k+1;i<5;i++)               /*从第一行开始,将第一列的2--5元素消去,然后从第二行开始,消去第二列的3--5*/                  {aa[i][k]=-aa[i][k]/aa[k][k];   /*依此类推,化为上三角行列式*/
       ddd[i][1]=ddd[i][1]+aa[i][k]*ddd[k][1];
       for(j=k+1;j<5;j++)
        {aa[i][j]=aa[i][j]+aa[i][k]*aa[k][j];
        }
      }
    }

  x[4]=ddd[4][1]/aa[4][4];            /*求出上三角行列式最后一行的变量,即求出x[4]*/
  for(k=3;k>=0;k--)                   /*反向迭代求出x[0],x[1],x[2],x[3]*/
    {tt=0;
     for(j=k+1;j<5;j++)
      {tt=aa[k][j]*x[j]+tt;
      }
     x[k]=(ddd[k][1]-tt)/aa[k][k];
    }

/*.......................................按照Heydemann算法求出纠正值a,g,p,q............................*/

  a=arcsin(-x[1]/sqrt(-4*x[0]));             
  g=sqrt(-x[0]);
  p=(2*x[0]*x[2]-x[3]*x[1])/(x[1]*x[1]+4*x[0]);
  q=(-2*x[3]-x[2]*x[1])/(x[1]*x[1]+4*x[0]);

/*...............................对输入的32个数据进行误差补偿,存放到数组a2[32],b2[32]中......................*/

  for(i=0;i<32;i++)                    
    {a2[i]=a1[i]-p;
    }
  for(i=0;i<32;i++)
    {b2[i]=(a2[i]*sin(a)+g*(b1[i]-q))/cos(a);
    }
  }
}

⌨️ 快捷键说明

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