当前位置: 首页 > news >正文

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

直流无感无刷电机方波控制!初始位置检测! 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 和我的硬件调试的,如果有需要移植的朋友,可以额外联系。希望这篇文章对研究直流无感无刷电机方波控制的小伙伴有所帮助!

http://www.jsqmd.com/news/205972/

相关文章:

  • 强烈安利MBA必用8个一键生成论文工具测评
  • Java类加载机制
  • 深度测评10个AI论文写作软件,继续教育学生轻松搞定论文!
  • AI不再“一本正经胡说八道“!LLM+RAG融合技术实战指南,让大模型回答有据可查,小白也能轻松上手
  • 2026 届计算机毕业设计全流程指南(从 0 到答辩)
  • js刷新页面的几种方法
  • TreeUtil树构建工具-超好用工具
  • 计算机专业毕设怎么选题?老师最容易通过的 20 个方向
  • Visual Studio 2022中配置cuda环境
  • AI 技术在英语培训中的应用
  • 从零到一全面掌握MySQL:安装配置、SQL详解与数据库实战理解
  • MySQL保姆级教程:从安装部署到核心概念,快速上手避坑指南
  • tcpdump抓包实战:命令行网络诊断利器
  • 飞书多维表格基础操作
  • 一篇搞定MySQL:从环境搭建到深入理解,高效入门数据库
  • 网络延迟与丢包问题排查实战
  • 欧盟EN 18031-1无线设备认证
  • MT-Safety 标签env 和 locale
  • EN 18031-1通用网络安全认证新规
  • 除了安全更新,EN 18031-1还有哪些重要的认证要求?
  • 写给开发者、内容创作者:当你“快做完了”却开始崩,这不是技术问题
  • 如何确保设备满足EN 18031-1标准中的安全更新要求?
  • 通达信专抓超跌副图无未来
  • 安达发|石油化工行业自动排产软件:驱动产业升级的核心引擎
  • 计算机毕设从选题到答辩,全程可指导(真实案例)
  • 通达信日周共振
  • AI 量化为什么不敢上线?——我的 Fail-Closed 模板实战
  • Python+Vue的大学生创新创业调查问卷系统 Pycharm django flask
  • 通达信回归斜率线
  • 红娘子双线强弱源码分享贴图