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

📄 max262.c

📁 可编程程控滤波器MAX262驱动.可步进设置中心频率,Q,截止频率
💻 C
字号:
 #include <reg52.h>
 #include <MATH.H>
 #include  <INTRINS.H>

 typedef  unsigned char  uchar ;
 typedef unsigned int  uint;

 #define P_262 P1   //口线连线(从高到低):A3,A2,A1,A0,D1,D0,Wr,_
  sbit P_wr = P_262^1;
  sbit Fclk_S2=P2^2; //CPLD选择Fclk控制线
  sbit Fclk_S1=P2^1;
  sbit Fclk_S0=P2^0;

 sbit PFS0=P2^3;//工作模式工作模式选择0
 sbit PFS1=P2^4;//工作模式工作模式选择1

 long FLCK = 1000000 ; //MAX262工作频率
 uchar Mod=2;//工作模式0,1,2,3
 #define PI 3.1415926



#define delay_262()  _nop_();_nop_();_nop_()

void delay(unsigned int d)
{unsigned char j;
while(d!=0)
  {
   d--;
   j=70;
   do {j--;} while(j!=0);
  }

}

//***************************************************************
//写两比特的数据
void write(uchar add,uchar dat2bit)
{
 	 P_262=(P_262&0x0f)|(add<<4);
	 P_262=(P_262&0xf3)|((dat2bit<<2)&0x0c);
	 P_wr=0;
	 delay_262();
	 P_wr=1;
	 delay_262();
	}
//**************************************************************

//设置A通道工作模式
void Set_AM(uchar mod)
 {
 	 write(0,mod);
 	}
//设置A通道F值
void Set_AF(uchar datF)
 {
 	 write(1,datF);
 	 datF=datF>>2;
 	 write(2,datF);
 	 datF=datF>>2;
 	 write(3,datF);
 	}
//设置A通道Q值
void Set_AQ(uchar datQ)
 {
 	 write(4,datQ);
 	 datQ=datQ>>2;
 	 write(5,datQ);
 	 datQ=datQ>>2;
 	 write(6,datQ);
 	 datQ=(datQ>>2)&1;
 	 write(7,datQ);
 	}
//设置B通道工作模式
void Set_BM(uchar mod)
 {
 	 write(8,mod);
 	}
//设置A通道F值
void Set_BF(uchar datF)
 {
 	 write(9,datF);
 	 datF=datF>>2;
 	 write(10,datF);
 	 datF=datF>>2;
 	 write(11,datF);
 	}
//设置A通道Q值
void Set_BQ(uchar datQ)
 {
 	 write(12,datQ);
 	 datQ=datQ>>2;
 	 write(13,datQ);
 	 datQ=datQ>>2;
 	 write(14,datQ);
 	 datQ=(datQ>>2)&1;
 	 write(15,datQ);
 	}

//***************************************************************
//基本计算
//***************************************************************
//根据截止频率fc计算中心频率f0
//
/*
uchar CopF0(float q, float fc)
 {
        q  =  pow(q, 2);
        q  =  (float)q*2;
        q  = (float)(q-1)/q;//1-(1/q)
        fc = (float)fc * sqrt(sqrt(1+pow(q,2))-q);
 	}

float CopF0_tx(float q, float fc)
 {
        q  =  pow(q, 2);
        q  =  (float)q*2;
        q  = (float)(q-1)/q;//1-(1/q)
        fc = fc * sqrt(sqrt(1+pow(q,2))+q);
 	}
 */
//根据中心频率求设定值FN
float CopFn(uchar mod, float f0)
{
	if (1==mod)
          {
		return ((float)((FLCK*2.8284271247/f0)/PI)-26);
          }
	else
         {
		 return ((float)((FLCK*2/f0)/PI)-26);
          }
	}

//根据Q求设定值QN
uchar CopQn(uchar mod, float q)
{
	if (1==mod)
	  {
	        return (128-(float)(90.51/q));
	  }
	else
          {

                 return (128-(float)(64/q));
          }

	}

 //***************************************
//功能接口函数

//设定频率
Set_F0(uchar mod,float f0 )
{
  if(f0>28612)
    {
     Fclk_S2=0;Fclk_S1=0;Fclk_S0=0;//Fclk 4M
     FLCK=4000000;
     }
  else if(f0>14306)
     {
      Fclk_S2=0;Fclk_S1=0;Fclk_S0=1;//Fclk 2M
      FLCK=2000000;
     }
  else if(f0>7153)
    {
     Fclk_S2=0;Fclk_S1=1;Fclk_S0=0; //Fclk 1M
     FLCK=1000000;
     }
  else if(f0>3683)
    {
     Fclk_S2=0;Fclk_S1=1;Fclk_S0=1;//Fclk 512K
     FLCK=512000;
     }
  else if(f0>1831)
     {
      Fclk_S2=1;Fclk_S1=0;Fclk_S0=0;//Fclk 256
      FLCK=256000;
      }
  else
     {
      Fclk_S2=1;Fclk_S1=0;Fclk_S0=1;//Fclk 128
      FLCK=128000;
      }

 Set_AF(CopFn(mod,f0));
 Set_BF(CopFn(mod,f0));
}

//设置滤波器模式 , 0为底通、1为高通、2为带通
Set_PFmod(uchar mod)
{
 if(mod<3)
   {
     switch(mod)
      { case 0:
              PFS1=0;PFS0=0;
              Mod=0;
              break;
         case 1:
              PFS1=0;PFS0=1;
              Mod=2;
              break;
         case 2:
              PFS1=1;PFS0=0;
              Mod=0;
              break;
       }
     Set_AM(Mod); Set_BM(Mod);
   }

}


//uint Tx;


 float Tx;
void main(void)
{

   /*
   Tx=CopFn(Mod,120048);
   Tx=CopQn(Mod,1);
   Tx=CopF0(0.7,60000);
   Tx=CopF0_tx(0.7,Tx); */

   delay(10000);delay(10000);delay(10000);

   Set_AM(Mod);
   Set_AQ(CopQn(Mod,1));
   Set_BM(Mod);
   Set_BQ(CopQn(Mod,1));

  //Set_AF(CopFn(Mod,5000));
  //Set_BF(CopFn(Mod,5000));
   Set_PFmod(2);
  Set_F0(Mod,8000);

  for(;;);
}


















⌨️ 快捷键说明

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