news 2026/9/20 8:17:32

直流无感无刷电机方波控制全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直流无感无刷电机方波控制全解析

直流无感无刷电机方波控制!初始位置检测! 1.代码方便修改和移植,不是库! 2.方案:ADC和比较器,ADC检测完位置强拖,比较器检测完位置直接切闭环运行。 3.控制方式:开环/速度环/双闭环 4.通信:串口 5.保护:欠压保护/软件过流保护/硬件过流保护/过温保护/缺相保护 6.启动方式:三段式和电感法。 7.硬件上特殊:休眠电路,防打火电路。 8.视频中只展示了三款电机,我手里的其他电机也可以! 9.波形只是一种参考!需要根据电机和负载以及使用环境进行调试。 10.本程序是基于stm32F0和我的硬件调试的,需要需要移植的,可以额外联系。

最近在研究直流无感无刷电机的方波控制,今天来和大家分享下其中的门道。这里主要涉及到初始位置检测,以及一系列控制、通信、保护和启动等方面的内容。

方案:ADC 和比较器并用

在初始位置检测这块,采用了 ADC 和比较器相结合的方案。ADC 检测完位置后强拖,比较器检测完位置则直接切闭环运行。

ADC 检测相关代码示例

// 初始化 ADC void ADC_Init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 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); ADC_Cmd(ADC1, ENABLE); } // 获取 ADC 值 uint16_t Get_ADC_Value(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); }

这段代码首先初始化了 ADC,设置为独立模式,单次转换,软件触发等。然后定义了获取 ADC 值的函数,通过配置通道和触发转换,最后返回转换后的值。在初始位置检测中,这个 ADC 值就可以用来判断电机的位置信息,之后进行强拖操作,将电机拖到合适的启动位置。

比较器检测相关代码示例

// 初始化比较器 void Comparator_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); COMP_InitTypeDef COMP_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP1, ENABLE); COMP_InitStructure.COMP_Input1 = COMP_Input1_GPIO; COMP_InitStructure.COMP_Input2 = COMP_Input2_VREFINT; COMP_InitStructure.COMP_Output = COMP_Output_OP1; COMP_InitStructure.COMP_OutputPol = COMP_OutputPol_Low; COMP_Init(COMP1, &COMP_InitStructure); COMP_Cmd(COMP1, ENABLE); } // 检测比较器输出 uint8_t Check_Comparator_Output(void) { return COMP_GetOutputStatus(COMP1); }

这里初始化了比较器,配置了输入引脚和相关参数。通过检测比较器的输出状态,来判断电机位置是否满足条件,一旦满足,就直接切入闭环运行。

控制方式多样

  1. 开环控制:开环控制相对简单,就是按照预设的控制信号去驱动电机,不考虑电机实际的运行状态反馈。比如简单地设定一个固定的占空比去控制电机的转速。
  2. 速度环控制:速度环控制则需要实时获取电机的转速信息,然后根据设定的目标转速和实际转速的差值,通过 PI 调节器来调整控制信号,使得电机转速尽可能接近目标转速。
// 简单的速度环 PI 调节器示例 float Speed_PI_Controller(float set_speed, float current_speed, float *Ki, float *Kp, float *integral) { float error = set_speed - current_speed; *integral += error; return (*Kp * error) + (*Ki * *integral); }
  1. 双闭环控制:双闭环控制在速度环的基础上增加了电流环,先通过电流环控制电机的电流,再由速度环根据速度偏差调整电流环的给定值,这样可以更好地应对负载变化等情况,提高电机控制的稳定性和动态性能。

通信靠串口

采用串口进行通信,可以方便地与上位机或者其他设备进行数据交互。比如可以通过串口发送电机的运行状态信息,接收上位机发送的控制指令等。

// 串口初始化代码 void USART_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } // 串口发送字符函数 void USART_SendChar(uint8_t ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, ch); }

这段代码初始化了串口,设置了波特率、数据位、停止位等参数,同时定义了发送字符的函数。

多重保护机制

  1. 欠压保护:检测电源电压,当电压低于设定值时,采取相应措施,比如停止电机运行,防止电机因电压过低而损坏。
  2. 软件过流保护:通过检测电流值,在软件中设定过流阈值,当检测到电流超过阈值时,调整控制信号,降低电机电流。
  3. 硬件过流保护:在硬件电路上设置过流检测电路,一旦电流过大,硬件电路会迅速切断电源或者采取其他保护动作。
  4. 过温保护:利用温度传感器检测电机温度,当温度过高时,降低电机功率或者停止电机运行。
  5. 缺相保护:检测电机三相电流或者电压,当发现某一相缺失时,及时保护电机。

启动方式

  1. 三段式启动:一般分为预定位、强拖和切换三个阶段。预定位阶段确定电机初始位置,强拖阶段将电机转速提升到一定程度,最后切换到正常运行状态。
  2. 电感法启动:利用电机绕组电感特性来检测电机位置,进而实现启动。

硬件特色

  1. 休眠电路:在电机不工作时,通过休眠电路可以降低系统功耗,延长设备使用寿命。
  2. 防打火电路:防止电机在启动、停止或者运行过程中产生打火现象,保护电路元件和提高系统稳定性。

视频中虽然只展示了三款电机,但实际上手里的其他电机也都适用这套控制方案。而且波形只是一种参考,实际应用中需要根据电机和负载以及使用环境进行调试。本程序是基于 stm32F0 和我的硬件调试的,如果有需要移植的朋友,可以额外联系。希望这篇文章对研究直流无感无刷电机方波控制的小伙伴有所帮助!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 8:03:00

2026都到了!为什么说AI产品经理是未来5年最值得all in的岗位?

如果你要问我:未来5年,什么岗位最有“钱”景、最值得all in? 我的答案只有一个——AI产品经理。 这不是我瞎说。过去一年,我跟超过200位职场人聊过这个话题。我发现,几乎所有想抓住AI机会的人,都卡在了这3种…

作者头像 李华
网站建设 2026/9/19 0:04:11

一边是35岁危机,一边是AI高薪。普通程序员如何选对路、不掉队?

35岁,程序员的十字路口,焦虑与机遇并存。技术浪潮汹涌,经验与智慧沉淀,适者生存。AI红利,工具赋能,引领未来。 35岁程序员危机,时代洪流中的思考 一、年龄与技能的双重焦虑 技术浪潮的冲击。新技…

作者头像 李华
网站建设 2026/9/15 0:49:02

CES 2026 | 从感知到执行 TI打破L3级智驾规模化落地的“三道墙”

作者:毛烁当自动驾驶的竞争从L2级向L3级迈进的关键节点,其面临的挑战往往不再只来自算法本身,而是被三堵“工程墙”所约束——算力能效边界、感知成本曲线,以及车内通信架构的割裂。在CES 2026上,TI在拉斯维加斯亮相了…

作者头像 李华
网站建设 2026/9/15 2:14:12

【VTK手册033】深入解析 vtkProgrammableFilter 的原理与应用

【VTK手册033】深入解析 vtkProgrammableFilter 的原理与应用0. 概述 在基于 VTK(Visualization Toolkit)的算法开发过程中,若需实现特定的数据处理逻辑,通常的做法是继承 vtkAlgorithm 或其子类并重写 RequestData 方法。然而&am…

作者头像 李华
网站建设 2026/9/18 10:08:00

震惊!2025年AI编程开发大变局:Claude逆袭ChatGPT,太空数据中心成真,小白程序员如何抓住“模型套利“风口?

【导读】大模型王座易主Anthropic,太空数据中心成真,「AI泡沫」反成创业红利?2025年底的Y Combinator博客中,谈到了2025 年 AI 领域的四大变局。 从孵化器的角度来看,最显著的变化是Anthropic成为创始人中最受欢迎的大…

作者头像 李华