|
可以用,ZET6的
單片機(jī)源程序如下:
- /**********************************************************
-
- 功能:stm32f103rct6控制,20MHz時(shí)鐘, AD9954正弦波點(diǎn)頻輸出,范圍0-130M(可編輯0-200M),
- 掃頻默認(rèn)正弦波 。
- 顯示:12864cog
- 接口:控制接口請參照AD9954.h 按鍵接口請參照key.h
- **********************************************************/
- #include "AD9954.h"
- #include "delay.h"
- #include "math.h"
- //系統(tǒng)頻率fosc(外部晶振頻率),系統(tǒng)頻率=fosc*M
- #define fosc 20 //晶振頻率
- #define PLL_MULTIPLIER 20 //PLL倍頻數(shù)(4--20)
- #define fs (fosc*PLL_MULTIPLIER) //系統(tǒng)時(shí)鐘頻率
- //double fH_Num=11.2204;
- double fH_Num=10.73741824; //400M
- //double fH_Num=11.3671588397205;//
- //double fH_Num = 11.3025455157895;
- /*
- ** 函數(shù)名稱 :void GPIO_AD9954_Init(void)
- ** 函數(shù)功能 :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端口時(shí)鐘
-
- 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); //根據(jù)設(shè)定參數(shù)初始化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); //根據(jù)設(shè)定參數(shù)初始化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); //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED1-->PE.5 端口配置, 推挽輸出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4
-
- AD9954_IOSY=0;
- AD9954_OSK=0;
- AD9954_PWR=0;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void AD9954_RESET(void)
- ** 函數(shù)功能 :復(fù)位AD9954
- ** 函數(shù)說明 :不復(fù)位也可以
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- 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;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void AD9954_SENDBYTE(u8 dat)
- ** 函數(shù)功能 :往AD9954發(fā)送一個(gè)字節(jié)的內(nèi)容
- ** 函數(shù)說明 :AD9954的傳輸速度最大為25M,所以不加延時(shí)也可以
- ** 入口參數(shù) :待發(fā)送字節(jié)
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- 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;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void UPDATE(void)
- ** 函數(shù)功能 :產(chǎn)生一個(gè)更新信號,更新AD9954內(nèi)部寄存器,
- ** 函數(shù)說明 :可以不加任何延時(shí)
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- void UPDATE(void)
- {
- IOUPDATE=0;
- // delay_us(100);
- IOUPDATE = 1;
- //delay_us(200);
- IOUPDATE = 0;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void AD9954_Init(void))
- ** 函數(shù)功能 :初始化AD9954的管腳和最簡單的內(nèi)部寄存器的配置,
- ** 函數(shù)說明 :默認(rèn)關(guān)掉比較器的電源,因板上的晶振為100MHz,最大采用了4倍頻,為400M
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- //讀寄存器
- 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 "系統(tǒng)頻率超過芯片最大值"
- #elseif fs>=250
- AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04|0X03);
- #else
- AD9954_SENDBYTE(PLL_MULTIPLIER<<3);
- #endif
- // AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M
- AD9954_CS=1;
- }
- //Get_FTW的修正后頻率
- u32 Get_FTW(double f)
- {
- return (u32)((fH_Num+4.6)*f);
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void AD9954_SETFRE(float f)
- ** 函數(shù)功能 :設(shè)置AD9954當(dāng)前的頻率輸出,采用的是單一頻率輸出
- ** 函數(shù)說明 :因?yàn)椴捎玫母↑c(diǎn)數(shù)進(jìn)行計(jì)算,轉(zhuǎn)換過程中會出現(xiàn)誤差,通過調(diào)整可以精確到0.1Hz以內(nèi)
- ** 入口參數(shù) :欲設(shè)置的頻率值
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- 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控制位驅(qū)動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控制高位,系統(tǒng)時(shí)鐘倍頻后為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控制位驅(qū)動FTW
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x40);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void Generate_PSK(float f,u16 *phase)
- ** 函數(shù)功能 :PSK調(diào)制信號輸出
- ** 函數(shù)說明 :通過RAM端來控制信號的相位,從而實(shí)現(xiàn)PSK信號的調(diào)制
- ** 這里使用一個(gè)RAM段的循環(huán)模式,PSK信號為8為數(shù)據(jù)位。
- ** RAM的更新速度由ram rate定時(shí)寄存器控制,寄存器為16位,實(shí)現(xiàn)對系統(tǒng)提供的100M時(shí)鐘1~65535分頻,寫0是無效的
- ** 當(dāng)跟輸出PSK載波的頻率是ram rate跟新頻率的整數(shù)倍時(shí),才能保證每次的相位改變一致
- ** 入口參數(shù) :float f :PSK載波的頻率
- ** u16 *phase: 寫入相位累加器的相位值,180實(shí)現(xiàn)對相位翻轉(zhuǎn),0不改變相位,PSK信號為8位,需為8位的數(shù)組
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- void Generate_PSK(double f, u16 *phase)
- {
- u8 i;
- u16 date;
- AD9954_CS = 0;
- IOUPDATE = 0;
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動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控制高位,系統(tǒng)時(shí)鐘倍頻后為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控制位驅(qū)動FTW
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x40);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void Generate_FM(u32 *fre)
- ** 函數(shù)功能 :FM調(diào)制信號輸出
- ** 函數(shù)說明 :通過RAM端來控制信號的頻率,從而實(shí)現(xiàn)FM信號的調(diào)制
- ** 這里使用一個(gè)RAM段的循環(huán)模式,PSK信號為8為數(shù)據(jù)位。
- ** RAM的更新速度由ram rate定時(shí)寄存器控制,寄存器為16位,實(shí)現(xiàn)對系統(tǒng)提供的100M時(shí)鐘1~65535分頻,寫0是無效的
- ** ram rate的跟新速度為調(diào)制信號的頻率,這里如1KHz,寫入ram rate的值為0X0C35,
- ** 入口參數(shù) :u32 *fre:FM信號頻率值,這里采用的是32點(diǎn)頻率采樣,調(diào)用此函數(shù)之前需先設(shè)置好頻率表的值,其按正弦規(guī)律改變
- ** for(i=0;i<32;i++)
- ** {
- ** fre[i]=Fc+Fshift*sin(wt);
- ** }
- ** 出口參數(shù) :無
- Fc調(diào)制前載波的角頻率,F(xiàn)shift
- *********************************************************************************************************/
- void Generate_FM(u32 *fre)
- {
- u8 i;
- u32 date;
- AD9954_CS = 0;
- IOUPDATE = 0;
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動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控制高位,系統(tǒng)時(shí)鐘倍頻后為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控制位驅(qū)動FTW
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x40);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void ASK_Init(void)
- ** 函數(shù)功能 :ASK調(diào)制信號輸出初始化
- ** 函數(shù)說明 :ASK調(diào)制,需要先設(shè)置好載波頻率,然后改變DAC比例因子 scale factor其為14位,通過設(shè)置為最大和0兩種值實(shí)現(xiàn)ASK信號的調(diào)制
- ** 調(diào)用Write_ASF(u16 factor)來改變幅值
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- ****************************************************** ***************************************************/
- void ASK_Init(void)
- {
- AD9954_CS = 0;
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x02);//手動打開OSK打開
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x20);//當(dāng)受到UPDATE信號,自動清楚相位累加器 //
- // AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />
- AD9954_SENDBYTE(0x40);
- //控制相位偏移,因默認(rèn)輸出是余弦波,所以需控制相位累加器的累加相位為270
- AD9954_SENDBYTE(0X05);
- AD9954_SENDBYTE(0X30);
- AD9954_SENDBYTE(0X00);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void AM_Init(void)
- ** 函數(shù)功能 :AM調(diào)制信號輸出初始化
- ** 函數(shù)說明 :AM調(diào)制,需要先設(shè)置好載波頻率,然后改變DAC比例因子 scale factor其為14位,AM的幅度值按正弦規(guī)律變換,可以實(shí)現(xiàn)AM
- ** 最高可以采用32點(diǎn)采樣
- ** 調(diào)用Write_ASF(u16 factor)來改變幅值
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- void AM_Init(void)
- {
- AD9954_CS = 0;
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x02);//手動打開OSK打開
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />
- AD9954_SENDBYTE(0x00);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void Write_ASF(u16 factor)
- ** 函數(shù)功能 :改變scale factor數(shù)值,改變DAC輸出幅度
- ** 函數(shù)說明 :寫入最大為0X3FFF,最小為0
- ** 入口參數(shù) :無
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- void Write_ASF(u16 factor) //2ASK
- {
- AD9954_CS = 0;
- // AD9954_SENDBYTE(0x00);//地址0寫操作
- // AD9954_SENDBYTE(0x02);//手動打開OSK打開
- // AD9954_SENDBYTE(0x00);
- // AD9954_SENDBYTE(0x20);//當(dāng)受到UPDATE信號,自動清楚相位累加器 //
- // // AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />
- // 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掃頻模式輸出
- * 參 數(shù):MinFreq:掃頻下限頻率,MaxFreq:掃頻上限頻率
- * UpStepFreq:向上掃頻步進(jìn),UpStepTime:向上掃頻的跳頻時(shí)間
- * DownStepFreq:向下掃頻步進(jìn),DownStepTime:向下掃頻的跳頻時(shí)間
- * Mode:掃頻模式
- * 返 回 值:無 Linear_Sweep(100, 100000000, 100, 250, 100,250, 1);
- * 說 明:步進(jìn)頻率單位是100khz
- * Mode=DoubleScan(雙邊掃頻)時(shí),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----下降頻率步進(jìn)和跳頻時(shí)間
- FTW_Vau = Get_FTW(DownStepFreq);
- AD9954_SENDBYTE(NLSCW);
- AD9954_SENDBYTE(DownStepTime); //跳頻時(shí)間(DownStepTime個(gè)??周期)
- AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進(jìn)
- AD9954_SENDBYTE(FTW_Vau>>16);
- AD9954_SENDBYTE(FTW_Vau>>8);
- AD9954_SENDBYTE(FTW_Vau);
- PS0=0; //下降掃頻
- }
- if (Mode == UpScan)
- {
-
- //寫入PLSCW----上升頻率步進(jìn)和跳頻時(shí)間
- FTW_Vau = Get_FTW(UpStepFreq);
- AD9954_SENDBYTE(PLSCW);
- AD9954_SENDBYTE(UpStepTime); //跳頻時(shí)間(0XFF個(gè)??周期)
- AD9954_SENDBYTE(FTW_Vau>>24); //頻率步進(jìn)
- AD9954_SENDBYTE(FTW_Vau>>16);
- AD9954_SENDBYTE(FTW_Vau>>8);
- AD9954_SENDBYTE(FTW_Vau);
- PS0=1; //上升掃頻
- }
- AD9954_CS=1;
- UPDATE();
- }
- /******************************************************************
- * 名 稱:PS0_WriteBit
- * 功 能:設(shè)置PS0的狀態(tài)
- * 參 數(shù):BitVal:PS0狀態(tài)
- * 返 回 值:無
- * 說 明:PS0可以控制AD9954掃頻方向
- ******************************************************************/
- void PS0_WriteBit(BitAction BitVal)
- {
- PS0=BitVal;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void DirectSwitchFSK(float f1,float f2,float f3,float f4)
- ** 函數(shù)功能 :四相FSK信號輸出
- ** 函數(shù)說明 :在四個(gè)RAM區(qū)各設(shè)置了一個(gè)頻率值,通過改變PS0和PS1的電平選擇對應(yīng)的RAM端輸出相應(yīng)的頻率值來實(shí)現(xiàn)FSK,也可以實(shí)現(xiàn)二項(xiàng)的FSK;
- ** 通過設(shè)置定時(shí)器中斷控制PS0,PS1管腳的電平就可以將二進(jìn)制的編碼轉(zhuǎn)化為FSK信號輸出
- ** 入口參數(shù) :float f1:頻率1
- ** float f2:頻率2
- ** float f3:頻率3
- ** float f4:頻率4
- ** 隱含控制 PS0: 0 1 0 1
- 管腳參數(shù): PS1: 0 0 1 1
- ** 對應(yīng)控制 RAM段: 0 1 2 3
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- void DirectSwitchFSK(double f1,double f2,double f3,double f4)
- {
- u32 FTW_Vau;
- AD9954_CS = 0;
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動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控制高位,系統(tǒng)時(shí)鐘倍頻后為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); //頻率步進(jìn)
- 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); //頻率步進(jìn)
- 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); //頻率步進(jìn)
- 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); //頻率步進(jìn)
- AD9954_SENDBYTE(FTW_Vau>>16);
- AD9954_SENDBYTE(FTW_Vau>>8);
- AD9954_SENDBYTE(FTW_Vau);
- AD9954_SENDBYTE(0x00);//地址0寫操作
- AD9954_SENDBYTE(0x80);//打開RAM控制位驅(qū)動FTW
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x00);
- AD9954_SENDBYTE(0x40);
- AD9954_CS = 1;
- UPDATE();
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱 :void LINEARSWEEP(float f1,float f2)
- ** 函數(shù)功能 :線性掃面輸出模式
- ** 函數(shù)說明 :使頻率按預(yù)置的模式線性掃描上去,詳細(xì)參見官方PDF
- ** 入口參數(shù) :float f1:起始頻率
- ** float f2:終止頻率
- ** 出口參數(shù) :無
- *********************************************************************************************************/
- 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控制高位,系統(tǒng)時(shí)鐘倍頻后為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();
- }
復(fù)制代碼
所有資料51hei提供下載:
AD9954.7z
(224.66 KB, 下載次數(shù): 64)
2019-8-6 03:01 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|