登录/注册

STM32F103BLDC程序

STM32F103BLDC程序

更多

以下是一个基于STM32F103的无刷直流电机(BLDC)控制程序框架,使用霍尔传感器进行换相控制。程序采用标准库开发,包含PWM输出、霍尔信号检测和六步换相逻辑:

#include "stm32f10x.h"

// PWM输出引脚定义
#define PWM_A_PIN    GPIO_Pin_8   // PA8 (TIM1_CH1)
#define PWM_B_PIN    GPIO_Pin_9   // PA9 (TIM1_CH2)
#define PWM_C_PIN    GPIO_Pin_10  // PA10 (TIM1_CH3)

// 霍尔传感器引脚
#define HALL_U_PIN   GPIO_Pin_15  // PC15
#define HALL_V_PIN   GPIO_Pin_14  // PC14
#define HALL_W_PIN   GPIO_Pin_13  // PC13

// 换相表 (正转顺序)
const uint8_t commutationTable[6] = {
    // HALL:UVW 相位控制(AH-BL/AL-BH等)
    0b001010,  // 001: A+ B-
    0b001001,  // 010: A+ C-
    0b010001,  // 011: B+ C-
    0b010100,  // 100: B+ A-
    0b100100,  // 101: C+ A-
    0b100010   // 110: C+ B-
};

// 霍尔信号读取
uint8_t ReadHallSensors(void) {
    return (GPIO_ReadInputDataBit(GPIOC, HALL_U_PIN) << 2) | 
           (GPIO_ReadInputDataBit(GPIOC, HALL_V_PIN) << 1) | 
            GPIO_ReadInputDataBit(GPIOC, HALL_W_Pin);
}

// PWM初始化
void PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_InitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    // 配置PWM引脚
    GPIO_InitStructure.GPIO_Pin = PWM_A_PIN | PWM_B_PIN | PWM_C_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 定时器基础设置
    TIM_InitStructure.TIM_Period = 1000-1;  // PWM频率=72MHz/(1000*PSC)
    TIM_InitStructure.TIM_Prescaler = 72-1; // 1MHz计数器
    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_InitStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseInit(TIM1, &TIM_InitStructure);

    // PWM输出配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = ENABLE;
    TIM_OCInitStructure.TIM_OutputNState = ENABLE;
    TIM_OCInitStructure.TIM_Pulse = 0;  // 初始占空比0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);

    // 互补通道和死区时间配置
    TIM_BDTRInitTypeDef BDTR_InitStructure;
    BDTR_InitStructure.TIM_DeadTime = 10;  // 死区时间=72ns*10
    BDTR_InitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    BDTR_InitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
    BDTR_InitStructure.TIM_Break = TIM_Break_Disable;
    TIM_BDTRConfig(TIM1, &BDTR_InitStructure);

    // 启动定时器
    TIM_Cmd(TIM1, ENABLE);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

// 霍尔传感器初始化
void HALL_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    // 配置霍尔引脚
    GPIO_InitStructure.GPIO_Pin = HALL_U_PIN | HALL_V_PIN | HALL_W_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    // 配置霍尔信号外部中断
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource15);

    EXTI_InitStructure.EXTI_Line = EXTI_Line13 | EXTI_Line14 | EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    // 配置中断优先级
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

// 换相函数
void Commutate(uint8_t step) {
    TIM1->CCR1 = (commutationTable[step] & 0b100000) ? duty : 0;  // A高
    TIM1->CCR2 = (commutationTable[step] & 0b010000) ? duty : 0;  // B高
    TIM1->CCR3 = (commutationTable[step] & 0b001000) ? duty : 0;  // C高

    // 配置互补通道(低端驱动)
    // 注意:低端通过自动互补通道控制
}

// 霍尔中断处理
void EXTI15_10_IRQHandler(void) {
    if(EXTI_GetITStatus(EXTI_Line13 | EXTI_Line14 | EXTI_Line15) != RESET) {
        uint8_t hallState = ReadHallSensors();
        uint8_t step = 0;

        // 霍尔值转换为换相步骤 (001-6步)
        switch(hallState) {
            case 0b001: step = 0; break;
            case 0b011: step = 1; break;
            case 0b010: step = 2; break;
            case 0b110: step = 3; break;
            case 0b100: step = 4; break;
            case 0b101: step = 5; break;
            default: return; // 无效状态
        }
        Commutate(step);
        EXTI_ClearITPendingBit(EXTI_Line13 | EXTI_Line14 | EXTI_Line15);
    }
}

// 主函数
int main(void) {
    SystemInit();
    PWM_Init();
    HALL_Init();

    uint16_t duty = 500; // 50%占空比

    while(1) {
        // 主循环可添加速度控制逻辑
        // 例如:通过PID调节duty值
    }
}

关键功能说明:

  1. 换相控制

    • 使用霍尔传感器检测转子位置(6步换相)
    • 换相表定义了每个霍尔状态对应的MOSFET开关组合
    • 互补PWM输出配合死区时间防止短路
  2. PWM配置

    • 使用高级定时器TIM1生成三路互补PWM
    • 72MHz时钟下产生约1kHz PWM频率(可调整TIM_Period值改变)
    • 10步死区时间(约720ns)保护MOSFET
  3. 霍尔信号处理

    • PC13/14/15引脚响应霍尔信号跳变
    • 每次信号变化触发中断执行换相
    • 滤波电路需硬件实现(软件可添加延时消抖)

使用说明:

  1. 硬件连接:

    • PWM输出连接驱动芯片(如IR2136)输入端
    • 霍尔传感器接入PC13-15(可修改端口)
    • 低端MOSFET由定时器自动控制互补通道
  2. 调速方式:

    • 修改全局变量duty值(范围0-1000对应占空比0-100%)
    • 实际应用应通过ADC采样电位器或接收串口命令调速
  3. 保护功能扩展:

    • 添加过流检测(TIM1刹车功能)
    • 温度监控(ADC采样NTC)
    • 堵转检测(监控换相周期)

注意:实际使用时需根据电机特性调整:

  1. 死区时间(影响效率与安全)
  2. PWM频率(建议8-20kHz)
  3. 换相延迟角(优化扭矩性能)

STM32F103VET6

1970-01-01 08:00:00 至 1970-01-01 08:00:00

STM32F103RCT6

1970-01-01 08:00:00 至 1970-01-01 08:00:00

在GD32F103移植STM32F103代码

使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。

2023-12-15 13:37:35

STM32F103芯片FFT程序

STM32F103芯片使用DSP库进行FFT运算的资料与程序。

资料下载 米一样 2022-06-07 16:30:21

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于ARM的32位MCU芯片STM32F103x4/103x6

基于ARM的32位MCU芯片STM32F103x4/103x6

资料下载 jf_42320578 2021-05-21 15:32:12

STM32F103 CAN模板程序

STM32F103 CAN模板程序

资料下载 luo 2020-11-09 11:08:07

STM32F103 BLDC直流无刷电机开发驱动板电路原理图和PCB图免费下载

本文档的主要内容详细介绍的是STM32F103BLDC直流无刷电机开发驱动板电路原理图和PCB图免费下载。

资料下载 你好明天卍 2019-03-29 08:00:00

ch32f103stm32的区别

ch32f103和stm32的区别 STM32 系列是意法半导体公司旗下的 ARM Cortex-M3 和 Cortex-M4 微控制器,系列产

2023-08-22 15:48:42

STM32使用教程 基于STM32F103RBT6的例程 STM32控制OLED例程

STM32使用教程 提供基于STM32F103RBT6的例程 硬件连接 我们提供的例程是基于STM32F103RBT6的,提供的连接方式也是对应

2022-05-05 19:44:07

NS32F103CBT6软硬件通用STM32F103CBT6

国产MCU单片机新域半导体NS32F103CBT6 替换STM32F103CBT6,目前新域半导体量产的有NSF103系列,新域半导体芯片完全P

2022-02-22 14:00:54

芯片短缺如何用HK32F103换掉STM32F103

F103做过产品的公司都在考虑国产替代,之前在公众号也分享过几款替代方案,现在国产有的供货也在涨价,并且有的货期也不好,尤其是对小公司。最近又找了一家HK的103RB用来替换

2021-11-01 14:14:48

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

怎样去制作一款基于STM32F103的无刷电机(BLDC)控制器?

怎样去制作一款基于STM32F103的无刷电机(BLDC)控制器?基于STM32F103的无刷电机(

2021-07-20 06:00:04

采用stm32f103rc的STM32最小系统

采用stm32f103rc的STM32最小系统详细解析图,如下:

2020-09-01 11:39:41

7天热门专题 换一换
相关标签