查看: 2251|回复: 0

[LPC双核挑战赛] 【2018 LPC54114双核挑战赛】驱动DDS AD9833

[复制链接]

该用户从未签到

6

主题

34

帖子

2

注册会员

Rank: 2

积分
142
最后登录
2022-1-3
发表于 2018-5-27 15:04:19 | 显示全部楼层 |阅读模式


项目需要用到DDS芯片产生可调频的高精度正弦信号,

ad9833驱动比较简单,只需要3个IO即可,片选、数据、时钟,这里我使用PIO0_11作为时钟,PIO0_12作为数据、PIO0_14作为片选。采用模拟SPI方式。

  1. #include "app_ad9833.h"

  2. #include "app_ioctl.h"

  3. #define AD9833_SYSTEM_CLOCK 25000000UL

  4. #define FSYNC_0()        do {gpio_out_low(0,12);} while(0)
  5. #define FSYNC_1()        do {gpio_out_high(0,12);} while(0)

  6. #define SCLK_0()        do {gpio_out_low(0,11);}  while(0)
  7. #define SCLK_1()        do {gpio_out_high(0,11);} while(0)

  8. #define SDATA_0()        do {gpio_out_low(0,14);}  while(0)
  9. #define SDATA_1()        do {gpio_out_high(0,14);} while(0)

  10. void ad9833_init(void)
  11. {
  12.     gpio_out_init(0,12,1);//ss
  13.     gpio_out_init(0,14,0);//data
  14.     gpio_out_init(0,11,0);//sck
  15. }

  16. void AD9833_Write_16Bits(uint16_t _cmd)
  17. {
  18.         uint8_t i;
  19.         SCLK_1();
  20.         FSYNC_0();
  21.        
  22.         for(i = 0; i < 16; i++)
  23.         {
  24.                 if (_cmd & 0x8000)
  25.                 {
  26.                         SDATA_1();
  27.                 }
  28.                 else
  29.                 {
  30.                         SDATA_0();
  31.                 }
  32.                 SCLK_0();
  33.                 _cmd <<= 1;
  34.                 SCLK_1();
  35.         }
  36.        
  37.         FSYNC_1();
  38. }

  39. /*
  40. *********************************************************************************************************
  41. *        函数名:AD9833_SelectWave
  42. *        功能说明:软件位控制

  43. *        IOUT正弦波 ,SIGNBITOUT方波 ,写FREQREG0 ,写PHASE0
  44. *        ad9833_write_16bit(0x2028) 一次性写FREQREG0
  45. *        ad9833_write_16bit(0x0038) 单独改写FREQREG0的LSB
  46. *        ad9833_write_16bit(0x1038) 单独改写FREQREG0的MSB

  47. *        IOUT三角波 ,写PHASE0
  48. *        ad9833_write_16bit(0x2002)一次性写FREQREG0
  49. *        ad9833_write_16bit(0x0002)单独改写FREQREG0的LSB
  50. *        ad9833_write_16bit(0x1008)单独改写FREQREG0的MSB

  51. *   形参:_Type -- 波形类型
  52. *   返回值 :无

  53. *********************************************************************************************************
  54. */
  55. void AD9833_SelectWave(uint8_t _Type)
  56. {
  57.         FSYNC_1();  //宏定义
  58.         SCLK_1();
  59.         if(_Type == 0)
  60.         {
  61.                 AD9833_Write_16Bits(0x2028); /*频率寄存器输出方波*/
  62.         }
  63.         else if(_Type == 1)
  64.         {
  65.                 AD9833_Write_16Bits(0x2002); /*频率寄存器输出三角波*/
  66.         }
  67.         else if(_Type == 2)
  68.         {
  69.                 AD9833_Write_16Bits(0x2000); /*频率寄存器输出正弦波*/
  70.         }
  71.         else if(_Type == 3)
  72.         {
  73.                 AD9833_Write_16Bits(0x00C0); /*无输出*/
  74.         }


  75. }

  76. /****************************************************************
  77. 函数名称: AD9833_SetFreq
  78. 功能: 设置频率值   
  79. 参数: _freq
  80. freq -- 频率值 (Freq_value(value)=Freq_data(data)*FCLK/2^28)
  81. 返回值: 无
  82. *****************************************************************/
  83. void AD9833_SetFreq(uint32_t _freq)
  84. {
  85.         uint32_t freq;
  86.         uint16_t lsb_14bit;
  87.         uint16_t msb_14bit;
  88.         uint8_t freq_number = 0;

  89.         freq = (uint32_t)(268435456.0 / AD9833_SYSTEM_CLOCK * _freq);
  90.         lsb_14bit = (uint16_t)freq;
  91.         msb_14bit = (uint16_t)(freq >> 14);
  92.         if(freq_number == FREQ_0)
  93.         {
  94.                 lsb_14bit &= ~(1U<<15);
  95.                 lsb_14bit |= 1<<14;
  96.                 msb_14bit &= ~(1U<<15);
  97.                 msb_14bit |= 1<<14;
  98.         }
  99.         else
  100.         {
  101.                 lsb_14bit &= ~(1<<14);
  102.                 lsb_14bit |= 1U<<15;  
  103.                 msb_14bit &= ~(1<<14);
  104.                 msb_14bit |= 1U<<15;
  105.         }

  106.         AD9833_Write_16Bits(lsb_14bit);
  107.         AD9833_Write_16Bits(msb_14bit);
  108. }
复制代码



IMG_20180527_041027_1.jpg

IMG_20180527_041037_1.jpg

IMG_20180527_041108_1.jpg

附上工程:
LPC54114-AD9833.zip (1.08 MB, 下载次数: 20)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-5-3 00:49 , Processed in 0.111282 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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