DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采用这种方法设计的信号源可工作于调制状态,可对输出电平进行调节,也可输出各种波形。

一个完整周期的函数波形被存储在上面所示的存储器查找表中。相位累加器跟踪输出函数的电流相位。为了输出一个非常低的频率,采样样本之间的差相位(Δ)将非常小。例如,一个很慢的正弦波可能将有1度的Δ相位。则波形的0号采样样本采得0度时刻的正弦波的幅度,而波形的1号采样将采得1度时刻的正弦波的幅度,依次类推。经过360次采样后,将输出正弦曲线的全部360度,或者确切地说是一个周期。一个较快的正弦波可能会有10度的Δ相位。于是,36次采样就会输出正弦波的一个周期。如果采样率保持恒定,上述较慢的正弦波的频率将比较快的正弦波慢10倍。 进一步说,一个恒定的Δ相位必将导致一个恒定正弦波频率的输出。但是,DDS技术允许通过一个频率表迅速地改变信号的Δ相位。函数发生器能够指定一个频率表,该表包括由波形频率和持续时间信息组成的各个段。函数发生器按顺序产生每个定义的频率段。通过生成一个频率表,可以构建复杂的频率扫描信号和频率跳变信号。DDS允许函数发生器的相位从一级到另一级连续变化。 矢量信号发生器提供高灵活度和强大的解决方案,可用于科学研究,通信,消费电子,宇航/国防,半导体测试以及一些新兴领域,如软件无线电,无线电频率识别( RFID),以及无线传感网络等。 有些公司还提供许多其他利用DAC来产生模拟信号的模拟输出产品。模拟输出板的基本架构是,将一个小型的FIFO存储器连接到一个DAC上。绝大部分的模拟输出板被用来产生静态电压,而且许多可以被用来产生低频波形。

STM32内部带有12位ADC,通过查表的方式输出各个电压

#include "sign.h"
u16 SineWave_Value[256]; /********正弦波输出表***********/
//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);}
}/****************初始化引脚******************/
void SineWave_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);  //开时钟GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //输出速率 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 ; //选择引脚GPIO_SetBits(GPIOA,GPIO_Pin_4)  ;   //拉高输出GPIO_Init(GPIOA, &GPIO_InitStructure);      //初始化GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //推挽输出模式 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //选择引脚GPIO_Init(GPIOD, &GPIO_InitStructure);      //初始化
}/******************DAC初始化ˉ*************************/
void SineWave_DAC_Config( void)
{DAC_InitTypeDef            DAC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//开DAC时钟/**************DAC结构初始化*******************/DAC_StructInit(&DAC_InitStructure);    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不产生波形DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; //不使能输出缓存DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;//DAC触发为定时器2触发DAC_Init(DAC_Channel_1, &DAC_InitStructure);//初始化DAC_Cmd(DAC_Channel_1, ENABLE);    //使能DAC的通道1//DAC_DMACmd(DAC_Channel_1, ENABLE); //使能DAC通道1的DMA
}/*********定时器初始化************/
void SineWave_TIM_Config(u32 Wave1_Fre)
{TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开时钟TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0;     //不预分频TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //不分频<br>  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseStructure.TIM_Period = Wave1_Fre;//设置输出频率TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);//设置TIME输出触发为更新模式
}/*********DMA配置***********/
void SineWave_DMA_Config(void)
{                  DMA_InitTypeDef            DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);//开启DMA2时钟DMA_StructInit( &DMA_InitStructure);        //DMA结构体初始化DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//从寄存器读数据DMA_InitStructure.DMA_BufferSize = 256;//寄存器大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//宽度为半字DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//宽度为半字DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//优先级非常高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//关闭内存到内存模式DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环发送模式DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;//外设地址为DAC通道1的地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SineWave_Value;//波形数据表内存地址DMA_Init(DMA2_Channel3, &DMA_InitStructure);//初始化DMA_Cmd(DMA2_Channel3, ENABLE); //使能DMA通道3      }/**********正弦波初始化**********************/
//Wave1_Fre:    频率值(0~60 000)Hz
//Um             :  电压峰值(0.0~1.5)V
/*******************************************/void SineWave_Init(u16 Wave1_Fre,float Um)
{u32 f1;f1=(u32)(8000000/sizeof(SineWave_Value)*2/Wave1_Fre);//计算频率SineWave_Data(256,SineWave_Value,Um);     //生成输出正弦波的波形表SineWave_GPIO_Config();             //初始化io//SineWave_TIM_Config(f1);            //初始化定时器SineWave_DAC_Config();              //配置DAC//SineWave_DMA_Config();              //配置DMA//TIM_Cmd(TIM2, ENABLE);             //开启定时器
}

基于STM32的DDS信号发生器相关推荐

  1. 基于FPGA的DDS信号发生器

    基于FPGA的DDS信号发生器     两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...

  2. 【FPGA实例】基于FPGA的DDS信号发生器设计

    原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...

  3. CASE_05 基于FPGA的DDS信号发生器

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 DDS原理与方案 2.1 方案一:基于CORD ...

  4. 基于STM32的函数信号发生器设计(上:硬件设计)

    转载请注明出处:http://blog.csdn.net/sctu_vroy/article/details/45888277 大三初学STM32时做的点东西,现在拿出来和大家分享一下~ 这是一款基于 ...

  5. 基于stm32单片机的信号发生器设计

    硬件方案 硬件主要由stm32单片机核心板+LCD1602液晶显示屏+LM358运算放大电路+DAC0832数模电路+TL431基准参考电压电路+ICL7660稳压电路+按键电路等构成:如图: 设计功 ...

  6. 基于STM32的函数信号发生器设计(下:软件设计)

    转载请注明出处:http://blog.csdn.net/sctu_vroy/article/details/46279817 下篇将介绍整个STM32函数信号发生器系统软件设计部分,将着重介绍设计逻 ...

  7. 基于FPGA的DDS 信号发生器(一)

    用DDS求角度的正弦值 1 DDS原理 1.1 书上的解释 1.2 自己的理解 2 DDS IP的参数设置 3 Vivado实现 3.1 编写源文件 3.2 编写testbench文件 3.3 仿真结 ...

  8. 基于FPGA的DDS 信号发生器(三)

    控制正弦波的频率和相位(频率控制字+相位控制字) 1 DDS原理 1.1 书上的解释 1.2 自己的理解 2 DDS IP的参数设置 3 源码 3.1 顶层文件 3.2 频率控制字模块 3.3 相位控 ...

  9. 基于FPGA的DDS信号发生器(vivado版本)

    一.设计目标 根据DDS技术原理,在vavido上编写DDS信号源硬件逻辑语言,实现频率.幅度.波形可调的信号源发生器. 频率调节分为11个档位,分别是:1Hz.10Hz.100Hz.500Hz.1k ...

  10. STM32单片机可变频率幅度DDS信号发生器正弦波三角波方波AD9833

    实践制作DIY- GC0094-DDS信号发生器 一.功能说明: 基于STM32单片机设计-DDS信号发生器 功能介绍: 硬件组成:STM32F103C系列最小系统板 +LCD1602显示器+AD98 ...

最新文章

  1. 没有内幕交易:Coinbase完成了比特币现金调查
  2. mysql的学习总结
  3. JAVA——Java连接MySQL数据库
  4. 【数据库学习】——windows、MySQL构建新闻管理系统(控制台版)
  5. linux培训笔记1
  6. Java中高效判断数组中是否包含某个元素
  7. JavaScript0-闭包
  8. Magento教程 20:仅限会员留言的产品评论设定!
  9. 深度剖析Java数据结构之表(二)——List接口
  10. Nginx + uWSGI + flask + socketio 部署解决方案
  11. 学术论文海报模板_推荐 | 绘制学术论文中的图表一般有哪些专业的软件?
  12. oracle 序列号连号,火并VariPrint技术指标(HaiyaaVariPrint.PDF
  13. 准备建个深圳程序员内推找工作微信群
  14. 2021清北学堂储备营Day1
  15. java微信投票_微信小程序投票功能
  16. debian 7 安装 rz sz lrzsz
  17. 最新WIFI分销大师小程序源码+带后端/亲测可用
  18. 电脑文件备份到移动硬盘的方法
  19. Windows驱动_WDDM之一
  20. [转载] 七龙珠第一部——第041话 玛斯鲁塔的毁灭

热门文章

  1. PMP 成本计算相关
  2. 简单说说路由器和交换机的区别
  3. 手机连接电脑DCIM目录下文件夹和图片显示不全
  4. 红帽linux安装中文输入法,Redhat安装中文输入法
  5. pngimg 可以商用吗_免费商用无版权素材 免费图库 抠图 PNG 插画素材
  6. python 实现文字识别提取
  7. mac打开网页速度特别慢
  8. unity摄像机带碰撞检测 摄像机碰到带碰撞物体自动拉近
  9. 转载四代重歼的一片博文 - 漏斗子:“三大战役”完成 人民币国际化就登场
  10. krpano使用gyro2.js自定义陀螺仪