• 入门电机系列之4步进电机


    入门电机系列,基于STM32硬件

    本文章学习借鉴于野火团队资料,以表感谢。官网http://products.embedfire.com/
    舵机的原理与应用。



    前言

    步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作
    原理是依靠气隙磁导的变化来产生电磁转矩。由于步进电机是一个可以把电脉冲转换成机械运
    动的装置,具有很好的数据控制特性,因此,计算机成为步进电机的理想驱动源,随着微电子和
    计算机技术的发展,软硬件结合的控制方式成为了主流,即通过程序产生控制脉冲,驱动硬件电
    路。单片机通过软件来控制步进电机,更好地挖掘出了电机的潜力。在不超载的情况下电机的转
    速和停止位置只取决于脉冲信号的频率和数量;并且步进电机的脉冲与步进旋转的角度成正比,
    脉冲的频率与步进的转速成正比,所以可以很好的从源头控制信号的输出;且步进电机只有周期
    性的误差,使得在速度、位置等控制领域用步进电机来控制变的非常的简单。话虽如此,想要玩
    转步进也不是件容易的事情。

    在这里插入图片描述


    提示:以下是本篇文章正文内容,下面案例可供参考

    工作原理

    通常步进电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。磁场会带动
    转子旋转一定的角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转
    一个角度。转子也随着该磁场转步距角。每输入一个电脉冲,电动机转动一个角度前进一步。它
    输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会
    反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。具体
    看下图:
    在这里插入图片描述

    步进电机极性区分

    步进电机又分为单极性的步进电机和双极性的步进电机;具体简易图如下图所示:
    在这里插入图片描述

    五线四相
    就是图中所示的4段线圈和5根线

    4线双极性

    由于2段是分开的所示双极性,4条线

    其中左侧为单极性步进电机,右侧为双极性的步进电机,单双极性是指一个步进电机里面有几种电流的流向,左侧的五线四相步进电机就是单极性的步进电机,图中的红色箭头为电流的走向,四根线的电流走向汇总到公共线,所以称之为单极性电机;但是右侧则不同,电机中有两个电流的回路,两个电流的回路自然就是双极性,所以称之为双极性电机。

    单极性绕组
    单极性步进电机使用的是单极性绕组。其一个电极上有两个绕组,这种联接方式为当一个绕组通
    电时,产生一个北极磁场;另一个绕组通电,则产生一个南极磁场。因为从驱动器到线圈的电流
    不会反向,所以可称其为单极绕组。

    双极性绕组
    双极性步进电机使用的是双极性绕组。每相用一个绕组,通过将绕组中电流反向,电磁极性被反
    向。典型的两相双极驱动的输出步骤在电气原理图和下图中的步进顺序中进一步阐述。按图所
    示,转换只利用绕组简单地改变电流的方向,就能改变该组的极性。

    双极性步进电机驱动原理

    下图是一个双极性的步进电机整步,步进顺序。在第一步中:将 A 相通电,根据电磁铁原理,产
    生磁性,并且因异性相吸,所以磁场将转子固定在第一步的位置;第二步:当 A 相关闭,B 相通
    电时,转子会旋转 90°;第三步:B 相关闭、A 相通电,但极性与第 1 步相反,这促使转子再次旋
    转 90°。在第四步中:A 相关闭、B 相通电,极性与第 2 步相反。重复该顺序促使转子按 90° 的
    步距角顺时针旋转。
    在这里插入图片描述
    上图中显示的步进顺序是单相激励步进,也可以理解为每次通电产生磁性的相只有一个,要么 A
    相,要么 B 相;但是更常用的是双相激励,但是在转换时,一次只能换相一次,具体详见下图:
    在这里插入图片描述
    上图是两相同时通电的旋转顺序,与单相激励不同的是,单相通电后被固定在了与定子正对着的
    绕组极性,但是双相同时激励时转子却被固定在两个绕阻的极性中间;此时通电顺序就变成了
    AB 相同时通电即可。
    在双相激励的过程中,也可以在装换相位时加一个关闭相位的状态而产生走半步的现象,这将步
    进电机的整个步距角一分为二,例如,一个 90° 的步进电机将每半步移动 45°,具体见下图。

    单极性步进电机驱动原理

    单极性与双极性步进电机驱动类似,都可以分为整步与半步的驱动方式,不同的是,双极性的步
    进电机可以通过改变电流的方向来改变每相的磁场方向,但是单极性的就不可以了,它有一个公
    共端,这就直接决定了,电流方向。具体旋转顺序详见下图:

    在这里插入图片描述
    上图是单极性步进电机整步旋转的过程,其中,在图示中分为 5 根线,分别为 A、B、C、D 和公
    共端(+),公共端需要一直通电,剩下 ABCD 相中只要有一个相通电,即可形成回路产生磁场,
    图中的通电顺序为 A->B->C->D,即可完成上图中的顺时针旋转,如果想要逆时针旋转只需要将
    其倒序即可。
    以上是单相通电产生的整步旋转,两相通电也可以产生,两个相邻的相通电,这样相邻的两个相
    就都产生了回路,也就产生了磁场,图中的通电顺序为 AB->BC->CD->DA,同理逆时针旋转的
    顺序为逆序。具体看下图:

    在这里插入图片描述

    上面两张图清晰的描述了单极性步进电机的通电顺序与旋转的过程,综合这两张图就是单极性
    步进电机半步的通电顺序,具体看下图:在这里插入图片描述

    细分器驱动原理

    对于细分驱动的原理,不分单双极步进电机,下图以单极为例:
    在这里插入图片描述
    在上图中均为双相激励;其中图(a)为 A 相电流很大,B 相的电流极其微弱,接近 0;图 © 为
    A 相和 B 相的电流相同,电流决定磁场,所以说 A 相和 B 相的磁场也是相同的,(a) 和(c)可以
    是极限特殊的情况,再看图(b)和图(d)这两个是由于 A 相和 B 相的电流不同产生位置情况;
    由此可以得出改变定子的电流比例就可以使得转子在任意角度停住。细分的原理就是:通过改变
    定子的电流比例,改变转子在一个整步中的不同位置,可以将一个整步分成多个小步来运行。
    在上图中就是一个整步分成了 4 步来跑,从(a)~(d)是 A 相的电流逐渐减小,B 相电流逐渐
    增大的过程,如果驱动器的细分能力很强,可以将其分成 32 细分、64 细分等;这不仅提高了步
    进电机旋转的顺畅度而且提高了每步的精度。

    动态指标术语

    • 步距角精度:步进电机转动一个步距角度的理论值与实际值的误差。用百分比表示:误差/步
    距角 *100%。
    • 失步:电机运转时运转的步数,不等于理论上的步数。也可以叫做丢步,一般都是因负载
    太大或者是频率过快。
    • 失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误
    差,采用细分驱动是不能解决的。
    • 最大空载起动频率:在不加负载的情况下,能够直接起动的最大频率。
    • 最大空载的运行频率:电机不带负载的最高转速频率。
    • 运行转矩特性:电机的动态力矩取决于电机运行时的平均电流(而非静态电流),平均电流
    越大,电机输出力矩越大,即电机的频率特性越硬。
    • 电机正反转控制:通过改变通电顺序而改变电机的正反转

    静态指标术语

    • 相数:产生不同对极 N、S 磁场的激磁线圈对数,也可以理解为步进电机中线圈的组数,其
    中两相步进电机步距角为 1.8°,三相的步进电机步距角为 1.5°,相数越多的步进电机,其
    步距角就越小。
    • 拍数:完成一个磁场周期性变化所需脉冲数或导电状态用 n 表示,或指电机转过一个齿距
    角所需脉冲数,以四相电机为例,有四相四拍运行方式即 AB-BC-CD-DA-AB,四相八拍运
    行方式即 A-AB-B-BC-C-CD-D-DA-A。
    • 步距角:一个脉冲信号所对应的电机转动的角度,可以简单理解为一个脉冲信号驱动的角
    度,电机上都有写,一般 42 步进电机的步距角为 1.8°
    • 定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械
    误差造成的)。
    • 静转矩:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力
    矩是衡量电机体积的标准,与驱动电压及驱动电源等无关。

    主要特点

    1. 步进电机的精度大概为步距角的 3-5%,且不会积累
    2. 步进电机的外表允许的最高温度:一般步进电机会因外表温度过高而产生磁性减小,从而
      会导致力矩较小,一般来说磁性材料的退磁点都在摄氏 130 度以上,有的甚至高达摄氏 200
      度以上,所以步进电机外表温度在摄氏 80-90 度完全正常。
    3. 步进电机的转矩与速度成反比,速度越快力矩越小。
    4. 低速时步进电机可以正常启动,高速时不会启动,并伴有啸叫声。步进电机的空载启动频
      率是固定的,如果高于这个频率电机不能被启动并且会产生丢步或者堵转。

    驱动器简介

    步进电机必须要有控制器和驱动器才可以使电机正常工作,控制器是 stm32 或者其它型号的 MCU
    了,驱动器就是步进电机驱动器了。为什么要使用驱动器呢?驱动器起到将控制器信号放大或者
    转换的作用,如下图所示,控制器输出方向信号和脉冲信号来控制步进电机驱动器,驱动器将其
    功率放大然后作用到步进电机上。
    在这里插入图片描述

    驱动器模式设置

    高动态模式和低速静音模式。具体工作模式可以通过 SW8 来选择,默
    认为高动态模式。低速静音模式仅适用于低转速和低加速度的应用,使用此模式时建议电机转速
    控制在 200RPM 以内。

    接线方式
    驱动器与控制器共有两种接线方式,分别为共阴极接法和供阳极接法:

    在这里插入图片描述

    在这里插入图片描述

    共阴极接法和供阳极 顾名思义共同使用一个阳极或者阴极

    使用方法

    第一种方式:使用 GPIO 延时模拟脉冲控制,即pwm 脉冲控制
    (1) 通用 GPIO 配置
    (2) GPIO 结构体 GPIO_InitTypeDef 配置
    (3) 封装 stepper_turn() 函数用于控制步进电机旋转
    (4) 在 main 函数中编写轮询按键控制步进电机旋转的代码

    
    //引脚定义
     /*******************************************************/
     //Motor 方向
     #define MOTOR_DIR_PIN GPIO_PIN_1
     #define MOTOR_DIR_GPIO_PORT GPIOE
     #define MOTOR_DIR_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
    
     //Motor 使能
     #define MOTOR_EN_PIN GPIO_PIN_0
     #define MOTOR_EN_GPIO_PORT GPIOE
     #define MOTOR_EN_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
    
     //Motor 脉冲
    
     #define MOTOR_PUL_PIN GPIO_PIN_5
     #define MOTOR_PUL_GPIO_PORT GPIOI
     #define MOTOR_PUL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE()
    
     /************************************************************/
     #define HIGH GPIO_PIN_SET //高电平
     #define LOW GPIO_PIN_RESET //低电平
    
     #define ON LOW //开
     #define OFF HIGH //关
    
     #define CW HIGH //顺时针
     #define CCW LOW //逆时针
    
    
     //控制使能引脚
     /* 带参宏,可以像内联函数一样使用 */
     #define MOTOR_EN(x) HAL_GPIO_WritePin(MOTOR_EN_GPIO_PORT,MOTOR_EN_PIN,x)
     #define MOTOR_PLU(x) HAL_GPIO_WritePin(MOTOR_PUL_GPIO_PORT,MOTOR_PUL_PIN,x)
     #define MOTOR_DIR(x) HAL_GPIO_WritePin(MOTOR_DIR_GPIO_PORT,MOTOR_DIR_PIN,x)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    使用宏定义非常方便程序升级、移植。如果使用不同的 GPIO,修改这些宏即可。

    /**
     * @brief 引脚初始化
     * @retval 无
     */
    void stepper_Init()
    {
    	/* 定义一个 GPIO_InitTypeDef 类型的结构体 */
    	GPIO_InitTypeDef GPIO_InitStruct;
    	
    	/* 开启 Motor 相关的 GPIO 外设时钟 */
    	MOTOR_DIR_GPIO_CLK_ENABLE();
    	MOTOR_PUL_GPIO_CLK_ENABLE();
    	MOTOR_EN_GPIO_CLK_ENABLE();
    	
    	/* 选择要控制的 GPIO 引脚 */
    	GPIO_InitStruct.Pin = MOTOR_DIR_PIN;
    	
    	/* 设置引脚的输出类型为推挽输出 */
    	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    	
    	GPIO_InitStruct.Pull =GPIO_PULLUP;// GPIO_PULLDOWN GPIO_PULLUP
    	
    	/* 设置引脚速率为高速 */
    	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    	
    	/*Motor 方向引脚 初始化 */
    	HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct);
    	
    	/*Motor 脉冲引脚 初始化 */
    	GPIO_InitStruct.Pin = MOTOR_PUL_PIN;
    	
    	HAL_GPIO_Init(MOTOR_PUL_GPIO_PORT, &GPIO_InitStruct);
    	
    	/*Motor 使能引脚 初始化 */
    	GPIO_InitStruct.Pin = MOTOR_EN_PIN;
    	HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct);
    	
    	/* 关掉使能 */
    	MOTOR_EN(OFF);
    
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    步进电机引脚使用必须选择相应的模式和设置对应的参数,使用 GPIO 之前都必须开启相应端口
    时钟。初始化结束后可以先将步进电机驱动器的使能先关掉 MOTOR_EN(OFF),需要旋转的时
    候,再将其打开即可。
    封装步进电机旋转函数
    由于脉冲为模拟产生的所以必须使用模拟的方式来产生所需的特定脉冲

    步进电机旋转

    
    /**
    * @brief 步进电机旋转
    * @param tim 方波周期 单位 MS 周
    期越短频率越高,转速越快 细分为 1 时最少 10ms
    * @param angle 需要转动的角度值
    * @param dir 选择正反转 (取值范围:0,1)
    * @param subdivide 细分值
    * @note 无
    * @retval 无
    */
    void stepper_turn(int tim,float angle,float subdivide,uint8_t dir)
     {
    	int n,i;
    	/* 根据细分数求得步距角被分成多少个方波 */
    	n=(int)(angle/(1.8/subdivide));
    	if(dir==CLOCKWISE) //顺时针
    	{
    		MOTOR_DIR(CLOCKWISE);
    	}
    	else if(dir==ANTI_CLOCKWISE)//逆时针
    	{
    		MOTOR_DIR(ANTI_CLOCKWISE);
    	}
    	/* 开使能 */
    	MOTOR_EN(ON);
    	/* 模拟方波 */
    	for(i=0;i<n;i++)
    	{
    		MOTOR_PLU(HIGH);
    		delay_us(tim/2);
    		MOTOR_PLU(LOW);
    		delay_us(tim/2);
    	}
    	/* 关使能 */
    	MOTOR_EN(OFF);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    stepper_Init();/ /* 步进电机初始化 / / 开启步进电机使能 */
    angle_val 改变角度
    dir_val 转换方向
    stepper_turn(1000,angle_val,32,dir_val);

    此函数封装的功能为步进电机选装特定的角度,stepper_turn() 函数共四个参数,这四个参数几乎
    是决定了步进电机的旋转的所有特性
    • tim: tim 用于控制脉冲的产生周期,周期越短频率越高,速度也就越快
    • angle:angle 用于控制步进电机旋转的角度,如果需要旋转一周,输入 360 即可
    • subdivide:subdivide 用于控制软件上的细分数,这个细分参数必须与硬件的细分参数保持一

    论坛:https://www.firebbs.cn/ 192 天猫:https://yehuosm.tmall.com
    野火电机开发实战指南
    基于野火 STM32 全系列开发板
    • dir:dir 用于控制方向,dir 为 1 时顺时针方向旋转,dir 为 0 时逆时针方向旋转
    在函数中 n=(int)(angle/(1.8/subdivide)); 根据函数传入的角度参数和步进电机的步角 1.8°,就可
    以算出在细分参数为 1 的情况下需要模拟的脉冲数,以此类推,细分数为 2、4、8、16 时代入公
    式计算即可。

    第二种方式:使用 GPIO 中断模拟脉冲控制
    (1) 通用 GPIO 配置
    (2) 步进电机、定时器中断初始化
    (3) 在定时器中断翻转 IO 引脚
    (4) 在 main 函数中编写轮询按键控制步进电机旋转的代码

    第三种方式:使用 PWM 比较输出
    (1) 步进电机、定时器初始化
    (2) 在 main 函数中编写轮询按键控制步进电机旋转的代码

    第四种方式:使用 PWM 控制匀速旋转

    (1) 步进电机、定时器初始化
    (2) 在 main 函数中编写轮询按键控制步进电机旋转的代码


    上一节 入门电机系列之3舵机

  • 相关阅读:
    利用谷歌云跑代码
    Android Launcher3简介
    fastadmin tp 安装使用百度富文本编辑器UEditor
    yolov8 snpe报错 Invalid Slice inputs 4, only constant inputs supported
    redis-哨兵模式&集群(无中心化)
    CSS学习————背景属性(4)
    干货分享|一些好的数据分析、数据挖掘的网站或数据学习网站
    QT QAxWidget控件 使用详解
    Servlet——文件上传
    基于javaweb的在线服装销售商城系统(java+springboot+vue+mysql)
  • 原文地址:https://blog.csdn.net/qq_35653974/article/details/127803616