欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > STM32开发板上生成PWM正弦波

STM32开发板上生成PWM正弦波

2025/4/4 21:13:32 来源:https://blog.csdn.net/weixin_62244995/article/details/146959842  浏览:    关键词:STM32开发板上生成PWM正弦波

在STM32开发板上生成正弦波通常需要结合定时器(TIM)、数模转换器(DAC)或脉宽调制(PWM)以及时钟系统的配置。以下是分步指南:


方法1:使用DAC + 定时器(推荐)

步骤1:配置时钟系统
  1. 使用STM32CubeMX或直接配置寄存器,确保系统时钟(SYSCLK)足够高(例如72MHz)。
  2. 配置定时器的时钟源(如APB1或APB2总线时钟)。
    • 例如,若使用APB1定时器(TIM6/TIM7),时钟频率为72MHz。
步骤2:生成正弦波数据表
  1. 计算一个正弦周期内的采样点,例如200个点。
    #define SIN_SAMPLES 200
    uint32_t sin_table[SIN_SAMPLES];
    for (int i = 0; i < SIN_SAMPLES; i++) {sin_table[i] = (uint32_t)(2048 * (1 + sin(2 * M_PI * i / SIN_SAMPLES))); // 12-bit DAC范围:0-4095
    }
    
步骤3:配置DAC
  1. 启用DAC通道(例如DAC1通道1)。
  2. 配置DAC为定时器触发模式:
    HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_table, SIN_SAMPLES, DAC_ALIGN_12B_R);
    
步骤4:配置定时器
  1. 设置定时器为触发DAC的更新事件:
    • 定时器频率 = 正弦波频率 × 采样点数。
    • 例如,生成1kHz正弦波,采样200点,定时器频率需为200kHz。
    htim6.Instance = TIM6;
    htim6.Init.Prescaler = 72 - 1;      // 72MHz / 72 = 1MHz
    htim6.Init.Period = 5 - 1;          // 1MHz / 5 = 200kHz
    HAL_TIM_Base_Init(&htim6);
    HAL_TIM_Base_Start(&htim6);
    
步骤5:启动DAC和定时器
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_table, SIN_SAMPLES, DAC_ALIGN_12B_R);

方法2:使用PWM + 低通滤波器

步骤1:配置PWM定时器
  1. 设置定时器为PWM模式(例如TIM1或TIM3)。
  2. 调整PWM频率(载波频率建议在20kHz以上以简化滤波):
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 72 - 1;     // 72MHz / 72 = 1MHz
    htim3.Init.Period = 50 - 1;        // 1MHz / 50 = 20kHz
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    
步骤2:生成正弦波占空比表
#define SIN_SAMPLES 200
uint16_t pwm_table[SIN_SAMPLES];
for (int i = 0; i < SIN_SAMPLES; i++) {pwm_table[i] = (uint16_t)(25 * (1 + sin(2 * M_PI * i / SIN_SAMPLES))); // 占空比0-50(对应0-100%)
}
步骤3:动态更新PWM占空比

使用定时器中断或DMA更新占空比:

// 在定时器中断中更新CCR
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {static uint8_t idx = 0;__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_table[idx]);idx = (idx + 1) % SIN_SAMPLES;
}
步骤4:添加低通滤波器

在PWM输出引脚后连接RC低通滤波器(截止频率略高于目标正弦波频率)。


关键公式

  • 正弦波频率计算

    • DAC方法:正弦波频率 = 定时器触发频率 / 采样点数
    • PWM方法:正弦波频率 = 定时器更新频率 / 采样点数
  • 定时器频率计算

    • 定时器频率 = 输入时钟 / (Prescaler + 1) / (Period + 1)

注意事项

  1. 确保时钟树配置正确(使用STM32CubeMX可视化配置)。
  2. DMA可大幅降低CPU负载,推荐使用。
  3. 调整采样点数和滤波电路以优化波形质量。

通过上述步骤,即可在STM32开发板上输出高质量的正弦波。


STM32正弦波生成原理硬核总结


1. 核心原理
  • 数字信号离散化:将连续正弦波按奈奎斯特定理采样离散化,采样频率需≥2倍信号频率(实际工程中通常取5~10倍)。
  • 信号重建机制
    • DAC法:通过数模转换器直接输出量化后的电压值,实现信号重建。
    • PWM法:利用占空比的等效面积原理(Voltage-Second Balance),通过低通滤波器提取基波分量。

2. 硬件模块深度解析
(1) DAC模块
  • 工作模式
    • 单次触发:CPU手动更新数据(低效)
    • DMA循环模式:定时器触发DAC,DMA自动搬运波形表(零CPU开销)
    • 双缓冲模式:交替更新波形表,避免输出毛刺
  • 关键参数
    • 转换时间:STM32F4 DAC转换时间最低可达1μs(对应1MSPS)
    • 量化误差:12位DAC理论信噪比SNR=74dB(SNR=6.02N+1.76)
(2) PWM模块
  • 调制机制
    • 定时器CNT与CCRx比较产生可变占空比方波
    • 占空比分辨率:Resolution = log2(TIM_CLK / PWM_Freq)
    • 例如:72MHz时钟,20kHz PWM → 12位分辨率
  • 频谱特性
    • 输出频谱 = 基波 + 载波频率谐波
    • 滤波器需抑制载波频率(如20kHz)及其边带
(3) 时钟系统
  • 关键路径
    HSE → PLL → SYSCLK → APBx Prescaler → TIMx_CLK
    
  • 时钟精度影响
    • 频率误差:Δf = ±0.25%(工业级晶振典型值)
    • 长期稳定性:需考虑温漂(±50ppm/℃)

3. 数学建模
(1) 采样定理实现
  • 设目标频率f_signal,采样点数N,则:
    • 定时器触发频率:f_trigger = N * f_signal
    • 重建信号带宽:f_max = f_trigger / 2(受限于DAC/PWM响应)
(2) 波形量化误差
  • 量化台阶:ΔV = V_ref / (2^N - 1)
  • 总谐波失真(THD):
    THD ≈ 20*log10(ΔV/(2√2))  // 假设理想正弦波
    
    12位DAC理论THD≈-72dB
(3) PWM等效电压
  • 输出电压:V_avg = (CCRx / ARR) * V_dd
  • 纹波电压:V_ripple = (V_dd * T_pwm) / (8RC)(一阶RC滤波)

4. 关键设计参数
参数DAC法公式PWM法公式
定时器周期ARR = (TIM_CLK / f_trigger) - 1ARR = (TIM_CLK / f_pwm) - 1
最大信号频率f_max = TIM_CLK / (2*N)f_max = 1/(2πRC)(滤波器限制)
功耗优化点关闭未用模拟电路优化死区时间降低开关损耗

5. 误差源分析
误差类型DAC法影响PWM法影响
时钟抖动导致采样时间不确定性(孔径抖动)引起占空比调制误差
量化噪声白噪声基底,-74dB(12bit)台阶式失真,需dithering改善
非线性误差INL/DNL影响波形保真度死区时间导致谐波畸变
滤波器相位延迟无(直接输出)引入群延迟,影响实时性

6. 高阶优化技术
  • 过采样与插值
    • 4×过采样可将有效位数提升1bit
    • 使用Cubic插值算法平滑波形
  • Σ-Δ调制
    • 将PWM升级为1位Σ-Δ流,通过噪声整形降低带内噪声
  • 动态波形更新
    • 双缓冲DMA实现波形表无缝切换
    • 实时计算波形(如使用CORDIC算法)

7. 实测验证要点
  1. 频谱分析
    • 使用FFT观察THD(Total Harmonic Distortion)
    • DAC法典型THD<1%,PWM法THD≈3-5%(受滤波器影响)
  2. 瞬态响应测试
    • 阶跃响应测试重建滤波器性能
  3. 长期稳定性
    • 持续运行24小时监测频率漂移

设计选择决策树

是否需要高压/大电流输出?
├── 是 → 选择PWM+功率驱动电路
└── 否 → ├── 要求高波形质量? │   ├── 是 → 选择DAC+抗混叠滤波器│   └── 否 → 选择PWM+简易RC滤波└── 需要多通道同步?├── 是 → 使用TIM主从模式同步多个DAC└── 否 → 独立通道实现

通过上述硬核原理分析,开发者可深入理解STM32正弦波生成的本质矛盾(速度vs精度),并根据应用场景选择最优实现方案。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词