news 2026/5/8 5:28:23

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

作者头像

张小明

前端开发工程师

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/5/2 7:23:58

Visual Studio 2022中配置cuda环境

一、前置条件(必须先完成) 在配置VS2022前,你需要先安装好以下软件,否则配置会失败: NVIDIA显卡驱动:确保你的电脑有NVIDIA独立显卡,且安装了最新/兼容的显卡驱动(可通过NVIDIA控制…

作者头像 李华
网站建设 2026/4/30 14:52:12

深度学习毕设项目:基于python深度学习的砖头墙裂缝识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/27 12:00:04

解锁盲盒新玩法✨定制你的专属小程序

💡想要打造独特盲盒小程序? 这些玩法你的项目都有了吗👇 ✔️福袋惊喜 – 超值组合随机触发 ✔️一番赏经典 – 人气奖池阶梯抽取 ✔️无限赏模式 – 奖池常驻永不下架 ✔️集合赏专题 – 主题系列成套收集 ✔️进阶挑战 – 收集成就解锁隐藏…

作者头像 李华
网站建设 2026/5/8 4:49:01

通达信回归斜率线

{}回归斜率线A:EMA(SLOPE(C,4)*20C,42); 经典RL:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; 经典K:SMA(经典RL,3,1); 经典D:SMA(经典K,3,1); 经典J:3*经典K-2*经典D; MAHL1:100*((EMA((HL)/2,3)-LLV(EMA((HL)/2,5),30)-(EMA(H,20)-EMA(L,20))) /(LLV(EMA((HL)/2,5),30…

作者头像 李华
网站建设 2026/5/4 18:03:54

【数据分享】全国村级行政区矢量(免费/无套路分享)

行政区划边界矢量数据是我们在各项研究中最常用的数据。本次我们为大家带来的是我国分省的行政村(社区)的行政区划矢量数据!数据格式为Shp,每一个省份的行政村(社区)行政区划数据保存为一个shp文件。数据范…

作者头像 李华
网站建设 2026/4/26 15:11:26

AI圈炸锅!DeepSeek-OCR黑科技:压缩10倍长文本,成本直降90%!VTC技术让大模型“过目不忘“,中科院发布权威评测

【导读】DeepSeek-OCR的视觉文本压缩(VTC)技术通过将文本编码为视觉Token,实现高达10倍的压缩率,大幅降低大模型处理长文本的成本。但是,视觉语言模型能否理解压缩后的高密度信息?中科院自动化所等推出VTCB…

作者头像 李华