问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

步进电机控制卡入门

创作时间:
作者:
@小白创作中心

步进电机控制卡入门

引用
CSDN
1.
https://blog.csdn.net/pauljames1028/article/details/138238371

步进电机控制是自动化控制领域的重要组成部分,广泛应用于各种精密设备和数控加工系统中。本文将从基础理论到具体实现,全面介绍步进电机控制卡的开发过程,帮助读者快速掌握这一关键技术。

一、概述

脉冲控制是自动化控制中的一个大类别。最常见的是步进电机的控制,而步进电机在自动化中的应用不用多说。此外,还有大量的伺服电机,同样接受脉冲控制。这样,使用采用来搭建设备,乃至多轴数控加工设备就变得非常普遍。本文档总结脉冲卡并提炼其中的关键点,供广大爱好者学习研究,少走弯路。

针对文档中不够清晰的部分,读者可以在评论区留言讨论。

以步进电机为执行器的系统,除去客户端,一般包含3大部分,如图1所示:


图1 步进电机系统常见配置

  1. 步进电机本体(Motor)
  • 最为常见的是两相四线步进电机,步距角1.8度,不细分的话,就是200个脉冲转一圈。这种电机随处可买,价格根据功率大小与制作工艺而变。
  1. 步进电机驱动器(Motor Driver)
  • 驱动器是给电机线圈通电的装置,它接受从电机控制器的脉冲和方向信号,进而转换为电机线圈的励磁电流,从而驱动电机动作。常见的驱动器包含电流选择与步距角细分功能,好一点的带自测功能,不需要外接脉冲就可以转动电机。
  1. 步进电机控制器(Motion Controller)
  • 电机控制器是用来给驱动器发脉冲的,脉冲的频率由控制器来决定,如果要实现电机平滑加减速,就要根据需要产生变频率脉冲,这些计算都在控制器内部进行。
  1. 操作客户端(Client)
  • 通过某种通信方式,比如串口给电机控制器发指令,从而完成控制步进电机的功能。常见的客户端如串口助手

本文的重点介绍对象是步进电机控制器,将带领大家从理论开始,到代码实现。

二、步进电机控制理论背景

步进电机驱动器接受脉冲信号,转换为步进电机的转角,一个脉冲转过的角度称为步距角。因此,脉冲的总数决定了一次运动过程中电机的转角,脉冲的频率决定了步进电机的速度。图2表示脉冲出现的时刻,时间之间的间隔分别是基础时钟的整数倍


图2

因此,步进电机的控制,从本质上来讲非常简单,就是控制脉冲总数以及脉冲的出现间隔。至于怎么来产生需要的脉冲频率,就会衍生出多种不同的算法,也就是步进电机加减速算法,此外业内流行的数控系统代码,比如GRBL也是一样的套路,使用脉冲频率的变化来操作。下面我们就结合代码来分析。

三、步进电机控制器实现

要实现一个完整的电机控制器,需要整合多个模块,最为常见的有:通信模块,IO模块,定时器模块,加减速算法模块以及辅助支持模块等。下面分模块来阐述

3.1 通信模块

通信模块的功能在于完成跟上位机的通信,比如232串口,485串口,USB,CAN总线,网络等。完成原始数据的接收,并根据上下位机约定的数据协议来分解,这就是通信模块要完成的任务。一个典型的实现过程如下:

需要有一个外设的初始化函数

void UART_init(uint32 Baund)  
{  
GPIO_InitTypeDef GPIO_InitStructure;  
USART_InitTypeDef USART_InitStructure;  
NVIC_InitTypeDef NVIC_InitStructure;  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);  
USART_DeInit(USART1);  
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 = Baund;  
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);  
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure);  
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
USART_Cmd(USART1, ENABLE);  
}  

在这个函数内部,主要完成端口和中断配置,并使能外设功能。

剩下的,就是最为关键的接受函数了。这个函数典型的入口是串口接受中断

void USART1_IRQHandler(void)  

在这个中断内部,来执行数据解析。数据协议的常见形式,例如一条运动指令,带上多个参数M01 100 200 300 400,这样的数据,怎么来分解呢?最为简单的做法就是搜索字符串,根据分割符号空格来处理数据。String头文件中为此准备了专门的函数,strtok()来处理这的数据。具体实现过程,大家可以参考该函数的使用方法。这里就不展开了。

3.2 IO模块

脉冲控制卡,本身就需要最后输出脉冲来驱动电机,此外还有方向信号,限位开关等一系列端口信号需要处理,这就需要一个IO模块来管理这些外设。

IO模块对于单片机来说,应该是最简单的,几乎所有的单片机教程第一课都是操作GPIO,因此这里不打算再去重复具体实现,只是提醒下一些用于步进电机控制的点。对于IO的统一管理,可以采用面向对象的方式来进行。这样修改起来很方便。

3.3 定时器模块

定时器是脉冲产生与输出的关键设备,由于STM32的定时器很多,还有一些高级功能,所以这里只针对典型的情况进行讲解。采用的方法也是最常见的定时器用法。

班特科技的开源产品,步进电机8大算法里面提到过,产生脉冲的办法是很多的,有定时器的PWM专用通道法,也有DMA法。我们使用定时器溢出法,也是定时器的基本功能。这样也方便移植到一些基本的单片机上,比如STC的,LPC的,PIC的。

定时器作为基础定时功能,需要配置,示例代码如下:

void TIM3_Int_Init(u16 arr,u16 psc)  
{  
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
NVIC_InitTypeDef NVIC_InitStructure;  
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
TIM_TimeBaseStructure.TIM_Period = arr;  
TIM_TimeBaseStructure.TIM_Prescaler =psc;  
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );  
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );  
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure);  
}  

因为定时功能不绑定具体IO,因此在内部没有操作GPIO的语句。只有操作ARR和PSC的语句,以及设置中断优先级的。

3.4 加减速算法模块

S曲线常见的方法是七段法,在很多论文中都有涉及,该方法的灵活性好,可以指定任意一段加速度以及斜率。缺点呢,也在于过于灵活导致参数众多。班特科技采用的方法,参数少,易于掌控,这就是logistic函数法。具体过程可以参考文档《logistic函数法步进电机S曲线加减速》。

速度曲线如图3所示,可以看到十分光滑,这样实际跑出来的效果也是启动停止平滑的。


图3

3.5 辅助支持模块

对于一个控制器,需要考虑的问题还不止上面这些核心模块,例如需要保存客户设置的参数,那么就要有个读写EEPROM的模块。常见的有读取和写入内部EERPOM的方式,当然也有外挂的形式。因为STM32的FLASH比较大,可以作为EEPROM使用。

四、完整工程示例

为了方便广大爱好者搭建自己的控制器,工程采用单片机为STM32C6T6,但是程序做了模块化设计,非常方便移植到各个不同的平台,大家可以按照自己的需求进行。编译环境使用MDK4.7,工程源码结构如图4所示。


图4 工程结构

工程使用方法为,运行单片机程序后,从串口发送数据,比如执行一条指令M01 100 200 300 400,那么这个数据就会发送到串口接受区域的对应数据结构中,如图5所示


图5 上位机数据接收

有了这个数据,后续大家就可以跟上位机交互了,可以按照自己的想法添加各种指令。指令的应用逻辑,可以根据自己的需求添加和修改。

以上这些内容,就构成了整个步进电机控制器的主体,希望能够帮助大家快速开发自己的步进电机控制器。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号