You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在STM32中优化BLDC电机的SPWM驱动

BLDC驱动器SPWM优化与实现问题

近几个月自制了一款BLDC电机驱动器,首次进行相关软件开发,经验不足。近3天用该驱动器驱动BLDC电机时,相比家中成品BLDC ESC驱动器,电机振动更明显、发热更严重,电流也略高,噪音大,无法达到理想运行状态。观察成品ESC发现其采用JY01集成电路,通过以下SPWM方式驱动:

JY01 SPWM驱动波形

现寻求在STM32中实现该SPWM驱动方式的方法,或优化现有代码以实现电机正常驱动。

现有代码如下:

#define PI 3.14159265359
#define PWM_MAX 100 // 假设TIM8 ARR = 999对应100%占空比
#define TABLE_SIZE 360

int sineTable[360] = { //手动生成的正弦表  
    0, 24, 51, 49, 73, 97, 122, 146, 170, 194,
    218, 242, 266, 289, 313, 336, 359, 382, 404, 427,
    449, 470, 492, 513, 534, 555, 575, 595, 614, 633,
    652, 670, 688, 706, 723, 740, 756, 772, 787, 802,
    816, 830, 844, 856, 869, 881, 892, 903, 913, 922,
    932, 940, 948, 955, 962, 969, 974, 979, 984, 988,
    991, 994, 996, 997, 998, 999, 998, 997, 996, 994,
    991, 988, 984, 979, 974, 969, 962, 955, 948, 940,
    932, 922, 913, 903, 892, 881, 869, 856, 844, 830,
    816, 802, 787, 772, 756, 740, 723, 706, 688, 670,
    652, 633, 614, 595, 575, 555, 534, 513, 492, 470,
    449, 427, 404, 382, 359, 336, 313, 289, 266, 242,
    218, 194, 170, 146, 122, 97, 73, 49, 24, 0,
    -24, -49, -73, -97, -122, -146, -170, -194, -218, -242,
    -266, -289, -313, -336, -359, -382, -404, -427, -449, -470,
    -492, -513, -534, -555, -575, -595, -614, -633, -652, -670,
    -688, -706, -723, -740, -756, -772, -787, -802, -816, -830,
    -844, -856, -869, -881, -892, -903, -913, -922, -932, -940,
    -948, -955, -962, -969, -974, -979, -984, -988, -991, -994,
    -996, -997, -998, -999, -998, -997, -996, -994, -991, -988,
    -984, -979, -974, -969, -962, -955, -948, -940, -932, -922,
    -913, -903, -892, -881, -869, -856, -844, -830, -816, -802,
    -787, -772, -756, -740, -723, -706, -688, -670, -652, -633,
    -614, -595, -575, -555, -534, -513, -492, -470, -449, -427,
    -404, -382, -359, -336, -313, -289, -266, -242, -218, -194,
    -170, -146, -122, -97, -73, -49, -24, 0
};

// 预计算正弦查找表
uint16_t stepIndex = 0; // 正弦波生成的角度步长

void generateSPWM() {
    // 更新相位偏移
    stepIndex = (stepIndex + 1) % TABLE_SIZE;

    // 获取三相正弦波值,相位差120°
    int SINE_A_PWM = sineTable[stepIndex];
    int SINE_B_PWM = sineTable[(stepIndex + 120) % TABLE_SIZE];
    int SINE_C_PWM = sineTable[(stepIndex + 240) % TABLE_SIZE];

    // 设置各相PWM占空比
    __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, SINE_A_PWM * 0.12);
    __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, SINE_B_PWM * 0.12);
    __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, SINE_C_PWM * 0.12);

}

// 定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM8) {
        generateSPWM(); // 定时器溢出时生成SPWM
    }
}
/* USER CODE END 0 */

/**
  * @brief  应用程序入口函数
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU配置--------------------------------------------------------*/

  /* 重置所有外设,初始化Flash接口和SysTick */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* 配置系统时钟 */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* 初始化所有配置的外设 */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_SPI3_Init();
  MX_TIM2_Init();
  MX_ADC1_Init();
  MX_I2C2_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(GPIOB, RUNL_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET); // 启用半桥1
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); // 启用半桥2
  HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_3);
  // 启动PWM信号
  HAL_TIM_Base_Start_IT(&htim8);
  /* USER CODE END 2 */

  /* 无限循环 */
  /* USER CODE BEGIN WHILE */
  while(1){

  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */
}

当前代码借助ChatGPT及他人帮助编写,驱动电机时振动、噪音、发热情况严重,电流值偏高,无法达到理想运行状态。


内容的提问来源于stack exchange,提问作者SergenX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:10:54