#include
#include
#include
typedef unsigned char uchar ;
typedef unsigned int uint;
#define P_262 P1 //口线连线(从高到低):A3,A2,A1,A0,D1,D0,Wr,_
***it P_wr = P_262^1;
***it Fclk_S2=P2^2; //CPLD选择Fclk控制线
***it Fclk_S1=P2^1;
***it Fclk_S0=P2^0;
***it PFS0=P2^3;//工作模式工作模式选择0
***it 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)
{
P_262=(P_262&0x0f)|(add<<4);
P_262=(P_262&0xf3)|((dat2bit<<2)&0x0c);
P_wr=0;
delay_262();
P_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:
PFS1=0;FS0=0;
Mod=0;
break;
case 1:
PFS1=0;FS0=1;
Mod=2;
break;
case 2:
PFS1=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修正