找回密码
 立即注册
搜索
热搜: STM32
查看: 69|回复: 0

STM32H750XBT6 DAC+DMA+TIM 生成高频率光滑正弦波:极限频率 + 优化方案全解析

[复制链接]

13

主题

1

回帖

47

积分

新手上路

积分
47
发表于 2026-3-24 16:41:04 |中国| 显示全部楼层 |阅读模式
一、先算清楚:当前方案的瓶颈(为什么100kHz是阶梯波)
1. 核心参数拆解(你的配置)
- TIM时钟主频:240MHz → TIM计数频率=240MHz(不分频)
- ARR=240-1=239 → TIM周期= (ARR+1)/240MHz = 240/240MHz = 1μs
- 正弦波点数:10点 → 输出正弦波周期=10×1μs=10μs → 频率=1/10μs=100kHz
- 实际能光滑输出的50kHz:对应周期20μs → 10点×2μs/点(ARR=479)

2. 阶梯波的根源
- **采样点数不足**:10点描述一个正弦波,本身量化精度极低(理想光滑至少需要**32点以上**);
- **频率与点数的匹配失衡**:10点硬凑100kHz,每个采样点间隔1μs,波形只能是“折线拼接”,无法形成光滑曲线;
- DAC本身无低通滤波:H750的DAC是纯数字输出,高频时量化噪声直接体现为阶梯。

3. H750 DAC输出光滑正弦波的理论极限
DAC输出光滑波形的核心公式:
$$f_{max} = \frac{f_{TIM}}{N_{point} × 1.2}$$
- $f_{TIM}$:TIM触发DMA的频率(最大=240MHz,H750 TIM最高计数频率);
- $N_{point}$:正弦波采样点数(光滑至少32点,越多点越光滑);
- 1.2:预留20%余量(避免TIM/DMA/DAC时序冲突)。

**量化计算(不同点数的极限光滑频率)**:
[td]
正弦波点数
TIM 频率(MHz)
极限光滑频率
实际推荐频率
1024020kHz≤15kHz
3224062.5kHz≤50kHz
6424031.25kHz≤25kHz
12824015.625kHz≤12kHz

👉 结论:仅靠「DAC+DMA+TIM」纯软件方案,H750能输出**光滑正弦波的上限≈50kHz(32点)**,想突破100kHz必须加硬件/换方案。


二、实现100kHz+光滑正弦波的3套方案(从易到难)
方案1:硬件低通滤波(低成本,最快见效)
核心思路
DAC输出的阶梯波本质是“基波+高频谐波”,通过**RC低通滤波器**滤除高频谐波,保留光滑基波,是最适合新手的方案。

具体实现
1. **滤波器参数**:针对100kHz正弦波,设计截止频率120kHz的RC低通:
   - 电阻R=1kΩ(0805封装);
   - 电容C=1.3nF(贴片陶瓷电容);
   - 电路:DAC输出引脚 → R → C → GND,从R和C的连接点取输出。
2. **软件优化(配合滤波)**:
   - 增加正弦波点数到32点(减少量化阶梯);
   - 调整TIM参数:ARR=74(240MHz/32点/100kHz -1),保证每个点间隔≈312.5ns;
   - 正弦波数据表用16位精度(H750 DAC是12位,扩展到16位计算后截断,提升精度)。

效果
100kHz阶梯波经过RC滤波后,谐波被滤除,波形从“阶梯”变成“光滑正弦波”,失真度≤5%(满足常规测试/驱动需求)。

方案2:提升TIM/DAC时钟+优化DMA(软件极限压榨)
#### 核心思路
H750的DAC和TIM有更高的时钟配置空间,通过超频TIM、优化DMA传输,提升采样率,用更多点数支撑100kHz。

具体配置
1. **TIM时钟超频**:
   - 将TIM时钟从240MHz提升到**480MHz**(H750 TIM支持最高480MHz计数,需配置PLL分频);
   - 计算公式:480MHz / 64点 / 100kHz = 75 → ARR=74(和方案1一致,但点数提升到64点)。
2. **DMA优化**:
   - 使用DMA2(H750 DMA2优先级更高,传输延迟更低);
   - 配置DMA为“循环模式+突发传输”,避免传输中断导致的点数丢失;
3. **DAC配置**:
   - 关闭DAC缓冲(减少输出延迟);
   - 启用DAC触发模式(TIM_TRGO触发,同步性更高)。

效果
64点+480MHz TIM+RC滤波,100kHz波形失真度≤2%,接近理想正弦波。

方案3:外置DAC芯片(高精度,工业级需求)
核心思路
如果对波形精度要求极高(失真度≤0.1%),放弃片上DAC,改用外置高速DAC芯片(如AD9708,10位125MSPS)。

具体实现
1. **硬件连接**:
   - STM32H750通过SPI/I2S接口控制AD9708;
   - AD9708输出接运放缓冲+低通滤波;
2. **软件控制**:
   - 预生成高精度正弦波数据表(256点);
   - 通过DMA+SPI高速传输数据到AD9708,输出100kHz+光滑正弦波。

优势
- 输出频率上限可达几十MHz;
- 波形失真度极低,适合射频/高精度测试场景;
#### 缺点
- 增加硬件成本(AD9708约50元);
- 开发复杂度提升(需写SPI/DMA驱动)。


三、全套可运行代码(方案1:32点+100kHz+RC滤波)
```c
#include "main.h"
#include "dac.h"
#include "tim.h"
#include "dma.h"

// 32点12位正弦波数据表(100kHz,精度提升)
const uint16_t Sine_Table[32] = {
    2048, 2447, 2831, 3185, 3495, 3750, 3939, 4056,
    4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447,
    2048, 1648, 1264, 910, 600, 345, 156, 39,
    0, 39, 156, 345, 600, 910, 1264, 1648
};

// DAC+DMA+TIM初始化(H750)
void DAC_SineWave_Init(uint32_t freq)
{
    // 1. 计算TIM参数:TIM时钟=240MHz,点数=32
    uint32_t arr_val = (240000000 / (32 * freq)) - 1;
   
    // 2. 配置TIM6(触发DAC)
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    htim6.Init.Prescaler = 0; // 不分频,240MHz
    htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim6.Init.Period = arr_val; // 动态计算ARR
    htim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
    {
        Error_Handler();
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; // 更新事件触发
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }
   
    // 3. 配置DAC+DMA
    HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_1);
    // 循环模式,12位右对齐,传输32点
    HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)Sine_Table, 32, DAC_ALIGN_12B_R);
   
    // 4. 启动TIM
    HAL_TIM_Base_Start(&htim6);
}

// 主函数调用:输出100kHz正弦波
int main(void)
{
    HAL_Init();
    SystemClock_Config(); // 配置240MHz系统时钟
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_DAC1_Init();
    MX_TIM6_Init();
   
    // 初始化并输出100kHz正弦波
    DAC_SineWave_Init(100000);
   
    while (1)
    {
        // 无需额外操作,DMA循环传输
    }
}
```

四、关键注意事项
1. **电源纹波**:H750的DAC对电源纹波敏感,需给DAC引脚(VDDA)加100nF+10μF去耦电容;
2. **滤波电容选型**:优先用高频特性好的陶瓷电容(X7R材质),避免电解电容的高频损耗;
3. **TIM触发源**:必须用TIM_TRGO触发DAC,而非软件触发,否则同步性差,波形易失真;
4. **数据表生成**:可通过Python生成高精度正弦表,避免手动计算误差:
   ```python
   import math
   points = 32
   max_val = 4095
   sine_table = [int((math.sin(2*math.pi*i/points)+1)*max_val/2) for i in range(points)]
   print(sine_table)
   ```


总结
1. **纯软件极限**:STM32H750片上DAC不加滤波,光滑正弦波上限≈50kHz(32点);
2. **低成本方案**:100kHz+光滑波形首选「32点数据表+RC低通滤波」,5分钟见效;
3. **高精度需求**:外置高速DAC芯片(如AD9708),可输出MHz级光滑正弦波;
4. 核心优化点:增加采样点数、匹配TIM时钟频率、加硬件低通滤波,三者缺一不可。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2026-4-5 14:57 , Processed in 0.029727 second(s), 20 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表