MAX262使用说明

1、概述

利用开关电容滤波原理,可以搭建LP/HP/BP/NO滤波器。

内部含有两个相同的滤波单元A/B,每个单元是两节滤波,故一片MAX262可以构成4阶滤波器。

MAX262使用说明

  使用时要用到四个参数:中心频率f0,Q值,时钟频率,工作模式。滤波器的类型(LP/HP/BP/NOTCH)通过引脚连接确定,滤波器的截止频率f0通过fclk和参数FN共同决定,滤波器的Q值通过参数QN决定。

  参数测定可以较精确,但因为是开关电容滤波,故输出波形呈阶梯状。

二、详细说明

1、四种模式

  模式1 带通、低通。适用类型巴特沃斯、切比雪夫、贝塞尔。也可用于带阻滤波器,但有注意点,见PDF.

  模式2 全极点带通、低通

  模式3 椭圆带通、椭圆低通、高通

  模式4 全通

2、fclk通过引脚CLKA/CLKB输入,可以同参数FN一起改变滤波器的截止频率fo.

3、FN值是针对F0,Q的二进制数值的十进制表示。

  中心频率范围1HZ-100KHZ,MAX262中心频率最大可到140KHZ。

     中心频率或拐点频率计算方法:

  模式134:Fclk/f0=(26+N)pi/2;转换得f0=fclk*2/pi/(26+N)

  模式2:N= fclk/f0/1.11072-26·

4、QN值范围0.5-64.0,最大模式可达90

  Q值控制字计算方法:

  模式134:N=128-64/Q

  模式2:N=128-90.51/Q

5、工作模式、FN、QN都可以通过对MAX262的地址线、数据线、控制线的写操作存入MAX262内部ROM中,从而使系统工作。

  选择A0-A3ROM内的数据会更新,D0/D1为数据位。数据在WR信号上升沿写入。Fclk输入端电信号不会对数字信号端产生干扰。

内部ROM分配如下:

MAX262使用说明

三、细节

1、单片机向MAX262连接时中间加上锁存器可显著降低干扰。

2、设置频率f0有两种方法:

     方法一:fclk固定,改变FN的值。因为FN范围只有[0-63],故步进值很小且精度低。

     方法二:FN固定,改变fclk。调节fclk可以得到满意的截止频率。

四、MSP430代码(还需完善)

点C文件

#include "MAX262_Driver.h"

/*******************************************

函数名称:MAX262_Init

功    能:将430与MAX262接口初始化

参    数:无

返回值  :无

********************************************/

void MAX262_Init(void)

{

   AddrOUT;

   DataOUT;

   DataWROUT;

   DataWR_H;

}

/*******************************************

函数名称:WriteAddr

功    能:向MAX262写入地址信号

参    数:uchar addr.参考MAX262官方PDF,地址范围[0:15]

          超出地址范围默认写入地址0

返回值  :无

********************************************/

void WriteAddr(uchar addr)

{

  switch(addr)

  {

    case 0:{Addr3_L;Addr2_L;Addr1_L;Addr0_L;break;}

    case 1:{Addr3_L;Addr2_L;Addr1_L;Addr0_H;break;}

    case 2:{Addr3_L;Addr2_L;Addr1_H;Addr0_L;break;}

    case 3:{Addr3_L;Addr2_L;Addr1_H;Addr0_H;break;}

    case 4:{Addr3_L;Addr2_H;Addr1_L;Addr0_L;break;}

    case 5:{Addr3_L;Addr2_H;Addr1_L;Addr0_H;break;}

    case 6:{Addr3_L;Addr2_H;Addr1_H;Addr0_L;break;}

    case 7:{Addr3_L;Addr2_H;Addr1_H;Addr0_H;break;}

    case 8:{Addr3_H;Addr2_L;Addr1_L;Addr0_L;break;}

    case 9:{Addr3_H;Addr2_L;Addr1_L;Addr0_H;break;}

    case 10:{Addr3_H;Addr2_L;Addr1_H;Addr0_L;break;}

    case 11:{Addr3_H;Addr2_L;Addr1_H;Addr0_H;break;}

    case 12:{Addr3_H;Addr2_H;Addr1_L;Addr0_L;break;}

    case 13:{Addr3_H;Addr2_H;Addr1_L;Addr0_H;break;}

    case 14:{Addr3_H;Addr2_H;Addr1_H;Addr0_L;break;}

    case 15:{Addr3_H;Addr2_H;Addr1_H;Addr0_H;break;}

    default:{Addr3_L;Addr2_L;Addr1_L;Addr0_L;break;}

  }

}

/*******************************************

函数名称:WriteData

功    能:向MAX262写入数据

参    数:uchar data.参考MAX262官方PDF,数据范围[0:3]

          超出数据范围默认写入0

返回值  :无

********************************************/

void WriteData(uchar data)

{

  DataWR_L;

  delay_us(1);

  switch(data)

  {

    case 0:{Data1_L;Data0_L;break;}

    case 1:{Data1_L;Data0_H;break;}

    case 2:{Data1_H;Data0_L;break;}

    case 3:{Data1_H;Data0_H;break;}

    default:{Data1_L;Data0_L;break;}

  }

  delay_us(1);

  DataWR_H;

  delay_us(1);

}

/*******************************************

函数名称:SetAMode

功    能:设置MAX262滤波器A工作模式

参    数:uchar mode.参考MAX262官方PDF,数据范围[0:3]

返回值  :无

********************************************/

void  SetAMode(uchar mode)

{

  WriteAddr(0);

  WriteData(mode);

}

/*******************************************

函数名称:SetAF

功    能:设置MAX262滤波器A的频率f

参    数:uchar freq.参考MAX262官方PDF,数据范围[0:63]

返回值  :无

********************************************/

void  SetAF(uchar freq)

{

  uchar temp;

  WriteAddr(1);

  temp=freq&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(2);

  temp=(freq>>2)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(3);

  temp=(freq>>4)&(BIT0+BIT1);

  WriteData(temp);

}

/*******************************************

函数名称:SetAQ

功    能:设置MAX262滤波器A的Q

参    数:uchar Qvalue.参考MAX262官方PDF,数据范围[0:127]

返回值  :无

********************************************/

void  SetAQ(uchar Qvalue)

{

  uchar temp;

  WriteAddr(4);

  temp=Qvalue&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(5);

  temp=(Qvalue>>2)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(6);

  temp=(Qvalue>>4)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(6);

  temp=(Qvalue>>6)&(BIT0);

  WriteData(temp);

}

/*******************************************

函数名称:SetBMode

功    能:设置MAX262滤波器B工作模式

参    数:uchar mode.参考MAX262官方PDF,数据范围[0:3]

返回值  :无

********************************************/

void  SetBMode(uchar mode)

{

  WriteAddr(8);

  WriteData(mode);

}

/*******************************************

函数名称:SetBF

功    能:设置MAX262滤波器B的频率f

参    数:uchar freq.参考MAX262官方PDF,数据范围[0:63]

返回值  :无

********************************************/

void  SetBF(uchar freq)

{

  uchar temp;

  WriteAddr(9);

  temp=freq&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(10);

  temp=(freq>>2)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(11);

  temp=(freq>>4)&(BIT0+BIT1);

  WriteData(temp);

}

/*******************************************

函数名称:SetBQ

功    能:设置MAX262滤波器B的Q

参    数:uchar Qvalue.参考MAX262官方PDF,数据范围[0:127]

返回值  :无

********************************************/

void  SetBQ(uchar Qvalue)

{

  uchar temp;

  WriteAddr(12);

  temp=Qvalue&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(13);

  temp=(Qvalue>>2)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(14);

  temp=(Qvalue>>4)&(BIT0+BIT1);

  WriteData(temp);

  WriteAddr(15);

  temp=(Qvalue>>6)&(BIT0);

  WriteData(temp);

}

/*******************************************

函数名称:ComputeFN

功    能:计算MAX262中心频率或拐点频率f0对应的控制字

参    数:uchar mode,long int fclk,float f0.

          mode 范围[0-3],fclk单位为HZ,范围[40-4000000],

          f0单位为HZ,范围[1-100000]

          fclk,f0具体可用范围需参考MAX262官方PDF

返回值  :uchar。中心频率对应的控制字。范围[0-63]

********************************************/

uchar ComputeFN(uchar mode,long int fclk,long int f0)

{

  if(mode==1)

    return ( (float)((fclk*2.8284271247/f0)/PI)-26 );

  else 

    return ( (float)((fclk*2/f0)/PI)-26 );

}

/*******************************************

函数名称:ComputeQN

功    能:计算MAX262的Q值对应的控制字QN

参    数:uchar mode,float Q.

          mode 范围[0-3],Q范围[0.5-64],

          Q值具体范围需参考MAX262官方PDF

返回值  :uchar。Q值 对应的控制字。范围[0-127]

********************************************/

uchar ComputeQN(uchar mode,float Q)

{

  if(mode==1)

    return (128-(float)(90.51/Q));

  else 

    return (128-(float)(64/Q));

}

/*******************************************

函数名称:LPSet 需要DDS

功    能:通过查表设置低通滤波时钟频率

参    数:uchar f0。范围[1,20],单位KHZ

返回值  :无

********************************************/

void LPSet(uchar f0,uchar Q)

{

  SetAMode(0);

  SetAF(38);

  SetAQ(11);

  SetBMode(0);

  SetBF(38);

  SetBQ(79);

}



对应点h文件

#ifndef _MAX262_DRIVER_H

#define _MAX262_DRIVER_H

//=================================头文件=============================//

#include "msp430f5438.h"

#include "MCU_Init.h"

//========================频率、Q值计算所需常量========================//

#define PI 3.1415926

//1K-20K截止频率,fclk频率

uchar LPFclk[]={102,204,306,408,510,612,714,816,918,1020

                1122,1224,1326,1428,1530,1632,1734,1836,1938,2040};

uchar HPFclk[]={97,193,290,385,480,575,670,760,850,950

                1050,1140,1240,1330,1420,1500,1610,1720,1830,1940};

//=================================引脚分配=============================//

//4位地址线

#define AddrOUT     P9DIR|=BIT0+BIT1+BIT2+BIT3

#define Addr0_H     P9OUT|=BIT0

#define Addr0_L     P9OUT&=~BIT0

#define Addr1_H     P9OUT|=BIT1

#define Addr1_L     P9OUT&=~BIT1

#define Addr2_H     P9OUT|=BIT2

#define Addr2_L     P9OUT&=~BIT2

#define Addr3_H     P9OUT|=BIT3

#define Addr3_L     P9OUT&=~BIT3

//两位数据线

#define DataOUT     P9DIR|=BIT4+BIT5

#define Data0_H     P9OUT|=BIT4

#define Data0_L     P9OUT&=~BIT4

#define Data1_H     P9OUT|=BIT5

#define Data1_L     P9OUT&=~BIT5

//控制线

#define DataWROUT   P9DIR|=BIT6

#define DataWR_H    P9OUT|=BIT6

#define DataWR_L    P9OUT&=~BIT6

//=================================函数申明=============================//

//底层驱动函数

extern void MAX262_Init(void);

extern void WriteAddr(uchar addr);

extern void WriteData(uchar data);

//基本功能函数

extern void  SetAMode(uchar mode);//A通道设置函数

extern void  SetAF(uchar freq);

extern void  SetAQ(uchar Qvalue);

extern void  SetBMode(uchar mode);//B通道设置函数

extern void  SetBF(uchar freq);

extern void  SetBQ(uchar Qvalue);

//高级功能函数

extern uchar ComputeFN(uchar mode,long int fclk,long int f0);

extern uchar ComputeQN(uchar mode,float Q);



#endif

 

 

你可能感兴趣的:(max)