找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32F407的AD9834驱动程序源码

[复制链接]
跳转到指定楼层
楼主
ID:370382 发表于 2018-7-12 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写得不是很好,拿出来分享一下,希望大家能够提点建议!
/* 注:使用时先调用初始化函数初始化IO配置,然后调用AD9834_Select_Wave()选择波形,最后选择频率值即可输出。 */

stm32源码如下:
  1. //================AD9834.h======================//
  2. /*-----------------------------------------------------
  3.                     AD9834驱动程序
  4.                     STM32固件函数库V2.0
  5.                     2011.3.29
  6. -------------------------------------------------------*/
  7. #ifndef __AD9834_H
  8. #define __AD9834_H
  9. #include "stm32f10x_lib.h"
  10. #define Triangle_Wave    0x2002
  11. #define Sine_Wave  0x2028
  12. /* AD9834晶振频率 */
  13. #define AD9834_SYSTEM_COLCK     50000000UL
  14. /* AD9834 控制引脚 */
  15. #define AD9834_Control_Port     GPIOC
  16. #define AD9834_FSYNC            GPIO_Pin_6
  17. #define AD9834_SCLK             GPIO_Pin_7
  18. #define AD9834_SDATA            GPIO_Pin_8
  19. #define AD9834_RESET            GPIO_Pin_9
  20. #define AD9834_FSYNC_SET   GPIO_SetBits(AD9834_Control_Port ,AD9834_FSYNC)
  21. #define AD9834_FSYNC_CLR   GPIO_ResetBits(AD9834_Control_Port ,AD9834_FSYNC)
  22. #define AD9834_SCLK_SET   GPIO_SetBits(AD9834_Control_Port ,AD9834_SCLK)
  23. #define AD9834_SCLK_CLR   GPIO_ResetBits(AD9834_Control_Port ,AD9834_SCLK)
  24. #define AD9834_SDATA_SET   GPIO_SetBits(AD9834_Control_Port ,AD9834_SDATA)
  25. #define AD9834_SDATA_CLR   GPIO_ResetBits(AD9834_Control_Port ,AD9834_SDATA)
  26. #define AD9834_RESET_SET   GPIO_SetBits(AD9834_Control_Port ,AD9834_RESET)
  27. #define AD9834_RESET_CLR   GPIO_ResetBits(AD9834_Control_Port ,AD9834_RESET)

  28. #define FREQ_0      0
  29. #define FREQ_1      1

  30. #define DB15        0
  31. #define DB14        0
  32. #define DB13        B28
  33. #define DB12        HLB
  34. #define DB11        FSEL
  35. #define DB10        PSEL
  36. #define DB9         PIN_SW
  37. #define DB8         RESET
  38. #define DB7         SLEEP1
  39. #define DB6         SLEEP12
  40. #define DB5         OPBITEN
  41. #define DB4         SIGN_PIB
  42. #define DB3         DIV2
  43. #define DB2         0
  44. #define DB1         MODE
  45. #define DB0         0
  46. #define CONTROL_REGISTER    (DB15<<15)|(DB14<<14)|(DB13<<13)|(DB12<<12)|(DB11<<11)|(DB10<<10)\
  47.     |(DB9<<9)|(DB8<<8)|(DB7<<7)|(DB6<<6)|(DB5<<5)|(DB4<<4)|(DB3<<3)|(DB2<<2)|(DB1<<1)|(DB0<<0)
  48. /* AD9834函数声明 */
  49. extern void AD9834_Write_16Bits(unsigned int data) ;  //写一个字到AD9834
  50. extern void AD9834_Select_Wave(unsigned int initdata) ; //选择输出波形
  51. extern void Init_AD9834() ;//初始化配置
  52. extern void AD9834_Set_Freq(unsigned char freq_number, unsigned long freq) ;//选择输出寄存器和输出频率值
  53. #endif /* AD9834_H */
  54. //================================================================//
  55. //====================AD9834.c====================================//
  56. #include "stm32f10x_lib.h"
  57. #include "AD9834.h"

  58. /****************************************************************
  59. 函数名称: AD9834_Write_16Bits
  60. 功    能: 向AD9834写入16为数据
  61. 参    数: data --  要写入的16位数据
  62. 返回值  : 无
  63. *****************************************************************/
  64. void AD9834_Write_16Bits(unsigned int data)
  65. {
  66.     unsigned char i = 0 ;
  67.    
  68.     AD9834_SCLK_SET ;
  69.     AD9834_FSYNC_CLR ;
  70.     for(i=0 ;i<16 ;i++)
  71.     {
  72.         if(data & 0x8000)
  73.           AD9834_SDATA_SET ;
  74.         else
  75.           AD9834_SDATA_CLR ;
  76.         
  77.         AD9834_SCLK_CLR ;
  78.         data <<= 1 ;
  79.         AD9834_SCLK_SET ;
  80.     }
  81.    
  82.     AD9834_FSYNC_SET ;
  83. }
  84. /***********************************************************************************
  85. 函数名称:AD9834_Select_Wave
  86. 功    能:软件为控制,
  87.     --------------------------------------------------
  88.     IOUT正弦波 ,SIGNBITOUT方波 ,写FREQREG0 ,写PHASE0
  89.     ad9834_write_16bit(0x2028)   一次性写FREQREG0
  90.     ad9834_write_16bit(0x0038)   单独改写FREQREG0的LSB
  91.     ad9834_write_16bit(0x1038)   单独改写FREQREG0的MSB
  92.     --------------------------------------------------
  93.     IOUT三角波 ,写PHASE0
  94.     ad9834_write_16bit(0x2002)   一次性写FREQREG0
  95.     ad9834_write_16bit(0x0002)   单独改写FREQREG0的LSB
  96.     ad9834_write_16bit(0x1008)   单独改写FREQREG0的MSB
  97. 参    数:initdata -- 要输入的命令
  98. 返回值  :无
  99. ************************************************************************************/
  100. void AD9834_Select_Wave(unsigned int initdata)
  101. {
  102.     AD9834_FSYNC_SET;
  103.     AD9834_SCLK_SET;
  104.    
  105.     AD9834_RESET_SET;
  106.     AD9834_RESET_SET;
  107.     AD9834_RESET_CLR;
  108.      
  109.     AD9834_Write_16Bits(initdata);
  110. }
  111. /****************************************************************
  112. 函数名称: Init_AD9834
  113. 功    能: 初始化AD9834控制引脚
  114. 参    数: 无
  115. 返回值  : 无
  116. *****************************************************************/
  117. void Init_AD9834()
  118. {
  119.     GPIO_InitTypeDef GPIO_InitStructure ;
  120.     GPIO_InitStructure.GPIO_Pin = AD9834_FSYNC | AD9834_SCLK | AD9834_SDATA | AD9834_RESET ;
  121.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
  122.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
  123.     GPIO_Init(AD9834_Control_Port ,&GPIO_InitStructure) ;
  124. }
  125. /****************************************************************
  126. 函数名称: AD9834_Set_Freq
  127. 功    能: 设置频率值
  128. 参    数: freq_number -- 要写入的平率寄存器(FREQ_0或FREQ_1)
  129.           freq -- 频率值 (Freq_value(value)=Freq_data(data)*FCLK/2^28)
  130. 返回值  : 无
  131. *****************************************************************/
  132. void AD9834_Set_Freq(unsigned char freq_number, unsigned long freq)
  133. {
  134.     unsigned long FREQREG = (unsigned long)(268435456.0/AD9834_SYSTEM_COLCK*freq);
  135.    
  136.     unsigned int FREQREG_LSB_14BIT = (unsigned int)FREQREG;
  137.     unsigned int FREQREG_MSB_14BIT = (unsigned int)(FREQREG>>14);
  138.    
  139.     if(freq_number == FREQ_0)
  140.     {
  141.         FREQREG_LSB_14BIT &= ~(1U<<15);
  142.         FREQREG_LSB_14BIT |= 1<<14;
  143.         FREQREG_MSB_14BIT &= ~(1U<<15);
  144.         FREQREG_MSB_14BIT |= 1<<14;
  145.     }
  146.     else
  147.     {
  148.         FREQREG_LSB_14BIT &= ~(1<<14);
  149.         FREQREG_LSB_14BIT |= 1U<<15;
  150.         FREQREG_MSB_14BIT &= ~(1<<14);
  151.         FREQREG_MSB_14BIT |= 1U<<15;
  152.     }
  153.    
  154.     AD9834_Write_16Bits(FREQREG_LSB_14BIT);
  155.     AD9834_Write_16Bits(FREQREG_MSB_14BIT);
  156.    
  157. }
  158. //============================================================//

复制代码

完整的Word格式文档51黑下载地址:
基于STM32的-AD9834-驱动程序.doc (37 KB, 下载次数: 101)



评分

参与人数 1黑币 +4 收起 理由
muyichuan2012 + 4 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:307065 发表于 2019-7-27 09:37 | 只看该作者
感觉在选择波形的寄存器配置好像有点问题?
回复

使用道具 举报

板凳
ID:263693 发表于 2020-2-1 14:47 | 只看该作者
下载下来学习一下,用407感觉有点浪费啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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