Interfacing Stepper Motor with STM32F103C8
Động cơ bước là động cơ điện một chiều không chổi than, có thể quay được các góc nhỏ, các góc này được gọi là bước. Nói chung động cơ bước sử dụng 200 bước để hoàn thành vòng quay 360 độ, nghĩa là xoay 1,8 độ mỗi bước. Động cơ bước được sử dụng trong nhiều thiết bị cần chuyển động quay chính xác như rô bốt, ăng-ten, ổ cứng, v.v. Chúng tôi có thể xoay động cơ bước theo bất kỳ góc cụ thể nào bằng cách đưa ra hướng dẫn thích hợp. Chủ yếu có hai loại động cơ bước, Đơn cực và Lưỡng cực. Đơn cực dễ vận hành, kiểm soát hơn và cũng dễ lấy hơn. Ở đây trong hướng dẫn này, chúng tôi đang giao tiếp Động cơ bước với bảng STM32F103C8 (Viên thuốc màu xanh lam).
Materials Required
- STM32F103C8 (Blue pill)
- Stepper Motor(28BYJ-48)
- ULN2003 IC
- Potentiometer 10k
- Breadboard
- Jumper wires
28BYJ-48 là động cơ bước đơn cực yêu cầu nguồn điện 5V. Động cơ có bố trí 4 cuộn dây đơn cực và mỗi cuộn dây được đánh giá là + 5V, do đó nó tương đối dễ điều khiển với bất kỳ bộ vi điều khiển nào như Arduino, Raspberry Pi cũng STM32. tiêu thụ dòng điện cao và nó có thể làm hỏng vi điều khiển.
Một dữ liệu quan trọng khác cần lưu ý là Stride Angle: 5.625 ° / 64. Điều này có nghĩa là động cơ khi hoạt động theo trình tự 8 bước sẽ di chuyển 5.625 độ cho mỗi bước và sẽ mất 64 bước (5.625 * 64 = 360) để hoàn thành một vòng quay đầy đủ. Các thông số kỹ thuật khác được cung cấp trong biểu dữ liệu dưới đây:
ULN2003 Motor Driver IC
Nó được sử dụng để điều khiển động cơ theo các xung nhận được từ vi điều khiển. Dưới đây là sơ đồ hình ảnh của ULN2003:
Các chân (IN1 đến IN7) là các chân đầu vào và (OUT 1 đến OUT 7) là các chân đầu ra tương ứng. COM được cung cấp Điện áp nguồn dương cần thiết cho các thiết bị đầu ra. Các kết nối khác cho động cơ bước được đưa ra bên dưới trong phần sơ đồ mạch.
Circuit Diagram and Connections
STM32F103C8 with ULN2003 Motor Driver IC
Pins (PA0 to PA3) are considered as output pins that are connected with input pins (IN1-IN4) of the ULN2003 IC.
PINS OF STM32F103C8 | PINS OF ULN2003 IC |
PA0 | IN1 |
PA1 | IN2 |
PA2 | IN3 |
PA3 | IN4 |
5V | COM |
GND | GND |
ULN2003 IC with Stepper Motor (28BYJ-48)
The output pins (OUT1-OUT4) of ULN2003 IC are connected to the stepper motors pins (Orange, Yellow, Pink, and Blue).
PINS OF ULN2003 IC | PINS OF STEPPER MOTOR |
OUT1 | ORANGE |
OUT2 | YELLOW |
OUT3 | PINK |
OUT4 | BLUE |
COM | RED |
STM32F103C8 with Potentiometer
A potentiometer is used as to set speed of the stepper motor.
POTENTIOMETER | STM32F103C8 |
LEFT (INPUT) | 3.3 |
CENTRE(OUTPUT) | PA4 |
RIGHT(GND) | GND
|
Rotating Stepper Motor with STM32F103C8
Dưới đây là một số bước để vận hành Động cơ bước:
Đặt tốc độ của động cơ bước bằng cách thay đổi chiết áp.
Sau đó, nhập thủ công các bước để xoay theo chiều kim đồng hồ (+ giá trị) hoặc ngược chiều kim đồng hồ (-giá trị) thông qua SERIAL MONITER có trong ARDUINO IDE (Công cụ-> Màn hình nối tiếp) hoặc CTRL + SHIFT + M.
Theo giá trị đầu vào được đưa ra trong màn hình nối tiếp, các bước quay nhất định diễn ra trong động cơ bước.
For Example
VALUE GIVEN IN SERIAL MONITER | ROTATION |
2048 | (360) CLK WISE |
1024 | (180)CLK WISE |
512 | (90)CLK WISE |
-2048 | (-360) ANTI CLK WISE |
-1024 | (-180)ANTI CLK WISE |
-512 | (-90)ANTI CLK WISE
|
PROGRAMMING STM32 for Stepper Motor
Giống như hướng dẫn trước, chúng tôi đã lập trình STM32F103C8 với Arduino IDE thông qua cổng USB mà không cần sử dụng bộ lập trình FTDI. Để tìm hiểu về lập trình STM32 với Arduino IDE, hãy làm theo liên kết. Chúng ta có thể tiến hành lập trình nó giống như Arduino. Mã hoàn chỉnh được đưa ra ở cuối dự án.
Đầu tiên, chúng ta phải bao gồm các tệp thư viện bước #include <Stepper.h> để sử dụng các hàm bước.
Sau đó, chúng tôi xác định không. trong số các bước cần hoàn thành khi xoay, ở đây chúng tôi sử dụng 32 vì chúng tôi đang sử dụng Toàn bước (4 bước-trình tự) nên (360/32 = 11,25 độ). Vì vậy, trong một bước, trục di chuyển 11,25 độ đó là góc sải chân. Trong chuỗi 4 bước, 4 bước được yêu cầu cho một vòng quay hoàn chỉnh.
#define STEPS 32
Chúng ta cũng có thể sử dụng chế độ Nửa bước trong đó có 8 bước trình tự (360/64 = 5.625) góc sải chân.
Steps per revolution = 360 / STEP ANGLE
Vì chúng ta đang cài đặt tốc độ, chúng ta phải lấy giá trị tương tự từ PA4 được kết nối với chiết áp. Vì vậy, chúng ta phải khai báo mã pin cho điều đó
const int speedm = PA4
Sau đó, chúng tôi đã chuyển đổi giá trị tương tự thành kỹ thuật số bằng cách lưu trữ các giá trị đó trong biến kiểu số nguyên, sau đó chúng tôi phải ánh xạ các giá trị ADC cho tốc độ cài đặt vì vậy chúng tôi sử dụng câu lệnh dưới đây. Tìm hiểu thêm về cách sử dụng ADC với STM32 tại đây.
int adc = analogRead(speedm);
int result = map(adc, 0, 4096, 1, 1023);
Để thiết lập tốc độ, chúng tôi sử dụng stepper.setSpeed (result); Chúng tôi có phạm vi tốc độ là (1-1023).
Chúng ta phải tạo trường hợp như bên dưới để thiết lập các chân được kết nối với động cơ. Hãy cẩn thận trong các bước này vì hầu hết chúng đều mắc lỗi ở đây trong mẫu này. Họ đưa ra mô hình sai và do đó các cuộn dây không thể được cung cấp năng lượng.
Stepper stepper(STEPS, PA0, PA2, PA1, PA3);
Câu lệnh dưới đây được sử dụng để lấy giá trị của các bước từ màn hình nối tiếp. Ví dụ, chúng ta cần 2048 giá trị cho một vòng quay đầy đủ (32 * 64 = 2048), 64 sẽ là tỷ số truyền và 32 sẽ là chuỗi nửa bước cho một vòng quay.
rotate = Serial.parseInt();
Mã bên dưới được sử dụng để gọi phiên bản và chạy động cơ. Nếu giá trị xoay là 1, nó sẽ gọi hàm bước một lần và một lần di chuyển được thực hiện.
#include <Stepper.h> // 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
}
}