郁闷啊,AD9833能输出波形了,但怎么改程序参数就是不改变频率
这段代码是参照论坛上某XD的,网上也有类似的51程序,晶振用的是16M的,MCU是tiny13使用内部8M RCint main(void)
{
PORTB=(1<<AD9833_CE)|(1<<AD9833_SDATA)|(1<<AD9833_SCLK);
DDRB =(1<<AD9833_CE)|(1<<AD9833_SDATA)|(1<<AD9833_SCLK);
delay_nms(2000);
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0x2900); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x8000); //写频率0寄存器的低字节LSB
Write_word(0x8000); //写频率0寄存器的高字节MSB
//Write_word(0xD000);
//Write_word(0xF000);
Write_word(0xC000); //写频率0寄存器的低字节LSB
Write_word(0xF000); //写频率0寄存器的高字节MSB
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
output(50);
while(1);
}
/*-----------------------------------------------------------------------
delay_nus :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 us
-----------------------------------------------------------------------*/
void delay_nus(unsigned int t)
{
while (t--)
_delay_us(1);
}
/*-----------------------------------------------------------------------
delay_nms :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 ms
-----------------------------------------------------------------------*/
void delay_nms(unsigned int t)
{
while (t--)
_delay_ms(1);
}
//-----------------------------------------------------------------------
//Write_word : 写16位数据到SPI接口,软件SPI方式
//
//输入参数: data: 数据(16位)
//-----------------------------------------------------------------------
void Write_word(unsigned int data)
{
unsigned char i;
SCL_H;
SDA_H;
FSYNC_H;
delay_nus(5);
FSYNC_L;
delay_nus(2);
for(i=0;i<16;i++)
{
if(data&0x8000) SDA_H;
else SDA_L;
SCL_L;
delay_nus(2);
SCL_H;
delay_nus(2);
data=data<<1;
}
delay_nus(1);
FSYNC_H;
delay_nus(1);
SCL_L;
delay_nus(10);
}
//------------------------------------------------------------------
//output :AD9833输出指定频率的正弦波
//
//输入参数:freq_value 类型:unsigned long
//输出参数:无
//------------------------------------------------------------------
void output(unsigned long freq_value)
{
unsigned long dds;
unsigned int dds_l,dds_h;
dds= freq_value *16.777216; //268435456/ FMCLK
dds=dds<<2;
dds_l=dds; //低字节
dds_h=dds>>16; //高字节
dds_l=dds_l>>2;
dds_l=dds_l & 0x7FFF;
dds_l=dds_l | 0x4000;
dds_h=dds_h & 0x7FFF;
dds_h=dds_h | 0x4000;
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
//Write_word(0x4000 | 0x49B); //200k sine wave
//Write_word(0x4000 | 0x83);
Write_word(dds_l);
Write_word(dds_h);
} 我进行了3种实验,将while(1);放在delay_nms(2000); 的下面时
示波器显示的是无规律的波形
将while(1);放在output(50);上面时,出现了1Khz的正弦波形
将while(1);放在output(50);下面时,无论怎么改变output的参数的值,输出的波形频率始终是1.3KHZ
不解。。。。 刚刚又检查了一遍电路,3号脚CAP确实有2.5V的电压,应该没问题,其他脚也没有虚焊或焊在一起的现象,看来还是软件原因 那你把while(1)去掉呢,好像你的while(1)没什么意义,去掉试试 会不会是计算频率那边的代码有问题?不知道楼主解决问题了没有? mark标记一下,谢谢了 學習 !! 您好!我最近想搞attiny45-ad9833-dds正弦电路看到您09年试验拜托邦忙开发一下行否.具体请与我联糸rxwang@sh163.net
页:
[1]