步进电机是无刷直流电机,可以小角度旋转,这些角度称为步进。一般步进电机使用200步完成360度旋转,意味着其每步旋转1.8度。步进电机用于许多需要精确旋转运动的设备,如机器人、天线、硬盘驱动器等。我们可以通过给出适当的说明将步进电机旋转到任何特定角度。主要有两种类型的步进电机可供选择,单极和双极。单极更容易操作、控制,也更容易获得。在本教程中,我们将步进电机与STM32F103C8(蓝色药丸)板连接。
所需材料
STM32F103C8 (蓝色药丸)
步进电机(28BYJ-48)
ULN2003 集成电路
电位器 10k
面包板
跳线
步进电机 (28BYJ-48)
28BYJ-48 是一款单极步进电机,需要 5V 电源。电机具有4线圈单极性布置,每个线圈的额定电压为+5V,因此使用Arduino,Raspberry Pi和STM32等任何微控制器都相对容易控制。但是我们需要像ULN2003这样的电机驱动IC来驱动它,因为步进电机消耗大电流,可能会损坏微控制器。
另一个需要注意的重要数据是步幅角度:5.625°/64。这意味着电机按 8 步顺序运行时每一步移动 5.625 度,完成一整圈需要 64 步(5.625*64=360)。以下数据表中提供了其他规格:
ULN2003 电机驱动器 IC
它用于根据从微控制器接收到的脉冲驱动电机。以下是ULN2003的图片图:
引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 被赋予输出设备所需的正源电压。步进电机的进一步连接在下面的电路图部分给出。
电路图和连接
以下是上述电路图的连接说明。
STM32F103C8 (蓝色药丸)
如下图所示,PWM引脚以波形(~)表示,有15个这样的引脚可用于步进电机的脉冲输出。我们只需要四个引脚,我们使用(PA0到PA3)。
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)反克利明智 |
步进电机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
}
}