找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7252|回复: 5
打印 上一主题 下一主题
收起左侧

DDS AD9958 AD9959原理图STM32程序

  [复制链接]
跳转到指定楼层
楼主
找了好久,终于找到了相关资料,AD9958 AD9959 DDS模块,希望对大家有帮助




单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "stdint.h"
  3. #include "Delay.h"
  4. #include "Timer.h"
  5. #include "InternalFlash.h"
  6. #include "AD9958.h"


  7. /* 晶振频率 */
  8. #define AD9958_CRYSTAL_OSCILLATOR 25000000


  9. AD9958TypeDef Extern_ad9958_data;


  10. int32_t Extern_channel0_frequency_rising_delta = 0;     /* 扫频模式下上升时每次改变的频率量 */
  11. int32_t Extern_channel0_frequency_falling_delta = 0;    /* 扫频模式下下降时每次改变的频率量 */
  12. int32_t Extern_channel0_frequency_start = 0;            /* 扫频模式下起始频率 */
  13. int32_t Extern_channel0_frequency_stop = 0;             /* 扫频模式下上升终止频率 */
  14. int32_t Extern_channel0_frequency_now = 0;               /* 扫频模式下上升实时频率 */

  15. int32_t Extern_channel1_frequency_rising_delta = 0;     /* 扫频模式下上升时每次改变的频率量 */
  16. int32_t Extern_channel1_frequency_falling_delta = 0;    /* 扫频模式下下降时每次改变的频率量 */
  17. int32_t Extern_channel1_frequency_start = 0;            /* 扫频模式下起始频率 */
  18. int32_t Extern_channel1_frequency_stop = 0;             /* 扫频模式下上升终止频率 */
  19. int32_t Extern_channel1_frequency_now = 0;               /* 扫频模式下上升实时频率 */


  20. /*
  21. * Return:      void
  22. * Parameters:  void
  23. * Description: AD9958初始化
  24. */
  25. void ad9958Init(void)
  26. {
  27.     uint32_t data[20] = {0};
  28.     Union32_t temp;
  29.    
  30.     GPIO_InitTypeDef GPIO_InitStructure;

  31.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  32.    
  33.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  34.         
  35.     /* 关闭PB3 JTAG功能 */
  36.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
  37.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  38.                                                                                                                   
  39.     GPIO_InitStructure.GPIO_Pin = AD9958_SDIO_0 | AD9958_SDIO_1 | AD9958_SDIO_2 | AD9958_SDIO_3 \
  40.                                 | AD9958_DIN_P0 | AD9958_DIN_P1 | AD9958_DIN_P2 | AD9958_DIN_P3 \
  41.                                 | AD9958_MASTER_RESET | AD9958_SCLK | AD9958_CS | AD9958_IO_UPDATA | AD9958_CLK_SEL ;
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  45.    
  46.     AD9958_IO_UPDATA_0();
  47.     AD9958_CS_1();
  48.     AD9958_SCLK_1();
  49.     AD9958_MASTER_RESET_0();
  50.     AD9958_CLK_SEL_1();
  51.    
  52.     AD9958_SDIO_0_1();
  53.     AD9958_SDIO_1_1();
  54.     AD9958_SDIO_2_1();
  55.     AD9958_SDIO_3_1();
  56.    
  57.     AD9958_DINP_0_1();
  58.     AD9958_DINP_1_1();
  59.     AD9958_DINP_2_1();
  60.     AD9958_DINP_3_1();
  61.    
  62.     internalFlashRead(0, data, 20);
  63.     if(data[19] != 0x12345678)
  64.     {
  65.         temp.Float_number = Extern_ad9958_data.channel[0].frequency = 7.0f;
  66.         data[0] = temp.Uint32_number;
  67.         temp.Float_number = Extern_ad9958_data.channel[0].phase = 0.0f;
  68.         data[1] = temp.Uint32_number;
  69.         temp.Float_number = Extern_ad9958_data.channel[0].amplitude = 1.0f;
  70.         data[2] = temp.Uint32_number;
  71.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_falling_blanking_time = 10.0f;
  72.         data[3] = temp.Uint32_number;
  73.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_rising_blanking_time = 10.0f;
  74.         data[4] = temp.Uint32_number;
  75.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_falling_delta = 1.0f;
  76.         data[5] = temp.Uint32_number;
  77.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_rising_delta = 20.0f;
  78.         data[6] = temp.Uint32_number;
  79.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_start = 0.0f;
  80.         data[7] = temp.Uint32_number;
  81.         temp.Float_number = Extern_ad9958_data.channel[0].frequency_stop = 1000000.0f;
  82.         data[8] = temp.Uint32_number;
  83.         
  84.         temp.Float_number = Extern_ad9958_data.channel[1].frequency = 1.0f;
  85.         data[10] = temp.Uint32_number;
  86.         temp.Float_number = Extern_ad9958_data.channel[1].phase = 90.0f;
  87.         data[11] = temp.Uint32_number;
  88.         temp.Float_number = Extern_ad9958_data.channel[1].amplitude = 1.0f;
  89.         data[12] = temp.Uint32_number;
  90.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_falling_blanking_time = 1000.0f;
  91.         data[13] = temp.Uint32_number;
  92.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_rising_blanking_time = 1000.0f;
  93.         data[14] = temp.Uint32_number;
  94.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_falling_delta = 10.0f;
  95.         data[15] = temp.Uint32_number;
  96.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_rising_delta = 10.0f;
  97.         data[16] = temp.Uint32_number;
  98.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_start = 50.0f;
  99.         data[17] = temp.Uint32_number;
  100.         temp.Float_number = Extern_ad9958_data.channel[1].frequency_stop = 1000.0f;
  101.         data[18] = temp.Uint32_number;
  102.         
  103.         data[19] = 0x12345678;
  104.         
  105.         internalFlashWrite(0, data, 20);
  106.     }
  107.     else
  108.     {
  109.         temp.Uint32_number = data[0];
  110.         Extern_ad9958_data.channel[0].frequency = temp.Float_number;
  111.         temp.Uint32_number = data[1];
  112.         Extern_ad9958_data.channel[0].phase = temp.Float_number;
  113.         temp.Uint32_number = data[2];
  114.         Extern_ad9958_data.channel[0].amplitude = temp.Float_number;
  115.         temp.Uint32_number = data[3];
  116.         Extern_ad9958_data.channel[0].frequency_falling_blanking_time = temp.Float_number;
  117.         temp.Uint32_number = data[4];
  118.         Extern_ad9958_data.channel[0].frequency_rising_blanking_time = temp.Float_number;
  119.         temp.Uint32_number = data[5];
  120.         Extern_ad9958_data.channel[0].frequency_falling_delta = temp.Float_number;
  121.         temp.Uint32_number = data[6];
  122.         Extern_ad9958_data.channel[0].frequency_rising_delta = temp.Float_number;
  123.         temp.Uint32_number = data[7];
  124.         Extern_ad9958_data.channel[0].frequency_start = temp.Float_number;
  125.         temp.Uint32_number = data[8];
  126.         Extern_ad9958_data.channel[0].frequency_stop = temp.Float_number;
  127.         
  128.         temp.Uint32_number = data[10];
  129.         Extern_ad9958_data.channel[1].frequency = temp.Float_number;
  130.         temp.Uint32_number = data[11];
  131.         Extern_ad9958_data.channel[1].phase = temp.Float_number;
  132.         temp.Uint32_number = data[12];
  133.         Extern_ad9958_data.channel[1].amplitude = temp.Float_number;
  134.         temp.Uint32_number = data[13];
  135.         Extern_ad9958_data.channel[1].frequency_falling_blanking_time = temp.Float_number;
  136.         temp.Uint32_number = data[14];
  137.         Extern_ad9958_data.channel[1].frequency_rising_blanking_time = temp.Float_number;
  138.         temp.Uint32_number = data[15];
  139.         Extern_ad9958_data.channel[1].frequency_falling_delta = temp.Float_number;
  140.         temp.Uint32_number = data[16];
  141.         Extern_ad9958_data.channel[1].frequency_rising_delta = temp.Float_number;
  142.         temp.Uint32_number = data[17];
  143.         Extern_ad9958_data.channel[1].frequency_start = temp.Float_number;
  144.         temp.Uint32_number = data[18];
  145.         Extern_ad9958_data.channel[1].frequency_stop = temp.Float_number;
  146.     }
  147.    
  148.     /* 开机后必须对AD9958进行复位 */
  149.     AD9958_RESET();

  150.     /* 设置20倍频 */
  151.     ad9958SetPLLDividerRatio(20);
  152.    

  153.     /* 选择通道0 */
  154.     ad9958ChoiceChannel(AD9958_CHANNEL_0);
  155.    
  156.     /* 设置频率1000 Hz */
  157.     ad9958SetFrequency(Extern_ad9958_data.channel[0].frequency);
  158.    
  159.     /* 设置相位90度 */
  160.     ad9958SetPhase(Extern_ad9958_data.channel[0].phase);
  161.    
  162.     /* 设置衰减系数1.0 */
  163.     ad9958SetAmplitude(Extern_ad9958_data.channel[0].amplitude);


  164.     /* 选择通道1 */
  165.     ad9958ChoiceChannel(AD9958_CHANNEL_1);
  166.    
  167.     /* 设置频率1000 Hz */
  168.     ad9958SetFrequency(Extern_ad9958_data.channel[1].frequency);
  169.    
  170.     /* 设置相位90度 */
  171.     ad9958SetPhase(Extern_ad9958_data.channel[1].phase);
  172.    
  173.     /* 设置衰减系数1.0 */
  174.     ad9958SetAmplitude(Extern_ad9958_data.channel[1].amplitude);
  175. }

  176. /*
  177. * Return:      void
  178. * Parameters:  Data: 要写入的字节
  179. * Description: 向AD9958写入一个字节
  180. */
  181. void ad9958WriteByte(uint8_t Data)
  182. {
  183.     uint8_t mask;
  184.    
  185.     for(mask=0x80; mask; mask>>=1)
  186.     {
  187.         AD9958_SCLK_0();
  188.         
  189.         if(Data & mask)
  190.             AD9958_SDIO_0_1();
  191.         else
  192.             AD9958_SDIO_0_0();

  193.         AD9958_SCLK_1();
  194.     }
  195.     AD9958_SDIO_0_1();
  196. }

  197. /*
  198. * Return:      当前读取到的一个字节
  199. * Parameters:  void
  200. * Description: 从AD9958读取一个字节
  201. */
  202. uint8_t ad9958ReadByte(void)
  203. {
  204.     uint8_t mask, data = 0;
  205.    
  206.     AD9958_SDIO_0_1();
  207.     for(mask=0x80; mask; mask>>=1)
  208.     {
  209.         AD9958_SCLK_0();
  210.         
  211.         if(AD9958_SDIO_0_VALUE())
  212.             data |= mask;

  213.         AD9958_SCLK_1();
  214.     }
  215.    
  216.     return data;
  217. }

  218. /*
  219. * Return:      0: 成功; 1: 失败
  220. * Parameters:  Reg: 寄存器地址; Data: 缓存指针; Length: 长度
  221. * Description: 向AD9958写入一组数据
  222. */
  223. uint8_t ad9958WriteDatas(uint8_t Reg, uint8_t * Data, uint16_t Length)
  224. {
  225.     uint16_t i = 0;
  226.    
  227.     AD9958_SDIO_3_0();
  228.     AD9958_CS_0();
  229.    
  230.     ad9958WriteByte(Reg);
  231.    
  232.     for(i=0; i<Length; ++i)
  233.     {
  234.         ad9958WriteByte(Data[i]);
  235.     }
  236.    
  237.     AD9958_CS_1();
  238.     AD9958_SDIO_3_1();
  239.    
  240.     /* 控制AD9958数据更新 */
  241.         AD9958_UPDATA();
  242.    
  243.     return 0;
  244. }

  245. /*
  246. * Return:      0: 成功; 1: 失败
  247. * Parameters:  Reg: 寄存器地址; Data: 缓存指针; Length: 长度
  248. * Description: 向AD9958读取一组数据
  249. */
  250. uint8_t ad9958ReadDatas(uint8_t Reg, uint8_t * Data, uint16_t Length)
  251. {
  252.     uint16_t i = 0;
  253.    
  254.     AD9958_SDIO_3_0();
  255.     AD9958_CS_0();
  256.    
  257.     ad9958WriteByte(Reg | 0x80);
  258.    
  259.     for(i=0; i<Length; ++i)
  260.     {
  261.         Data[i] = ad9958ReadByte();
  262.     }
  263.    
  264.     AD9958_CS_1();
  265.     AD9958_SDIO_3_1();
  266.    
  267.     return 0;
  268. }

  269. /*
  270. * Return:      void
  271. * Parameters:  Channel: 通道序号; Mode: 扫频模式(0:关闭扫频、 1:MCU模拟扫频、 2:AD9958硬件扫频)
  272. * Description: 设置AD9958扫频模式
  273. */
  274. void ad9958FrequencyLinearSweepOpen(AD9958ChannelOrder_TypeDef Channel, uint8_t Mode)
  275. {
  276.     float time = 0.0f;
  277.    
  278.     if(Mode == 1)
  279.     {
  280.         /* 设置上升扫描频率步进 */
  281.         Extern_channel0_frequency_rising_delta = Extern_ad9958_data.channel[0].frequency_rising_delta;
  282.         
  283.         /* 设置下降扫描频率步进 */
  284.         Extern_channel0_frequency_falling_delta = Extern_ad9958_data.channel[0].frequency_falling_delta;
  285.         
  286.         /* 设置扫描开始频率 */
  287.         Extern_channel0_frequency_start = Extern_ad9958_data.channel[0].frequency_start;
  288.         
  289.         /* 设置扫描开始频率 */
  290.         Extern_channel0_frequency_now = Extern_ad9958_data.channel[0].frequency_start;
  291.         
  292.         /* 设置扫描最大终止频率 */
  293.         Extern_channel0_frequency_stop = Extern_ad9958_data.channel[0].frequency_stop;
  294.         
  295.         
  296.         /* 设置上升扫描频率步进 */
  297.         Extern_channel1_frequency_rising_delta = Extern_ad9958_data.channel[1].frequency_rising_delta;
  298.         
  299.         /* 设置下降扫描频率步进 */
  300.         Extern_channel1_frequency_falling_delta = Extern_ad9958_data.channel[1].frequency_falling_delta;
  301.         
  302.         /* 设置扫描开始频率 */
  303.         Extern_channel1_frequency_start = Extern_ad9958_data.channel[1].frequency_start;
  304.         
  305.         /* 设置扫描开始频率 */
  306.         Extern_channel1_frequency_now = Extern_ad9958_data.channel[1].frequency_start;
  307.         
  308.         /* 设置扫描最大终止频率 */
  309.         Extern_channel1_frequency_stop = Extern_ad9958_data.channel[1].frequency_stop;
  310.         
  311.         /* 关闭AD9958硬件扫频 */
  312.         TIM2->DIER &= (uint16_t)~TIM_IT_Update;
  313.         
  314.         /* 开启MCU模拟扫频 */
  315.         if(Channel & AD9958_CHANNEL_0)
  316.         {
  317.             timerSetTime(TIM3, Extern_ad9958_data.channel[0].frequency_rising_blanking_time);
  318.             
  319.             TIM3->DIER |= TIM_IT_Update;
  320.         }
  321.         if(Channel & AD9958_CHANNEL_1)
  322.         {
  323.             timerSetTime(TIM4, Extern_ad9958_data.channel[1].frequency_rising_blanking_time);
  324.             
  325.             TIM4->DIER |= TIM_IT_Update;
  326.         }
  327.     }
  328.     else if(Mode == 2)
  329.     {
  330.         ad9958ChoiceChannel(Channel);
  331.         
  332.         /* 设置上升与下降扫频时间间隔 */
  333.         ad9958SetBlankingTimeNs(Extern_ad9958_data.channel[0].frequency_rising_blanking_time, Extern_ad9958_data.channel[0].frequency_falling_blanking_time);
  334.         
  335.         /* 设置上升扫频频率步进 */
  336.         ad9958SetFrequencyRisingLSR(Extern_ad9958_data.channel[0].frequency_rising_delta);
  337.         
  338.         /* 设置下降扫频频率步进 */
  339.         ad9958SetFrequencyFallingLSR(Extern_ad9958_data.channel[0].frequency_falling_delta);
  340.         
  341.         /* 设置扫频开始频率 */
  342.         ad9958SetFrequency(Extern_ad9958_data.channel[0].frequency_start);
  343.         
  344.         /* 设置扫频最大终止频率 */
  345.         ad9958SetChannelWord(Extern_ad9958_data.channel[0].frequency_stop, AD9958_FREQUENCY, 1);
  346.         
  347.         /* 设置数字调制阶数 */
  348.         ad9958ModulationLevelSelection(TWO_LEVEL_MODULATION);

  349.         /* 设置硬件扫频模式与设置扫描位 */
  350.         ad9958ModulationTypeConfiguration(AD9958_FREQUENCY, LINEAR_OPEN);
  351.         
  352.         time = Extern_ad9958_data.channel[0].frequency_stop * Extern_ad9958_data.channel[0].frequency_rising_blanking_time / Extern_ad9958_data.channel[0].frequency_rising_delta * 0.001;
  353.         time += Extern_ad9958_data.channel[0].frequency_stop * Extern_ad9958_data.channel[0].frequency_falling_blanking_time / Extern_ad9958_data.channel[0].frequency_falling_delta * 0.001;
  354.         
  355.         /* 设置扫频上升与下降的切换时间 */
  356.         timerSetTime(TIM2, time);
  357.         
  358.         /* 关闭MCU模拟扫频 */
  359.         if(Channel & AD9958_CHANNEL_0)
  360.             TIM3->DIER &= (uint16_t)~TIM_IT_Update;
  361.         if(Channel & AD9958_CHANNEL_1)
  362.             TIM4->DIER &= (uint16_t)~TIM_IT_Update;
  363.         
  364.         /* 开启AD9958硬件扫频 */
  365.         TIM2->DIER |= TIM_IT_Update;
  366.     }
  367.     else
  368.     {
  369.         /* 关闭AD9958硬件扫频 */
  370.         TIM2->DIER &= (uint16_t)~TIM_IT_Update;
  371.         
  372.         /* 关闭MCU模拟扫频 */
  373.         TIM3->DIER &= (uint16_t)~TIM_IT_Update;
  374.         TIM4->DIER &= (uint16_t)~TIM_IT_Update;
  375.     }
  376. }

  377. /*
  378. * Return:      void
  379. * Parameters:  Channel: 通道序号(AD9958_CHANNEL_0、 AD9958_CHANNEL_1、 AD9958_CHANNEL_0_AND_1)
  380. * Description: 选择当前要操作的通道
  381. */
  382. void ad9958ChoiceChannel(AD9958ChannelOrder_TypeDef Channel)
  383. {
  384.     uint8_t data[1] = {0};
  385.    
  386.     data[0] = Channel & 0xF0;
  387.    
  388.     ad9958WriteDatas(0x00, data, 1);
  389. }

  390. /*
  391. * Return:      void
  392. * Parameters:  Data: 倍频系数(0 ~~~ 63)
  393. * Description: 设置主频的倍频系数
  394. */
  395. void ad9958SetPLLDividerRatio(uint8_t Data)
  396. {
  397.     uint8_t data[3] = {0, 0, 0};
  398.    
  399.     Data %= 64;
  400.    
  401.     /* 设置主频倍频系数 */
  402.     Extern_ad9958_data.pll_divider_ratio = Data;
  403.    
  404.     /* 计算系统频率 */
  405.     Extern_ad9958_data.system_clock = Extern_ad9958_data.pll_divider_ratio * AD9958_CRYSTAL_OSCILLATOR;
  406.    
  407.     /* 计算主频因子 */
  408.     Extern_ad9958_data._2_32_divide_system_clock_and_pll_divider_ratio = 4294967296.0 / Extern_ad9958_data.system_clock;
  409.    
  410.     data[0] = ((uint8_t)Extern_ad9958_data.pll_divider_ratio << 2) | 0x80;
  411.     data[1] = 0x51;
  412.    
  413.     ad9958WriteDatas(0x01, data, 3);
  414. }

  415. /*
  416. * Return:      void
  417. * Parameters:  Frequency: 频率值(0.116416 ~~~ 200000000.0)
  418. * Description: 设置要输出的频率
  419. */
  420. void ad9958SetFrequency(float Frequency)
  421. {
  422.     uint32_t frequency_tuning_word;
  423.     uint8_t data[4] = {0, 0, 0, 0};
  424.    
  425.     /* frequency_tuning_word = Frequency * 2^32 / (SystemClock * PLLDividerRatio) */
  426.     frequency_tuning_word = Frequency * Extern_ad9958_data._2_32_divide_system_clock_and_pll_divider_ratio;
  427.    
  428.     data[0] = frequency_tuning_word >> 24;
  429.     data[1] = frequency_tuning_word >> 16;
  430.     data[2] = frequency_tuning_word >> 8;
  431.     data[3] = frequency_tuning_word >> 0;
  432.    
  433.     ad9958WriteDatas(0x04, data, 4);
  434. }

  435. /*
  436. * Return:      void
  437. * Parameters:  Phase: 相位值(0.0 ~~~ 360.0)
  438. * Description: 设置要输出的相位
  439. */
  440. void ad9958SetPhase(float Phase)
  441. {
  442.     uint16_t phase_offset_word;
  443.     uint8_t data[2] = {0, 0};
  444.    
  445.     /* phase_offset_word = Phase * 2^14 / 360 */
  446.     phase_offset_word = Phase / 360.0f * 16384.0f;
  447.    
  448.     phase_offset_word &= 0x3FFF;
  449.    
  450.     data[0] = phase_offset_word >> 8;
  451.     data[1] = phase_offset_word >> 0;
  452.    
  453.     ad9958WriteDatas(0x05, data, 2);
  454. }

  455. /*
  456. * Return:      void
  457. * Parameters:  Amplitude: 幅度衰减系数(0.0 ~~~ 1.0)
  458. * Description: 设置幅度衰减系数
  459. */
  460. void ad9958SetAmplitude(float Amplitude)
  461. {
  462.     uint16_t amplitude_scale_factor;
  463.     uint8_t data[3] = {0, 0, 0};
  464.    
  465.     /* amplitude_scale_factor = Amplitude * 2^10 */
  466.     amplitude_scale_factor = Amplitude * 1023.0f;
  467.    
  468.     amplitude_scale_factor &= 0x0003FF;
  469.    
  470.     data[1] = (amplitude_scale_factor >> 8) | 0x10;
  471.     data[2] = amplitude_scale_factor >> 0;

  472.     ad9958WriteDatas(0x06, data, 3);
  473. }

  474. /*
  475. * Return:      void
  476. * Parameters:  Level: 进制选择(0 ~ 3)
  477. * Description: 设置调制进制(2, 4, 8, 16)
  478. */
  479. void ad9958ModulationLevelSelection(ModulationLevel_TypeDef Level)
  480. {
  481.     uint8_t data[3] = {0, 0, 0};
  482.    
  483.     Level &= 0x03;
  484.    
  485.     data[0] = ((uint8_t)Extern_ad9958_data.pll_divider_ratio << 2) | 0x80;
  486.     data[1] = 0x50 | Level;
  487.    
  488.     ad9958WriteDatas(0x01, data, 3);
  489. }

  490. /*
  491. * Return:      void
  492. * Parameters:  Mode: 调制模式(AD9958_AMPLITUDE, AD9958_FREQUENCY, AD9958_PHASE)
  493. * Description: 设置调制模式
  494. */
  495. void ad9958ModulationTypeConfiguration(ModulationConfiguration_TypeDef Mode, AD9958LinearSweepState_TypeDef NewState)
  496. {
  497.     uint8_t data[4] = {0, 0, 0};
  498.    
  499.     NewState &= 0x01;
  500.    
  501.     data[0] = Mode << 6;
  502.     data[1] = 0x03 | (NewState << 6);
  503.     data[2] = 0x00;
  504.     ad9958WriteDatas(0x03, data, 3);
  505. }

  506. /*
  507. * Return:      void
  508. * Parameters:  Rising: 上升时间隔时间(纳秒); Falling: 下降时间隔时间(纳秒)
  509. * Description: 设置扫描间隔时间
  510. */
  511. void ad9958SetBlankingTimeNs(float Rising, float Falling)
  512. {
  513.     uint8_t data[2] = {0, 0};
  514.    
  515.     Falling *= (Extern_ad9958_data.system_clock / 4000000000.0f);
  516.     Rising *= (Extern_ad9958_data.system_clock / 4000000000.0f);
  517.    
  518.     if(Falling < 1)
  519.         Falling = 1;
  520.     else if(Falling > 255)
  521.         Falling = 255;
  522.    
  523.     if(Rising < 1)
  524.         Rising = 1;
  525.     else if(Rising > 255)
  526.         Rising = 255;
  527.    
  528.     data[0] = Falling;
  529.     data[1] = Rising;
  530.     ad9958WriteDatas(0x07, data, 2);
  531. }

  532. /*
  533. * Return:      void
  534. * Parameters:  Frequency: 频率值(0.116416 ~~~ 200000000.0)
  535. * Description: 设置上升扫描每次增加的频率
  536. */
  537. void ad9958SetFrequencyRisingLSR(float Frequency)
  538. {
  539.     uint32_t frequency_tuning_word;
  540.     uint8_t data[4] = {0, 0, 0, 0};
  541.    
  542.     /* frequency_tuning_word = Frequency * 2^32 / (SystemClock * PLLDividerRatio) */
  543.     frequency_tuning_word = Frequency * Extern_ad9958_data._2_32_divide_system_clock_and_pll_divider_ratio;
  544.    
  545.     data[0] = frequency_tuning_word >> 24;
  546.     data[1] = frequency_tuning_word >> 16;
  547.     data[2] = frequency_tuning_word >> 8;
  548.     data[3] = frequency_tuning_word >> 0;
  549.    
  550.     ad9958WriteDatas(0x08, data, 4);
  551. }

  552. /*
  553. * Return:      void
  554. * Parameters:  Frequency: 频率值(0.116416 ~~~ 200000000.0)
  555. * Description: 设置下降扫描每次减少的频率
  556. */
  557. void ad9958SetFrequencyFallingLSR(float Frequency)
  558. {
  559.     uint32_t frequency_tuning_word;
  560.     uint8_t data[4] = {0, 0, 0, 0};
  561.    
  562.     /* frequency_tuning_word = Frequency * 2^32 / (SystemClock * PLLDividerRatio) */
  563.     frequency_tuning_word = Frequency * Extern_ad9958_data._2_32_divide_system_clock_and_pll_divider_ratio;
  564.    
  565.     data[0] = frequency_tuning_word >> 24;
  566.     data[1] = frequency_tuning_word >> 16;
  567.     data[2] = frequency_tuning_word >> 8;
  568.     data[3] = frequency_tuning_word >> 0;
  569.    
  570.     ad9958WriteDatas(0x09, data, 4);
  571. }

  572. /*
  573. * Return:      void
  574. * Parameters:  Data: 数据; Mode: 调制模式; Channel: 备用通寄存器
  575. * Description: 设置扫描终止频率
  576. */
  577. void ad9958SetChannelWord(float Data, ModulationConfiguration_TypeDef Mode, uint8_t CW_number)
  578. {
  579.     uint32_t word = 0;
  580.     uint8_t data[4] = {0, 0, 0, 0};
  581.    
  582.     switch(Mode)
  583.     {
  584.         /* amplitude_scale_factor = Amplitude * 2^10 */
  585.         case AD9958_AMPLITUDE: word = (uint32_t)(Data * 1023.0f) << 22; break;
  586.         
  587.         /* frequency_tuning_word = Frequency * 2^32 / (SystemClock * PLLDividerRatio) */
  588.         case AD9958_FREQUENCY: word = Data * Extern_ad9958_data._2_32_divide_system_clock_and_pll_divider_ratio; break;
  589.         
  590.         /* phase_offset_word = Phase * 2^14 / 360 */
  591.         case AD9958_PHASE: word = (uint32_t)(Data / 360.0f * 16384.0f) << 18; break;
  592.         
  593.         default: break;
  594.     }
  595.    
  596.     data[0] = word >> 24;
  597.     data[1] = word >> 16;
  598.     data[2] = word >> 8;
  599.     data[3] = word >> 0;
  600.    
  601.     ad9958WriteDatas(0x09 + CW_number, data, 4);
  602. }
复制代码

附件里面是AD9958 AD9959的STM32代码:
dds.7z (3.96 MB, 下载次数: 307)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:709207 发表于 2020-3-16 11:09 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:743654 发表于 2021-3-9 09:33 | 只看该作者
楼主有AD9959中文版的数据手册吗?
回复

使用道具 举报

地板
ID:710074 发表于 2021-7-29 22:16 | 只看该作者
谢谢楼主的分享,找好久了,发现论坛有资料 美滋滋
回复

使用道具 举报

5#
ID:146782 发表于 2021-7-30 08:50 | 只看该作者
谢谢分享!太有用了
回复

使用道具 举报

6#
ID:842343 发表于 2021-9-25 15:45 | 只看该作者
楼主能分享一下AD9958的原理图吗?网页上只有9959的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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