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值
}
}
关键功能说明:
-
换相控制:
- 使用霍尔传感器检测转子位置(6步换相)
- 换相表定义了每个霍尔状态对应的MOSFET开关组合
- 互补PWM输出配合死区时间防止短路
-
PWM配置:
- 使用高级定时器TIM1生成三路互补PWM
- 72MHz时钟下产生约1kHz PWM频率(可调整TIM_Period值改变)
- 10步死区时间(约720ns)保护MOSFET
-
霍尔信号处理:
- PC13/14/15引脚响应霍尔信号跳变
- 每次信号变化触发中断执行换相
- 滤波电路需硬件实现(软件可添加延时消抖)
使用说明:
-
硬件连接:
- PWM输出连接驱动芯片(如IR2136)输入端
- 霍尔传感器接入PC13-15(可修改端口)
- 低端MOSFET由定时器自动控制互补通道
-
调速方式:
- 修改全局变量
duty值(范围0-1000对应占空比0-100%) - 实际应用应通过ADC采样电位器或接收串口命令调速
- 修改全局变量
-
保护功能扩展:
- 添加过流检测(TIM1刹车功能)
- 温度监控(ADC采样NTC)
- 堵转检测(监控换相周期)
注意:实际使用时需根据电机特性调整:
- 死区时间(影响效率与安全)
- PWM频率(建议8-20kHz)
- 换相延迟角(优化扭矩性能)
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
基于ARM的32位MCU芯片STM32F103x4/103x6
基于ARM的32位MCU芯片STM32F103x4/103x6
资料下载
jf_42320578
2021-05-21 15:32:12
STM32F103 BLDC直流无刷电机开发驱动板电路原理图和PCB图免费下载
本文档的主要内容详细介绍的是STM32F103BLDC直流无刷电机开发驱动板电路原理图和PCB图免费下载。
资料下载
你好明天卍
2019-03-29 08:00:00
ch32f103和stm32的区别
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
怎样去制作一款基于STM32F103的无刷电机(BLDC)控制器?
怎样去制作一款基于STM32F103的无刷电机(BLDC)控制器?基于STM32F103的无刷电机(
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 芯片的工作原理是什么?
- ssd是什么意思
- 什么是蓝牙?它的主要作用是什么?
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- dtmb信号覆盖城市查询
- 怎样挑选路由器?
- 华为芯片为什么受制于美国?
- 元宇宙概念股龙头一览
- type-c四根线接法图解
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- BLDC电机技术分析
- 复位电路的原理及作用
- dsp是什么意思?有什么作用?
- iphone13promax电池容量是多少毫安
- 苹果无线充电器怎么使用?
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 传感器常见类型有哪些?
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机