[讨论] 求指导啊,有木有大神做07的D题程控滤波啊,求指导关于MAX262的控制,看了好几天了

默默沉默中   2013-8-5 11:56 楼主


真心看不懂了,不是没有思考过的,下面放程序出来

 

本帖最后由 paulhyde 于 2014-9-15 03:48 编辑

回复评论 (17)



#include #include #include 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) { _262=(P_262&0x0f)|(add<<4); _262=(P_262&0xf3)|((dat2bit<<2)&0x0c); _wr=0; delay_262(); _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: FS1=0;FS0=0; Mod=0; break; case 1: FS1=0;FS0=1; Mod=2; break; case 2: FS1=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(;;); } 这里参数有N,clk , Q , F0 中心频率这几个参数,写入方法参见数据手册和子函数, 先把N开最大,这里的N是开关电容的采样频率参数,要想获得大范围可调,取最大值,剩下Q是 内部电路的Q值得意思,Q越大,频率曲线波动越大,根据不同滤波器类型取合适值,还有就是中心频率F0, 实际上按数据手册公式是有偏差,这是早期的开关电容滤波芯片,其实不太好,细调CLK修正

 

本帖最后由 paulhyde 于 2014-9-15 03:48 编辑
点赞  2013-8-5 11:56


上面的程序是从网上找的资料,不过有几个地方不是很明白 #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 //这一个,上面#define P_262 P1 //口线连线(从高到低):A3,A2,A1,A0,D1,D0,Wr,_ 不是已经设置好了吗,这一个工作模式说的是哪一个呢

 

本帖最后由 paulhyde 于 2014-9-15 03:48 编辑
点赞  2013-8-5 11:59


#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; //上面三根时钟线根线是哪里的,不是很明白啊

 

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑
点赞  2013-8-5 12:01


#defineP_262 P1 //口线连线(从高到低):A3,A2,A1,A0,D1,D0,Wr,
//写两比特的数据
void write(ucharadd,uchar dat2bit)
{
_262=(P_262&0x0f)|(add<<4);
_262=(P_262&0xf3)|((dat2bit<<2)&0x0c);
_wr=0;
delay_262();
_wr=1;
delay_262();
}
布线并没有按照这个设定来,怎么修改一下A3,A2,A1,A0,D1,D0的赋值呢

 

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑
  • CF~577[6~IG2PXG8R4{8QWJ.jpg
点赞  2013-8-5 12:06
有没有大神能给一下自己写的程序让我可以参考一下呢,最好可以带注释了,问题暂时就这么多了
点赞  2013-8-5 12:07
这个是资料
点赞  2013-8-5 12:15
麻烦大神帮忙看一下,解答一下疑问
点赞  2013-8-5 12:18
真心没有人吗
点赞  2013-8-5 16:51
我们当初做用的FPGA的软核的NIOS II,程序忘记了,就觉得程控靠改时钟和Q值
点赞  2013-8-5 23:31

回复 10楼longhaozheng 的帖子

好吧,在没有高人帮忙下,差不多弄出来了,现在在调试程序,不过,功能不是很对
点赞  2013-8-6 15:07

回复 10楼longhaozheng 的帖子

等我调试完了,如果能通过的话,我把程序发出来给大家看一下
点赞  2013-8-6 15:08
应该是快要成功了,加油,看一下明天的效果怎么样
点赞  2013-8-7 00:06
结果如何 ?哈
加油!在电子行业默默贡献自己的力量!:)
点赞  2013-8-7 10:13
只能说,有时候可以有时候不可以,而且控制的,并不是我想要的
点赞  2013-8-17 20:57
#include

#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define PI 3.141592653
ulong FLCK=900000;//0.9m
uchar NQ,N0;


sbit wr=P0^1;

sbit a0=P0^2;
sbit a1=P0^3;
sbit a2=P0^6;
sbit a3=P0^5;

sbit d0=P0^0;
sbit d1=P0^4;


void del(uchar t)
{
        unsigned int i,j;
        for(i=0; i     for(j=0; j<10; j++);
}

/********************************************************************
* 名称 :
* 功能 :写入地址
* 输入 : 无
* 输出 : 无
***********************************************************************/
void address_262(uchar x)
{
        x=(x&0x0f);
        if((x&0x01)==0x01)a0=1;
        else a0=0;
        if((x&0x02)==0x02)a1=1;
        else a1=0;
        if((x&0x04)==0x04)a2=1;
        else a2=0;
        if((x&0x08)==0x08)a3=1;
        else a3=0;
}
/********************************************************************
* 名称 :
* 功能 :写入数据
* 输入 : 无
* 输出 : 无
***********************************************************************/
void data_262(uchar x)
{
        x=(x&0x03);
        if(x&0x01)d0=1;
        else d0=0;
        if((x&0x02)==0x02)d1=1;
        else d1=0;
}

/********************************************************************
* 名称 :
* 功能 :传送内容
* 输入 : 无
* 输出 : 无
***********************************************************************/
void send_data_262(uchar x,uchar y)//先地址,后数据
{
        wr=1;
        address_262(x);
        del(2);
        wr=0;
        del(2);
        data_262(y);
        wr=1;
}
/********************************************************************
* 名称 :
* 功能 :设定max262的滤波器的工作模式
* 输入 : 无
* 输出 : 无
***********************************************************************/
//函数功能: 设定max262的滤波器的工作模式
work_mod_262(uchar x,uchar y)//x表示工作模式(0--3),y表示哪个滤波器,滤波器0或者滤波器1
{
        x=(x&0x03);
        y=(y&0x01);
        send_data_262((0x00+y*0x08),x);
}
/********************************************************************
* 名称 :
* 功能 :设定max262的滤波器的中心频率
* 输入 : 无
* 输出 : 无
***********************************************************************/
void set_fre_262(uchar x,uchar y)//x输入频率对应的N,y表示哪个滤波器,滤波器0或者滤波器1
{
        uchar temp;
        y=(y&0x01);
       
        temp=(x&0x03);
        send_data_262((0x01+y*0x08),temp);
       
        temp=((x&0x0c)>>2);
        send_data_262((0x02+y*0x08),temp);
       
        temp=((x&0x30)>>4);
        send_data_262((0x03+y*0x08),temp);
}

/********************************************************************
* 名称 :
* 功能 :设定max262的Q值
* 输入 : 无
* 输出 : 无
***********************************************************************/
void set_q_262(uchar x,uchar y)//x输入Q值,y表示哪个滤波器,滤波器0或者滤波器1
{
        uchar temp;
        y=(y&0x01);
       
        temp=x&0x03;
        send_data_262((0x04+y*0x08),temp);
       
        temp=((x&0x0c)>>2);
        send_data_262((0x05+y*0x08),temp);
       
        temp=((x&0x30)>>4);
        send_data_262((0x06+y*0x08),temp);
       
        temp=((x&0x40)>>6);
        send_data_262((0x07+y*0x08),temp);
}
//***************************************************************   
//基本计算   
//***************************************************************   
//根据截止频率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);   
    }   
*/   
//根据中心频率求设定值
float CopFn(uchar mod, float f0)   
{   
    if (1==mod)   
          {   
        N0= ((float)(FLCK/(1.11072*f0))-26);   
          }   
    else   
         {   
         N0= ((float)((FLCK*2/f0)/PI)-26);   
          }
                  return N0;  
    }   
   
//根据Q求设定值QN   
uchar CopQn(uchar mod, float q)   
{   
    if (1==mod)   
      {   
            NQ= (128-(float)(q/90.51));   
      }   
    else   
          {   
   
             NQ= (128-(float)(q/64));   
          }
                  return NQ;   
   
    }
点赞  2013-8-17 21:30
上面那个是我写的程序,可以看到效果的,不过,效果不理想而已,有需要的,就拿去吧
点赞  2013-8-17 21:31
参考一下
点赞  2016-2-16 12:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复