#define MCLK 16.776e6 //系统时钟
#define SFreq 5000
#define IncFreq 100
#define IncNum 451
/* AD5933初始化函数 */
void AD5933_Init(void)
{ //Gain = 1;clk_internal;vol = 2v;
/* 起始频率码 */
code1=code1|((int)((SFreq/(MCLK/4))*pow(2,27))&0xFF); //低8位
code2=code2|((((int)((SFreq/(MCLK/4))*pow(2,27)))>>8)&0xFF); //中间8位
code3=code3|((((int)((SFreq/(MCLK/4))*pow(2,27)))>>16)&0xFF); //高8位
/* 频率增量码 */
code4=code4|((int)((IncFreq/(MCLK/4))*pow(2,27))&0xFF); //低8位
code5=code5|(((int)((IncFreq/(MCLK/4))*pow(2,27))>>8)&0xFF); //中间8位
code6=code6|((int)((IncFreq/(MCLK/4))*pow(2,27))>>16); //高8位
/* 增量数 */
code7=code7|(IncNum & 0xFF);
code8=code8|((IncNum>>8)&0x1);
delay_ms(100);
/* 将起始频率码写入寄存器,此时使用内部16.776MHz时钟 */
i2c_write ( 0x84, code1);
i2c_write ( 0x83, code2);
i2c_write ( 0x82, code3);
/* 将频率增量码写入寄存器,此时使用内部16.776MHz时钟 */
i2c_write ( 0x87, code4);
i2c_write ( 0x86, code5);
i2c_write ( 0x85, code6);
/* 将增量数写入寄存器 */
i2c_write ( 0x89, code7);
i2c_write ( 0x88, code8);
/* 将预激励周期数15写入寄存器 */
i2c_write ( 0x8B, 0x0F);
i2c_write ( 0x8A, 0x00);
/* 将AD5933置于待命模式 */
i2c_write ( 0x80, 0xB0);
/* 选择使用内部时钟 */
i2c_write ( 0x81, 0x00);
/* 以用户所设定的参数进入初始化模式 */
i2c_write ( 0x80, 0x11);
delay_ms(10);//这里的延时是为了使电路在发出初始化命令后达到稳定状态
/* 进入频率扫描模式 */
i2c_write ( 0x80, 0x21);
}
/* 频率扫描函数 */
void sweep (void)
{
unsigned int real_byte_high;
unsigned int real_byte_low;
unsigned int imag_byte_high;
unsigned int imag_byte_low;
signed short int imag_data;
signed short int real_data;
int m = 0; //增益因子与系统相位数组递增变量
printf ("Start of Frequency sweep\n");
delay_ms(10);
for(;;){
status_register = AD5933_read(0x8F); //read Status Reg
status_register = (status_register & 0x2); //Get D1 bit(data valid bit)
if( ((status_register)| 0xFD )== 0xFF){ //1:data valid
if( (AD5933_read(0x8F)| 0xFB )!= 0xFF){ //1:freq sweep over (D2 bit)
LCD_Clear();
real_byte_high = AD5933_read(0x94); //读取实部寄存器高8位数据
real_byte_low = AD5933_read(0x95); //读取实部寄存器低8位数据
imag_byte_high = AD5933_read(0x96); //读取虚部寄存器高8位数据
imag_byte_low = AD5933_read(0x97); //读取虚部寄存器低8位数据
real_data = ((real_byte_high << 8) | real_byte_low);
imag_data = ((imag_byte_high << 8) | imag_byte_low);
Re = (int) real_data;
Im = (int) imag_data;
Magnitude = sqrt(pow(Re,2) + pow(Im,2)); //计算DFT幅度 DFT_ amp
Impedance = 1/(Magnitude * (GAIN_FAC[m])); //GainFactor_My
//#define CAL_5933
#ifdef CAL_5933
cal_value = 50000.0/Magnitude;//1/20000=50000 res:20kou
printf("Freq=%d,Magnitude=%f,GainFac=%f\n",freq1,Magnitude,cal_value);
// printf("Freq=%d,Re=%d,Im=%d,GainFac=%f\n",freq1,Re,Im,cal_value);
#else
// printf("m=%d,Freq=%d,Re=%d,Im=%d,Impedance=%fK\n",m,freq1,Re,Im,Impedance/1000);
// printf("Freq=%d,Re=%d,Im=%d,Impedance=%fK\n",freq1,Re,Im,Impedance/1000);
printf("%d , %fK\n",freq1,Impedance/1000);
#endif
delay_ms(1);
if(m++>IncNum-1) m=0; //增益因子与系统相位数组下标递增 TODO
freq1 = freq1 + IncFreq; // 频率递增
i2c_write ( 0x80, 0x31); //add freq gain=1 递增至下一个频率点
} //Query D2_bit over
else{ // invalid data,break
continue;
}
} //Query D1_bit over
} // sweep loop over
}