D223的DDS信号发生器:10000点查找表与4通道16位DAC波形输出

采集卡只会采集?D223内置4通道16位DAC,支持正弦、三角、方波和自定义DDS波形输出。本文从代码层面解析DDS波形合成的完整实现。


一、硬件基础:TI-REF5050 + 4通道16位DAC

D223的模拟输出(AO)模块采用TI-REF5050基准源驱动的4通道16位DAC芯片note_63。DAC芯片通过SPI2与STM32H743连接,由TIM14定时器中断驱动波形输出note_63。

与早期产品DABL7606使用"PWM + RC低通滤波"实现10位DAC不同,D223使用的是真正的16位DAC芯片,输出精度和建立时间都有质的提升img_147。

DAC输出范围:0-5V,由REF5050提供高精度基准电压note_63。


二、DDS波形合成的六种模式

D223固件定义了6种DAC工作模式note_63word_3:

c 复制代码
enum _ddsDacWorkMode {
    _ddsDacWorkMode_Stop = 0x00,      // 停止输出
    _ddsDacWorkMode_Dc = 0x01,        // 直流输出
    _ddsDacWorkMode_Sin = 0x02,       // 正弦波
    _ddsDacWorkMode_Triangle = 0x03,  // 三角波
    _ddsDacWorkMode_Square = 0x04,    // 方波
    _ddsDacWorkMode_Dds = 0x05,       // 自定义DDS波形(查表)
    _ddsDacWorkMode_Calib = 0xff,     // 校准模式
};

DDS核心数据结构note_63:

c 复制代码
typedef struct {
    u8  ddsDacWorkMode[4];   // 各通道工作模式
    u32 dacIndex[4];          // 相位累加器(DDS核心)
    u32 dacMaxIndex[4];       // 一个周期的最大索引
    u16 dacCCR[4];            // TIM5 CCR输出值(计算结果)
    u16 ddsDatas[10000];      // 自定义波形数据(10000点查找表)
    u16 ddsDatasLen;          // 自定义波形长度
} ddsDac;

重要 :D223支持10000点自定义DDS波形查找表note_244。注意不是500点------500点是内部正弦波的固定查找表,自定义DDS波形支持最多10000点。


三、正弦波:相位累加器 + 500点固定查找表

正弦波使用500点内部查找表 + 相位累加器实现note_63:

c 复制代码
// 相位步进
_ddsDac.dacIndex[i] += freq * 500000 / interruptFreq;
// 模500000(500点 × 1000精度)
_ddsDac.dacIndex[i] %= 500000;
// 查表索引
dacIndexInt = _ddsDac.dacIndex[i] / 1000;
// 查表 + 幅度 + 偏置
_ddsDac.dacCCR[i] = sinTable[dacIndexInt] * amp / 65536 + bias;

这里的关键设计:

  • 500000 = 500(查找表点数)× 1000(小数精度3位)
  • 相位累加器为32位无符号整数,通过取模实现周期循环
  • 除以1000去掉小数部分,得到查找表索引
  • 最终输出值 = 查表值 × 幅度 / 65536 + 偏置

多通道相位同步

同频通道共享通道0的相位累加器,仅叠加相位偏移:

c 复制代码
phase_offset = phase * 500000 / 360;

通过这种方式实现多通道相位同步输出note_63。


四、自定义DDS波形:10000点查找表

自定义DDS模式从ddsDatas[]数组循环查表输出note_63。用户可以上传最多10000点的任意波形数据,固件按设定的频率循环输出。

这比早期DABL7689采集卡的200点查找表note_69和DABL7606的查找表容量大幅提升,可以表达更复杂的波形细节。


五、三角波与方波

三角波

线性上升→线性下降,直接通过数学计算生成,不需要查找表note_63。

方波

根据占空比判断高低电平,直接输出对应DAC值note_63。

可调参数包括word_3:

  • 频率(freq)
  • 幅度(volt)
  • 占空比(duty)
  • 偏置(bias)

六、DAC输出率与资源调度

DAC输出率由TIM14定时器控制,范围1000~10000Hznote_63。当DAC和PWM同时工作时,在线ADC采集的采样率会被限制在30kHz以下,以出让资源给DAC和PWM外设note_63。

这是D223固件层面的资源调度策略------在多功能并行时主动降速,确保系统稳定性优先。


七、与其他型号的对比

型号 DAC方案 通道数 分辨率 输出范围 自定义波形点数
DABL7606 PWM + RC低通滤波 4 10位 0-5V -
DABL-G511 TI-REF5050 + DAC 4 16位 0-10V -
DABM-D223 TI-REF5050 + DAC 4 16位 0-5V 10000点

D223在DAC方面相比DABL7606有显著提升:从10位PWM滤波升级为16位真DAC芯片,并支持10000点自定义DDS波形img_147note_244。


八、总结

D223的DDS信号发生器实现了:

  1. 4通道独立控制:每个通道可独立设置波形类型、频率、幅度、偏置
  2. 6种波形模式:直流、正弦、三角、方波、自定义DDS、校准
  3. 10000点自定义查找表:远超早期产品,支持复杂波形
  4. 多通道相位同步:同频通道共享相位累加器,可设置相位偏移
  5. 16位真DAC输出:TI-REF5050基准源,0-5V可编程输出

一块采集卡既能采又能发,这才是"一块板子干一个实验室的活"。


下篇预告:《D223的SRAM硬件记录仪:外部触发与瞬态波形捕获》

相关推荐
jiecy8 小时前
在 ARM 的 UOS 系统里布署 WebDav
arm开发·docker·debian
女神下凡10 小时前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范
起个网名真难~20 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
这个DBA有点耶21 小时前
1亿条向量内存降95.4%,延迟降80%:金仓AI原生内核真能解决RAG痛点?
数据库·人工智能·开源
Zevalin爱灰灰21 小时前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
小李不想当小白1 天前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
鶴哥只手遮天1 天前
Angular 22 源码级深度解析-第 06 章 模板指令全解:`ɵɵelementStart`、`ɵɵproperty`、`ɵɵadvance` 与绑定指令
前端·开源·angular.js
AI日报派送佬1 天前
2026年11月01日AI行业日报|可灵AI198亿融资落地、DeepSeek开源超级智能体、Anthropic取消Ultra时长限制
人工智能·开源·openai·deepseek·anthropic·ai日报
miofly1 天前
Mistral Large 4发布,万亿参数模型的编码与安全实测数据
开源·github
SL_staff1 天前
10人团队如何用轻量私有化文档平台实现知识复用提效?技术视角拆解B/S架构下的协作闭环
java·开源·全栈