一文掌握步进电机控制

2023-11-06


前言

今天讲讲步进电机的控制原理。之前因为项目需要用到步进电机,这次对步进电机的相关知识做介绍,以及我个人的理解,并附上驱动源码。


一、什么是步进电机

步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。
每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。

步进电机相对于其它控制用途电机的最大区别是,它接收数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,它本身就是一个完成数字模式转化的执行元件。而且它可开环位置控制,输入一个脉冲信号就得到一个规定的位置增量,这样的所谓增量位置控制系统与传统的直流控制系统相比,其成本明显减低,几乎不必进行系统调整。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。

简而言之

控制步进电机很简单,有两点,
1、控制步进电机转动一个角度,只需要要给一个脉冲,转动多少角度,就给多少个脉冲
那么如何确定角度与脉冲之间的关系呢?

二、步进电机角度与脉冲数之间的关系

首先,我们要了解步进电机以及步进电机驱动器的相关参数。

步进电机参数

这篇博文分析的很透彻,我就不多赘述了,简单地总结一下。
博文链接

步距角:在不设置步进电机驱动器细分的情况下,一般就是1.8度,也就是给一个脉冲,步进电机转1.8度。举个例子,如果你驱动器细分为2,那步距角就是0.9度。

相数:我们常见的步进电机类别有四线两相步进电机以及六线两相步进电机
这里的两相指的是A相、B相。线数指的是引出的线,有A+,A-,B+,B-四线,六线与四线不同在于引出了两个com端,一个既可做A+,又可作A-;一个既可做B+,又可作B-。

如果你拿到一个步进电机,无法区分A、B相,就用万用表测一下,连在一起的是同一相。

实物图如下:(这是六线的,四线的没有两个com口)
在这里插入图片描述

步进电机驱动器参数

为什么需要步进电机驱动器?

步进驱动器是驱动步进电机运行的功率放大器,它能接收控制器(plc/单片机等)发送来的控制信号并控制步进电机转过相应的角度/步数。最常见的控制信号是脉冲信号,步进驱动器接收到一个有效脉冲就控制步进电机运行一步。具有细分功能的步进驱动器可以改变步进电机的固有步距角,达到更大的控制精度、降低振动及提高输出转矩;除了脉冲信号,具有总线通信功能的步进驱动器还能接收总线信号控制步进电机进行相应的动作。

步进电机驱动器可分为两部分一部分是环形分配器,另一部分是功率放大。

环形分配器:要是接收3种信号分别为:脉冲信号,方向信号,脱机信号。

功率放大:步进驱动器首先要外接直流电源24~28V,一端要连步进电机,另一端作输入信号也就是控制信号。

简而言之步进电机驱动器的作用在于接收单片机的方向控制与脉冲信号,输出控制A+,A-,B+,B-四相的通断电时间以及次序,进而实现步进电机的控制。可以看到步进电机只有六根线,不能通过单片机直接控制。

这就是为啥要驱动器的原因。

关于它的参数。有细分与电流两种,通过拨码开关档位选择进行控制。
参数1:细分数就是改变步距角,一个脉冲转多少度。
参数2:电流细分则是控制它的电流大小。
在这里插入图片描述
接线注意:共阴极接法就是把PUL-,DIR-同接GND,PUL+接单片机脉冲引脚,DIR接单片机方向引脚,ENA+与ENA-可不接线。

其实,也可以通过L295N来控制步进电机,其方法就是控制A+,A-,B+,B-的通电顺序。
具体我就不详细解释了。

三、如何控制步进电机

步进电机的控制设计到两个参数,一个是转速,一个是角度,一个是转向。

这里需要用到一个定时器的一个通道的输出比较功能,用于脉冲的输出。

1、转速:我们先来看如何改变步进电机的转速,步进电机的转速取决于定时器的ARR值,ARR值越大,转速越快,反之,则亦然。

2、角度:对于角度的控制是通过控制脉冲数实现的,如何控制脉冲数,也就是记录定时器更新中断的次数,进一次中断也就相当于产生一个脉冲,一个脉冲控制步进电机转一个步距角。
3、转向:步进电机的转向是通过操作单片机的IO口高低电平来实现的,方向引脚置高电平,正转;置低电平,反转。


四、程序实现步进电机控制

其实,如果你掌握了控制一个步进电机的方法,控制多个步进电机协同运动也是同样的道理。程序具体我就不分析了,上面已经讲的很清楚了。有问题可以留下评论,我会及时回复的。

// 方向控制IO口的初始化
void DIR_GPIO_Config(void)
{
    /*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;

    /*开启LED相关的GPIO外设时钟*/
    RCC_APB2PeriphClockCmd( DIR_GPIO_CLK, ENABLE);

    GPIO_InitStructure.GPIO_Pin = DIR_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DIR_GPIO_PORT, &GPIO_InitStructure);
}


static void BJ_TIM_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 输出比较通道1 GPIO 初始化
    RCC_APB2PeriphClockCmd(BJ_TIM_CH1_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin =  BJ_TIM_CH1_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(BJ_TIM_CH1_PORT, &GPIO_InitStructure);
}

static void BJ_TIM_Mode_Config(void)
{
	// NVIC初始化
	NVIC_InitTypeDef NVIC_InitStructure;
	// 设置中断来源
	NVIC_InitStructure.NVIC_IRQChannel = BJ_TIM_IRQ ;
	// 设置主优先级为 0
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	// 设置抢占优先级为 0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
    // 开启定时器时钟,即内部时钟CK_INT=72M
    BJ_TIM_APBxClock_FUN(BJ_TIM_CLK,ENABLE);

    /*--------------------时基结构体初始化-------------------------*/
    // 配置周期,这里配置为100K
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=BJ_TIM_Period;
    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    TIM_TimeBaseStructure.TIM_Prescaler= BJ_TIM_Prescaler;
    // 时钟分频因子 ,配置死区时间时需要用到
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    // 初始化定时器
    TIM_TimeBaseInit(BJ_TIM, &TIM_TimeBaseStructure);

    /*--------------------输出比较结构体初始化-------------------*/
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    // 配置为PWM模式1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    // 输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    // 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    // 输出比较通道 1
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OC1Init(BJ_TIM, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(BJ_TIM, TIM_OCPreload_Enable);

    // 清除计数器中断标志位
	TIM_ClearFlag(BJ_TIM, TIM_FLAG_Update);

	// 开启计数器中断
	TIM_ITConfig(BJ_TIM,TIM_IT_Update,ENABLE);
	
	// 使能计数器
	TIM_Cmd(BJ_TIM, ENABLE);
}

void BJ_TIM_Init(void)
{
    BJ_TIM_GPIO_Config();
    BJ_TIM_Mode_Config();
	DIR_GPIO_Config();
}



extern uint16_t hopeSignal;

void BJ_TIM_IRQHandler (void)
{
	if ( TIM_GetITStatus( BJ_TIM, TIM_IT_Update) != RESET )
	{
		TIM_ClearITPendingBit(BJ_TIM , TIM_FLAG_Update);
	
	
			{
				
				if(hopeSignal<=0)
			{
				
				hopeSignal=0;
				TIM_SetCompare1(BJ_TIM, 0);		// 停止动
			}
			else
			{
					hopeSignal--;
					TIM_SetCompare1(BJ_TIM, 100);		// 停止动
			}


			}
}
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文掌握步进电机控制 的相关文章

  • 记一个正式的shell 2进制文件编辑方法。

    鉴于shell本身能力有限 不能用重定向的方法来实现较为正式的2进制文件修改 google无果 下面的实现还是比较满意的 1 printf或者echo n e来打印需要的内容到文件 2 dd插入内容 比如想在一个文件a bin的0x300位
  • 太阳能板如何串联_一步步教你搭建属于你自己的太阳能系统

    太阳能板种类 单晶硅太阳能板 单晶硅太阳能板的光电转换效率为15 左右 最高的达到24 这是所有种类的太阳能板中光电转换效率最高的 但制作成本很大 以致于它还不能被大量广泛和普遍地使用 由于单晶硅一般采用钢化玻璃以及防水树脂进行封装 因此其
  • springboot 自定义异常

    1 创建一个自定义异常类ManualException java 自定义异常类 author cf public class ManualException extends RuntimeException 错误代码 private Int

随机推荐

  • 未来10年互联网的十大发展趋势

    Written by Richard MacManus 刘明君译 我们已经现在进入被称为web 2 0的网络时代 这个阶段互联网的特征包括搜索 社区化网络 网络媒体 音乐 视频等 内容聚合和聚集 RSS mashups 一种交互式Web 应
  • dataloader的长度

    数据集 batchsize 比如数据集共有10582张图片 batchsize设为26 那么 len dataloader 10582 26 407
  • linux重启mysql服务_Linux怎么重启MySQL

    Linux怎么重启MySQL 从程序安装包安装的Mysql 在系统中没有红帽常用的servcie mysqld restart这个脚本 因此重启MYSQL数据库 只好手工重启 直接执行Killall mysql 强制终止的话 将可能造成表的
  • 虚拟数字人chatGPT结合?时代大革新?

    随着人工智能技术的快速发展 虚拟数字人和聊天机器人ChatGPT成为了越来越多人们日常生活中的重要伙伴 虚拟数字人可以陪伴人们聊天 解答问题 执行一些简单的任务 而ChatGPT则是一款领先的人工智能聊天机器人 具备强大的自然语言处理能力
  • 为WinDbg设置符号文件路径

    WinDbg可以通过加载Symbol文件 pdb 即时的调试程序 WinDbg如何找到相应的符号文件呢 WinDbg首先在 exe或者 dll所在目录下寻找同名的 pdb文件 如果找不到 WinDbg在Symbol File Path中查找
  • npm报错:A complete log of this run can be fund in: C\Users\用户\AppData\Roaming\npm-cache_logs\解决方案

    因项目中安装模块 多次不成功 所以导致报错 A complete log of this run can be fund in C Users 用户 AppData Roaming npm cache logs 2018 9 24T10 5
  • 《动手学深度学习 Pytorch版》 2.3 线性代数

    2 3 1 标量 import torch 标量由只有一个元素的张量表示 可进行熟悉的算数运算 x torch tensor 3 0 y torch tensor 2 0 x y x y x y x y x y tensor 3 tenso
  • scrapy 环境搭建

    在win7环境下 以window7 64bit安装为例子 1 下载python2 7环境 用浏览器打开https www python org downloads 然后选择所对应的版本 这里选择2 7 11 下载完成之后安装 在安装界面的时
  • twitter 分享链接_链接您的Twitter Feed

    twitter 分享链接 click here 请单击此处 So you want to display your Twitter status on your blog No problem use the API But what if
  • * 引领华为:任正非的七大领导力启示

    中国有诗云 江山代有才人出 各领风骚数百年 的确 任正非制定了最为有效的战略 让华为成长为一家全球领先的企业 这证明了他的巨大影响力和远见卓识 在本文里 大卫 德克莱默和田涛探讨了帮助华为取得巨大成功的七大领导力启示 中欧关系源远流长 自中
  • c语言中错误c2084,错误_C2084_函数“int multi(int)”已有主体

    file1 c中的程序 int multi int a return a a 文件file2 c中的程序 include file1 c int squsum int pt int i 0 sum 0 for i 0 i lt 5 i su
  • Mybatis框架

    什么是Mybits 是一款优秀的持久层框架 他是支持制定SQL 存储过程以及高级映射 它避免了几乎所有JDBC代码和手动设置参数 以及获取结果集 是一种可以 使用XML或者注解来配置和映射 支持动态sql以及数据缓存 将结果映射成java的
  • 微信小程序返回弹出提示

    当用户进入页面 编辑后没有保存直接返回 这时需要给用户提示是否需要保存在返回 如果保存了 则不提示 主要用到 wx enableAlertBeforeUnload Object object 开启小程序页面返回询问对话框 wx disabl
  • sql中的if else 的一个小陷阱

    今天遇到一个特别奇葩的问题 一个存储过程 SP MODI TPAYNOTICE ZHONGTAI 有如下代码 DECLARE V USER ID INT IF V USER ID 5 BEGIN 同步修改事物正文 EXEC V RET SP
  • 路由查找之Radix Tree

    什么是Radix Tree 在计算机科学中 基数树 或称Patricia trie tree 或crit bit tree 压缩前缀树 是一种更节省空间的Trie 前缀树 对于基数树的每个节点 如果该节点是唯一的子树的话 就和父节点合并 g
  • 【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

    小白CV教程 YOLOv5 Deepsort实现车辆行人的检测 追踪和计数 本文禁止转载 项目简介 YOLOv5检测器 DeepSort追踪器 运行demo 训练自己的模型 调用接口 创建检测器 调用检测接口 联系作者 关注我的公众号 本文
  • 【算法面试宝典】无重复字符的最长子串

    1 算法描述 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因
  • 用mysql存储过程求从1+2+3....+99+100...+n的值

    注意 加法从0开始 乘从1开始 代码如下 reate student returns begin begin decalre sum begin declare I int set sum 0 set I 1 while I lt N do
  • 修复python2 pip_如何使用Python 2和pip修复MD5 ImportError

    修复python2 pip Recently when trying to run a Python script on my Mac I faced an import error for a specific Python module
  • 一文掌握步进电机控制

    前言 今天讲讲步进电机的控制原理 之前因为项目需要用到步进电机 这次对步进电机的相关知识做介绍 以及我个人的理解 并附上驱动源码 一 什么是步进电机 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机 每输入一个脉冲信号 转子就转动