
无感无刷BLDC驱动板stm32f051k8u6+fd6288q
简介
无感无刷电机驱动板,基于https://oshwhub.com/e_ljf_v2/f051_esc工程修改 stm32f051k8u6+fd6288q,非同步整流方案测试电机,PWM上管+GPIO下管
简介:无感无刷电机驱动板,基于https://oshwhub.com/e_ljf_v2/f051_esc工程修改 stm32f051k8u6+fd6288q,非同步整流方案测试电机,PWM上管+GPIO下管开源协议
:GPL 3.0
描述
更新2025/11/28
经过Sangk-Hu指点,十分感谢,下版本修复内容如下:
1、增加为四层板获取完整地平面和更大带载能力
2、将mos管栅极电阻尽量靠近mos管放置
3、反电动势采样电路独立从UVW中引出,不走原栅极驱动路径
4、取消MOS管旁边的栅极1nf电容,减小开关损耗
5、取消泪滴操作,有地方成为了锐角,避免信号反射
6、改善线间距稍微调整线宽加大线路带载能力
项目简介
基于开源广场另一位大佬的工程修改而来,修改为自己的方案使用,不进行通讯,仅作为驱动板使用
项目功能
BLDC驱动板硬件:
NTC电阻温度采样
INA226总电源采样
FD6288Q三相驱动MOS管
BLDC驱动板程序:
由开环强托启动积累到足够反电动势信号好切换为闭环运行
基于stm32cubemx+MDK525开发,全代码带注释
软件代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_COMP2_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_ADC_Init();
MX_I2C1_Init();
MX_TIM1_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc); // ADC校准
WS2812_Init(&ESHL_StateLed,&htim1 ,TIM_CHANNEL_1,1); // 初始化ws2812b
WS2812_SetAll(&ESHL_StateLed,5,0,0); // 默认为不亮
HAL_Delay(100); // 等待INA226上电完成
INA226_init(); // 电流采样芯片初始化
ESHL_ESC_Init(); // 电调初始化
DWQ_Select_IntORExt(); // 电位器选择,用于电机调速
MOS_PowerOn_SelfTest(); // MOS管上电自检函数,检测总电路是否漏电和MOS管是否漏电
BLDC_Start_Music(); // BLDC播放开机音乐
HAL_Delay(3000); // 调试设备
if(ESHL_GetState() == ESHL_STATE_OFF) // 初始化无错误
{ ESHL_SetState(ESHL_STATE_READY); } // 将电调状态设置为准备就绪
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
ESHL_CurrAndVolt_Detection(); // 电调电流电压功率检测
ESHL_NTCAndDWQ_ADC(); // NTC温度检测和电位器调速
switch(ESHL_GetState()) // 获取电调状态
{
case ESHL_STATE_OFF: // 关闭电调
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
break;
case ESHL_STATE_READY: // 电调准备就绪
ESHL_Running_Normal_LED(); // 电调正常运行灯光,绿灯常亮
ESHL_SetState(ESHL_STATE_START); // 准备就绪以后直接进入开环启动状态
break;
case ESHL_STATE_START: // 启动电机
ESHL_Start(ESHL_GetDirection()); // 开环步骤启动电机
break;
case ESHL_STATE_OPEN_LOOP_START_FAIL: // 电调开环启动失败
if(ESHL_OpenLoopRestartNum > ESHL_OPEN_LOOP_RESTART_MAX_NUM)
{ ESHL_SetState(ESHL_STATE_OPEN_LOOP_START_ERROR); } // 超过开环最大启动次数,设置状态为开环启动失败
else // 未达到开环启动次数限制
{
ESHL_OpenLoopRestartNum++; // 开环启动次数+1
ESHL_Start(ESHL_GetDirection()); // 再次进入开环启动步骤
}
break;
case ESHL_STATE_OPEN_LOOP_START_ERROR: // 电调开环启动重试超过最大次数,无法开环启动
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
if(!BLDC_Protect_state){ BLDC_Protect_state = true; } // 当作已经触发保护,不检测电流电压温度
ESHL_OPEN_LOOP_START_ERROR_LED(); // 电调开环启动失败灯光,红1蓝3
break;
case ESHL_STATE_RUN_CLOCKWISE: // 顺时针方向运动中
ESHL_OpenLoopRestartNum = 0; // 开环重启动计数清零
ESHL_RuningChack(); // 堵转检测
ESHL_SET_PWM(ESHL_RunPWMBuff); // 更新运行PWM值
break;
case ESHL_STATE_RUN_COUNTER_CLOCKWISE: // 逆时针方向运动中
ESHL_OpenLoopRestartNum = 0; // 开环重启动计数清零
ESHL_RuningChack(); // 堵转检测
ESHL_SET_PWM(ESHL_RunPWMBuff); // 更新运行PWM值
break;
case ESHL_STATE_MOTOR_RUNING_STOP: // 电机运行时停转
ESHL_Start(ESHL_GetDirection()); // 重新进行开环启动步骤
break;
case ESHL_STATE_CURRENT_ERROR: // 电流异常
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
ESHL_CURRENT_ERROR_LED(); // 电调电流异常灯光,红1蓝4
break;
case ESHL_STATE_BATTERY_VOLTAGE_ERROR: // 上电电池电压异常
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
ESHL_BATTERY_VOLTAGE_ERROR_LED(); // 电调上电电压异常灯光,黄灯闪烁
break;
case ESHL_STATE_BATTERY_OVER_VOLTAGE: // 运行过程中过压
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
ESHL_BATTERY_OVER_VOLTAGE_LED(); // 电调电压过压灯光,红2蓝1
break;
case ESHL_STATE_BATTERY_UNDER_VOLTAGE: // 运行过程中欠压
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
ESHL_BATTERY_UNDER_VOLTAGE_LED(); // 电调电压欠压灯光,红2蓝2
break;
case ESHL_STATE_OVER_TEMPERATURE: // 运行过程中温度过高
ESHL_CloseMOSComp(); // 关闭所有MOS管并且关闭比较器
ESHL_OVER_TEMPERATURE_LED(); // 电调过温灯光,红1蓝2
break;
case ESHL_STATE_BRAKE: // 电调刹车中
ESHL_Break(ESHL_GetStopMode()); // 电调进行刹车操作,滑行刹车
break;
case ESHL_STATE_BRAKE_OK: // 刹车完毕
ESHL_BRAKE_OK_LED(); // 电调刹车灯光,黄灯常亮
break;
default:
break;
}
HAL_Delay(30); // 延时30ms,避免加速度太快
}
/* USER CODE END 3 */
}
注意事项

此处反电动势采样电容100nf过大,在低速状态,高速状态下都不太好,转速无法达到最大值而且电流突增,应该电容太大是换相延迟导致的,以下是某一相的示波器检测电压
低速状态:

高速状态:

更换为4.7uf电容以后的波形:
(中间有马鞍波一样的波浪,根据up李大郎6x66视频讲解得知是非同步整流驱动的效果
视频:https://www.bilibili.com/video/BV1Fx76zzEcP/?spm_id_from=333.337.search-card.all.click)
低速:

高速:

向各位开源大佬请教遇到的困难
1、开环启动程序效果不太好,会有明显的开环动作,而且开环切入闭环有时候会误检测到堵转状态重新进行开环循环,猜测是切入闭环的瞬间没有触发到stm32f051内置比较器中断导致,请问有无哪个开源工程的开环算法比较好可以借鉴?
2、在电机高速转动下,逐步施加一个大负载,电机有时候突然触发发出嗡嗡声但还是在转动状态,电流突然增大,目前猜测是缺步导致的电流异常,请教是否是非同步整流方案的弊端,硬件上如果做PWMN下管的同步整流方案是否能够优化掉这个问题?
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










