将步进电机与STM32F103C8板连接的教程

2023-08-03  

步进电机是无刷直流电机,可以小角度旋转,这些角度称为步进。一般步进电机使用200步完成360度旋转,意味着其每步旋转1.8度。步进电机用于许多需要精确旋转运动的设备,如机器人、天线、硬盘驱动器等。我们可以通过给出适当的说明将步进电机旋转到任何特定角度。主要有两种类型的步进电机可供选择,单极和双极。单极更容易操作、控制,也更容易获得。在本教程中,我们将步进电机与STM32F103C8(蓝色药丸)板连接。


所需材料

STM32F103C8 (蓝色药丸)

步进电机(28BYJ-48)

ULN2003 集成电路

电位器 10k

面包板

跳线

步进电机 (28BYJ-48)

28BYJ-48 是一款单极步进电机,需要 5V 电源。电机具有4线圈单极性布置,每个线圈的额定电压为+5V,因此使用Arduino,Raspberry Pi和STM32等任何微控制器都相对容易控制。但是我们需要像ULN2003这样的电机驱动IC来驱动它,因为步进电机消耗大电流,可能会损坏微控制器。

poYBAGNouTOAcaulAACKtPpkgRI756.jpg

另一个需要注意的重要数据是步幅角度:5.625°/64。这意味着电机按 8 步顺序运行时每一步移动 5.625 度,完成一整圈需要 64 步(5.625*64=360)。以下数据表中提供了其他规格:

pYYBAGNouTaAbZUwAAB7b7VRrg0628.png

ULN2003 电机驱动器 IC

它用于根据从微控制器接收到的脉冲驱动电机。以下是ULN2003的图片图:

poYBAGNouTiATXtKAABQcZ6E12U320.png

引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 被赋予输出设备所需的正源电压。步进电机的进一步连接在下面的电路图部分给出。

电路图和连接

poYBAGNouUCAQbPrAACrOCxMxRI602.png

以下是上述电路图的连接说明。

STM32F103C8 (蓝色药丸)

如下图所示,PWM引脚以波形(~)表示,有15个这样的引脚可用于步进电机的脉冲输出。我们只需要四个引脚,我们使用(PA0到PA3)。

STM32-Pin-Details_0.png

STM32F103C8 带 ULN2003 电机驱动器 IC

引脚(PA0 至 PA3)被视为与 ULN2003 IC 的输入引脚 (IN1-IN4) 连接的输出引脚。


STM32F103C8的引脚 ULN2003 集成电路引脚
质保 合1
质量保证 IN2
质量保证 HNR
卡塔尔里亚尔 IN4
5V .COM
接地 接地


ULN2003 带步进电机的集成电路 (28BYJ-48)

ULN2003 IC 的输出引脚 (OUT1-OUT4) 连接到步进电机引脚(橙色、黄色、粉红色和蓝色)。


ULN2003 集成电路引脚 步进电机引脚
输出1
输出2 黄色
输出3 粉红色
输出4
.COM


STM32F103C8 带电位计

电位计用于设定步进电机的速度。


电位计 STM32F103C8
左(输入) 3.3
中心(输出) 质保
右(接地) 接地


采用STM32F103C8的旋转步进电机

以下是操作步进电机的几个步骤:

通过改变电位器设置步进电机的速度。

然后通过ARDUINO IDE(工具>串行监视器)或CTRL + SHIFT + M中的串行MONITER以顺时针(+值)或逆时针方向(-值)手动输入旋转步骤。

根据串行监视器中给出的输入值,步进电机中会发生某些旋转步骤。

例如


串行监控器中给出的值 旋转
2048 (360) 克莱克·怀斯
1024 (180)CLK WISE
512 (90)CLK WISE
-2048 (-360)反克利明智
-1024 (-180)反克利明智
-512 (-90)反克利明智


pYYBAGNouU2AMW14AACrF-gWbvY631.jpg

步进电机STM32编程

与前面的教程一样,我们通过USB端口使用Arduino IDE对STM32F103C8进行了编程,而无需使用FTDI编程器。

首先,我们必须包含步进库文件#include ,以便使用步进器函数。

#include

然后我们定义 no。旋转时要完成的步骤,这里我们使用 32,因为我们使用的是全步(4 步序列)所以 (360/32 = 11.25 度)。因此,对于一步,轴移动 11.25 度,即步幅角。在 4 步序列中,一个完整的旋转需要 4 个步骤。

#define STEPS 32

我们还可以使用半步模式,其中有 8 步序列 (360/64=5.625) 步幅。

Steps per revolution = 360 / STEP ANGLE

当我们设置速度时,我们必须从连接到电位计的PA4中获取模拟值。所以我们必须为此声明 pin

const int speedm = PA4

然后,我们将模拟值转换为数字值,将这些值存储在整数类型的变量中,之后我们必须映射ADC值以设置速度,因此我们使用以下语句。在此处了解有关将ADC与STM32配合使用的更多信息。

int adc = analogRead(speedm);

int result = map(adc, 0, 4096, 1, 1023);

为了设置速度,我们使用stepper.setSpeed(result);我们的速度范围为 (1-1023)。

我们必须创建如下所示的实例来设置连接到电机的引脚。在这些步骤中要小心,因为大多数步骤在此模式中都会出错。它们给出了错误的模式,因此线圈无法通电。

Stepper stepper(STEPS, PA0, PA2, PA1, PA3);

以下语句用于从串行监视器获取步骤的值。例如,我们需要 2048 个值进行一次完整旋转 (32*64 = 2048),即 64 将是齿轮比,32 将是一次旋转的半步序列。

rotate = Serial.parseInt();

下面的代码用于调用实例并运行电机。如果旋转值为 1,则调用函数步进器一次,完成一次移动。

stepper.step(rotate);

/STM32 stepper motor control code

//CIRCUIT DIGEST


#include // Include the Stepper motor header file

#define STEPS 32 // change this to the number of steps on your motor

const int speedm = PA4; // Pin for input speed

Stepper stepper(STEPS, PA0, PA2, PA1, PA3); // create an instance of the stepper class using the steps and pins

int rotate = 0; //declare variable rotate with 0 for input rotation.

void setup() //Setup() runs only once

{

Serial.begin(9600); //begins serial communication at 9600baud rate

pinMode(speedm,INPUT); //set pin PA4 as input

}


void loop() //loop() runs infinitely

{

if (Serial.available()>0) //Checks if serial data is entered or not in serial monitor

{

rotate = Serial.parseInt(); //gets the value for rotation from serial monitor

int adc = analogRead(speedm); //read analog value from pin PA0

int result = map(adc, 0, 4096, 0, 1023); //maps the result of ADC from (0to4096)with (0to1023)

stepper.setSpeed(result); //sets the speed of motor

stepper.step(rotate); //makes the motor to rotate

Serial.println(rotate); //prints the value you specified to rotate

}

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。