?? ad9833.c
字號:
/*
AD9833
功能:可編程波形發生器,能夠產生正弦波、三角波、方波輸出。
特點:主頻時鐘為25MHz時,精度為0.1Hz,主頻時鐘為1MHz時,精度可以達到0.004Hz。
輸出正弦波頻率 fOUT=M(fMCLK/2^28)
M為頻率控制字,由外部編程給定,其范圍為0≤M≤2^28-1。
fMCLK為外部輸入晶振。
FSYNC引腳是使能引腳,電平觸發方式,低電平有效。進行串行數據傳輸時,FSYNC引腳必須置低,
要注意FSYNC有效到SCLK下降沿的建立時間t7的最小值。FSYNC置低后,在16個SCLK的下降沿數據
被送到AD9833的輸入移位寄存器,在第16個SCLK的下降沿FSYNC可以被置高,但要注意在SCLK下降
沿到FSYNC上升沿的數據保持時間ts的最小和最大值。當然,也可以在FSYNC為低電平的時候,連
續加載多個16位數據,僅在最后一個數據的第16個SCLK的下降沿的時將FSYNC置高,最后需要注意
的是,寫數據時SCLK時鐘為高低電平脈沖信號,但是,在FSYNC剛開始變為低時(即將開始寫數
據時),SCLK必須為高電平(注意t11這個參數)。
當AD9833初始化時,為了避免DAC產生虛假輸出,RESET必須置為1(RESET不會復位頻率、相位和
控制寄存器),直到配置完畢,需要輸出時才將RESET置為0;RESET為0后的8-9個MCLK時鐘周期
可在DAC的輸出端觀察到波形。
AD9833數據傳輸格式:
對于單個16位數據來說,高位在前,低位在后。
對于頻率寄存器和相位寄存器來說,先是控制字,再是數據低字節,最后是數據高字節。
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "AD9833.h"
#include "main.h"
/*-----------------------------------------------------------------------
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(200);
FSYNC_L;
for(i=0;i<16;i++)
{
if(data&0x8000) SDA_H;
else SDA_L;
SCL_L;
delay_nus(5);
SCL_H;
data=data<<1;
}
delay_nus(2);
FSYNC_H;
SCL_L;
delay_nus(200);
}
void init_ad9833(void)
{
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(0xC000); //寫頻率0寄存器的低字節LSB
Write_word(0xF000); //寫頻率0寄存器的高字節MSB
Write_word(0x2000); //28位連續,選擇頻率0,相位0,RESET=0
}
//------------------------------------------------------------------
//output :AD9833輸出指定頻率的正弦波
//
//輸入參數:freq_value 類型:unsigned long
//輸出參數:無
//------------------------------------------------------------------
void output(unsigned long freq_value)
{
unsigned long dds;
unsigned int dds_l,dds_h;
dds= freq_value *268.435456; //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(dds_l);
Write_word(dds_h);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -