欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32F103ZET6驅動AD9954源程序
[打印本頁]
作者:
艾米莉亞碳
時間:
2019-8-5 20:31
標題:
STM32F103ZET6驅動AD9954源程序
可以用,ZET6的
單片機源程序如下:
/**********************************************************
功能:stm32f103rct6控制,20MHz時鐘, AD9954正弦波點頻輸出,范圍0-130M(可編輯0-200M),
掃頻默認正弦波 。
顯示:12864cog
接口:控制接口請參照AD9954.h 按鍵接口請參照key.h
**********************************************************/
#include "AD9954.h"
#include "delay.h"
#include "math.h"
//系統頻率fosc(外部晶振頻率),系統頻率=fosc*M
#define fosc 20 //晶振頻率
#define PLL_MULTIPLIER 20 //PLL倍頻數(4--20)
#define fs (fosc*PLL_MULTIPLIER) //系統時鐘頻率
//double fH_Num=11.2204;
double fH_Num=10.73741824; //400M
//double fH_Num=11.3671588397205;//
//double fH_Num = 11.3025455157895;
/*
** 函數名稱 :void GPIO_AD9954_Init(void)
** 函數功能 :AD9954接口IO初始化
** AD9954_CS----------PB9 OUT
** AD9954_SCLK--------PB10 OUT
** AD9954_SDIO--------PB11 OUT
** AD9954_OSK---------PB12 OUT
** PS0----------------PB13 OUT
** PS1----------------PB14 OUT
** IOUPDATE-----------PB15 OUT
** AD9954_SDO---------PB5 IN
** AD9954_IOSY--------PB6 OUT
** AD9954_RET---------PB7 OUT
** AD9954_PWR---------PB8 OUT
*/
void GPIO_AD9954_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_6; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_0; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED1-->PE.5 端口配置, 推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4
AD9954_IOSY=0;
AD9954_OSK=0;
AD9954_PWR=0;
}
/*********************************************************************************************************
** 函數名稱 :void AD9954_RESET(void)
** 函數功能 :復位AD9954
** 函數說明 :不復位也可以
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void AD9954_RESET(void)
{
AD9954_CS = 0;
AD9954_RET = 0;
AD9954_RET = 1;
delay_ms(100);
AD9954_RET = 0;
AD9954_CS = 0;
AD9954_SCLK = 0;
PS0 = 0;
PS1 = 0;
IOUPDATE = 0;
AD9954_CS = 1;
}
/*********************************************************************************************************
** 函數名稱 :void AD9954_SENDBYTE(u8 dat)
** 函數功能 :往AD9954發送一個字節的內容
** 函數說明 :AD9954的傳輸速度最大為25M,所以不加延時也可以
** 入口參數 :待發送字節
** 出口參數 :無
*********************************************************************************************************/
void AD9954_SENDBYTE(u8 dat)
{
u8 i;
for (i = 0;i<8;i++)
{
AD9954_SCLK = 0;
if (dat & 0x80)
{
AD9954_SDIO = 1;
}
else
{
AD9954_SDIO = 0;
}
AD9954_SCLK = 1;
dat <<= 1;
}
}
u8 AD9954_ReadByte(void)
{
u8 i,dat=0;
for (i = 0;i<8;i++)
{
AD9954_SCLK = 0;
dat|=AD9954_SDO;
AD9954_SCLK = 1;
dat <<= 1;
}
return dat;
}
/*********************************************************************************************************
** 函數名稱 :void UPDATE(void)
** 函數功能 :產生一個更新信號,更新AD9954內部寄存器,
** 函數說明 :可以不加任何延時
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void UPDATE(void)
{
IOUPDATE=0;
// delay_us(100);
IOUPDATE = 1;
//delay_us(200);
IOUPDATE = 0;
}
/*********************************************************************************************************
** 函數名稱 :void AD9954_Init(void))
** 函數功能 :初始化AD9954的管腳和最簡單的內部寄存器的配置,
** 函數說明 :默認關掉比較器的電源,因板上的晶振為100MHz,最大采用了4倍頻,為400M
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
//讀寄存器
u32 Read_Vau1(void)
{
uint32_t ret;
// char i;
AD9954_CS=1;
AD9954_SENDBYTE(CFR1);
ret = AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
AD9954_CS=1;
return ret;
}
u32 Read_Vau2(void)
{
uint32_t ret;
// char i;
AD9954_CS=1;
AD9954_SENDBYTE(CFR2);
ret = AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
AD9954_CS=0;
return ret;
}
void AD9954_Init(void)
{
GPIO_AD9954_Init();
AD9954_RESET();
delay_ms(10);
AD9954_CS = 0;
//single tone
AD9954_SENDBYTE(CFR1);//地址0寫操作
AD9954_SENDBYTE(0x02);//02
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x10);
// AD9954_SENDBYTE(0x40);//比較器power down
AD9954_SENDBYTE(0x00);//比較器使能
AD9954_SENDBYTE(CFR2);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
#if fs>400
#error "系統頻率超過芯片最大值"
#elseif fs>=250
AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04|0X03);
#else
AD9954_SENDBYTE(PLL_MULTIPLIER<<3);
#endif
// AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
AD9954_CS=1;
}
//Get_FTW的修正后頻率
u32 Get_FTW(double f)
{
return (u32)((fH_Num+4.6)*f);
}
/*********************************************************************************************************
** 函數名稱 :void AD9954_SETFRE(float f)
** 函數功能 :設置AD9954當前的頻率輸出,采用的是單一頻率輸出
** 函數說明 :因為采用的浮點數進行計算,轉換過程中會出現誤差,通過調整可以精確到0.1Hz以內
** 入口參數 :欲設置的頻率值
** 出口參數 :無
*********************************************************************************************************/
void AD9954_SETFRE(double f)//single tone
{
u32 date;
AD9954_CS = 0;
date = Get_FTW(f);//det=(f/fclk)x2^32=10.7374xf
//date=10.7374*f;
AD9954_SENDBYTE(FTW0);//FTW0地址
// delay_ms(1);
AD9954_SENDBYTE((u8)(date >> 24));//頻率控制字
AD9954_SENDBYTE((u8)(date >> 16));
AD9954_SENDBYTE((u8)(date >> 8));
AD9954_SENDBYTE((u8)date);
AD9954_CS=1;
UPDATE();
// fH_Num+=0.001;
}
/*
*/
void DirectSwitchPSK(float f, float phase1, float phase2, float phase3, float phase4)
{
u16 date;
AD9954_CS = 0;
IOUPDATE = 0;
delay_us(1);
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x00);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0xA4);//4倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
AD9954_SETFRE(f);//載波頻率
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位沒有激活
UPDATE();
date = 45.51*phase1;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 1;//ram1
PS1 = 0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位沒有激活
UPDATE();
date = 45.51*phase2;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 0;//ram2
PS1 = 1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
date = 45.51*phase3;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 1;//ram3
PS1 = 1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
date = 45.51*phase4;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0xa0);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void Generate_PSK(float f,u16 *phase)
** 函數功能 :PSK調制信號輸出
** 函數說明 :通過RAM端來控制信號的相位,從而實現PSK信號的調制
** 這里使用一個RAM段的循環模式,PSK信號為8為數據位。
** RAM的更新速度由ram rate定時寄存器控制,寄存器為16位,實現對系統提供的100M時鐘1~65535分頻,寫0是無效的
** 當跟輸出PSK載波的頻率是ram rate跟新頻率的整數倍時,才能保證每次的相位改變一致
** 入口參數 :float f :PSK載波的頻率
** u16 *phase: 寫入相位累加器的相位值,180實現對相位翻轉,0不改變相位,PSK信號為8位,需為8位的數組
** 出口參數 :無
*********************************************************************************************************/
void Generate_PSK(double f, u16 *phase)
{
u8 i;
u16 date;
AD9954_CS = 0;
IOUPDATE = 0;
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x00);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
AD9954_SETFRE(f);//載波頻率
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE(0x00);//頻率控制字
AD9954_SENDBYTE(0x10);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
UPDATE();
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x00);//ramp rate=0x0400
AD9954_SENDBYTE(0x04);
AD9954_SENDBYTE(0x07);//final address:0x007
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位沒有激活
UPDATE();
AD9954_SENDBYTE(0x0b);
for (i = 0;i<8;i++)
{
date = 45.51*phase[i];
date = date << 2;
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
}
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0xc0);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void Generate_FM(u32 *fre)
** 函數功能 :FM調制信號輸出
** 函數說明 :通過RAM端來控制信號的頻率,從而實現FM信號的調制
** 這里使用一個RAM段的循環模式,PSK信號為8為數據位。
** RAM的更新速度由ram rate定時寄存器控制,寄存器為16位,實現對系統提供的100M時鐘1~65535分頻,寫0是無效的
** ram rate的跟新速度為調制信號的頻率,這里如1KHz,寫入ram rate的值為0X0C35,
** 入口參數 :u32 *fre:FM信號頻率值,這里采用的是32點頻率采樣,調用此函數之前需先設置好頻率表的值,其按正弦規律改變
** for(i=0;i<32;i++)
** {
** fre[i]=Fc+Fshift*sin(wt);
** }
** 出口參數 :無
Fc調制前載波的角頻率,Fshift
*********************************************************************************************************/
void Generate_FM(u32 *fre)
{
u8 i;
u32 date;
AD9954_CS = 0;
IOUPDATE = 0;
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x00);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x35);//ramp rate=32kHz
AD9954_SENDBYTE(0x0C);
AD9954_SENDBYTE(0x1F);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x80);//RAM0工作于模式0,不停留位沒有激活
UPDATE();
AD9954_SENDBYTE(0x0b);
for (i = 0;i<32;i++)
{
date = 10.73741*fre[i];
AD9954_SENDBYTE((u8)(date >> 24));//頻率控制字
AD9954_SENDBYTE((u8)(date >> 16));
AD9954_SENDBYTE((u8)(date >> 8));
AD9954_SENDBYTE((u8)date);
}
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x80);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void ASK_Init(void)
** 函數功能 :ASK調制信號輸出初始化
** 函數說明 :ASK調制,需要先設置好載波頻率,然后改變DAC比例因子 scale factor其為14位,通過設置為最大和0兩種值實現ASK信號的調制
** 調用Write_ASF(u16 factor)來改變幅值
** 入口參數 :無
** 出口參數 :無
****************************************************** ***************************************************/
void ASK_Init(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x02);//手動打開OSK打開
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x20);//當受到UPDATE信號,自動清楚相位累加器 //
// AD9954_SENDBYTE(0x00);//不改變任何
AD9954_SENDBYTE(0x40);
//控制相位偏移,因默認輸出是余弦波,所以需控制相位累加器的累加相位為270
AD9954_SENDBYTE(0X05);
AD9954_SENDBYTE(0X30);
AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void AM_Init(void)
** 函數功能 :AM調制信號輸出初始化
** 函數說明 :AM調制,需要先設置好載波頻率,然后改變DAC比例因子 scale factor其為14位,AM的幅度值按正弦規律變換,可以實現AM
** 最高可以采用32點采樣
** 調用Write_ASF(u16 factor)來改變幅值
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void AM_Init(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x02);//手動打開OSK打開
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//不改變任何
AD9954_SENDBYTE(0x00);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void Write_ASF(u16 factor)
** 函數功能 :改變scale factor數值,改變DAC輸出幅度
** 函數說明 :寫入最大為0X3FFF,最小為0
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void Write_ASF(u16 factor) //2ASK
{
AD9954_CS = 0;
// AD9954_SENDBYTE(0x00);//地址0寫操作
// AD9954_SENDBYTE(0x02);//手動打開OSK打開
// AD9954_SENDBYTE(0x00);
// AD9954_SENDBYTE(0x20);//當受到UPDATE信號,自動清楚相位累加器 //
// // AD9954_SENDBYTE(0x00);//不改變任何
// AD9954_SENDBYTE(0x40);
// //控制相位偏移
// AD9954_SENDBYTE(0X05);
// AD9954_SENDBYTE(0X30);
// AD9954_SENDBYTE(0X00);
AD9954_SENDBYTE(0x02);//幅度
AD9954_SENDBYTE(factor >> 8);
AD9954_SENDBYTE(factor);
AD9954_CS = 1;
UPDATE();
}
void Write_Pow0(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0X05);
// AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
// AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0X10);
AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
//相位控制:相位偏移=(pow/16384)*360 pow=(相位偏移/360)*16384
void Write_Pow(double xw)
{
u16 date;
date=xw*45.511;
AD9954_CS = 0;
AD9954_SENDBYTE(0X05);
// date>>=2;
AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
AD9954_SENDBYTE((u8)date);
// AD9954_SENDBYTE(0X00);
// AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
/******************************************************************
* 名 稱:Linear_Sweep
* 功 能:AD9954掃頻模式輸出
* 參 數:MinFreq:掃頻下限頻率,MaxFreq:掃頻上限頻率
* UpStepFreq:向上掃頻步進,UpStepTime:向上掃頻的跳頻時間
* DownStepFreq:向下掃頻步進,DownStepTime:向下掃頻的跳頻時間
* Mode:掃頻模式
* 返 回 值:無 Linear_Sweep(100, 100000000, 100, 250, 100,250, 1);
* 說 明:步進頻率單位是100khz
* Mode=DoubleScan(雙邊掃頻)時,PS0=1,即為向上掃頻,但配置了
* 向下掃頻的寄存器,可以直接通過PS0_WriteBit()來改變掃頻方向
******************************************************************/
void Linear_Sweep(double MinFreq,double MaxFreq,double UpStepFreq,u8 UpStepTime,double DownStepFreq,u8 DownStepTime,ScanMode Mode )//0向下掃頻模式,1向上掃頻模式,2雙邊掃頻
{
uint32_t FTW_Vau;
PS0=0;
PS1=0;
AD9954_CS=0;
AD9954_SENDBYTE(CFR1);
AD9954_SENDBYTE(0x02);//斜坡鍵控使能
AD9954_SENDBYTE(0x20);//線性頻率掃描使能
AD9954_SENDBYTE(0x00);
// if (Mode & No_Dwell)
// AD9954_SENDBYTE(0x44);//使能比較器和線性掃描無停留
// else
AD9954_SENDBYTE(0x40); //使能比較器
//
//寫入FTW0----最小頻率
FTW_Vau = Get_FTW(MinFreq);
AD9954_SENDBYTE(FTW0);
AD9954_SENDBYTE((u8)(FTW_Vau>>24));
AD9954_SENDBYTE((u8)(FTW_Vau>>16));
AD9954_SENDBYTE((u8)(FTW_Vau>>8));
AD9954_SENDBYTE((u8)(FTW_Vau));
//寫入FTW1----最大頻率
FTW_Vau = Get_FTW(MaxFreq);
AD9954_SENDBYTE(FTW1);
AD9954_SENDBYTE(FTW_Vau>>24);
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
// Mode &= 0x7F;
if(Mode == DownScan)
{
PS0=0;
//寫入NLSCW----下降頻率步進和跳頻時間
FTW_Vau = Get_FTW(DownStepFreq);
AD9954_SENDBYTE(NLSCW);
AD9954_SENDBYTE(DownStepTime); //跳頻時間(DownStepTime個??周期)
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=0; //下降掃頻
}
if (Mode == UpScan)
{
//寫入PLSCW----上升頻率步進和跳頻時間
FTW_Vau = Get_FTW(UpStepFreq);
AD9954_SENDBYTE(PLSCW);
AD9954_SENDBYTE(UpStepTime); //跳頻時間(0XFF個??周期)
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1; //上升掃頻
}
AD9954_CS=1;
UPDATE();
}
/******************************************************************
* 名 稱:PS0_WriteBit
* 功 能:設置PS0的狀態
* 參 數:BitVal:PS0狀態
* 返 回 值:無
* 說 明:PS0可以控制AD9954掃頻方向
******************************************************************/
void PS0_WriteBit(BitAction BitVal)
{
PS0=BitVal;
}
/*********************************************************************************************************
** 函數名稱 :void DirectSwitchFSK(float f1,float f2,float f3,float f4)
** 函數功能 :四相FSK信號輸出
** 函數說明 :在四個RAM區各設置了一個頻率值,通過改變PS0和PS1的電平選擇對應的RAM端輸出相應的頻率值來實現FSK,也可以實現二項的FSK;
** 通過設置定時器中斷控制PS0,PS1管腳的電平就可以將二進制的編碼轉化為FSK信號輸出
** 入口參數 :float f1:頻率1
** float f2:頻率2
** float f3:頻率3
** float f4:頻率4
** 隱含控制 PS0: 0 1 0 1
管腳參數: PS1: 0 0 1 1
** 對應控制 RAM段: 0 1 2 3
** 出口參數 :無
*********************************************************************************************************/
void DirectSwitchFSK(double f1,double f2,double f3,double f4)
{
u32 FTW_Vau;
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x00);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0xA4);//8倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
PS0=0;
PS1=0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位沒有激活
UPDATE();
FTW_Vau=Get_FTW(f1);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1;//ram1
PS1=0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位沒有激活
UPDATE();
FTW_Vau=Get_FTW(f2);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=0;//ram2
PS1=1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
FTW_Vau=Get_FTW(f3);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1;//ram3
PS1=1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
FTW_Vau=Get_FTW(f4);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x80);//打開RAM控制位驅動FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數名稱 :void LINEARSWEEP(float f1,float f2)
** 函數功能 :線性掃面輸出模式
** 函數說明 :使頻率按預置的模式線性掃描上去,詳細參見官方PDF
** 入口參數 :float f1:起始頻率
** float f2:終止頻率
** 出口參數 :無
*********************************************************************************************************/
void LINEARSWEEP(float f1,float f2)//linear sweep mode
{
u32 date;
AD9954_SCLK=0;
AD9954_RET=0;
IOUPDATE=0;
PS0=0;
PS1=0;
AD9954_CS=0;
//linear sweep mode
AD9954_SENDBYTE(0x00);//地址0寫操作
AD9954_SENDBYTE(0x02);//
AD9954_SENDBYTE(0x20);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1寫操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x02);
// AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統時鐘倍頻后為400M
AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04);
date=10.7374*f1;
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE((u8)(date>>24));//頻率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
date=10.7374*f2;
AD9954_SENDBYTE(0x06);//FTW1地址
AD9954_SENDBYTE((u8)(date>>24));//頻率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x07);//NLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x1b);
AD9954_SENDBYTE(0xf4);
AD9954_SENDBYTE(0x08);//PLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0xa3);
AD9954_SENDBYTE(0x6f);
AD9954_CS=1;
UPDATE();
}
復制代碼
所有資料51hei提供下載:
AD9954.7z
(224.66 KB, 下載次數: 64)
2019-8-6 03:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
愛仕達撒多所
時間:
2020-4-23 10:26
感謝分享!!!1
作者:
305305305
時間:
2021-5-1 12:58
樓主,我試了一下發現輸出不是正弦波,請問是什么原因
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1