MAX262使用说明

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。

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

  模式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分配如下:

三、细节

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

 

 

原文地址:https://www.cnblogs.com/yuesheng/p/2146127.html