电机控制器,低压无感BLDC方波控制,全部源码,方便调试移植! 1.通用性极高,图片中的电机,一套参数即可启动。 2. ADC方案 3.电转速最高12w 4.电感法和普通三段式 5.按键启动和调速 6.开环,速度环,限流环 7.参数调整全部宏定义,方便调试! 代码全部源码

最近在做一个电机控制器的项目,主要针对低压无感BLDC电机的方波控制。经过一段时间的调试和优化,终于把整个方案稳定下来了。今天就来分享一下这个方案的核心思路和代码实现,希望能给有类似需求的朋友们一些参考。


项目背景

这个方案的核心目标是实现一个通用性高、易于调试和移植的BLDC电机控制器。BLDC(Brushless DC Motor,无刷直流电机)因其高效、耐用的特点,被广泛应用于各种场景。而方波控制作为一种经典的控制方式,虽然精度不如正弦波控制,但在成本和实现难度上更具优势。

方案特点

  1. 通用性极高:一套参数即可启动不同型号的电机,极大简化了调试过程。
  2. ADC方案:采用ADC(模数转换器)采集相电流,用于电机的转速计算和电流检测。
  3. 高电转速支持:电转速最高可达12万转/分钟,满足高性能应用场景。
  4. 电感法和普通三段式:支持两种不同的控制方式,用户可以根据需求灵活选择。
  5. 按键启动和调速:通过按键实现电机的启动、停止和调速功能,操作简单直观。
  6. 多环控制:支持开环、速度环和限流环,满足不同控制需求。
  7. 参数调整方便:所有参数均通过宏定义实现,方便用户快速调整。

核心代码实现

1. ADC配置与采样

ADC用于采集相电流信号,是整个控制方案的重要组成部分。

// ADC初始化配置
void ADC_Init(void) {
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA和ADC1的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
    
    // 配置ADC输入通道
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 例如,PA0作为ADC输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置ADC
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
}

// 采样相电流
uint16_t Read_Phase_Current(void) {
    ADC_Cmd(ADC1, ENABLE); // 启动ADC
    ADC_SoftwareStartConv(ADC1); // 软件触发采样
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 等待采样完成
    return ADC_GetConversionValue(ADC1); // 获取采样值
}

2. 方波控制核心逻辑

方波控制的核心是根据电机的转子位置生成PWM信号。

// 计算电角度
void Calculate_Electrical_Angle(void) {
    static uint16_t last_counter = 0;
    uint16_t current_counter = Timer_GetCounterValue(); // 获取定时器计数值
    uint16_t delta = current_counter - last_counter;
    
    // 根据计数值计算电角度
    electrical_angle += delta * KP;
    if (electrical_angle >= 360) {
        electrical_angle -= 360;
    }
    last_counter = current_counter;
}

// 生成PWM信号
void Generate_PWM(void) {
    uint16_t pwm_value = 0;
    
    // 根据电角度计算PWM占空比
    if (electrical_angle < 60) {
        pwm_value = Duty_Cycle;
    } else if (electrical_angle < 120) {
        pwm_value = 0;
    } else if (electrical_angle < 180) {
        pwm_value = Duty_Cycle;
    } else if (electrical_angle < 240) {
        pwm_value = 0;
    } else if (electrical_angle < 300) {
        pwm_value = Duty_Cycle;
    } else {
        pwm_value = 0;
    }
    
    // 输出PWM信号
    Set_PWM_Output(pwm_value);
}

3. 转速计算与控制

通过采样周期计算电机的转速,并根据需求调整PWM占空比。

// 计算电机转速
void Calculate_Speed(void) {
    static uint32_t last_time = 0;
    uint32_t current_time = Get_Current_Time();
    uint32_t period = current_time - last_time;
    
    // 计算转速(转/分钟)
    speed = (60 * 1000) / period;
    
    // 限制转速
    if (speed > MAX_SPEED) {
        speed = MAX_SPEED;
    }
    
    last_time = current_time;
}

// 转速控制
void Speed_Control(void) {
    if (speed < TARGET_SPEED) {
        Duty_Cycle += 1; // 提高占空比
    } else if (speed > TARGET_SPEED) {
        Duty_Cycle -= 1; // 降低占空比
    }
    
    // 限制占空比范围
    if (Duty_Cycle > 100) {
        Duty_Cycle = 100;
    } else if (Duty_Cycle < 0) {
        Duty_Cycle = 0;
    }
}

方案优势总结

  1. 通用性强:一套参数即可适配多种电机,减少了重复调试的工作量。
  2. 高电转速支持:最高支持12万转/分钟,满足高性能需求。
  3. 多种控制方式:支持电感法和普通三段式,用户可以根据需求灵活选择。
  4. 按键操作:通过按键实现启动、停止和调速,操作简单直观。
  5. 多环控制:支持开环、速度环和限流环,满足不同控制需求。
  6. 参数调整方便:所有参数均通过宏定义实现,方便用户快速调整。

总结

这个低压无感BLDC方波控制方案经过多次调试和优化,已经非常稳定,适合用于各种应用场景。代码完全开源,方便大家直接使用和移植。如果大家在使用过程中有任何问题,欢迎随时交流!

电机控制器,低压无感BLDC方波控制,全部源码,方便调试移植! 1.通用性极高,图片中的电机,一套参数即可启动。 2. ADC方案 3.电转速最高12w 4.电感法和普通三段式 5.按键启动和调速 6.开环,速度环,限流环 7.参数调整全部宏定义,方便调试! 代码全部源码

代码下载地址点击下载

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐