【毕设教程】单片机控制步进电机

1 前言

这几天有同学在做课设,对步进电机控制原理不理解,来寻求学长解答,这里专门写一篇文章进行解答!

在这里插入图片描述


2 电机工作原理

步进电机使用带齿的轮和电磁体来使轮一次“一步”旋转。

发送的每个HIGH脉冲都会使线圈通电,吸引齿轮的最近齿,并一步步驱动电动机。

在这里插入图片描述

脉冲对这些线圈的方式会极大地影响电动机的性能。

  • 脉冲序列确定电动机的旋转方向。
  • 脉冲的频率决定了电动机的速度。
  • 脉冲数确定电动机将旋转多远(多少步)。

3 DRV8825步进电机驱动器芯片

该模块的核心是德州仪器(TI)的微步进驱动器芯片– DRV8825。它的体积很小(只有0.8英寸×0.6英寸),但仍力气还是挺大
的。

在这里插入图片描述

DRV8825步进电动机驱动器具有高达45V的输出驱动能力,可让您控制一个双极步进电动机,每个线圈的最大输出电流为2.2A。

该驱动程序具有内置转换器,易于操作。这样可以将控制销的数量减少到仅2个,一个用于控制步进,另一个用于控制旋转方向。

驱动程序提供6种不同的步进分辨率。全步,半步,四分之一步,八,十六和三十二分之一步。

4 DRV8825电机驱动器引脚

DRV8825驱动程序共有16个引脚,可将其与外界连接。连接如下:

在这里插入图片描述

4.1 微步选择引脚

DRV8825驱动程序通过允许中间步进位置来允许微步进。这是通过以中等电流水平向线圈通电来实现的。 例如,如果我们选择以四分之一步模式驱动每转1.8°或200步的NEMA 17,则电动机每转将给出800微步。

在这里插入图片描述

DRV8825驱动器具有三个步长(分辨率)选择器输入,即: M0,M1和M2。通过为这些引脚设置适当的逻辑电平,我们可以将电动机设置为六个步进分辨率之一。

在这里插入图片描述

这三个微步选择引脚被内部下拉电阻拉至低电平,因此,如果我们将其断开,电动机将以全步模式运行。

4.2 控制输入​​引脚

DRV8825具有两个控制输入,即。STEP和DIR。

在这里插入图片描述

STEP控制电机的微步。发送到该引脚的每个HIGH脉冲都会通过微步选择引脚设置的微步数来步进电动机。脉冲越快,电动机旋转得越快。

DIR控制电动机的旋转方向。将其拉高,将驱动电机顺时针旋转,将其拉低,将驱动电机逆时针旋转。

如果仅希望电动机沿单个方向旋转,则可以将DIR相应地直接连接到VCC或GND。

4.3 限流

在使用电动机之前,我们需要进行一些小的调整。我们需要限制流经步进线圈的最大电流,并防止其超过电机的额定电流。

在这里插入图片描述

DRV8825驱动器上有一个微调电位器,可用于设置电流限制。您应将电流限制设置为等于或小于电动机的额定电流。

将通过测量“ ref”引脚上的电压(Vref)来设置电流限制。

查看您的步进电机的数据表。记下它的额定电流。在我们的实验设置情况下,我们使用NEMA 17 200steps / rev,12V 350mA。
断开三个微步选择引脚,使驱动器进入全步模式。
不给STEP输入计时,将电动机固定在固定位置。
调整时,测量金属微调电位器本身的电压(Vref)。
使用公式调整Vref电压电流限制= Vref x 2
例如,如果电动机的额定电流为350mA,则可以将参考电压调整为0.175V。

在这里插入图片描述

5 Arduino 控制DRV8825步进电机驱动器

连接非常简单。首先将RST引脚连接到相邻的SLP / SLEEP引脚,并将二者都连接到Arduino的5V,以保持驱动器启用。

将GND LOGIC引脚连接到Arduino的接地引脚。DIR和STEP输入引脚分别连接到Arduino上的#2和#3数字输出引脚。

将步进电机连接到B2,B1,A1和A2引脚。实际上,DRV8825的布局很方便,可以与多个双极电机上的4针连接器匹配,因此这不是问题。

在这里插入图片描述

控制代码

void setup()
{
	// Declare pins as Outputs
	pinMode(stepPin, OUTPUT);
	pinMode(dirPin, OUTPUT);
}
void loop()
{
	// Set motor direction clockwise
	digitalWrite(dirPin, HIGH);

	// Spin motor slowly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(2000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(2000);
	}
	delay(1000); // Wait a second
	
	// Set motor direction counterclockwise
	digitalWrite(dirPin, LOW);

	// Spin motor quickly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(1000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(1000);
	}
	delay(1000); // Wait a second
}

6 AccelStepper库

在没有库的情况下控制步进器非常适合简单的单电机应用。但是,如果要控制多个步进器,则需要一个库。

AccelStepper 高级步进电机库,它支持:

  • 加减速。
  • 多个同时步进器,每个步进器具有独立的并发步进。

该库未包含在Arduino IDE中,因此您需要首先安装它。

使用实例,这是一个简单的程序,它使步进电机沿一个方向加速,然后减速以使其静止。电动机旋转一圈后,它将改变旋转方向。而且它不断地重复做。

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define pin connections
const int dirPin = 2;
const int stepPin = 3;

// Define motor interface type
#define motorInterfaceType 1

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000);
	myStepper.setAcceleration(50);
	myStepper.setSpeed(200);
	myStepper.moveTo(200);
}

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

7 最后

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一次控制两个电机#include #define GPIO_MOTOR P1 sbit K1=P3^6; sbit K2=P3^5; sbit K3=P3^4; sbit K4=P3^3; unsigned char code ZHENG1 [8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转顺序编码 unsigned char code FAN1 [8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //反转顺序编码 unsigned char code ZHENG2 [8]={0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f}; //正转顺序编码 unsigned char code FAN2 [8]={0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}; //反转顺序编码 char Motor1_Step,Motor2_Step,Speed,Speed2; void Delay(unsigned int t); void Motor1_zheng(); void Motor1_fan(); void Motor2_zheng(); void Motor2_fan(); void main() { unsigned int i; Motor1_Step=1; Motor2_Step=3; Speed=10; Speed2=40; while(1) { while(K1==0) { for(i=0;i<10;i++) { Motor1_zheng(); } } while(K2==0) { for(i=0;i<10;i++) { Motor1_fan(); } } while(K3==0) { for(i=0;i<10;i++) { Motor2_zheng(); } } while(K4==0) { for(i=0;i<10;i++) { Motor2_fan(); } } } } void Motor1_fan() { unsigned int i; for(i=0;i<8;i++) { //GPIO_MOTOR = FFW[i]&0x1f; //取数据 GPIO_MOTOR = FAN1[i]; Delay(Speed); //调节转速 } } void Motor1_zheng() { unsigned int i; for(i=0;i<8;i++) { //GPIO_MOTOR = FFZ[i]&0x1f; GPIO_MOTOR = ZHENG1[i]; Delay(Speed); //调节转速 } } void Motor2_fan() { unsigned int i; if(Motor1_Step==0) { for(i=0;i<8;i++) { //GPIO_MOTOR = FFW2[i]&0xf1; //取数据 GPIO_MOTOR = FAN2[i]; Delay(Speed2); //调节转速 } } Motor1_Step=1; } void Motor2_zheng() { unsigned int i; if(Motor1_Step==1) { for(i=0;i<8;i++) { //GPIO_MOTOR = FFZ2[i]&0xf1; GPIO_MOTOR = ZHENG2[i]; Delay(Speed2); //调节转速 } } Motor1_Step=0; } void Delay(unsigned int t) { unsigned int k; while(t--) { for(k=0; k<80; k++) { } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值