【GD32】AD9833模块 DDS模块 提供测试程序 正弦波/方波/三角波信号发生器

2.45 AD9833 DDS模块

2.45.1 模块来源

采购链接:
AD9833模块 DDS模块 提供测试程序 正弦波/方波/三角波信号发生器
资料下载:
https://pan.baidu.com/s/1JZ0ga4uTyXUq5u-Or9BVlg?pwd=GOOD
提取码:GOOD

2.45.2 规格参数
工作电压:2.3 V至5.5 V电源供电
工作电流:12.65 mW(3 V时)
通信方式:3线SPI接口
芯片引脚数量:10引脚MSOP封装
2.45.3 移植过程
我们的目标是在梁山派GD32F470上能够通过模块输出波形的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
2.45.3.1 查看资料
模块作用:
可编程波形发生器,能够产生正弦 波、三角波和方波输出。各种类型的检测、信号激励和时 域反射(TDR)应用都需要波形发生器。输出频率和相位可 通过软件进行编程,调整简单。无需外部元件。频率寄存 器为28位:时钟速率为25 MHz时,可以实现0.1 Hz的分辨 率;而时钟速率为1 MHz时,则可以实现0.004 Hz的分辨率。
模块驱动:
AD9833通过一个三线式串行接口写入数据。该串行接口能 够以最高40 MHz的时钟速率工作,并且与DSP和微控制器 标准兼容。该器件采用2.3 V至5.5 V电源供电。注意:在生成方波时会过冲(可以在加入电源滤波电路缓解但不能彻底解决!!!)
2.45.3.2 引脚选择
在这里插入图片描述
2.45.3.3 移植至工程
移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为AD9833.c与ccd.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件AD9833.c中,编写如下代码。

 /********************************************************************************* 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz* 版 本 号: V1.0* 修改作者: LCKFB* 修改日期: 2023年06月12日* 功能介绍:      ***************************************************************************************************************************************************************/#include "AD9833.h"
#include "gd32f4xx.h"/******************************************************************* 函 数 名 称:Ad9833GpioConfig* 函 数 说 明:Ad9833的初始化* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:软件SPI的配置
******************************************************************/
void AD9833_GpioConfig(void)
{rcu_periph_clock_enable(RCU_SDATA);     //使能SDATA引脚时钟rcu_periph_clock_enable(RCU_SCLK);      //使能SCLK引脚时钟rcu_periph_clock_enable(RCU_FSNYC);     //使能FSNYC引脚时钟//配置SDATA为上拉推挽输出gpio_mode_set(PORT_SDATA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDATA);        gpio_output_options_set(PORT_SDATA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_SDATA);//输出高电平gpio_bit_set(PORT_SDATA, GPIO_SDATA); //配置SCLK为上拉推挽输出gpio_mode_set(PORT_SCLK, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,  GPIO_SCLK);        gpio_output_options_set(PORT_SCLK, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,  GPIO_SCLK); //输出高电平gpio_bit_set(PORT_SCLK,  GPIO_SCLK); //配置FSNYC为上拉推挽输出gpio_mode_set(PORT_FSNYC, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_FSNYC);       gpio_output_options_set(PORT_FSNYC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_FSNYC); //输出高电平gpio_bit_set(PORT_FSNYC, GPIO_FSNYC);         
}/******************************************************************* 函 数 名 称:AD9833_WriteData* 函 数 说 明:向AD9833写入16位数据* 函 数 形 参:txdata=写入的16位数据* 函 数 返 回:无* 作       者:LC* 备       注:FSNYC低电平有效,数据在时钟的下降沿被采集数据,在时钟的上升沿更新数据
******************************************************************/
void AD9833_WriteData(uint16_t txdata)
{int i;ADI_FSNYC_OUT(1);ADI_SCLK_OUT(0);ADI_SCLK_OUT(1);ADI_FSNYC_OUT(0);//写16位数据for(i=0;i<16;i++){  if (txdata & 0x8000){ADI_SDATA_OUT(1);}else{ADI_SDATA_OUT(0);}ADI_SCLK_OUT(0);txdata<<=1;ADI_SCLK_OUT(1);}ADI_FSNYC_OUT(1);
}
/******************************************************************* 函 数 名 称:AD9833_SetFrequency* 函 数 说 明:ad9833设置频率寄存器* 函 数 形 参:reg=待写入的频率寄存器  fout=频率值* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void AD9833_SetFrequency(unsigned short reg, double fout)
{int frequence_LSB=0, frequence_MSB=0;double   frequence_mid=0, frequence_DATA=0;long int frequence_hex=0;/*********************************计算频率的16进制值***********************************///如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHzfrequence_mid = 268435456/25;//适合25M晶振frequence_DATA = fout;frequence_DATA = frequence_DATA/1000000;frequence_DATA = frequence_DATA*frequence_mid;frequence_hex = frequence_DATA;         //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;frequence_LSB = frequence_hex;          //frequence_hex低16位送给frequence_LSBfrequence_LSB = frequence_LSB&0x3fff;   //去除最高两位,16位数换去掉高位后变成了14位frequence_MSB = frequence_hex>>14;      //frequence_hex高16位送给frequence_HSBfrequence_MSB = frequence_MSB&0x3fff;   //去除最高两位,16位数换去掉高位后变成了14位frequence_LSB = frequence_LSB|reg;frequence_MSB = frequence_MSB|reg;AD9833_WriteData(0x2100);               //选择数据一次写入,B28位和RESET位为1AD9833_WriteData(frequence_LSB);AD9833_WriteData(frequence_MSB);
}/******************************************************************* 函 数 名 称:AD9833_SetPhase* 函 数 说 明:ad9833设置相位寄存器* 函 数 形 参:reg=待写入的相位寄存器    fout=相位值  * 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void AD9833_SetPhase(unsigned short reg, unsigned short val)
{unsigned short phase = reg;phase |= val;AD9833_WriteData(phase);
}/******************************************************************* 函 数 名 称:AD9833_SetWave* 函 数 说 明:ad9833设置波形* 函 数 形 参:WaveMode=输出波形类型 *              Freq_SFR=输出的频率寄存器类型*              Phase_SFR=输出的相位寄存器类型* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void AD9833_SetWave(unsigned int WaveMode,unsigned int Freq_SFR,unsigned int Phase_SFR)
{unsigned int val = 0;val = (val | WaveMode | Freq_SFR | Phase_SFR);AD9833_WriteData(val);
}/******************************************************************* 函 数 名 称:AD9833_Setup* 函 数 说 明:设置ad9833的输出* 函 数 形 参:Freq_SFR =  频率寄存器类型*              Freq     =  频率值*              Phase_SFR=  相位寄存器类型*              Phase    =  相位值*              WaveMode =  波形类型* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void AD9833_Setup(unsigned int Freq_SFR,double Freq,unsigned int Phase_SFR,unsigned int Phase,unsigned int WaveMode)
{unsigned int Fsel,Psel;AD9833_WriteData(0x0100); //复位AD9833,即RESET位为1AD9833_WriteData(0x2100); //选择数据一次写入,B28位和RESET位为1AD9833_SetFrequency(Freq_SFR,Freq);AD9833_SetPhase(Phase_SFR,Phase);if(Freq_SFR == AD9833_REG_FREQ0){Fsel = AD9833_FSEL0;}else {Fsel = AD9833_FSEL1;}if(Phase_SFR == AD9833_REG_PHASE0){Psel = AD9833_PSEL0;}else {Psel = AD9833_PSEL1;}AD9833_SetWave(WaveMode,Fsel,Psel);
}

在文件AD9833.h中,编写如下代码。

 /********************************************************************************* 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz* 版 本 号: V1.0* 修改作者: LCKFB* 修改日期: 2023年06月12日* 功能介绍:      ***************************************************************************************************************************************************************/
#ifndef _AD9833_H__
#define _AD9833_H__#include "GD32F4XX.h"//引脚定义
#define RCU_SDATA   RCU_GPIOD
#define PORT_SDATA  GPIOD
#define GPIO_SDATA  GPIO_PIN_5#define RCU_SCLK    RCU_GPIOD
#define PORT_SCLK   GPIOD
#define GPIO_SCLK   GPIO_PIN_4#define RCU_FSNYC   RCU_GPIOD
#define PORT_FSNYC  GPIOD
#define GPIO_FSNYC  GPIO_PIN_1//端口输出
#define  ADI_SDATA_OUT(X)       gpio_bit_write(PORT_SDATA, GPIO_SDATA, (X)?SET:RESET) 
#define  ADI_SCLK_OUT(X)        gpio_bit_write(PORT_SCLK, GPIO_SCLK, (X)?SET:RESET) 
#define  ADI_FSNYC_OUT(X)       gpio_bit_write(PORT_FSNYC, GPIO_FSNYC, (X)?SET:RESET) //输出波形
#define AD9833_OUT_SINUS    ((0 << 5) | (0 << 1) | (0 << 3))    //正弦波
#define AD9833_OUT_TRIANGLE ((0 << 5) | (1 << 1) | (0 << 3))    //三角波
#define AD9833_OUT_MSB      ((1 << 5) | (0 << 1) | (1 << 3))    //方波
#define AD9833_OUT_MSB2     ((1 << 5) | (0 << 1) | (0 << 3))    //方波//相关寄存器
#define AD9833_REG_CMD      (0 << 14)
#define AD9833_REG_FREQ0    (1 << 14)
#define AD9833_REG_FREQ1    (2 << 14)
#define AD9833_REG_PHASE0   (6 << 13)
#define AD9833_REG_PHASE1   (7 << 13)//命令控制位
#define AD9833_B28          (1 << 13)
#define AD9833_HLB          (1 << 12)
#define AD9833_FSEL0        (0 << 11)
#define AD9833_FSEL1        (1 << 11)
#define AD9833_PSEL0        (0 << 10)
#define AD9833_PSEL1        (1 << 10)
#define AD9833_PIN_SW       (1 << 9)
#define AD9833_RESET        (1 << 8)
#define AD9833_CLEAR_RESET  (0 << 8)
#define AD9833_SLEEP1       (1 << 7)
#define AD9833_SLEEP12      (1 << 6)
#define AD9833_OPBITEN      (1 << 5)
#define AD9833_SIGN_PIB     (1 << 4)
#define AD9833_DIV2         (1 << 3)
#define AD9833_MODE         (1 << 1)//函数声明
void AD9833_GpioConfig(void);
void AD9833_WriteData(uint16_t txdata);
void AD9833_SetFrequency(unsigned short reg, double fout);
void AD9833_SetPhase(unsigned short reg, unsigned short val);
void AD9833_SetWave(unsigned int WaveMode,unsigned int Freq_SFR,unsigned int Phase_SFR);
void AD9833_Setup(unsigned int Freq_SFR,double Freq,unsigned int Phase_SFR,unsigned int Phase,unsigned int WaveMode);#endif

2.45.4 移植验证

在自己工程中的main主函数中,编写如下。

 /********************************************************************************* 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz* 版 本 号: V1.0* 修改作者: LCKFB* 修改日期: 2023年06月12日* 功能介绍:      ***************************************************************************************************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "sys.h"
#include "bsp_usart.h"
#include "AD9833.h"int main(void)
{       systick_config();        usart_gpio_config(115200U);    AD9833_GpioConfig();while(1) {//输出 2K 三角波AD9833_Setup(AD9833_REG_FREQ0,2000.0,AD9833_REG_PHASE1,1024,AD9833_OUT_TRIANGLE);delay_1ms(2000);delay_1ms(2000);delay_1ms(2000);     delay_1ms(2000);     //输出 50K 正弦波AD9833_Setup(AD9833_REG_FREQ0,50000.0,AD9833_REG_PHASE1,1024,AD9833_OUT_SINUS);delay_1ms(2000);delay_1ms(2000);     delay_1ms(2000);     delay_1ms(2000);     //输出 1M 方波AD9833_Setup(AD9833_REG_FREQ0,1000000.0,AD9833_REG_PHASE1,1024,AD9833_OUT_MSB);delay_1ms(2000);delay_1ms(2000);     delay_1ms(2000);     delay_1ms(2000);               }
}

移植现象:该实例是产生一个2KHZ的三角波,8秒后产生50K正弦波,8秒后再产生1M方波,将探头连接到示波器上观察!!注意:生成方波有过冲是正常现象。
在这里插入图片描述
在这里插入图片描述
移植成功示例,见文件2.45.4-1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619044.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型面试准备(十八):使用 Pytorch 从零实现 Transformer 模型

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

白盒测试-路径覆盖

​ 程序中的路径是执行程序时经过的分支的集合。路径覆盖法是指设计一定数量的测试用例运行被测程序&#xff0c;使程序中的所有路径都至少被执行一次。路径覆盖率的计算方法为&#xff1a;测试时至少被执行过一次的路径总数 / 程序的总路径数。 栗子 public static int test…

ChatGPT 和 Elasticsearch:使用 Elastic 数据创建自定义 GPT

作者&#xff1a;Sandra Gonzales ChatGPT Plus 订阅者现在有机会创建他们自己的定制版 ChatGPT&#xff0c;称为 GPT&#xff0c;这替代了之前博客文章中讨论的插件。基于本系列的第一部分的基础 —— 我们深入探讨了在 Elastic Cloud 中设置 Elasticsearch 数据和创建向量嵌…

13.多通道视频流缓存以及显示架构

1 简介 多通道视频流缓存以及显示架构是一个在数字图像处理中很基础也很重要的一个架构。在图像拼接以及高分辨率图像显示方面应用范围较为广泛。本文将介绍一个四通道的图像显示。可以四个图像信息输入以及拼接到一个显示屏里面。使用的开发板为A7 2 框架图 架构图如下图所示…

基于ollama搭建本地chatGPT

ollama帮助我们可以快速在本地运行一个大模型&#xff0c;再整合一个可视化页面就能构建一个chatGPT&#xff0c;可视化页面我选择了chat-ollama&#xff08;因为它还能支持知识库&#xff0c;可玩性更高&#xff09;&#xff0c;如果只是为了聊天更推荐chatbox 部署步骤 下载…

【大语言模型】基础:余弦相似度(Cosine similarity)

余弦相似度是一种用来确定两个向量之间相似性的度量。它在数据科学、信息检索和自然语言处理&#xff08;NLP&#xff09;等多个领域被广泛使用&#xff0c;用于度量在多维空间中两个向量之间角度的余弦。这个指标捕捉的是方向上的相似性而非大小&#xff0c;使其非常适合比较长…

【Java集合进阶】数据结构(二又树,二又查找树,平衡二又树)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…

Spring Batch

Spring是一个开放源代码的J2EE应用程序框架&#xff0c;由Rod Johnson发起&#xff0c;是针对bean的生命周期进行管理的轻量级容器&#xff08;lightweight container&#xff09;。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大IOC、AOP及W…

【数据结构】4.List的介绍

目录 1.什么是List 2.常见接口介绍 3.List的使用 1.什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下&#xff1a; Iterable也是一个接口…

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

【第十五届】蓝桥杯省赛C++b组

今年的蓝桥杯省赛已经结束了&#xff0c;与以往不同&#xff0c;今年又回到了8道题&#xff0c;而22&#xff0c;23年出现了10道题 大家觉得难度怎么样&#xff0c;欢迎进来讨论&#xff0c;博主今年没参加哈&#xff0c;大家聊聊&#xff0c;我听听大家的意见和看法哈 试题A:…