直流无感无刷电机方波控制!初始位置检测! 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); }这里初始化了比较器,配置了输入引脚和相关参数。通过检测比较器的输出状态,来判断电机位置是否满足条件,一旦满足,就直接切入闭环运行。
控制方式多样
- 开环控制:开环控制相对简单,就是按照预设的控制信号去驱动电机,不考虑电机实际的运行状态反馈。比如简单地设定一个固定的占空比去控制电机的转速。
- 速度环控制:速度环控制则需要实时获取电机的转速信息,然后根据设定的目标转速和实际转速的差值,通过 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); }- 双闭环控制:双闭环控制在速度环的基础上增加了电流环,先通过电流环控制电机的电流,再由速度环根据速度偏差调整电流环的给定值,这样可以更好地应对负载变化等情况,提高电机控制的稳定性和动态性能。
通信靠串口
采用串口进行通信,可以方便地与上位机或者其他设备进行数据交互。比如可以通过串口发送电机的运行状态信息,接收上位机发送的控制指令等。
// 串口初始化代码 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); }这段代码初始化了串口,设置了波特率、数据位、停止位等参数,同时定义了发送字符的函数。
多重保护机制
- 欠压保护:检测电源电压,当电压低于设定值时,采取相应措施,比如停止电机运行,防止电机因电压过低而损坏。
- 软件过流保护:通过检测电流值,在软件中设定过流阈值,当检测到电流超过阈值时,调整控制信号,降低电机电流。
- 硬件过流保护:在硬件电路上设置过流检测电路,一旦电流过大,硬件电路会迅速切断电源或者采取其他保护动作。
- 过温保护:利用温度传感器检测电机温度,当温度过高时,降低电机功率或者停止电机运行。
- 缺相保护:检测电机三相电流或者电压,当发现某一相缺失时,及时保护电机。
启动方式
- 三段式启动:一般分为预定位、强拖和切换三个阶段。预定位阶段确定电机初始位置,强拖阶段将电机转速提升到一定程度,最后切换到正常运行状态。
- 电感法启动:利用电机绕组电感特性来检测电机位置,进而实现启动。
硬件特色
- 休眠电路:在电机不工作时,通过休眠电路可以降低系统功耗,延长设备使用寿命。
- 防打火电路:防止电机在启动、停止或者运行过程中产生打火现象,保护电路元件和提高系统稳定性。
视频中虽然只展示了三款电机,但实际上手里的其他电机也都适用这套控制方案。而且波形只是一种参考,实际应用中需要根据电机和负载以及使用环境进行调试。本程序是基于 stm32F0 和我的硬件调试的,如果有需要移植的朋友,可以额外联系。希望这篇文章对研究直流无感无刷电机方波控制的小伙伴有所帮助!