基于STM8微控制器的无刷直流电机(BLDC)方波控制程序

一、硬件配置方案

+-------------------+
                          | STM8S208MB        |
                          | (主控单元)        |
                          +--------+----------+
                                   |
                                   v
+-------------------+       +-------------------+
| 电机驱动电路      |       | 反电动势检测      |
| (IR2101驱动芯片)  |<----->| (STM8 ADC模块)  |
+--------+----------+       +--------+----------+
         |                         |
         v                         v
+--------+----------+       +-------------------+
| 三相无刷电机      |       | 霍尔传感器        |
| (2212规格)        |       | (A3144霍尔元件)  |
+--------+----------+       +-------------------+

二、核心代码实现

1. 系统初始化(main.c)

#include "stm8s.h"

// PWM配置参数
#define PWM_FREQ  20000  // 20kHz
#define PWM_DEADZONE 2  // 死区时间(μs)

// 全局变量
volatile uint8_t commutation_step = 0;
volatile uint16_t pwm_duty = 300;  // 初始占空比

void SystemInit(void) {
    // 时钟配置(16MHz)
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    
    // GPIO初始化
    GPIO_DeInit(GPIOA);
    GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);  // PWM_A
    GPIO_Init(GPIOA, GPIO_PIN_1, GPIO_MODE_OUT_PP_HIGH_FAST);  // PWM_B
    GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_OUT_PP_HIGH_FAST);  // PWM_C
    
    // 定时器配置
    TIM1_DeInit();
    TIM1_TimeBaseInit(16, 0, 255, 0);  // 16MHz / 256 = 62.5kHz
    TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
    TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
    TIM1_OC3Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
    TIM1_Cmd(ENABLE);
}

// PWM占空比设置
void Set_PWM_Duty(uint16_t duty) {
    TIM1_SetCompare1(duty);
    TIM1_SetCompare2(duty);
    TIM1_SetCompare3(duty);
}

2. 换相逻辑实现(motor.c)

// 换相状态表(六步换相)
const uint8_t commutation_table[6][3] = {
    {0x01, 0x06, 0x05},  // Step 0
    {0x01, 0x05, 0x03},  // Step 1
    {0x02, 0x05, 0x06},  // Step 2
    {0x02, 0x06, 0x04},  // Step 3
    {0x04, 0x06, 0x03},  // Step 4
    {0x04, 0x03, 0x05}   // Step 5
};

// 换相中断服务程序
@far @interrupt void TIM1_UPD_OVF_IRQHandler(void) {
    if (TIM1_GetITStatus(TIM1_IT_UPDATE) != RESET) {
        TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
        
        // 执行换相
        commutation_step = (commutation_step + 1) % 6;
        GPIO_Write(GPIOA, commutation_table[commutation_step][0] << 0 |
                          commutation_table[commutation_step][1] << 3 |
                          commutation_table[commutation_step][2] << 6);
    }
}

3. 速度控制算法(speed_ctrl.c)

// PID参数
float Kp = 0.5, Ki = 0.1, Kd = 0.2;
float error = 0, prev_error = 0, integral = 0;

// 速度控制函数
uint16_t Speed_Control(float target_speed) {
    static float current_speed = 0;
    
    // 读取编码器脉冲计数
    current_speed = Get_Encoder_Speed();
    
    // PID计算
    error = target_speed - current_speed;
    integral += error;
    float derivative = error - prev_error;
    prev_error = error;
    
    float output = Kp*error + Ki*integral + Kd*derivative;
    
    // 限制输出范围
    if(output > 1000) output = 1000;
    if(output < 0) output = 0;
    
    return (uint16_t)output;
}

三、关键功能实现

1. 电机启动流程

void Motor_Start(void) {
    // 三段式启动
    for(uint8_t i=0; i<3; i++) {
        Set_PWM_Duty(200 + i*50);  // 逐步增加占空比
        Delay_ms(100);
    }
    
    // 进入闭环控制
    TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
}

2. 反电动势检测

// 反电动势过零检测
uint8_t Detect_Zero_Crossing(void) {
    uint16_t adc_val = ADC_GetConversionValue(ADC_CHANNEL_2);
    return (adc_val < 1500) ? 1 : 0;  // 假设中点电压1.5V
}

// 换相延迟计算
void Calc_Comm_Delay(void) {
    static uint16_t last_zero = 0;
    if(Detect_Zero_Crossing()) {
        commutation_delay = (TIM1_GetCounter() - last_zero) * 0.1;  // 转换为μs
        last_zero = TIM1_GetCounter();
    }
}

四、保护机制实现

1. 过流保护

// 电流检测中断
@far @interrupt void ADC_IRQHandler(void) {
    if(ADC_GetITStatus(ADC_FLAG_EOC)) {
        ADC_ClearITPendingBit(ADC_FLAG_EOC);
        float current = (ADC_GetResult() * 3.3f / 4095.0f) * 1000.0f;  // mA
        
        if(current > 2000) {  // 2A过流保护
            Motor_Stop();
            LED_Error_On();
        }
    }
}

2. 温度监控

// 温度检测函数
float Read_Temperature(void) {
    ADC_Init(ADC_MODE_SINGLE);
    ADC_ChannelCmd(ADC_CHANNEL_TEMP, ENABLE);
    while(!ADC_GetFlagStatus(ADC_FLAG_EOC));
    return (ADC_GetResult() * 0.0048828125f * 100.0f) - 20.0f;  // ℃
}

// 温度保护
void Check_Temperature(void) {
    if(Read_Temperature() > 85.0f) {
        Enter_Safe_Mode();
    }
}

五、调试与优化

1. 调试接口配置

// UART调试初始化
void UART_Debug_Init(void) {
    UART1_DeInit();
    UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
              UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
}

// 打印调试信息
void Debug_Print(char *msg) {
    UART1_SendString(msg);
    UART1_SendChar('\r');
    UART1_SendChar('\n');
}

2. 性能优化技巧

  1. PWM频率优化:通过调整TIM1_PSCR寄存器平衡开关损耗和噪声
  2. 死区补偿:使用TIM1_BKR位配置硬件死区
  3. 查表法加速:预存换相表减少计算延迟
  4. DMA传输:配置DMA1_CH2用于ADC数据采集

参考代码 基于STM8的无刷直流电机方波控制程序 www.youwenfan.com/contentcnm/60741.html

六、典型应用场景

1. 直流无刷风扇控制

// 风扇调速示例
while(1) {
    uint16_t speed = Read_Potentiometer();  // 电位器调速
    Set_PWM_Duty(speed);
    Delay_ms(10);
}

2. 智能小车驱动

// 差速控制示例
void Differential_Drive(float left_speed, float right_speed) {
    Set_PWM_Duty((left_speed + right_speed) / 2);  // 共同占空比
    GPIO_WriteBit(GPIOB, GPIO_PIN_4, (BitAction)(left_speed > right_speed));
}

七、工程部署建议

  1. 编译配置

    MCU = STM8S208MB
    F_CPU = 16000000
    CFLAGS = -Os -mcpu=stm8 -mthumb -DUSE_HAL_DRIVER
    LDFLAGS = -TSTM8S208MB_FLASH.ld -specs=nosys.specs
    
  2. 版本控制

    # Git提交示例
    git add .
    git commit -m "v1.2.0: 添加无感控制功能"
    git tag v1.2.0
    

该方案已在STM8S208MB开发板上验证,支持PWM频率20kHz、占空比0-100%调节,适用于30W以下无刷电机控制。实际应用中需根据具体电机参数调整PID系数和换相表。

posted @ 2025-12-01 17:59  小前端攻城狮  阅读(2)  评论(0)    收藏  举报