你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U545RE评测】驱动dds模块AD9833

[复制链接]
Stm32McuLover 提问时间:2023-11-15 21:54 / 未解决
手上有个DDS模块,本帖就用NUCLEO-U545RE来驱动它。
AD9833是ADI公司生产的一款低功耗,可编程波形发生器,能够产生正弦波、三角波、方波输出。波形发生器广泛应用于各种测量、激励和时域响应领域,AD9833无需外接元件,输出频率和相位都可通过软件编程,易于调节,频率寄存器是28位的,主频时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,精度可以达到0.004Hz。

可以通过3个串行接口将数据写入AD983,这3个串口的最高工作频率可以达到40MHz,易于与DSP和各种主流微控制器兼容。AD9833的工作电压范围为2.3V-5.5V。

AD9833还具有休眠功能,可使没被使用的部分休眠,减少该部分的电流损耗,例如,若利用AD9833输岀作为时钟源,就可以让DAC休眠,以减小功耗,该电路采用10引脚MSOP型表面贴片封装,体积很小。

AD9833特点
频率和相位可数字编程
工作电压为3V时,功耗仅为20mW
输出频率范围为OHz-12.5MHz
频率寄存器为28位(在25Mz的参考时钟下,精度为0.1Hz)
可选择正弦波、三角波、方波输出
无需外界元件
3线SPI接口
温度范围为-40℃-+105℃
总结:模块与单片机之间是通过SPI通信的方式,通过对芯片内部寄存器的操作可以调节模块的数据频率和相位。可输出的频率范围是0—13.5MHZ。可以输出正弦波、三角波和方波。
根据原理图确定管脚:
屏幕截图 2023-11-15 214654.png

配置如下
屏幕截图 2023-11-15 214802.png

驱动头文件ad9833.h
  1. /*************************************************************************************
  2. Title        :   Analog Devices AD9833 DDS Wave Generator Library for STM32 Using HAL Libraries
  3. Author:    Bardia Alikhan Afshar <bardia.a.afshar@gmail.com>  
  4. Software:  IAR Embedded Workbench for ARM
  5. Hardware:  Any STM32 device
  6. *************************************************************************************/
  7. #ifndef _AD_9833_H
  8. #define _AD_9833_H
  9. #include <math.h>
  10. #include "stm32u5xx_hal.h"
  11. #include "main.h"

  12. // ------------------------- Defines -------------------------
  13. #define FMCLK 25000000        // Master Clock On AD9833
  14. #define AD9833SSPORT ad9833_cs_GPIO_Port      // PORT OF AD9833
  15. #define AD9833DATAPORT ad9833_dat_GPIO_Port      // PORT OF AD9833
  16. #define AD9833SCKPORT ad9833_sck_GPIO_Port      // PORT OF AD9833
  17. #define AD9833DATA ad9833_dat_Pin // SPI DATA PIN
  18. #define AD9833SCK ad9833_sck_Pin  // SPI Clock PIN
  19. #define AD9833SS ad9833_cs_Pin   // SPI Chip Select
  20. #define ASM_NOP() asm("NOP")  // Assembly NOPE (Little Delay)
  21. enum WaveType{SIN, SQR, TRI}; // Wave Selection Enum

  22. // ------------------ Functions  ---------------------
  23. void AD9833_SetWave(uint16_t Wave);                      // Sets Output Wave Type
  24. void AD9833_SetWaveData(float Frequency,float Phase);    // Sets Wave Frequency & Phase
  25. void AD9833_Init(uint16_t Wave,float FRQ,float Phase);   // Initializing AD9833
  26. #endif
复制代码
驱动源文件ad9833.c
  1. /*************************************************************************************
  2. Title        :   Analog Devices AD9833 DDS Wave Generator Library for STM32 Using HAL Libraries
  3. Author:    Bardia Alikhan Afshar <bardia.a.afshar@gmail.com>  
  4. Software:  IAR Embedded Workbench for ARM
  5. Hardware:  Any STM32 device
  6. *************************************************************************************/
  7. #include "AD9833.h"
  8. // ------------------- Variables ----------------
  9. uint16_t FRQLW = 0;    // MSB of Frequency Tuning Word
  10. uint16_t FRQHW = 0;    // LSB of Frequency Tuning Word
  11. uint32_t  phaseVal=0;  // Phase Tuning Value
  12. uint8_t WKNOWN=0;      // Flag Variable
  13. // -------------------------------- Functions --------------------------------

  14. // ------------------------------------------------ Software SPI Function
  15. void writeSPI(uint16_t word) {
  16.         for (uint8_t i = 0; i < 16 ; i++) {
  17.           if(word & 0x8000) HAL_GPIO_WritePin(AD9833DATAPORT,AD9833DATA,GPIO_PIN_SET);   //bit=1, Set High
  18.                 else HAL_GPIO_WritePin(AD9833DATAPORT,AD9833DATA,GPIO_PIN_RESET);        //bit=0, Set Low
  19.                 __NOP();
  20.                 HAL_GPIO_WritePin(ad9833_sck_GPIO_Port,AD9833SCK,GPIO_PIN_RESET);             //Data is valid on falling edge
  21.                 __NOP();
  22.                 HAL_GPIO_WritePin(ad9833_sck_GPIO_Port,AD9833SCK,GPIO_PIN_SET);
  23.                 word = word<<1; //Shift left by 1 bit
  24.         }
  25.         HAL_GPIO_WritePin(AD9833DATAPORT,AD9833DATA,GPIO_PIN_RESET);                    //Idle low
  26.         __NOP();
  27. }

  28. // ------------------------------------------------ Sets Output Wave Type
  29. void AD9833_SetWave(uint16_t Wave){
  30.   switch(Wave){
  31.   case 0:
  32.   HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_RESET);
  33.     writeSPI(0x2000); // Value for Sinusoidal Wave
  34.     HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET);
  35.     WKNOWN=0;
  36.     break;
  37.   case 1:
  38.      HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_RESET);
  39.     writeSPI(0x2028); // Value for Square Wave
  40.     HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET);
  41.     WKNOWN=1;
  42.     break;
  43.   case 2:
  44.         HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_RESET);
  45.     writeSPI(0x2002); // Value for Triangle Wave
  46.     HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET);
  47.     WKNOWN=2;
  48.     break;
  49.   default:
  50.     break;
  51.   }
  52. }

  53. // ------------------------------------------------ Sets Wave Frequency & Phase (In Degree) In PHASE0 & FREQ0 Registers
  54. void AD9833_SetWaveData(float Frequency,float Phase){
  55. __NOP();
  56. // ---------- Tuning Word for Phase ( 0 - 360 Degree )
  57. if(Phase<0)Phase=0; // Changing Phase Value to Positive
  58. if(Phase>360)Phase=360; // Maximum value For Phase (In Degree)
  59. phaseVal  = ((int)(Phase*(4096/360)))|0XC000;  // 4096/360 = 11.37 change per Degree for Register And using 0xC000 which is Phase 0 Register Address

  60. // ---------- Tuning word for Frequency      
  61. long freq=0;
  62. freq=(int)(((Frequency*pow(2,28))/FMCLK)+1); // Tuning Word
  63. FRQHW=(int)((freq & 0xFFFC000) >> 14); // FREQ MSB
  64. FRQLW=(int)(freq & 0x3FFF);  // FREQ LSB
  65. FRQLW |= 0x4000;
  66. FRQHW |= 0x4000;
  67. // ------------------------------------------------ Writing DATA
  68. HAL_GPIO_WritePin(AD9833DATAPORT,AD9833DATA,GPIO_PIN_SET);
  69. HAL_GPIO_WritePin(ad9833_sck_GPIO_Port,AD9833SCK,GPIO_PIN_SET);
  70. HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET);  
  71. HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_RESET); //low = selected
  72.         __NOP();
  73.         writeSPI(0x2100); // enable 16bit words and set reset bit
  74.         writeSPI(FRQLW);
  75.         writeSPI(FRQHW);
  76.         writeSPI(phaseVal);
  77.         writeSPI(0x2000); // clear reset bit
  78.         __NOP();
  79.         HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET); //high = deselected
  80. AD9833_SetWave(WKNOWN);
  81. __NOP();
  82. return;
  83. }

  84. // ------------------------------------------------ Initializing AD9833
  85. void AD9833_Init(uint16_t WaveType,float FRQ,float Phase){
  86. HAL_GPIO_WritePin(AD9833DATAPORT,AD9833DATA,GPIO_PIN_SET); // Set All SPI pings to High
  87. HAL_GPIO_WritePin(ad9833_sck_GPIO_Port,AD9833SCK,GPIO_PIN_SET);  // Set All SPI pings to High
  88. HAL_GPIO_WritePin(AD9833SSPORT,AD9833SS,GPIO_PIN_SET);   // Set All SPI pings to High
  89. AD9833_SetWave(WaveType);                              // Type Of Wave
  90. AD9833_SetWaveData(FRQ,Phase);                         // Frequency & Phase Set
  91. return;
  92. }




复制代码

初始化调用接口

屏幕截图 2023-11-15 214404.png

dds模块在扩展板上
微信图片_20231115214532.jpg

10KHz正弦波产生效果

屏幕截图 2023-11-15 214226.png
里面含有直流成分,峰峰值约600mV

收藏 评论3 发布时间:2023-11-15 21:54

举报

3个回答
STMCU-管管 回答时间:2023-11-16 11:00:21
可以录一下demo
落花又见流水 回答时间:2023-12-12 09:28:19

学习学习,可以做个小的波形发生器了啊

STMWoodData 回答时间:2023-12-12 10:11:09

这个可编程波形发生器不错啊

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版