1、概述
利用开关电容滤波原理,可以搭建LP/HP/BP/NO滤波器。
内部含有两个相同的滤波单元A/B,每个单元是两节滤波,故一片MAX262可以构成4阶滤波器。
使用时要用到四个参数:中心频率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