找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2316|回复: 2
收起左侧

ad9833资料 51单片机和STM32源程序

[复制链接]
ID:447388 发表于 2020-1-21 15:14 | 显示全部楼层 |阅读模式
资料手册齐全
51hei.png

单片机源程序如下:

  1. #include "ad9833.h"
  2. #include "common.h"



  3. //***************************
  4. //                Pin assign                  
  5. //                        STM32                        AD9833
  6. //                GPIOB_Pin_15                 ---> FSYNC
  7. //                GPIOB_Pin_14                 ---> SCK
  8. //                GPIOB_Pin_13                 ---> DAT
  9. //                GPIOB_Pin_12                ---> CS
  10. //***************************        

  11.         /*端口定义 */
  12.         #define PORT_FSYNC        GPIOB
  13.         #define PIN_FSYNC        GPIO_Pin_15

  14.         #define PORT_SCK        GPIOB
  15.         #define PIN_SCK                GPIO_Pin_14

  16.         #define PORT_DAT        GPIOB
  17.         #define PIN_DAT                GPIO_Pin_13

  18.         #define PORT_CS                GPIOB
  19.         #define PIN_CS                GPIO_Pin_12  //数字电位器片选

  20. //****************************************************************

  21.         #define FSYNC_0()                GPIO_ResetBits(PORT_FSYNC, PIN_FSYNC)
  22.         #define FSYNC_1()                GPIO_SetBits(PORT_FSYNC, PIN_FSYNC)

  23.         #define SCK_0()                GPIO_ResetBits(PORT_SCK, PIN_SCK)
  24.         #define SCK_1()                GPIO_SetBits(PORT_SCK, PIN_SCK)

  25.         #define DAT_0()                GPIO_ResetBits(PORT_DAT, PIN_DAT)
  26.         #define DAT_1()                GPIO_SetBits(PORT_DAT, PIN_DAT)        

  27.         #define CS_0()                GPIO_ResetBits(PORT_DAT, PIN_CS)        
  28.         #define CS_1()                GPIO_SetBits(PORT_DAT, PIN_CS)        

  29. //初始化AD9833 GPIO

  30. void AD9833_Init_GPIO()
  31. {
  32.     GPIO_InitTypeDef GPIO_InitStructure;

  33.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  34.         GPIO_InitStructure.GPIO_Pin = PIN_FSYNC|PIN_SCK|PIN_DAT|PIN_CS;
  35.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  37.     GPIO_Init(PORT_SCK, &GPIO_InitStructure);



  38. }



  39. /*
  40. *********************************************************************************************************
  41. *        函 数 名: AD9833_Delay
  42. *        功能说明: 时钟延时
  43. *        形    参: 无
  44. *        返 回 值: 无
  45. *********************************************************************************************************
  46. */
  47. static void AD9833_Delay(void)
  48. {
  49.         uint16_t i;
  50.         for (i = 0; i < 1; i++);
  51. }



  52. /*
  53. *********************************************************************************************************
  54. *        函 数 名: AD9833_Write
  55. *        功能说明: 向SPI总线发送16个bit数据
  56. *        形    参: TxData : 数据
  57. *        返 回 值: 无
  58. *********************************************************************************************************
  59. */
  60. void AD9833_Write(unsigned int TxData)
  61. {
  62.         unsigned char i;

  63.         SCK_1();
  64.         //AD9833_Delay();
  65.         FSYNC_1();
  66.         //AD9833_Delay();
  67.         FSYNC_0();
  68.         //AD9833_Delay();
  69.         for(i = 0; i < 16; i++)
  70.         {
  71.                 if (TxData & 0x8000)
  72.                         DAT_1();
  73.                 else
  74.                         DAT_0();
  75.                
  76.                 AD9833_Delay();
  77.                 SCK_0();
  78.                 AD9833_Delay();               
  79.                 SCK_1();
  80.                
  81.                 TxData <<= 1;
  82.         }
  83.         FSYNC_1();
  84.         
  85. }

  86. /*
  87. *********************************************************************************************************
  88. *        函 数 名: AD9833_AmpSet
  89. *        功能说明: 改变输出信号幅度值
  90. *        形    参: 1.amp :幅度值  0- 255
  91. *        返 回 值: 无
  92. *********************************************************************************************************
  93. */


  94. void AD9833_AmpSet(unsigned char amp)
  95. {
  96.         unsigned char i;
  97.         unsigned int temp;
  98.            
  99.         CS_0();
  100.         temp =0x1100|amp;
  101.         for(i=0;i<16;i++)
  102.         {
  103.             SCK_0();        
  104.            if(temp&0x8000)
  105.                    DAT_1();
  106.            else
  107.                 DAT_0();
  108.                 temp<<=1;
  109.             SCK_1();
  110.             AD9833_Delay();
  111.         }
  112.         
  113.            CS_1();
  114. }


  115. /*
  116. *********************************************************************************************************
  117. *        函 数 名: AD9833_WaveSeting
  118. *        功能说明: 向SPI总线发送16个bit数据
  119. *        形    参: 1.Freq: 频率值, 0.1 hz - 12Mhz
  120.                           2.Freq_SFR: 0 或 1
  121.                           3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
  122.                           4.Phase : 波形的初相位
  123. *        返 回 值: 无
  124. *********************************************************************************************************
  125. */
  126. void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
  127. {

  128.                 int frequence_LSB,frequence_MSB,Phs_data;
  129.                 double   frequence_mid,frequence_DATA;
  130.                 long int frequence_hex;

  131.                 /*********************************计算频率的16进制值***********************************/
  132.                 frequence_mid=268435456/25;//适合25M晶振
  133.                 //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
  134.                 frequence_DATA=Freq;
  135.                 frequence_DATA=frequence_DATA/1000000;
  136.                 frequence_DATA=frequence_DATA*frequence_mid;
  137.                 frequence_hex=frequence_DATA;  //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
  138.                 frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
  139.                 frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
  140.                 frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
  141.                 frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

  142.                 Phs_data=Phase|0xC000;        //相位值
  143.                 AD9833_Write(0x0100); //复位AD9833,即RESET位为1
  144.                 AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1

  145.                 if(Freq_SFR==0)                                  //把数据设置到设置频率寄存器0
  146.                 {
  147.                          frequence_LSB=frequence_LSB|0x4000;
  148.                          frequence_MSB=frequence_MSB|0x4000;
  149.                          //使用频率寄存器0输出波形
  150.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
  151.                         AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
  152.                         AD9833_Write(Phs_data);        //设置相位
  153.                         //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
  154.             }
  155.                 if(Freq_SFR==1)                                //把数据设置到设置频率寄存器1
  156.                 {
  157.                          frequence_LSB=frequence_LSB|0x8000;
  158.                          frequence_MSB=frequence_MSB|0x8000;
  159.                         //使用频率寄存器1输出波形
  160.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
  161.                         AD9833_Write(frequence_MSB); //H14 频率寄存器1为
  162.                         AD9833_Write(Phs_data);        //设置相位
  163.                         //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
  164.                 }

  165.                 if(WaveMode==TRI_WAVE) //输出三角波波形
  166.                          AD9833_Write(0x2002);
  167.                 if(WaveMode==SQU_WAVE)        //输出方波波形
  168.                         AD9833_Write(0x2028);
  169.                 if(WaveMode==SIN_WAVE)        //输出正弦波形
  170.                         AD9833_Write(0x2000);

  171. }
复制代码

  1. #include "ad9833.h"
  2. #include "STC15F2K60S2.H"


  3.         /*端口定义 */
  4.         sbit FSYNC  =  P1^2;
  5.         sbit CLK           =  P1^3;
  6.         sbit DAT          =  P1^4;  
  7.         sbit CS          =  P1^5;  


  8. //****************************************************************

  9.         #define FSYNC_0()                FSYNC =0
  10.         #define FSYNC_1()                FSYNC =1

  11.         #define SCK_0()                        CLK = 0
  12.         #define SCK_1()                        CLK = 1

  13.         #define DAT_0()                        DAT = 0
  14.         #define DAT_1()                        DAT = 1

  15.         #define CS_0()                        CS = 0
  16.         #define CS_1()                        CS = 1




  17. /*
  18. *********************************************************************************************************
  19. *        函 数 名: AD9833_Delay
  20. *        功能说明: 时钟延时
  21. *        形    参: 无
  22. *        返 回 值: 无
  23. *********************************************************************************************************
  24. */
  25. static void AD9833_Delay(void)
  26. {
  27.         unsigned int i;
  28.         for (i = 0; i < 1; i++);
  29. }



  30. /*
  31. *********************************************************************************************************
  32. *        函 数 名: AD9833_Write
  33. *        功能说明: 向SPI总线发送16个bit数据
  34. *        形    参: TxData : 数据
  35. *        返 回 值: 无
  36. *********************************************************************************************************
  37. */
  38. void AD9833_Write(unsigned int TxData)
  39. {
  40.         unsigned char i;

  41.         SCK_1();
  42.         //AD9833_Delay();
  43.         FSYNC_1();
  44.         //AD9833_Delay();
  45.         FSYNC_0();
  46.         //AD9833_Delay();
  47.         for(i = 0; i < 16; i++)
  48.         {
  49.                 if(TxData&0x8000)
  50.                         DAT_1();
  51.                 else
  52.                         DAT_0();

  53.                         

  54.                 AD9833_Delay();
  55.                 SCK_0();
  56.                 AD9833_Delay();               
  57.                 SCK_1();
  58.                
  59.                 TxData <<= 1;
  60.         }
  61.         FSYNC_1();
  62.         
  63. }



  64. /*
  65. *********************************************************************************************************
  66. *        函 数 名: AD9833_AmpSet
  67. *        功能说明: 改变输出信号幅度值
  68. *        形    参: 1.amp :幅度值  0- 255
  69. *        返 回 值: 无
  70. *********************************************************************************************************
  71. */


  72. void AD9833_AmpSet(unsigned char amp)
  73. {
  74.         unsigned char i;
  75.         unsigned int temp;
  76.            
  77.         CS_0();
  78.         temp =0x1100|amp;
  79.         for(i=0;i<16;i++)
  80.         {
  81.             SCK_0();        
  82.            if(temp&0x8000)
  83.                    DAT_1();
  84.            else
  85.                 DAT_0();
  86.                 temp<<=1;
  87.             SCK_1();
  88.             AD9833_Delay();
  89.         }
  90.         
  91.            CS_1();
  92. }



  93. /*
  94. *********************************************************************************************************
  95. *        函 数 名: AD9833_WaveSeting
  96. *        功能说明: 向SPI总线发送16个bit数据
  97. *        形    参: 1.Freq: 频率值, 0.1 hz - 12Mhz
  98.                           2.Freq_SFR: 0 或 1
  99.                           3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
  100.                           4.Phase : 波形的初相位
  101. *        返 回 值: 无
  102. *********************************************************************************************************
  103. */
  104. void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
  105. {

  106.                 int frequence_LSB,frequence_MSB,Phs_data;
  107.                 double   frequence_mid,frequence_DATA;
  108.                 long int frequence_hex;

  109.                 /*********************************计算频率的16进制值***********************************/
  110.                 frequence_mid=268435456/25;//适合25M晶振
  111.                 //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
  112.                 frequence_DATA=Freq;
  113.                 frequence_DATA=frequence_DATA/1000000;
  114.                 frequence_DATA=frequence_DATA*frequence_mid;
  115.                 frequence_hex=frequence_DATA;  //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
  116.                 frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
  117.                 frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
  118.                 frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
  119.                 frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

  120.                 Phs_data=Phase|0xC000;        //相位值
  121.                 AD9833_Write(0x0100); //复位AD9833,即RESET位为1
  122.                 AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1

  123.                 if(Freq_SFR==0)                                  //把数据设置到设置频率寄存器0
  124.                 {
  125.                          frequence_LSB=frequence_LSB|0x4000;
  126.                          frequence_MSB=frequence_MSB|0x4000;
  127.                          //使用频率寄存器0输出波形
  128.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
  129.                         AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
  130.                         AD9833_Write(Phs_data);        //设置相位
  131.                         //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
  132.             }
  133.                 if(Freq_SFR==1)                                //把数据设置到设置频率寄存器1
  134.                 {
  135.                          frequence_LSB=frequence_LSB|0x8000;
  136.                          frequence_MSB=frequence_MSB|0x8000;
  137.                         //使用频率寄存器1输出波形
  138.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
  139.                         AD9833_Write(frequence_MSB); //H14 频率寄存器1为
  140.                         AD9833_Write(Phs_data);        //设置相位
  141.                         //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
  142.                 }

  143.                 if(WaveMode==TRI_WAVE) //输出三角波波形
  144.                          AD9833_Write(0x2002);
  145.                 if(WaveMode==SQU_WAVE)        //输出方波波形
  146.                         AD9833_Write(0x2028);
  147.                 if(WaveMode==SIN_WAVE)        //输出正弦波形
  148.                         AD9833_Write(0x2000);

  149. }
复制代码


所有资料51hei提供下载:
AD9833资料&amp;文档.zip (4.93 MB, 下载次数: 67)

评分

参与人数 2黑币 +80 收起 理由
songhetai + 30 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:281113 发表于 2020-5-1 11:31 | 显示全部楼层
参考一下!
回复

使用道具 举报

ID:242092 发表于 2020-5-2 08:19 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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