微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 之AD9833无法输出波形

之AD9833无法输出波形

时间:10-02 整理:3721RD 点击:
最近得到一个AD9833模块,想用它来做个简易波形发生器。可是调试了半天就是不行,用的是模拟SPI,现将程序贴出,求大神解答。模块本身好的,我在一块STM32F103CBT6小板上实验成功,可是移植到NUCLEO-F412ZG板子,就是不行,实在无解。程序就那么几行,看来看去找不出问题。求大神帮忙看看.
主要程序如下:
AD9833.H

  1. #ifndef __AD9833_H
  2. #define __AD9833_H
  3. #include "sys.h"


  4. #define TRI_WAVE         0                  //输出三角波
  5. #define SIN_WAVE         1                //输出正弦波
  6. #define SQU_WAVE         2                //输出方波


  7. //void AD9833_WaveSeting(void);
  8. void AD9833_Init(void);
  9. void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase );

  10. void AD9833_Init_GPIO(void);

  11. #endif







复制代码

AD9833.C

  1. #include "AD9833.h"

  2. /*      1.Freq: 频率值, 0.1 hz - 12Mhz
  3.                           2.Freq_SFR: 0 或 1
  4.                           3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
  5.                           4.Phase : 波形的初相位*/

  6. //***************************
  7. //                Pin assign                  
  8. //                        STM32                        AD9833
  9. //                GPIOB_Pin_12                 ---> FSYNC
  10. //                GPIOB_Pin_13                 ---> SCK
  11. //                GPIOB_Pin_15                ---> DAT

  12. //***************************       

  13.         /*端口定义 */
  14.         #define PORT_FSYNC        GPIOB
  15.         #define PIN_FSYNC        GPIO_Pin_12

  16.         #define PORT_SCK        GPIOB
  17.         #define PIN_SCK                GPIO_Pin_13

  18.         #define PORT_DAT        GPIOB
  19.         #define PIN_DAT                GPIO_Pin_15

  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. //初始化AD9833 GPIO

  28. void AD9833_Init_GPIO()
  29. {
  30.         GPIO_InitTypeDef GPIO_InitStructure;

  31.         RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  32.        
  33.         GPIO_InitStructure.GPIO_Pin = PIN_SCK|PIN_DAT|PIN_FSYNC;
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  35.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  37.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
  38.        
  39.         GPIO_Init(PORT_SCK, &GPIO_InitStructure);       
  40.        
  41. }




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



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

  66.         SCK_1();
  67. //        AD9833_Delay();

  68.         FSYNC_1();
  69. //        AD9833_Delay();

  70.         FSYNC_0();
  71. //        AD9833_Delay();

  72.         for(i = 0; i < 16; i++)
  73.         {
  74.                 if (TxData & 0x8000)
  75.                         DAT_1();
  76.                 else
  77.                         DAT_0();
  78.                
  79.                 AD9833_Delay();

  80.                 SCK_0();
  81.                 AD9833_Delay();
  82.                  
  83.                 SCK_1();
  84.                
  85.                 TxData <<= 1;
  86.         }
  87.         FSYNC_1();
  88.        
  89. }



  90. void AD9833_Init()
  91. {

  92.         AD9833_Write(0x0100); //复位AD9833
  93.         AD9833_Write(0x2100); //选择数据一次写入
  94.         AD9833_Write(0x69F1); //L14
  95.         AD9833_Write(0x4000); //H14 频率寄存器0为1KHz
  96.         AD9833_Write(0x93E3); //L14
  97.         AD9833_Write(0x8001); //H14 频率寄存器1为2KHz
  98.         AD9833_Write(0x2000); //芯片进入工作状态,寄存器频率0输出1KHz波形

  99. }

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

  113.                 int frequence_LSB,frequence_MSB,Phs_data;
  114.                 double   frequence_mid,frequence_DATA;
  115.                 long int frequence_hex;

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

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

  130.                 if(Freq_SFR==0)                                  //把数据设置到设置频率寄存器0
  131.                 {
  132.                          frequence_LSB=frequence_LSB|0x4000;
  133.                          frequence_MSB=frequence_MSB|0x4000;
  134.                          //使用频率寄存器0输出波形
  135.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
  136.                         AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
  137.                         AD9833_Write(Phs_data);        //设置相位
  138.                         //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
  139.             }
  140.                 if(Freq_SFR==1)                                //把数据设置到设置频率寄存器1
  141.                 {
  142.                          frequence_LSB=frequence_LSB|0x8000;
  143.                          frequence_MSB=frequence_MSB|0x8000;
  144.                         //使用频率寄存器1输出波形
  145.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
  146.                         AD9833_Write(frequence_MSB); //H14 频率寄存器1为
  147.                         AD9833_Write(Phs_data);        //设置相位
  148.                         //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
  149.                 }
  150.                
  151.                 /*显示处理函数*/

  152.                 if(WaveMode==TRI_WAVE) //输出三角波波形
  153.                 {
  154.                          AD9833_Write(0x2002);
  155.                        
  156.                 }
  157.                 if(WaveMode==SQU_WAVE)        //输出方波波形
  158.                 {
  159.                         AD9833_Write(0x2028);

  160.                 }
  161.                 if(WaveMode==SIN_WAVE)        //输出正弦波形
  162.                 {
  163.                         AD9833_Write(0x2000);
  164.                        
  165.                 }

  166. }

复制代码

最后main.c

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "AD9833.h"




  6. int main(void)
  7. {
  8.   //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  9.         delay_init(168);                  //初始化延时函数       
  10.         AD9833_Init_GPIO(); //AD9833 GPIO 初始化
  11.         AD9833_Init();
  12.         LED_Init();                        //初始化LED端口
  13.         uart_init(9600);        //串口初始化波特率为115200

  14.         printf("AD9833实验开始!") ;
  15.         while(1)
  16.         {
  17.                 AD9833_WaveSeting(10,0,TRI_WAVE,0);
  18.                 delay_ms(10000);
  19.                 AD9833_WaveSeting(20000000,0,SIN_WAVE,0 );
  20.                 delay_ms(10000);       
  21.                 AD9833_WaveSeting(500,0,SQU_WAVE,0);
  22.                 delay_ms(10000);         //测试波形
  23.         }
  24.        

  25. }





复制代码


顶一下,虽然不是什么高大上

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top