1、概述

使用时要用到四个参数:中心频率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。
中心频率或拐点频率计算方法:
模式1、3、4: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值控制字计算方法:
模式1、3、4:N=128-64/Q
模式2:N=128-90.51/Q
5、工作模式、FN、QN都可以通过对MAX262的地址线、数据线、控制线的写操作存入MAX262内部ROM中,从而使系统工作。
选择A0-A3,ROM内的数据会更新,D0/D1为数据位。数据在WR信号上升沿写入。Fclk输入端电信号不会对数字信号端产生干扰。
内部ROM分配如下:

三、细节
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