stm32pwm波合成正弦波
时间: 2025-07-01 11:30:37 浏览: 20
### STM32 PWM 合成正弦波的实现方法
利用 STM32 的 PWM 功能生成正弦波是一种常见的嵌入式开发技术,广泛应用于信号处理、通信系统和电机控制等领域。以下是基于 PWM 合成正弦波的详细实现方案[^4]。
#### 1. 硬件准备
为了实现 PWM 合成正弦波,需要以下硬件配置:
- 开发板:STM32F103ZET6 核心板。
- 外设资源:TIM2 定时器(用于生成 PWM 信号)。
- 输出通道:PA0 或其他可配置为 PWM 输出的 GPIO 引脚。
- 滤波电路:RC 低通滤波器,用于平滑 PWM 信号并生成模拟正弦波。
硬件连接示例如下:
```plaintext
STM32F103ZET6 RC 滤波器 示波器
PA0 (PWM_OUT) ----> RC 滤波器 ------> CH1
GND ---------------- GND -------------- GND
```
#### 2. 软件实现步骤
以下是基于 HAL 库的软件实现方案:
##### (1)初始化定时器 TIM2
配置 TIM2 为 PWM 模式,并设置其计数频率和分辨率。假设目标正弦波频率为 1kHz,则 PWM 频率应远高于此值以确保波形平滑性[^5]。
代码示例:
```c
// 初始化 TIM2 为 PWM 模式
void MX_TIM2_Init(void)
{
TIM_HandleTypeDef htim2;
// 配置 TIM2 基础参数
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 设置预分频器,使计数频率为 1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 设置周期值,PWM 频率为 1kHz
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
// 配置通道 1 为 PWM 模式
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始占空比为 0
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
}
```
##### (2)生成正弦波数据表
通过数学计算生成正弦波的占空比数据表。假设正弦波周期为 1ms,则可以将一个周期分为 100 个点,每个点对应一个 PWM 占空比。
代码示例:
```c
#define SINE_WAVE_POINTS 100
uint16_t sine_wave_table[SINE_WAVE_POINTS];
void GenerateSineWaveTable(void)
{
for (int i = 0; i < SINE_WAVE_POINTS; i++)
{
float angle = (float)i / SINE_WAVE_POINTS * 2 * 3.141592653589793f; // 计算角度
float value = sin(angle); // 计算正弦值
sine_wave_table[i] = (uint16_t)((value + 1.0f) / 2.0f * 1000.0f); // 映射到 0~1000
}
}
```
##### (3)动态更新 PWM 占空比
在定时中断中,依次读取正弦波数据表中的值,并将其赋给 PWM 的占空比寄存器。
代码示例:
```c
volatile uint8_t sine_index = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, sine_wave_table[sine_index]); // 更新占空比
sine_index = (sine_index + 1) % SINE_WAVE_POINTS; // 循环索引
}
}
```
##### (4)添加低通滤波器
由于 PWM 信号本质上是数字脉冲序列,需通过低通滤波器将其转换为平滑的模拟正弦波。推荐使用二阶 RC 滤波器,截止频率约为 22.34kHz[^5]。
#### 3. 注意事项
- **PWM 频率选择**:PWM 频率应足够高以避免人耳感知到高频噪声,同时满足低通滤波器的设计要求。
- **滤波器设计**:滤波器的截止频率应远低于目标正弦波频率的 1/10,以确保波形不失真[^4]。
- **资源占用**:相比于 DAC 方法,PWM 合成正弦波不依赖专用外设,但需要额外的滤波硬件。
---
阅读全文
相关推荐


















