[STM32F4] PWM信号如何正确调制为正弦波形。

[复制链接]
1622|5
 楼主| 发的非官方的 发表于 2024-8-16 13:37 | 显示全部楼层 |阅读模式
将PWM信号正确调制为正弦波形需要使用正弦脉宽调制(SPWM)技术。SPWM通过调整PWM信号的占空比,使其在一个周期内近似为正弦波形。以下是详细的步骤和示例代码,展示如何在STM32上实现SPWM。

1. 正弦查找表
首先,创建一个正弦波查找表,用于生成SPWM信号。查找表中的值表示正弦波在一个周期内的不同时刻对应的幅值。

c
#define SINE_TABLE_SIZE 256  // 查找表大小

// 正弦查找表
const uint16_t sineTable[SINE_TABLE_SIZE] = {
    2048, 2098, 2148, 2198, 2248, 2298, 2348, 2397, 2447, 2496, 2545, 2594, 2642, 2691, 2738, 2786,
    2833, 2880, 2926, 2972, 3018, 3063, 3108, 3152, 3195, 3238, 3281, 3323, 3364, 3405, 3445, 3484,
    3523, 3561, 3598, 3635, 3671, 3706, 3740, 3773, 3806, 3837, 3868, 3898, 3927, 3955, 3982, 4008,
    4033, 4057, 4080, 4102, 4123, 4143, 4161, 4179, 4195, 4210, 4224, 4237, 4249, 4259, 4269, 4277,
    4283, 4289, 4293, 4296, 4298, 4299, 4299, 4298, 4296, 4293, 4289, 4283, 4277, 4269, 4259, 4249,
    4237, 4224, 4210, 4195, 4179, 4161, 4143, 4123, 4102, 4080, 4057, 4033, 4008, 3982, 3955, 3927,
    3898, 3868, 3837, 3806, 3773, 3740, 3706, 3671, 3635, 3598, 3561, 3523, 3484, 3445, 3405, 3364,
    3323, 3281, 3238, 3195, 3152, 3108, 3063, 3018, 2972, 2926, 2880, 2833, 2786, 2738, 2691, 2642,
    2594, 2545, 2496, 2447, 2397, 2348, 2298, 2248, 2198, 2148, 2098, 2048, 1998, 1948, 1898, 1848,
    1798, 1749, 1700, 1651, 1602, 1553, 1505, 1456, 1408, 1361, 1313, 1266, 1219, 1173, 1127, 1082,
    1037,  992,  948,  905,  862,  819,  777,  736,  695,  654,  614,  575,  536,  498,  461,  424,
     388,  353,  319,  285,  252,  219,  188,  157,  127,   98,   70,   43,   16,    1,    0,    0,
       0,    0,    0,    1,   16,   43,   70,   98,  127,  157,  188,  219,  252,  285,  319,  353,
     388,  424,  461,  498,  536,  575,  614,  654,  695,  736,  777,  819,  862,  905,  948,  992,
    1037, 1082, 1127, 1173, 1219, 1266, 1313, 1361, 1408, 1456, 1505, 1553, 1602, 1651, 1700, 1749,
    1798, 1848, 1898, 1948, 1998, 2048
};

 楼主| 发的非官方的 发表于 2024-8-16 13:38 | 显示全部楼层
定时器配置
使用STM32的定时器模块生成PWM信号。

c
复制代码
void PWM_Init(void)
{
    TIM_HandleTypeDef htim1;
    TIM_OC_InitTypeDef sConfigOC;

    __HAL_RCC_TIM1_CLK_ENABLE();

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 0;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 4095; // 对应12位精度的PWM
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    HAL_TIM_PWM_Init(&htim1);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
 楼主| 发的非官方的 发表于 2024-8-16 13:39 | 显示全部楼层
更新PWM占空比
使用查找表更新PWM占空比,实现SPWM调制。

c
void UpdatePWM(void)
{
    static uint16_t step = 0;

    // 更新PWM占空比
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, sineTable[step]);

    // 更新步进
    step++;
    if (step >= SINE_TABLE_SIZE) {
        step = 0;
    }
}

// 主循环中定时调用UpdatePWM函数
while (1)
{
    UpdatePWM();
    HAL_Delay(1); // 根据需要调整延时,控制频率
}
 楼主| 发的非官方的 发表于 2024-8-16 13:40 | 显示全部楼层
完整代码
将以上各部分组合起来,形成完整的PWM生成和正弦波调制代码。

c
#include "stm32f4xx_hal.h"

#define SINE_TABLE_SIZE 256

const uint16_t sineTable[SINE_TABLE_SIZE] = {
    // 正弦查找表值
    2048, 2098, 2148, 2198, 2248, 2298, 2348, 2397, 2447, 2496, 2545, 2594, 2642, 2691, 2738, 2786,
    2833, 2880, 2926, 2972, 3018, 3063, 3108, 3152, 3195, 3238, 3281, 3323, 3364, 3405, 3445, 3484,
    3523, 3561, 3598, 3635, 3671, 3706, 3740, 3773, 3806, 3837, 3868, 3898, 3927, 3955, 3982, 4008,
    4033, 4057, 4080, 4102, 4123, 4143, 4161, 4179, 4195, 4210, 4224, 4237, 4249, 4259, 4269, 4277,
    4283, 4289, 4293, 4296, 4298, 4299, 4299, 4298, 4296, 4293, 4289, 4283, 4277, 4269, 4259, 4249,
    4237, 4224, 4210, 4195, 4179, 4161, 4143, 4123, 4102, 4080, 4057,
狄克爱老虎油 发表于 2024-8-17 23:06 来自手机 | 显示全部楼层
查表法吗
grfqq325 发表于 2024-8-28 12:07 | 显示全部楼层
为了实现SPWM,首先需要生成一个正弦波查找表。这个查找表存储正弦波在一个周期内的不同时刻的幅值,用于调整PWM信号的占空比。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

77

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部