两相四线步进电机原理和各种驱动方法理解与应用

有时候软件工程师理解硬件知识,那就是十窍通了九窍,简称一窍不通(悲)。

今天我们来说说步进电机。

步进电机

从名字上面来理解,就是一步一步前进的电机。

既然如此,如何一步一步走呢?

根据高中物理知识,电机的旋转,无非就是电生磁,然后转化成动能。

而步进电机,只是三千弱水其中一瓢。

(图片来自网络)

大概就是长这个样子,但不是每一种步进电机都长这个样子。有腿多的,也有腿少的(相数线数不同)。

从不同的方向通电,就向不同的方向转动,通电电流大小不同,转动速度就不同。这也就是改变了电机转动的方向和转速。

以三相步进电机为例,定子按 A→B→C→A相轮流通电,则磁场沿A、B、C方向转动360°角,转子沿ABC方向转动了一个齿距的位置。

中间没啥复杂计算过程,纯纯物理控制,1就是1,因此步进电机没有累计误差的特点,广泛的用于各种开环控制。

相关参数

相数——步进电机的线圈对数

拍数——转子转动一周,定子绕组通电的次数

步距角——步进电机接收到一个脉冲信号后,驱动电机按设定的方向转动的一个固定角度

步距角θ=360°/mzc(m为定子相数;z为转子齿数;c为通电方式(1:单相轮流通电,双向轮流通电;2:单双向轮流通电方式))

转速公式:n=f*θ/x*360°(n为转速;f为脉冲频率;θ为步距角,x是细分数)

细分控制

细分数是什么?这就要说说所谓细分。

细分的目的主要是为了改善步进电机的运行性能,比如四步的转动扭矩会小于八步的,其次提高了步进电机的精度。

细分功能完全是由外部驱动电路精确控制电机的相电流产生的,和具体电机无关。

步进电机之所以能实现步进就是因为在硬件结构上做了拆分(定子上有不同的通电相,转子上有齿),使其一次转动不是一圈,而是一步一步的按固定的角度转动。这一步所转过的角度就是步距角。

细分控制是指对步距角再进行详细的分步控制。

例如,对一个步距角为1.8°的两相四拍电机进行四细分控制,就是使得电机转动一步是1.8除以4,也就是0.45°来运转。

细分越大精度的确可以提高,并且电机运行更平稳,但是相对的来说脉冲频率就变大,所以一些控制器的脉宽不够,导致电机失步、堵转,所以选择细分要根据实际来调,不是越大越好。

步进电机控制

控制器控制的是什么呢?还是拿STM32F103C8T6举例:

实际上,控制器能做的也就是控制引脚的输出,最最简单的引脚输出,要么高电平,要么低电平。如果上点难度,那就是快速切换高低电平,这样因为人来不及反应,你就感觉这个电平变化的五彩缤纷。

这也就是所谓PWM的原理。

那如果使用PWM方式来进行控制,我们需要的就是打开一个timer,然后用PWM方式start。(详细见上回舵机控制

比如:

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);

接着,因为控制电机不仅需要这个变花样的信号,还需要最基本的方向控制和使能,那就再加两个引脚,分别控制即可。

    GPIO_InitTypeDef GPIO_InitStruct;
    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /*Motor 方向引脚 初始化*/
    GPIO_InitStruct.Pin = GPIO_PIN_1;	
	GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP; 
	GPIO_InitStruct.Pull =GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	/*Motor 使能引脚 初始化*/
	GPIO_InitStruct.Pin = GPIO_PIN_2;	
	GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP; 
	GPIO_InitStruct.Pull =GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	/*Motor 脉冲引脚 初始化*/
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull =GPIO_PULLUP;
	GPIO_InitStruct.Pin = GPIO_PIN_8;	
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

如果你用的是比较输出方式,也差不多,在输出比较电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR、小于CCR、等于CCR时,输出就会输出对应的置1或置0。

驱动器、控制器、电机法原理

刚刚我们说了使用PWM(PWM输出)和OC(比较输出)方法控制电机,整个过程在于stm控制芯片输出波形信号给驱动器,驱动器根据这些信号的发送频率和占空比等等转换成不同速度和信号强度(电流大小),也会根据用户想要的拍数不同来切换不同位置,变化的发出0和1控制引脚电平变化。

但是!

你这也太超前了,如果我没有驱动器呢?咋办啊。

控制器、电机法原理

如果没有驱动器,那就是stm控制芯片直接控制电机,其实更简单了,为啥捏?

因为我们不用计算复杂的信号频率,旋转角度这些东西了,直接对引脚写0和1,速度也由自己控制,改变每次转换引脚电平的延时即可。

将以下代码封装成函数,加在mian函数的while循环里面,就会得到直接控制电机的程序啦。

注意,引脚电平高低顺序谁先谁后得看你自己的板子,这里只是举个例子。

如果你发现自己的步进电机没法转起来,大概率是线序错误,请看电机伸出的接线线序和板子设置的A+A-B+B-来检查线序!

        //正转,四步法
        PINA1_ON;
	    PINA2_ON;
	    PINB1_OFF;
	    PINB2_ON;
	    Self_Delay(delay);

		PINA1_ON;
		PINA2_OFF;
		PINB1_ON;
		PINB2_ON;
		Self_Delay(delay);

		PINA1_OFF;
		PINA2_ON;
		PINB1_ON;
		PINB2_ON;
		Self_Delay(delay);

		PINA1_ON;
		PINA2_ON;
		PINB1_ON;
		PINB2_OFF;
		Self_Delay(delay);
        //反转,四步法
        PINA1_ON;
		PINA2_ON;
		PINB1_ON;
		PINB2_OFF;
		Self_Delay(delay);

		PINA1_OFF;
		PINA2_ON;
		PINB1_ON;
		PINB2_ON;
		Self_Delay(delay);

		PINA1_ON;
		PINA2_OFF;
		PINB1_ON;
		PINB2_ON;
		Self_Delay(delay);

		PINA1_ON;
		PINA2_ON;
		PINB1_OFF;
		PINB2_ON;
		Self_Delay(delay);

改变delay的大小,就可以改变电机转动速度。

有好学的朋友可能要问了,那我如果想要高级一点,变速运动呢?

我只能说,问得好!(叉腰)

我们只要动态改变延时长度,那不就好啦!(变量大小老规矩,还是自己写噢)

void trapezoidal_motion() {
	for (int i = 0; i < SHORT_STEPS; i++) {//先加速
			speed_delay_time-=acceleration;
			test(speed_delay_time);//正转函数
	}

	for(int i=0;i<LONG_STEPS;i++)
		test(speed_delay_time);  // 匀速阶段

	for (int i = 0; i < SHORT_STEPS; i++) {
			speed_delay_time+=acceleration;
			test(speed_delay_time);//再减速
	}
}
void trapezoidal_motion_in() {
	for (int i = 0; i < SHORT_STEPS; i++) {
			speed_delay_time-=acceleration;
			test1(speed_delay_time);//反转函数
	}

	for(int i=0;i<LONG_STEPS;i++)
	test1(speed_delay_time);  // 匀速阶段

	for (int i = 0; i < SHORT_STEPS; i++) {
			speed_delay_time+=acceleration;
			test1(speed_delay_time);
	}
}
  • 19
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Arduino是一种开源的电子开发平台,它可以用来编程控制各种电子设备,包括步进电机两相四线步进电机是一种常见的用于精确控制旋转角度的电机。 首先,我们来看看Arduino与两相四线步进电机原理图。 在原理图中,有两个主要的部分:Arduino主板和步进电机驱动器。Arduino主板是一个微控制器,它有多个数字和模拟引脚,可以用来控制和发送信号给步进电机驱动器。 步进电机驱动器是连接Arduino主板和步进电机之间的中间件。它的作用是接收来自Arduino主板的信号,并将其转换为步进电机可以理解的电信号。 在两相四线步进电机中,有四个线路:两个相线(A和B)和两个公共线(C和D)。这种电机可以通过逐个切换相线和公共线,从而实现旋转。 Arduino主板通过数字引脚向步进电机驱动器发送脉冲信号。这些脉冲信号将导致步进电机驱动器切换相线和公共线。例如,当Arduino发送一个脉冲信号到A相线时,步进电机将在一个固定的角度旋转。 通过持续发送不同的脉冲信号,我们可以控制步进电机的旋转方向和速度。例如,通过连续发送一系列的脉冲信号到A相线和B相线,我们可以使步进电机顺时针旋转。如果我们改变脉冲信号的频率,步进电机的旋转速度也会发生改变。 总而言之,Arduino与两相四线步进电机原理图中,Arduino主板通过数字引脚向步进电机驱动器发送脉冲信号,步进电机驱动器将这些信号转换为步进电机的旋转动作,从而实现精确控制步进电机的旋转。 ### 回答2: Arduino是一款开源的开发板,它可以用来编写并控制各种电子装置。两相四线步进电机是一种常用的电机类型,其原理图是指电机与其他部件之间的电气连接图。 通常,两相四线步进电机具有四个线束,每个线束都有正负极,共四个极。这四个极按照相邻两个极之间的电流方向可以分为两个相位。每个相位都有两根线束连接到电机驱动器。 对于Arduino的控制,可以通过将电机驱动器与Arduino连接,以实现电机的控制。连接时,Arduino的数字输出针脚可以连接到电机驱动器的步进信号输入,以控制电机的步进运动。而电机驱动器的两个相位输入线束则连接到电机的两个相位线束,用于提供驱动电流。 在实际使用中,可以通过编写Arduino代码并结合相应的库文件,来实现对两相四线步进电机的控制。例如,可以定义步进角度和步进速度,并使用DigitalWrite函数来控制步进信号的输出状态,从而实现电机的转动。 需要注意的是,在连接电机、电机驱动器和Arduino之前,应了解电机和电机驱动器的电气参数,并根据其要求进行正确的电气连接。此外,在编写代码时也需要了解所使用的库文件函数的参数和使用方法。 总之,Arduino与两相四线步进电机原理图是建立在正确的电气连接和编写控制代码的基础上,通过控制步进信号和驱动电流,实现对电机步进运动的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值