|
|
一、先算清楚:当前方案的瓶颈(为什么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) | 极限光滑频率 | 实际推荐频率 | | 10 | 240 | 20kHz | ≤15kHz | | 32 | 240 | 62.5kHz | ≤50kHz | | 64 | 240 | 31.25kHz | ≤25kHz | | 128 | 240 | 15.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时钟频率、加硬件低通滤波,三者缺一不可。
|
|