找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4046|回复: 3
收起左侧

STM32F103ZET6驱动AD9954源程序

[复制链接]
ID:595801 发表于 2019-8-5 20:31 | 显示全部楼层 |阅读模式
可以用,ZET6的

单片机源程序如下:
  1. /**********************************************************
  2.                                                                                  
  3. 功能:stm32f103rct6控制,20MHz时钟, AD9954正弦波点频输出,范围0-130M(可编辑0-200M),
  4.                         扫频默认正弦波 。
  5.                         显示:12864cog
  6. 接口:控制接口请参照AD9954.h  按键接口请参照key.h

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

  11. //系统频率fosc(外部晶振频率),系统频率=fosc*M
  12. #define fosc  20                        //晶振频率
  13. #define PLL_MULTIPLIER  20             //PLL倍频数(4--20)
  14. #define fs  (fosc*PLL_MULTIPLIER)       //系统时钟频率

  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. ** 函数名称 :void GPIO_AD9954_Init(void)
  21. ** 函数功能 :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端口时钟
  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);                                         //根据设定参数初始化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);                                         //根据设定参数初始化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);                                         //根据设定参数初始化GPIOB.5        
  54.         
  55.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                             //LED1-->PE.5 端口配置, 推挽输出
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  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. ** 函数名称 :void AD9954_RESET(void)
  65. ** 函数功能 :复位AD9954
  66. ** 函数说明 :不复位也可以
  67. ** 入口参数 :无
  68. ** 出口参数 :无
  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. ** 函数名称 :void AD9954_SENDBYTE(u8 dat)
  86. ** 函数功能 :往AD9954发送一个字节的内容
  87. ** 函数说明 :AD9954的传输速度最大为25M,所以不加延时也可以
  88. ** 入口参数 :待发送字节
  89. ** 出口参数 :无
  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. ** 函数名称 :void UPDATE(void)
  123. ** 函数功能 :产生一个更新信号,更新AD9954内部寄存器,
  124. ** 函数说明 :可以不加任何延时
  125. ** 入口参数 :无
  126. ** 出口参数 :无
  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. ** 函数名称 :void AD9954_Init(void))
  138. ** 函数功能 :初始化AD9954的管脚和最简单的内部寄存器的配置,
  139. ** 函数说明 :默认关掉比较器的电源,因板上的晶振为100MHz,最大采用了4倍频,为400M
  140. ** 入口参数 :无
  141. ** 出口参数 :无
  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 "系统频率超过芯片最大值"
  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控制高位,系统时钟倍频后为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. ** 函数名称 :void AD9954_SETFRE(float f)
  207. ** 函数功能 :设置AD9954当前的频率输出,采用的是单一频率输出
  208. ** 函数说明 :因为采用的浮点数进行计算,转换过程中会出现误差,通过调整可以精确到0.1Hz以内
  209. ** 入口参数 :欲设置的频率值
  210. ** 出口参数 :无
  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控制位驱动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控制高位,系统时钟倍频后为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控制位驱动FTW
  314.         AD9954_SENDBYTE(0x00);
  315.         AD9954_SENDBYTE(0x00);
  316.         AD9954_SENDBYTE(0x40);
  317.         AD9954_CS = 1;
  318.         UPDATE();
  319. }
  320. /*********************************************************************************************************
  321. ** 函数名称 :void Generate_PSK(float f,u16 *phase)
  322. ** 函数功能 :PSK调制信号输出
  323. ** 函数说明 :通过RAM端来控制信号的相位,从而实现PSK信号的调制
  324. **            这里使用一个RAM段的循环模式,PSK信号为8为数据位。
  325. **            RAM的更新速度由ram rate定时寄存器控制,寄存器为16位,实现对系统提供的100M时钟1~65535分频,写0是无效的
  326. **                          当跟输出PSK载波的频率是ram rate跟新频率的整数倍时,才能保证每次的相位改变一致
  327. ** 入口参数 :float f   :PSK载波的频率
  328. **                           u16 *phase: 写入相位累加器的相位值,180实现对相位翻转,0不改变相位,PSK信号为8位,需为8位的数组
  329. ** 出口参数 :无
  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控制位驱动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控制高位,系统时钟倍频后为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控制位驱动FTW
  374.         AD9954_SENDBYTE(0x00);
  375.         AD9954_SENDBYTE(0x00);
  376.         AD9954_SENDBYTE(0x40);
  377.         AD9954_CS = 1;
  378.         UPDATE();
  379. }
  380. /*********************************************************************************************************
  381. ** 函数名称 :void Generate_FM(u32 *fre)
  382. ** 函数功能 :FM调制信号输出
  383. ** 函数说明 :通过RAM端来控制信号的频率,从而实现FM信号的调制
  384. **            这里使用一个RAM段的循环模式,PSK信号为8为数据位。
  385. **            RAM的更新速度由ram rate定时寄存器控制,寄存器为16位,实现对系统提供的100M时钟1~65535分频,写0是无效的
  386. **                          ram rate的跟新速度为调制信号的频率,这里如1KHz,写入ram rate的值为0X0C35,
  387. ** 入口参数 :u32 *fre:FM信号频率值,这里采用的是32点频率采样,调用此函数之前需先设置好频率表的值,其按正弦规律改变
  388. **            for(i=0;i<32;i++)
  389. **                                {
  390. **                                        fre[i]=Fc+Fshift*sin(wt);
  391. **                                }
  392. ** 出口参数 :无
  393. Fc调制前载波的角频率,Fshift
  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控制位驱动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控制高位,系统时钟倍频后为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控制位驱动FTW
  430.         AD9954_SENDBYTE(0x00);
  431.         AD9954_SENDBYTE(0x00);
  432.         AD9954_SENDBYTE(0x40);
  433.         AD9954_CS = 1;
  434.         UPDATE();
  435. }
  436. /*********************************************************************************************************
  437. ** 函数名称 :void ASK_Init(void)
  438. ** 函数功能 :ASK调制信号输出初始化
  439. ** 函数说明 :ASK调制,需要先设置好载波频率,然后改变DAC比例因子 scale factor其为14位,通过设置为最大和0两种值实现ASK信号的调制
  440. **                          调用Write_ASF(u16 factor)来改变幅值
  441. ** 入口参数 :无
  442. ** 出口参数 :无
  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);//当受到UPDATE信号,自动清楚相位累加器                //
  451.                                                   //        AD9954_SENDBYTE(0x00);//不改变任何

  452.         AD9954_SENDBYTE(0x40);

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

  457.         AD9954_CS = 1;
  458.         UPDATE();
  459. }
  460. /*********************************************************************************************************
  461. ** 函数名称 :void AM_Init(void)
  462. ** 函数功能 :AM调制信号输出初始化
  463. ** 函数说明 :AM调制,需要先设置好载波频率,然后改变DAC比例因子 scale factor其为14位,AM的幅度值按正弦规律变换,可以实现AM
  464. **            最高可以采用32点采样
  465. **                          调用Write_ASF(u16 factor)来改变幅值
  466. ** 入口参数 :无
  467. ** 出口参数 :无
  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);//不改变任何
  476.         AD9954_SENDBYTE(0x00);

  477.         AD9954_CS = 1;
  478.         UPDATE();
  479. }
  480. /*********************************************************************************************************
  481. ** 函数名称 :void Write_ASF(u16 factor)
  482. ** 函数功能 :改变scale factor数值,改变DAC输出幅度
  483. ** 函数说明 :写入最大为0X3FFF,最小为0
  484. ** 入口参数 :无
  485. ** 出口参数 :无
  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);//当受到UPDATE信号,自动清楚相位累加器                //
  494. //        //        AD9954_SENDBYTE(0x00);//不改变任何

  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. *  参    数:MinFreq:扫频下限频率,MaxFreq:扫频上限频率
  540. *            UpStepFreq:向上扫频步进,UpStepTime:向上扫频的跳频时间
  541. *            DownStepFreq:向下扫频步进,DownStepTime:向下扫频的跳频时间
  542. *            Mode:扫频模式
  543. *  返 回 值:无 Linear_Sweep(100, 100000000, 100,  250,   100,250, 1);
  544. *  说    明:步进频率单位是100khz
  545. *            Mode=DoubleScan(双边扫频)时,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----下降频率步进和跳频时间
  586.         FTW_Vau = Get_FTW(DownStepFreq);
  587.         AD9954_SENDBYTE(NLSCW);
  588.         AD9954_SENDBYTE(DownStepTime); //跳频时间(DownStepTime个??周期)     
  589.         AD9954_SENDBYTE(FTW_Vau>>24);  //频率步进
  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----上升频率步进和跳频时间
  599.         FTW_Vau = Get_FTW(UpStepFreq);
  600.         AD9954_SENDBYTE(PLSCW);
  601.         AD9954_SENDBYTE(UpStepTime); //跳频时间(0XFF个??周期)
  602.         AD9954_SENDBYTE(FTW_Vau>>24);  //频率步进
  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. *  功    能:设置PS0的状态
  614. *  参    数:BitVal:PS0状态
  615. *  返 回 值:无
  616. *  说    明:PS0可以控制AD9954扫频方向
  617. ******************************************************************/
  618. void PS0_WriteBit(BitAction BitVal)
  619. {
  620.     PS0=BitVal;
  621. }

  622. /*********************************************************************************************************
  623. ** 函数名称 :void DirectSwitchFSK(float f1,float f2,float f3,float f4)
  624. ** 函数功能 :四相FSK信号输出
  625. ** 函数说明 :在四个RAM区各设置了一个频率值,通过改变PS0和PS1的电平选择对应的RAM端输出相应的频率值来实现FSK,也可以实现二项的FSK;
  626. **            通过设置定时器中断控制PS0,PS1管脚的电平就可以将二进制的编码转化为FSK信号输出
  627. ** 入口参数 :float f1:频率1
  628. **               float f2:频率2
  629. **               float f3:频率3
  630. **               float f4:频率4
  631. ** 隐含控制                           PS0: 0   1        0         1
  632. 管脚参数:                                 PS1: 0   0        1         1
  633. ** 对应控制 RAM段:                 0   1        2         3
  634. ** 出口参数 :无
  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控制位驱动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控制高位,系统时钟倍频后为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);  //频率步进
  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);  //频率步进
  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);  //频率步进
  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);  //频率步进
  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控制位驱动FTW   
  711.         AD9954_SENDBYTE(0x00);   
  712.         AD9954_SENDBYTE(0x00);   
  713.         AD9954_SENDBYTE(0x40);   
  714.         AD9954_CS = 1;
  715.         UPDATE();
  716. }   
  717. /*********************************************************************************************************
  718. ** 函数名称 :void LINEARSWEEP(float f1,float f2)
  719. ** 函数功能 :线性扫面输出模式
  720. ** 函数说明 :使频率按预置的模式线性扫描上去,详细参见官方PDF
  721. ** 入口参数 :float f1:起始频率
  722. **                           float f2:终止频率
  723. ** 出口参数 :无
  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控制高位,系统时钟倍频后为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. }
复制代码

所有资料51hei提供下载:
AD9954.7z (224.66 KB, 下载次数: 64)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:608110 发表于 2020-4-23 10:26 | 显示全部楼层
感谢分享!!!1
回复

使用道具 举报

ID:910216 发表于 2021-5-1 12:58 来自手机 | 显示全部楼层
楼主,我试了一下发现输出不是正弦波,请问是什么原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表