找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4672|回復(fù): 3
收起左側(cè)

STM32F103ZET6驅(qū)動AD9954源程序

[復(fù)制鏈接]
ID:595801 發(fā)表于 2019-8-5 20:31 | 顯示全部樓層 |閱讀模式
可以用,ZET6的

單片機(jī)源程序如下:
  1. /**********************************************************
  2.                                                                                  
  3. 功能:stm32f103rct6控制,20MHz時(shí)鐘, AD9954正弦波點(diǎn)頻輸出,范圍0-130M(可編輯0-200M),
  4.                         掃頻默認(rèn)正弦波 。
  5.                         顯示:12864cog
  6. 接口:控制接口請參照AD9954.h  按鍵接口請參照key.h

  7. **********************************************************/
  8. #include "AD9954.h"
  9. #include "delay.h"
  10. #include "math.h"

  11. //系統(tǒng)頻率fosc(外部晶振頻率),系統(tǒng)頻率=fosc*M
  12. #define fosc  20                        //晶振頻率
  13. #define PLL_MULTIPLIER  20             //PLL倍頻數(shù)(4--20)
  14. #define fs  (fosc*PLL_MULTIPLIER)       //系統(tǒng)時(shí)鐘頻率

  15. //double fH_Num=11.2204;
  16. double fH_Num=10.73741824; //400M
  17. //double fH_Num=11.3671588397205;//
  18. //double fH_Num = 11.3025455157895;
  19. /*
  20. ** 函數(shù)名稱 :void GPIO_AD9954_Init(void)
  21. ** 函數(shù)功能 :AD9954接口IO初始化
  22. **            AD9954_CS----------PB9                         OUT
  23. **                              AD9954_SCLK--------PB10                         OUT
  24. **            AD9954_SDIO--------PB11           OUT
  25. **            AD9954_OSK---------PB12           OUT
  26. **                  PS0----------------PB13                  OUT
  27. **                              PS1----------------PB14                         OUT
  28. **            IOUPDATE-----------PB15                  OUT

  29. **                              AD9954_SDO---------PB5                  IN
  30. **            AD9954_IOSY--------PB6                  OUT
  31. **            AD9954_RET---------PB7            OUT
  32. **            AD9954_PWR---------PB8            OUT
  33. */
  34. void GPIO_AD9954_Init(void)
  35. {
  36. GPIO_InitTypeDef  GPIO_InitStructure;
  37.          
  38. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE);         //使能PB,PE端口時(shí)鐘
  39.         
  40. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //LED0-->PB.5 端口配置
  41. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  42. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  43. GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
  44.         
  45. 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 端口配置
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  47. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  48. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
  49.         
  50. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_0;                                 //LED0-->PB.5 端口配置
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  53. GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.5        
  54.         
  55.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                             //LED1-->PE.5 端口配置, 推挽輸出
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
  57.          GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4
  58.         
  59.         AD9954_IOSY=0;
  60.         AD9954_OSK=0;
  61.         AD9954_PWR=0;
  62. }
  63. /*********************************************************************************************************
  64. ** 函數(shù)名稱 :void AD9954_RESET(void)
  65. ** 函數(shù)功能 :復(fù)位AD9954
  66. ** 函數(shù)說明 :不復(fù)位也可以
  67. ** 入口參數(shù) :無
  68. ** 出口參數(shù) :無
  69. *********************************************************************************************************/
  70. void AD9954_RESET(void)
  71. {
  72.         AD9954_CS = 0;
  73.         AD9954_RET = 0;
  74.         AD9954_RET = 1;
  75.         delay_ms(100);
  76.         AD9954_RET = 0;
  77.         AD9954_CS = 0;
  78.         AD9954_SCLK = 0;
  79.         PS0 = 0;
  80.         PS1 = 0;
  81.         IOUPDATE = 0;
  82.         AD9954_CS = 1;
  83. }
  84. /*********************************************************************************************************
  85. ** 函數(shù)名稱 :void AD9954_SENDBYTE(u8 dat)
  86. ** 函數(shù)功能 :往AD9954發(fā)送一個(gè)字節(jié)的內(nèi)容
  87. ** 函數(shù)說明 :AD9954的傳輸速度最大為25M,所以不加延時(shí)也可以
  88. ** 入口參數(shù) :待發(fā)送字節(jié)
  89. ** 出口參數(shù) :無
  90. *********************************************************************************************************/
  91. void AD9954_SENDBYTE(u8 dat)
  92. {
  93.         u8 i;
  94.         for (i = 0;i<8;i++)
  95.         {
  96.                 AD9954_SCLK = 0;
  97.                 if (dat & 0x80)
  98.                 {
  99.                         AD9954_SDIO = 1;
  100.                 }
  101.                 else
  102.                 {
  103.                         AD9954_SDIO = 0;
  104.                 }
  105.                 AD9954_SCLK = 1;
  106.                 dat <<= 1;
  107.         }
  108. }
  109. u8 AD9954_ReadByte(void)
  110. {
  111.         u8 i,dat=0;
  112.         for (i = 0;i<8;i++)
  113.         {
  114.                 AD9954_SCLK = 0;
  115.                 dat|=AD9954_SDO;
  116.                 AD9954_SCLK = 1;
  117.                 dat <<= 1;
  118.         }
  119.         return dat;
  120. }
  121. /*********************************************************************************************************
  122. ** 函數(shù)名稱 :void UPDATE(void)
  123. ** 函數(shù)功能 :產(chǎn)生一個(gè)更新信號,更新AD9954內(nèi)部寄存器,
  124. ** 函數(shù)說明 :可以不加任何延時(shí)
  125. ** 入口參數(shù) :無
  126. ** 出口參數(shù) :無
  127. *********************************************************************************************************/
  128. void UPDATE(void)
  129. {
  130.         IOUPDATE=0;
  131. //        delay_us(100);
  132.         IOUPDATE = 1;
  133.         //delay_us(200);
  134.         IOUPDATE = 0;
  135. }
  136. /*********************************************************************************************************
  137. ** 函數(shù)名稱 :void AD9954_Init(void))
  138. ** 函數(shù)功能 :初始化AD9954的管腳和最簡單的內(nèi)部寄存器的配置,
  139. ** 函數(shù)說明 :默認(rèn)關(guān)掉比較器的電源,因板上的晶振為100MHz,最大采用了4倍頻,為400M
  140. ** 入口參數(shù) :無
  141. ** 出口參數(shù) :無
  142. *********************************************************************************************************/


  143. //讀寄存器
  144. u32 Read_Vau1(void)
  145. {
  146.     uint32_t ret;
  147. //    char i;
  148.     AD9954_CS=1;
  149.     AD9954_SENDBYTE(CFR1);
  150.     ret = AD9954_ReadByte();
  151.     ret<<=8;
  152.     ret += AD9954_ReadByte();
  153.     ret<<=8;
  154.     ret += AD9954_ReadByte();
  155.     ret<<=8;
  156.     ret += AD9954_ReadByte();
  157.     AD9954_CS=1;
  158.     return ret;
  159. }
  160. u32 Read_Vau2(void)
  161. {
  162.     uint32_t ret;
  163. //    char i;
  164.     AD9954_CS=1;
  165.     AD9954_SENDBYTE(CFR2);
  166.     ret = AD9954_ReadByte();
  167.     ret<<=8;
  168.     ret += AD9954_ReadByte();
  169.     ret<<=8;
  170.     ret += AD9954_ReadByte();
  171.     AD9954_CS=0;
  172.     return ret;
  173. }
  174. void AD9954_Init(void)
  175. {
  176.         GPIO_AD9954_Init();
  177.         AD9954_RESET();
  178.         delay_ms(10);
  179.         AD9954_CS = 0;
  180.         //single tone
  181.         AD9954_SENDBYTE(CFR1);//地址0寫操作
  182.         AD9954_SENDBYTE(0x02);//02
  183.         AD9954_SENDBYTE(0x00);
  184.         AD9954_SENDBYTE(0x10);
  185. //        AD9954_SENDBYTE(0x40);//比較器power down         
  186.         AD9954_SENDBYTE(0x00);//比較器使能        

  187.         AD9954_SENDBYTE(CFR2);//地址1寫操作
  188.         AD9954_SENDBYTE(0x00);//
  189.         AD9954_SENDBYTE(0x00);
  190. #if fs>400
  191.     #error "系統(tǒng)頻率超過芯片最大值"
  192. #elseif fs>=250
  193.     AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04|0X03);
  194. #else
  195.     AD9954_SENDBYTE(PLL_MULTIPLIER<<3);
  196. #endif
  197. //        AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M
  198.         AD9954_CS=1;
  199. }
  200. //Get_FTW的修正后頻率
  201. u32 Get_FTW(double f)
  202. {
  203.                 return (u32)((fH_Num+4.6)*f);
  204. }

  205. /*********************************************************************************************************
  206. ** 函數(shù)名稱 :void AD9954_SETFRE(float f)
  207. ** 函數(shù)功能 :設(shè)置AD9954當(dāng)前的頻率輸出,采用的是單一頻率輸出
  208. ** 函數(shù)說明 :因?yàn)椴捎玫母↑c(diǎn)數(shù)進(jìn)行計(jì)算,轉(zhuǎn)換過程中會出現(xiàn)誤差,通過調(diào)整可以精確到0.1Hz以內(nèi)
  209. ** 入口參數(shù) :欲設(shè)置的頻率值
  210. ** 出口參數(shù) :無
  211. *********************************************************************************************************/
  212. void AD9954_SETFRE(double f)//single tone
  213. {
  214.         u32 date;
  215.         AD9954_CS = 0;
  216.         
  217.         date = Get_FTW(f);//det=(f/fclk)x2^32=10.7374xf
  218.         //date=10.7374*f;
  219.         AD9954_SENDBYTE(FTW0);//FTW0地址
  220. //        delay_ms(1);
  221.         AD9954_SENDBYTE((u8)(date >> 24));//頻率控制字
  222.         AD9954_SENDBYTE((u8)(date >> 16));
  223.         AD9954_SENDBYTE((u8)(date >> 8));
  224.         AD9954_SENDBYTE((u8)date);

  225.         AD9954_CS=1;
  226.         UPDATE();
  227. //        fH_Num+=0.001;
  228. }
  229. /*

  230. */
  231. void DirectSwitchPSK(float f, float phase1, float phase2, float phase3, float phase4)
  232. {
  233.         u16 date;
  234.         AD9954_CS = 0;
  235.         IOUPDATE = 0;
  236.         delay_us(1);
  237.         AD9954_SENDBYTE(0x00);//地址0寫操作
  238.         AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動FTW
  239.         AD9954_SENDBYTE(0x00);
  240.         AD9954_SENDBYTE(0x00);
  241.         AD9954_SENDBYTE(0x40);
  242.         
  243.         AD9954_SENDBYTE(0x01);//地址1寫操作
  244.         AD9954_SENDBYTE(0x00);//
  245.         AD9954_SENDBYTE(0x00);
  246.         AD9954_SENDBYTE(0xA4);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M
  247.         AD9954_SETFRE(f);//載波頻率
  248.         PS0 = 0;
  249.         PS1 = 0;
  250.         AD9954_SENDBYTE(0x07);
  251.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010
  252.         AD9954_SENDBYTE(0x00);
  253.         AD9954_SENDBYTE(0x00);//final address:0x000
  254.         AD9954_SENDBYTE(0x00);//start address:0x000;
  255.         AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位沒有激活
  256.         UPDATE();
  257.         date = 45.51*phase1;
  258.         date = date << 2;
  259.         AD9954_SENDBYTE(0x0b);
  260.         AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  261.         AD9954_SENDBYTE((u8)date);
  262.         AD9954_SENDBYTE(0x00);
  263.         AD9954_SENDBYTE(0x00);

  264.         PS0 = 1;//ram1
  265.         PS1 = 0;

  266.         AD9954_SENDBYTE(0x08);
  267.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010
  268.         AD9954_SENDBYTE(0x00);
  269.         AD9954_SENDBYTE(0x01);//final address:0x0001
  270.         AD9954_SENDBYTE(0x04);//start address:0x0001
  271.         AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位沒有激活
  272.         UPDATE();
  273.         date = 45.51*phase2;
  274.         date = date << 2;
  275.         AD9954_SENDBYTE(0x0b);
  276.         AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  277.         AD9954_SENDBYTE((u8)date);
  278.         AD9954_SENDBYTE(0x00);
  279.         AD9954_SENDBYTE(0x00);

  280.         PS0 = 0;//ram2
  281.         PS1 = 1;

  282.         AD9954_SENDBYTE(0x09);
  283.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010
  284.         AD9954_SENDBYTE(0x00);
  285.         AD9954_SENDBYTE(0x02);//final address:0x0002
  286.         AD9954_SENDBYTE(0x08);//start address:0x0002
  287.         AD9954_SENDBYTE(0x00);
  288.         UPDATE();
  289.         date = 45.51*phase3;
  290.         date = date << 2;
  291.         AD9954_SENDBYTE(0x0b);
  292.         AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  293.         AD9954_SENDBYTE((u8)date);
  294.         AD9954_SENDBYTE(0x00);
  295.         AD9954_SENDBYTE(0x00);
  296.         PS0 = 1;//ram3
  297.         PS1 = 1;
  298.         AD9954_SENDBYTE(0x0a);
  299.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010
  300.         AD9954_SENDBYTE(0x00);
  301.         AD9954_SENDBYTE(0x03);//final address:0x0003
  302.         AD9954_SENDBYTE(0x0c);//start address:0x0003
  303.         AD9954_SENDBYTE(0x00);
  304.         UPDATE();
  305.         date = 45.51*phase4;
  306.         date = date << 2;
  307.         AD9954_SENDBYTE(0x0b);
  308.         AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  309.         AD9954_SENDBYTE((u8)date);
  310.         AD9954_SENDBYTE(0x00);
  311.         AD9954_SENDBYTE(0x00);

  312.         AD9954_SENDBYTE(0x00);//地址0寫操作
  313.         AD9954_SENDBYTE(0xa0);//打開RAM控制位驅(qū)動FTW
  314.         AD9954_SENDBYTE(0x00);
  315.         AD9954_SENDBYTE(0x00);
  316.         AD9954_SENDBYTE(0x40);
  317.         AD9954_CS = 1;
  318.         UPDATE();
  319. }
  320. /*********************************************************************************************************
  321. ** 函數(shù)名稱 :void Generate_PSK(float f,u16 *phase)
  322. ** 函數(shù)功能 :PSK調(diào)制信號輸出
  323. ** 函數(shù)說明 :通過RAM端來控制信號的相位,從而實(shí)現(xiàn)PSK信號的調(diào)制
  324. **            這里使用一個(gè)RAM段的循環(huán)模式,PSK信號為8為數(shù)據(jù)位。
  325. **            RAM的更新速度由ram rate定時(shí)寄存器控制,寄存器為16位,實(shí)現(xiàn)對系統(tǒng)提供的100M時(shí)鐘1~65535分頻,寫0是無效的
  326. **                          當(dāng)跟輸出PSK載波的頻率是ram rate跟新頻率的整數(shù)倍時(shí),才能保證每次的相位改變一致
  327. ** 入口參數(shù) :float f   :PSK載波的頻率
  328. **                           u16 *phase: 寫入相位累加器的相位值,180實(shí)現(xiàn)對相位翻轉(zhuǎn),0不改變相位,PSK信號為8位,需為8位的數(shù)組
  329. ** 出口參數(shù) :無
  330. *********************************************************************************************************/
  331. void Generate_PSK(double f, u16 *phase)
  332. {
  333.         u8 i;
  334.         u16 date;
  335.         AD9954_CS = 0;
  336.         IOUPDATE = 0;

  337.         AD9954_SENDBYTE(0x00);//地址0寫操作
  338.         AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動FTW
  339.         AD9954_SENDBYTE(0x00);
  340.         AD9954_SENDBYTE(0x00);
  341.         AD9954_SENDBYTE(0x40);

  342.         AD9954_SENDBYTE(0x01);//地址1寫操作
  343.         AD9954_SENDBYTE(0x00);//
  344.         AD9954_SENDBYTE(0x00);
  345.         AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M
  346.         AD9954_SETFRE(f);//載波頻率

  347.         AD9954_SENDBYTE(0x04);//FTW0地址
  348.         AD9954_SENDBYTE(0x00);//頻率控制字
  349.         AD9954_SENDBYTE(0x10);
  350.         AD9954_SENDBYTE(0x00);
  351.         AD9954_SENDBYTE(0x00);
  352.         UPDATE();

  353.         PS0 = 0;
  354.         PS1 = 0;
  355.         AD9954_SENDBYTE(0x07);
  356.         AD9954_SENDBYTE(0x00);//ramp rate=0x0400
  357.         AD9954_SENDBYTE(0x04);
  358.         AD9954_SENDBYTE(0x07);//final address:0x007
  359.         AD9954_SENDBYTE(0x00);//start address:0x000;
  360.         AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位沒有激活
  361.         UPDATE();

  362.         AD9954_SENDBYTE(0x0b);
  363.         for (i = 0;i<8;i++)
  364.         {
  365.                 date = 45.51*phase[i];
  366.                 date = date << 2;
  367.                 AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  368.                 AD9954_SENDBYTE((u8)date);
  369.                 AD9954_SENDBYTE(0x00);
  370.                 AD9954_SENDBYTE(0x00);
  371.         }
  372.         AD9954_SENDBYTE(0x00);//地址0寫操作
  373.         AD9954_SENDBYTE(0xc0);//打開RAM控制位驅(qū)動FTW
  374.         AD9954_SENDBYTE(0x00);
  375.         AD9954_SENDBYTE(0x00);
  376.         AD9954_SENDBYTE(0x40);
  377.         AD9954_CS = 1;
  378.         UPDATE();
  379. }
  380. /*********************************************************************************************************
  381. ** 函數(shù)名稱 :void Generate_FM(u32 *fre)
  382. ** 函數(shù)功能 :FM調(diào)制信號輸出
  383. ** 函數(shù)說明 :通過RAM端來控制信號的頻率,從而實(shí)現(xiàn)FM信號的調(diào)制
  384. **            這里使用一個(gè)RAM段的循環(huán)模式,PSK信號為8為數(shù)據(jù)位。
  385. **            RAM的更新速度由ram rate定時(shí)寄存器控制,寄存器為16位,實(shí)現(xiàn)對系統(tǒng)提供的100M時(shí)鐘1~65535分頻,寫0是無效的
  386. **                          ram rate的跟新速度為調(diào)制信號的頻率,這里如1KHz,寫入ram rate的值為0X0C35,
  387. ** 入口參數(shù) :u32 *fre:FM信號頻率值,這里采用的是32點(diǎn)頻率采樣,調(diào)用此函數(shù)之前需先設(shè)置好頻率表的值,其按正弦規(guī)律改變
  388. **            for(i=0;i<32;i++)
  389. **                                {
  390. **                                        fre[i]=Fc+Fshift*sin(wt);
  391. **                                }
  392. ** 出口參數(shù) :無
  393. Fc調(diào)制前載波的角頻率,F(xiàn)shift
  394. *********************************************************************************************************/
  395. void Generate_FM(u32 *fre)
  396. {
  397.         u8 i;
  398.         u32 date;
  399.         AD9954_CS = 0;
  400.         IOUPDATE = 0;

  401.         AD9954_SENDBYTE(0x00);//地址0寫操作
  402.         AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動FTW
  403.         AD9954_SENDBYTE(0x00);
  404.         AD9954_SENDBYTE(0x00);
  405.         AD9954_SENDBYTE(0x40);

  406.         AD9954_SENDBYTE(0x01);//地址1寫操作
  407.         AD9954_SENDBYTE(0x00);//
  408.         AD9954_SENDBYTE(0x00);
  409.         AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M

  410.         PS0 = 0;
  411.         PS1 = 0;
  412.         AD9954_SENDBYTE(0x07);
  413.         AD9954_SENDBYTE(0x35);//ramp rate=32kHz
  414.         AD9954_SENDBYTE(0x0C);
  415.         AD9954_SENDBYTE(0x1F);//final address:0x000
  416.         AD9954_SENDBYTE(0x00);//start address:0x000;
  417.         AD9954_SENDBYTE(0x80);//RAM0工作于模式0,不停留位沒有激活
  418.         UPDATE();

  419.         AD9954_SENDBYTE(0x0b);
  420.         for (i = 0;i<32;i++)
  421.         {
  422.                 date = 10.73741*fre[i];
  423.                 AD9954_SENDBYTE((u8)(date >> 24));//頻率控制字
  424.                 AD9954_SENDBYTE((u8)(date >> 16));
  425.                 AD9954_SENDBYTE((u8)(date >> 8));
  426.                 AD9954_SENDBYTE((u8)date);
  427.         }
  428.         AD9954_SENDBYTE(0x00);//地址0寫操作
  429.         AD9954_SENDBYTE(0x80);//打開RAM控制位驅(qū)動FTW
  430.         AD9954_SENDBYTE(0x00);
  431.         AD9954_SENDBYTE(0x00);
  432.         AD9954_SENDBYTE(0x40);
  433.         AD9954_CS = 1;
  434.         UPDATE();
  435. }
  436. /*********************************************************************************************************
  437. ** 函數(shù)名稱 :void ASK_Init(void)
  438. ** 函數(shù)功能 :ASK調(diào)制信號輸出初始化
  439. ** 函數(shù)說明 :ASK調(diào)制,需要先設(shè)置好載波頻率,然后改變DAC比例因子 scale factor其為14位,通過設(shè)置為最大和0兩種值實(shí)現(xiàn)ASK信號的調(diào)制
  440. **                          調(diào)用Write_ASF(u16 factor)來改變幅值
  441. ** 入口參數(shù) :無
  442. ** 出口參數(shù) :無
  443. ****************************************************** ***************************************************/
  444. void ASK_Init(void)
  445. {
  446.         AD9954_CS = 0;
  447.         AD9954_SENDBYTE(0x00);//地址0寫操作
  448.         AD9954_SENDBYTE(0x02);//手動打開OSK打開
  449.         AD9954_SENDBYTE(0x00);

  450.         AD9954_SENDBYTE(0x20);//當(dāng)受到UPDATE信號,自動清楚相位累加器                //
  451.                                                   //        AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />

  452.         AD9954_SENDBYTE(0x40);

  453.         //控制相位偏移,因默認(rèn)輸出是余弦波,所以需控制相位累加器的累加相位為270
  454.         AD9954_SENDBYTE(0X05);
  455.         AD9954_SENDBYTE(0X30);
  456.         AD9954_SENDBYTE(0X00);

  457.         AD9954_CS = 1;
  458.         UPDATE();
  459. }
  460. /*********************************************************************************************************
  461. ** 函數(shù)名稱 :void AM_Init(void)
  462. ** 函數(shù)功能 :AM調(diào)制信號輸出初始化
  463. ** 函數(shù)說明 :AM調(diào)制,需要先設(shè)置好載波頻率,然后改變DAC比例因子 scale factor其為14位,AM的幅度值按正弦規(guī)律變換,可以實(shí)現(xiàn)AM
  464. **            最高可以采用32點(diǎn)采樣
  465. **                          調(diào)用Write_ASF(u16 factor)來改變幅值
  466. ** 入口參數(shù) :無
  467. ** 出口參數(shù) :無
  468. *********************************************************************************************************/
  469. void AM_Init(void)
  470. {
  471.         AD9954_CS = 0;
  472.         AD9954_SENDBYTE(0x00);//地址0寫操作
  473.         AD9954_SENDBYTE(0x02);//手動打開OSK打開
  474.         AD9954_SENDBYTE(0x00);
  475.         AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />
  476.         AD9954_SENDBYTE(0x00);

  477.         AD9954_CS = 1;
  478.         UPDATE();
  479. }
  480. /*********************************************************************************************************
  481. ** 函數(shù)名稱 :void Write_ASF(u16 factor)
  482. ** 函數(shù)功能 :改變scale factor數(shù)值,改變DAC輸出幅度
  483. ** 函數(shù)說明 :寫入最大為0X3FFF,最小為0
  484. ** 入口參數(shù) :無
  485. ** 出口參數(shù) :無
  486. *********************************************************************************************************/
  487. void Write_ASF(u16 factor)  //2ASK
  488. {
  489.         AD9954_CS = 0;
  490. //                AD9954_SENDBYTE(0x00);//地址0寫操作
  491. //        AD9954_SENDBYTE(0x02);//手動打開OSK打開
  492. //        AD9954_SENDBYTE(0x00);

  493. //        AD9954_SENDBYTE(0x20);//當(dāng)受到UPDATE信號,自動清楚相位累加器                //
  494. //        //        AD9954_SENDBYTE(0x00);//不改變?nèi)魏?br />

  495. //        AD9954_SENDBYTE(0x40);

  496. //        //控制相位偏移
  497. //        AD9954_SENDBYTE(0X05);
  498. //        AD9954_SENDBYTE(0X30);
  499. //        AD9954_SENDBYTE(0X00);         

  500.         AD9954_SENDBYTE(0x02);//幅度        
  501.         AD9954_SENDBYTE(factor >> 8);
  502.         AD9954_SENDBYTE(factor);
  503.         AD9954_CS = 1;
  504.         UPDATE();

  505. }
  506. void Write_Pow0(void)
  507. {

  508.         AD9954_CS = 0;
  509.         AD9954_SENDBYTE(0X05);
  510. //        AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  511. //        AD9954_SENDBYTE((u8)date);
  512.         
  513.         AD9954_SENDBYTE(0X10);
  514.         AD9954_SENDBYTE(0X00);         
  515.         
  516.         AD9954_CS = 1;
  517.         UPDATE();



  518. }
  519. //相位控制:相位偏移=(pow/16384)*360                        pow=(相位偏移/360)*16384
  520. void Write_Pow(double xw)
  521. {
  522.         u16 date;
  523.         date=xw*45.511;
  524.         AD9954_CS = 0;
  525.         AD9954_SENDBYTE(0X05);
  526. //        date>>=2;
  527.         AD9954_SENDBYTE((u8)(date >> 8));//頻率控制字
  528.         AD9954_SENDBYTE((u8)date);
  529.         
  530. //        AD9954_SENDBYTE(0X00);
  531. //        AD9954_SENDBYTE(0X00);         
  532.         
  533.         AD9954_CS = 1;
  534.         UPDATE();

  535. }
  536. /******************************************************************
  537. *  名    稱:Linear_Sweep
  538. *  功    能:AD9954掃頻模式輸出
  539. *  參    數(shù):MinFreq:掃頻下限頻率,MaxFreq:掃頻上限頻率
  540. *            UpStepFreq:向上掃頻步進(jìn),UpStepTime:向上掃頻的跳頻時(shí)間
  541. *            DownStepFreq:向下掃頻步進(jìn),DownStepTime:向下掃頻的跳頻時(shí)間
  542. *            Mode:掃頻模式
  543. *  返 回 值:無 Linear_Sweep(100, 100000000, 100,  250,   100,250, 1);
  544. *  說    明:步進(jìn)頻率單位是100khz
  545. *            Mode=DoubleScan(雙邊掃頻)時(shí),PS0=1,即為向上掃頻,但配置了
  546. *            向下掃頻的寄存器,可以直接通過PS0_WriteBit()來改變掃頻方向
  547. ******************************************************************/
  548. void Linear_Sweep(double MinFreq,double MaxFreq,double UpStepFreq,u8 UpStepTime,double DownStepFreq,u8 DownStepTime,ScanMode Mode )//0向下掃頻模式,1向上掃頻模式,2雙邊掃頻

  549. {
  550.     uint32_t FTW_Vau;
  551.                 PS0=0;
  552.     PS1=0;
  553.         
  554.     AD9954_CS=0;
  555.     AD9954_SENDBYTE(CFR1);
  556.     AD9954_SENDBYTE(0x02);//斜坡鍵控使能
  557.     AD9954_SENDBYTE(0x20);//線性頻率掃描使能
  558.     AD9954_SENDBYTE(0x00);
  559. //    if (Mode & No_Dwell)
  560. //                                AD9954_SENDBYTE(0x44);//使能比較器和線性掃描無停留
  561. //    else
  562.        AD9954_SENDBYTE(0x40); //使能比較器
  563. //   
  564.     //寫入FTW0----最小頻率
  565.     FTW_Vau =  Get_FTW(MinFreq);
  566.     AD9954_SENDBYTE(FTW0);
  567.     AD9954_SENDBYTE((u8)(FTW_Vau>>24));
  568.     AD9954_SENDBYTE((u8)(FTW_Vau>>16));
  569.     AD9954_SENDBYTE((u8)(FTW_Vau>>8));
  570.     AD9954_SENDBYTE((u8)(FTW_Vau));
  571.    
  572.     //寫入FTW1----最大頻率
  573.     FTW_Vau = Get_FTW(MaxFreq);
  574.     AD9954_SENDBYTE(FTW1);
  575.     AD9954_SENDBYTE(FTW_Vau>>24);
  576.     AD9954_SENDBYTE(FTW_Vau>>16);
  577.     AD9954_SENDBYTE(FTW_Vau>>8);
  578.     AD9954_SENDBYTE(FTW_Vau);
  579.    
  580.   //  Mode &= 0x7F;
  581.    
  582.     if(Mode == DownScan)
  583.     {
  584.                                   PS0=0;  
  585.         //寫入NLSCW----下降頻率步進(jìn)和跳頻時(shí)間
  586.         FTW_Vau = Get_FTW(DownStepFreq);
  587.         AD9954_SENDBYTE(NLSCW);
  588.         AD9954_SENDBYTE(DownStepTime); //跳頻時(shí)間(DownStepTime個(gè)??周期)     
  589.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  590.         AD9954_SENDBYTE(FTW_Vau>>16);
  591.         AD9954_SENDBYTE(FTW_Vau>>8);
  592.         AD9954_SENDBYTE(FTW_Vau);
  593.         PS0=0;                         //下降掃頻
  594.     }
  595.     if (Mode == UpScan)
  596.     {
  597.                           
  598.         //寫入PLSCW----上升頻率步進(jìn)和跳頻時(shí)間
  599.         FTW_Vau = Get_FTW(UpStepFreq);
  600.         AD9954_SENDBYTE(PLSCW);
  601.         AD9954_SENDBYTE(UpStepTime); //跳頻時(shí)間(0XFF個(gè)??周期)
  602.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  603.         AD9954_SENDBYTE(FTW_Vau>>16);
  604.         AD9954_SENDBYTE(FTW_Vau>>8);
  605.         AD9954_SENDBYTE(FTW_Vau);
  606.            PS0=1;                   //上升掃頻
  607.     }
  608.     AD9954_CS=1;
  609.                 UPDATE();
  610. }

  611. /******************************************************************
  612. *  名    稱:PS0_WriteBit
  613. *  功    能:設(shè)置PS0的狀態(tài)
  614. *  參    數(shù):BitVal:PS0狀態(tài)
  615. *  返 回 值:無
  616. *  說    明:PS0可以控制AD9954掃頻方向
  617. ******************************************************************/
  618. void PS0_WriteBit(BitAction BitVal)
  619. {
  620.     PS0=BitVal;
  621. }

  622. /*********************************************************************************************************
  623. ** 函數(shù)名稱 :void DirectSwitchFSK(float f1,float f2,float f3,float f4)
  624. ** 函數(shù)功能 :四相FSK信號輸出
  625. ** 函數(shù)說明 :在四個(gè)RAM區(qū)各設(shè)置了一個(gè)頻率值,通過改變PS0和PS1的電平選擇對應(yīng)的RAM端輸出相應(yīng)的頻率值來實(shí)現(xiàn)FSK,也可以實(shí)現(xiàn)二項(xiàng)的FSK;
  626. **            通過設(shè)置定時(shí)器中斷控制PS0,PS1管腳的電平就可以將二進(jìn)制的編碼轉(zhuǎn)化為FSK信號輸出
  627. ** 入口參數(shù) :float f1:頻率1
  628. **               float f2:頻率2
  629. **               float f3:頻率3
  630. **               float f4:頻率4
  631. ** 隱含控制                           PS0: 0   1        0         1
  632. 管腳參數(shù):                                 PS1: 0   0        1         1
  633. ** 對應(yīng)控制 RAM段:                 0   1        2         3
  634. ** 出口參數(shù) :無
  635. *********************************************************************************************************/
  636. void DirectSwitchFSK(double f1,double f2,double f3,double f4)   
  637. {
  638.         u32 FTW_Vau;
  639.         AD9954_CS = 0;

  640.         AD9954_SENDBYTE(0x00);//地址0寫操作   
  641.         AD9954_SENDBYTE(0x00);//打開RAM控制位驅(qū)動FTW   
  642.         AD9954_SENDBYTE(0x00);   
  643.         AD9954_SENDBYTE(0x00);   
  644.         AD9954_SENDBYTE(0x40);   

  645.         AD9954_SENDBYTE(0x01);//地址1寫操作   
  646.         AD9954_SENDBYTE(0x00);//   
  647.         AD9954_SENDBYTE(0x00);   
  648.         AD9954_SENDBYTE(0xA4);//8倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M   
  649.         PS0=0;   
  650.         PS1=0;   
  651.         AD9954_SENDBYTE(0x07);   
  652.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010   
  653.         AD9954_SENDBYTE(0x00);   
  654.         AD9954_SENDBYTE(0x00);//final address:0x000   
  655.         AD9954_SENDBYTE(0x00);//start address:0x000;   
  656.         AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位沒有激活   
  657.         UPDATE();   
  658.         FTW_Vau=Get_FTW(f1);
  659.         AD9954_SENDBYTE(0x0b);
  660.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  661.         AD9954_SENDBYTE(FTW_Vau>>16);
  662.         AD9954_SENDBYTE(FTW_Vau>>8);
  663.         AD9954_SENDBYTE(FTW_Vau);

  664.         PS0=1;//ram1   
  665.         PS1=0;   

  666.         AD9954_SENDBYTE(0x08);   
  667.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010   
  668.         AD9954_SENDBYTE(0x00);   
  669.         AD9954_SENDBYTE(0x01);//final address:0x0001   
  670.         AD9954_SENDBYTE(0x04);//start address:0x0001   
  671.         AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位沒有激活   
  672.         UPDATE();
  673.         FTW_Vau=Get_FTW(f2);   
  674.         AD9954_SENDBYTE(0x0b);   
  675.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  676.         AD9954_SENDBYTE(FTW_Vau>>16);
  677.         AD9954_SENDBYTE(FTW_Vau>>8);
  678.         AD9954_SENDBYTE(FTW_Vau);  

  679.         PS0=0;//ram2   
  680.         PS1=1;   

  681.         AD9954_SENDBYTE(0x09);   
  682.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010   
  683.         AD9954_SENDBYTE(0x00);   
  684.         AD9954_SENDBYTE(0x02);//final address:0x0002   
  685.         AD9954_SENDBYTE(0x08);//start address:0x0002   
  686.         AD9954_SENDBYTE(0x00);   
  687.         UPDATE();   
  688.         FTW_Vau=Get_FTW(f3);   
  689.         AD9954_SENDBYTE(0x0b);   
  690.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  691.         AD9954_SENDBYTE(FTW_Vau>>16);
  692.         AD9954_SENDBYTE(FTW_Vau>>8);
  693.         AD9954_SENDBYTE(FTW_Vau);
  694.         PS0=1;//ram3   
  695.         PS1=1;   
  696.         AD9954_SENDBYTE(0x0a);   
  697.         AD9954_SENDBYTE(0x01);//ramp rate=0x0010   
  698.         AD9954_SENDBYTE(0x00);   
  699.         AD9954_SENDBYTE(0x03);//final address:0x0003   
  700.         AD9954_SENDBYTE(0x0c);//start address:0x0003   
  701.         AD9954_SENDBYTE(0x00);     
  702.         UPDATE();   
  703.         FTW_Vau=Get_FTW(f4);   
  704.         AD9954_SENDBYTE(0x0b);   
  705.         AD9954_SENDBYTE(FTW_Vau>>24);  //頻率步進(jìn)
  706.         AD9954_SENDBYTE(FTW_Vau>>16);
  707.         AD9954_SENDBYTE(FTW_Vau>>8);
  708.         AD9954_SENDBYTE(FTW_Vau);

  709.         AD9954_SENDBYTE(0x00);//地址0寫操作   
  710.         AD9954_SENDBYTE(0x80);//打開RAM控制位驅(qū)動FTW   
  711.         AD9954_SENDBYTE(0x00);   
  712.         AD9954_SENDBYTE(0x00);   
  713.         AD9954_SENDBYTE(0x40);   
  714.         AD9954_CS = 1;
  715.         UPDATE();
  716. }   
  717. /*********************************************************************************************************
  718. ** 函數(shù)名稱 :void LINEARSWEEP(float f1,float f2)
  719. ** 函數(shù)功能 :線性掃面輸出模式
  720. ** 函數(shù)說明 :使頻率按預(yù)置的模式線性掃描上去,詳細(xì)參見官方PDF
  721. ** 入口參數(shù) :float f1:起始頻率
  722. **                           float f2:終止頻率
  723. ** 出口參數(shù) :無
  724. *********************************************************************************************************/
  725. void LINEARSWEEP(float f1,float f2)//linear sweep mode
  726. {
  727.         u32 date;
  728.         AD9954_SCLK=0;
  729.         AD9954_RET=0;
  730.         IOUPDATE=0;
  731.         PS0=0;
  732.         PS1=0;
  733.         AD9954_CS=0;

  734.         //linear sweep mode
  735.         AD9954_SENDBYTE(0x00);//地址0寫操作
  736.         AD9954_SENDBYTE(0x02);//
  737.         AD9954_SENDBYTE(0x20);
  738.         AD9954_SENDBYTE(0x00);
  739.         AD9954_SENDBYTE(0x40);
  740.         

  741.         AD9954_SENDBYTE(0x01);//地址1寫操作
  742.         AD9954_SENDBYTE(0x00);//
  743.         AD9954_SENDBYTE(0x02);
  744. //        AD9954_SENDBYTE(0x24);//4倍頻,打開VCO控制高位,系統(tǒng)時(shí)鐘倍頻后為400M
  745.         AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04);
  746.         
  747.         date=10.7374*f1;
  748.         AD9954_SENDBYTE(0x04);//FTW0地址
  749.         AD9954_SENDBYTE((u8)(date>>24));//頻率控制字
  750.         AD9954_SENDBYTE((u8)(date>>16));
  751.         AD9954_SENDBYTE((u8)(date>>8));
  752.         AD9954_SENDBYTE((u8)date);
  753.         
  754.         date=10.7374*f2;
  755.         AD9954_SENDBYTE(0x06);//FTW1地址
  756.         AD9954_SENDBYTE((u8)(date>>24));//頻率控制字
  757.         AD9954_SENDBYTE((u8)(date>>16));
  758.         AD9954_SENDBYTE((u8)(date>>8));
  759.         AD9954_SENDBYTE((u8)date);
  760.         
  761.         AD9954_SENDBYTE(0x07);//NLSCW
  762.         AD9954_SENDBYTE(0x01);
  763.         AD9954_SENDBYTE(0x00);
  764.         AD9954_SENDBYTE(0x00);
  765.         AD9954_SENDBYTE(0x1b);
  766.         AD9954_SENDBYTE(0xf4);
  767.         
  768.         AD9954_SENDBYTE(0x08);//PLSCW
  769.         AD9954_SENDBYTE(0x01);
  770.         AD9954_SENDBYTE(0x00);
  771.         AD9954_SENDBYTE(0x01);
  772.         AD9954_SENDBYTE(0xa3);
  773.         AD9954_SENDBYTE(0x6f);
  774.         
  775.         AD9954_CS=1;
  776.         UPDATE();
  777. }
復(fù)制代碼

所有資料51hei提供下載:
AD9954.7z (224.66 KB, 下載次數(shù): 64)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:608110 發(fā)表于 2020-4-23 10:26 | 顯示全部樓層
感謝分享。!1
回復(fù)

使用道具 舉報(bào)

ID:910216 發(fā)表于 2021-5-1 12:58 來自手機(jī) | 顯示全部樓層
樓主,我試了一下發(fā)現(xiàn)輸出不是正弦波,請問是什么原因
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表