打印

基于MAX262程控滤波器的程序......?

[复制链接]
4268|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
甄明伟1987|  楼主 | 2009-8-31 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
甄明伟1987|  楼主 | 2009-8-31 16:16 | 只看该作者
高手呢,大侠呢???

使用特权

评论回复
板凳
雪山飞狐D| | 2009-8-31 17:06 | 只看该作者
本帖最后由 雪山飞狐D 于 2009-8-31 17:08 编辑

#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;FS0=0;   
              Mod=0;   
              break;   
         case 1:   
              PFS1=0;FS0=1;   
              Mod=2;   
              break;   
         case 2:   
              PFS1=1;FS0=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(;;);   
}

使用特权

评论回复
地板
甄明伟1987|  楼主 | 2009-8-31 21:36 | 只看该作者
谢了先,可是看不懂哦!
如果用MAX262做一个滤波器,也需要这样写吗?

使用特权

评论回复
5
雪山飞狐D| | 2009-8-31 21:48 | 只看该作者
本帖最后由 雪山飞狐D 于 2009-8-31 21:49 编辑

这里参数有N,clk , Q , F0 中心频率这几个参数,写入方法参见数据手册和子函数,
先把N开最大,这里的N是开关电容的采样频率参数,要想获得大范围可调,取最大值,剩下Q是
内部电路的Q值得意思,Q越大,频率曲线波动越大,根据不同滤波器类型取合适值,还有就是中心频率F0,
实际上按数据手册公式是有偏差,这是早期的开关电容滤波芯片,其实不太好,细调CLK修正

使用特权

评论回复
6
甄明伟1987|  楼主 | 2009-9-1 07:40 | 只看该作者
那怎样用外围电路来调节需要的参数呢,如高低通时的截至频率,带通的中心频率?而且N值还分为N1(F0~F5中心频率的控制字)和N2(Q0~Q7 Q值的控制字)这样算来要输入的控制字就有十五位(D1D0F0F1F2F3F4F5Q0Q1Q2Q3Q4Q5Q6),而给出的端口就只有D1D0A0A1A2A3六个口,真的一个控制字要输入8次才算完整?

使用特权

评论回复
7
dincoaur| | 2009-9-2 10:34 | 只看该作者
我有55DSP上的程序。。。

使用特权

评论回复
8
zhouzhaosheng1| | 2010-8-5 12:15 | 只看该作者
明白,不过程序里面有个小错误,我已经改了

使用特权

评论回复
9
0810612124| | 2011-7-27 12:26 | 只看该作者
我想这个是都过设置A0-A4的值来确定D0和D1输出的是什么。
设置出来的f0-f5 这就是所需要的N值。
不知道我理解的正确与否?

使用特权

评论回复
10
march2011| | 2011-8-10 11:42 | 只看该作者
请问为什么max262一接上电源就会发烫?

使用特权

评论回复
11
kevin1588112| | 2019-7-7 17:31 | 只看该作者
雪山飞狐D 发表于 2009-8-31 17:06
#include     
#include     
#include      

你这个缺少pow函数呀,程序不完整

使用特权

评论回复
评论
kevin1588112 2019-7-7 17:47 回复TA
不好意思,pow是求平方 
12
雪山飞狐D| | 2019-7-7 19:19 | 只看该作者
kevin1588112 发表于 2019-7-7 17:31
你这个缺少pow函数呀,程序不完整

    注意下帖子日期

使用特权

评论回复
13
zchong| | 2019-7-8 07:27 | 只看该作者
有没有国产的开关电容滤波器?不可软件编程的也行

使用特权

评论回复
14
雪山飞狐D| | 2019-7-8 17:24 | 只看该作者
zchong 发表于 2019-7-8 07:27
有没有国产的开关电容滤波器?不可软件编程的也行

  没有的,这种IC已经落伍了,没必要使用,用运放搭更便宜,软件STM32可以用库里面的FIR滤波

使用特权

评论回复
15
zchong| | 2019-7-9 13:45 | 只看该作者
雪山飞狐D 发表于 2019-7-8 17:24
  没有的,这种IC已经落伍了,没必要使用,用运放搭更便宜,软件STM32可以用库里面的FIR滤波 ...

当模拟通道数量较多时,软件计算能力不够啊,除非前端还要增加一个FPGA专门处理

使用特权

评论回复
16
雪山飞狐D| | 2019-7-9 17:25 | 只看该作者
zchong 发表于 2019-7-9 13:45
当模拟通道数量较多时,软件计算能力不够啊,除非前端还要增加一个FPGA专门处理 ...

    这种IC也是30-40一片好吧。。。。M3便宜的才多少钱????

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

41

帖子

1

粉丝