基于STM32+DAC+DMA和AD9850的波形发生器

试验目的

一、通过STM32单片机DAC+DMA产生频率可调正弦波、三角波、锯齿波、方波。
二、使用STM32驱动AD9850波形发生模块产生正弦波和方波。

一、AD9850/AD9851的简介
AD9850/AD9851 模块是采用 ADI 应用最广泛的 DDS(AD9850 和 AD9851)制作的模块。

主要功能特点:
模块能够输出正弦波和方波,2 个正弦波和 2 个方波输出。
 AD9850: 0-40MHz
 AD9851: 0-70MHz
 频率在 20-30MHz 后谐波越来越大,波形会越来越不干净。
 方波: 0-1MHz
采用 70MHz 的低通滤波器,使波形的 SN 比更好
比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波
AD9850 模块采用 125MHz 的有源晶振,AD9851 模块采用 30MHZ 的有源晶振

二、AD9850驱动程序
1、模块初始化

/********************************************
函数名称:Init_AD9834(主要是初始化GPIO)
功    能:初始化AD9834
参    数:无
返回值  :无
*********************************************/
void Init_AD9850(void)
{#ifdef MODE_SEIAL   //串行模式GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;AD9850_Reset_Sreial() ;
#endif#ifdef MODE_PARALLEL //并行模式GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//?GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;//可以GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure);AD9850_Reset_Parallel() ;//并行模式下复位AD9850
#endif}
/********************************************
函数名称:AD9850_Reset_Sreial
功    能:在串行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
void AD9850_Reset_Sreial(void)
{AD9850_WCLK_CLR ;AD9850_FQUD_CLR ;//RST信号AD9850_RST_CLR ;AD9850_RST_SET ;
//    AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_RST_CLR ;//WCLK信号AD9850_WCLK_CLR ;AD9850_WCLK_SET ;
//    AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_WCLK_CLR ;//FQUD信号AD9850_FQUD_CLR ;AD9850_FQUD_SET ;
//    AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_FQUD_CLR ;
}

2、串行模式数据写入

/********************************************
函数名称:AD9850_Write_Serial
功    能:在串行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Serial(unsigned char W0,unsigned long freq)
{unsigned char i,wdata ;unsigned long  y ;y=4294967296.0/125;y*=(((float)freq)/1000000);wdata = y>>0 ;   //写w4for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>8 ;  //写w3for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>16 ;  //写w2for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>24 ;  //写w1for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = W0 ;  //写w0for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}AD9850_FQUD_SET ;  //移入使能
//    AD9850_Delay(0xFFFF) ;AD9850_FQUD_CLR ;
}

三、基于STM32+DAC+DMA 的波形发生器
1、DAC DMA 初始化

void Wave_Init(u16 Wave1_Fre,float Um_H,float Um_l)
{u32 Freq;Freq=(u32)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);//计算频率// SquareWave_Data(256,SineWave_Value,Um_H,Um_l);//产生方波
//  SineWave_Data(256,SineWave_Value,Um_H);//产生正弦波TriangleWave_Data(256,SineWave_Value,Um_H);//产生三角波
//  SawTooth_Data(256,SineWave_Value,Um_H);//产生锯齿波SineWave_GPIO_Config();             //初始化ioSineWave_TIM_Config(Freq);          //初始化定时器SineWave_DAC_Config();              //配置DACSineWave_DMA_Config();              //配置DMATIM_Cmd(TIM2, ENABLE);
}

2、生成波形数据表

/********生成正弦波输出表***********/
//cycle :波形表的位数 (0~256)
//Um        :输出电压的峰值(0~1.5)
/*******************************/
void SineWave_Data( u16 cycle ,u16 *D,float Um)
{u16 i;for( i=0;i<cycle;i++){D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3);}
}
/********生成方波输出表***********/
//cycle :波形表的位数 (0~256)
//Um        :输出电压
/*******************************/
void SquareWave_Data( u16 cycle ,u16 *D,float Um_H,float Um_L)
{u16 i;float daH=0,daL=0;daH=4095*Um_H/3.3f;daL=4095*Um_L/3.3f;for(i=0;i<256/2;i++){D[i]= (u16)(daL);}for( i=256/2;i<256;i++){D[i]=(u16)(daH);}
}
/********生成三角波输出表***********/
//cycle :波形表的位数 (0~256)
//Um        :输出电压的峰值(0~1.5)
/*******************************/
void TriangleWave_Data( u16 cycle ,u16 *D,float Um)
{u16 i;int n=1;for( i=0;i<cycle;i++){if(i<cycle/2){D[i]= (u16)(1.0*i/255*4095);}else{D[i]= (u16)(1.0*(i-2*n)/255*4095);n++;}}
}
/********生成锯齿波形输出表***********/
//cycle :波形表的位数 (0~256)
//Um        :输出电压
/*******************************/
void SawTooth_Data( u16 cycle ,u16 *D,float Um)
{u16 i;for( i=0;i<cycle;i++){     D[i]= (u16)(1.0*i/255*4095);}
}

3、主函数

int main(void)
{  uint32_t FREQ=10000;u8 p[250];delay_init();  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);Init_AD9850();LED_Init();LCD_Init();LCD_Clear(BLACK);BACK_COLOR = BLACK;POINT_COLOR = WHITE;LCD_ShowString(50,40,200,24,24,(u8*)"AD9850 TEST");AD9850_Write_Serial(0x00,FREQ);sprintf((char*)p,"Freq : %d KHz",FREQ/1000);if(FREQ>=1000000) sprintf((char*)p,"Freq : %d MHz",FREQ/1000000);LCD_ShowString(30,100,200,24,24,p);Wave_Init(SquareFreq,SquareV_H,SquareV_L);  while(1){   LED0=!LED0;                     delay_ms(250);}
}

四、调试波形




基于STM32+DAC+DMA和AD9850的波形发生器相关推荐

  1. 基于STM32单片机和Labview的温湿度波形实时显示串口助手(一)----手把手教学

    基于STM32单片机和Labview的温湿度波形实时显示串口助手(一)----手把手教学 最近导师有个关于USRP的上位机系统需要找人做下,索性就把任务下发给我了.因为其它课题组有labview的正版 ...

  2. STM32 DAC DMA 使用

    目的:STM32 DAC DMA 环形发送音频数据:(ffmpeg.exe 可以将一些常见的音频文件转为原始数据,很强大): 用到的外设:DAC ,TIM,DMA DCA配置 TIM配置 加入代码 H ...

  3. STM32 DAC + DMA + TIM 输出正弦波,三角波,方波信号

    硬件平台:STM32F4 库类型:标准库. 参考:[二代示波器教程]第12章 示波器设计-DAC信号发生器的实现 DAC框图如下: 通过TIM触发DAC转换,转换完成后通过DMA输出. DMA通道框图 ...

  4. 基于STM32单片机和Labview的温湿度波形实时显示串口助手(二)----手把手教学

    文章目录 前言 一.温湿度检测波形显示系统界面 二.软件程序框图 1.Init 2.Wait 3.Send 4.GetData 5.Deal 6.Exit 总结 前言 由于最近忙于如何开展自己研究方向 ...

  5. 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器

    大家好,我是张巧龙,之前有给实验室学生出了一道关于STM32的题:基于手势控制的波形产生题,题目简单,但综合性较强. 有些学生完成的还不错,个人觉得此题用来 入门 STM32再合适不过了. 展示视频: ...

  6. 基于STM32的DAC音频输出

    基于STM32的DAC音频输出 一.DAC 1.1 DAC简介 1.2 DAC功能框图剖析 二.使用DAC输出周期2kHz的正弦波 2.1 使用Adobe Audition输出一个周期2khz的正弦波 ...

  7. 基于STM32的频谱分析和波形识别系统

    目录 1.概述 2.硬件设计 3.软件设计 4.测试结果 1.概述 本篇介绍了以STM32F103单片机为核心的频谱分析和波形识别系统,并对其硬件组成和软件设计做了详细讲解.该系统通过STM32F10 ...

  8. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  9. dac单缓冲方式C语言设计,课程设计基于DAC0832单缓冲工作波形发生器.doc

    课程设计基于DAC0832单缓冲工作波形发生器.doc 成绩 课程论文 题 目:基于DAC0832单缓冲工作波形发生器 学生姓名: 学生学号: 系别:电子工程学院 专业:通信工程 年级:2014 任课 ...

最新文章

  1. 《数据科学家养成手册》--第十一章算法学2---(非监督,监督贝叶斯概率以及损失函数)
  2. python tushare获取股票数据_Python 金融: TuShare API 获取股票数据 (1)
  3. JDBC是什么?和JDBC程序的基本编写
  4. 倍频程分析函数matlab,瞬时声压时域数据怎么用matlab进行1/3倍频程声压级分析
  5. 一转眼,距 2021 竟然就不到 65 天了,你准备好了么?
  6. JSK-24 函数规律【基础】
  7. C# 异步查询数据库(第二版)
  8. 麦淘亲子完成近千万美元B+轮融资,预计2019年前将开设约300个线下科学活动点...
  9. D3中的each() 以及svg defs元素 clipPath的使用
  10. VSCode 过滤.meta 文件
  11. tcl网络电视android无法启动,tcl智能电视系统升级和刷机常见问题解答
  12. 什么时候用到GDT?为什么要用GDT
  13. 【再学Tensorflow2】TensorFlow2的建模流程:Titanic生存预测
  14. Android应用漏洞及常见解决方案
  15. Zotero文献管理工具使用指南
  16. m基于FPGA的通信数据帧加扰解扰verilog实现,包含testbench
  17. Ubuntu添加虚拟网卡
  18. 金融信贷风控实战(二)
  19. HTML5前端视频_React视频-张晓飞-专题视频课程
  20. C语言简明教程,C语言简明教程

热门文章

  1. 机械行业ERP快速准确完成成本核算流程
  2. 荣之学浅谈跨境电商选品!
  3. Matlab——线图包络线
  4. 证书颁发机构(CA, Certificate Authority)
  5. 一个价值一千五的外包项目!抓取大众点评的店铺信息!
  6. 摘录马云对996的看法的原话以及一点自己的想法
  7. js关闭layui弹出框
  8. [scRNA-seq]单细胞转录因子分析——SCENIC实操示例
  9. 在线 Go 语言教程 —— Go 语言之旅(gotour)
  10. 编译型语言和解释型语言的区别