Điều khiển động cơ Servo bằng STM32F103C8

Điều khiển động cơ Servo bằng STM32F103C8

Trong điện tử, động cơ Servo chủ yếu được sử dụng trong các dự án Robotics vì độ chính xác và xử lý dễ dàng. Động cơ servo có kích thước nhỏ hơn và chúng rất hiệu quả và tiết kiệm năng lượng. Chúng cung cấp mô-men quay cao và có thể được sử dụng để nâng hoặc đẩy trọng lượng theo đặc điểm kỹ thuật của động cơ. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về Động cơ Servo và  Cách giao tiếp Servo với board STM32F103C8. Biến trở cũng được sử dụng để thay đổi vị trí trục của động cơ servo và màn hình LCD để hiển thị giá trị góc.

Linh kiện cần thiết

  • Board STM32F103C8
  • Động cơ Servo (SG90)
  • LCD (16×2)
  • Biến trở
  • Breadboard
  • Dây dẫn

Sơ đồ mạch và kết nối

Chi tiết chân SMT32F103C8

Trong STM32F103C8, có 10 chân ADC (PA0-PB1) và ở đây chúng tôi chỉ sử dụng một chân (PA3) cho analogread () để đặt vị trí trục của động cơ bằng biến trở. Ngoài ra trong số 15 chân PWM của STM32 (PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9), một chân sẽ được sử dụng để cung cấp xung cho động cơ (thường là màu cam).

Nối dây giữa STM32F103C8 và LCD

STM32F103C8 LCD
GND VSS
+5V VDD
Chân giữa của biến trở V0
PB0 RS
GND RW
PB1 E
PB10 D4
PB11 D5
PC13 D6
PC14 D7
+5V A
GND K

Nối dây giữa động cơ Servo và STM32F103C8

STM32F103C8 

SERVO

+5V

Đỏ (+5V)

PA0

Cam (chân PWM )

GND

Nâu (GND)

Nối dây cho biến trở

Chúng tôi đã sử dụng hai biến trở

  1. Biến trở bên phải được sử dụng để thay đổi độ tương phản LCD. Nó có ba chân, chân trái là + 5V và phải là GND và chân giữa được nối với V0 của LCD.
  2. Biến trở bên trái được sử dụng để thay đổi vị trí trục của động cơ servo bằng cách điều khiển điện áp đầu vào tương tự, chân trái có đầu vào 3,3V và bên phải nối GND và đầu ra ở giữa được nối với (PA3) của STM32

Lập trình STM32 cho động cơ Servo

Giống như hướng dẫn trước đây của chúng tôi, 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 FTDI. Chúng ta có thể tiến hành lập trình nó như một Arduino. Code hoàn chỉnh được đưa ra ở cuối dự án.

Đầu tiên tải các tệp thư viện cho các chức năng của servo và LCD:

#include <Servo.h>
#include <LiquidCstall.h>

Sau đó khai báo chân cho màn hình LCD và khởi tạo nó. Cũng khai báo một vài biến khác cho PWM và biến trở:

const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
int servoPin = PA0;
int potPin = PA3;

Ở đây chúng tôi đã tạo ra servo biến đổi với kiểu dữ liệu Servo và gắn nó vào chân PWM được khai báo trước đó.

Servo servo;
servo.attach (servoPin );

Sau đó đọc giá trị Analog từ chân PA3 vì đây là chân ADC, nó chuyển đổi điện áp tương tự (0-3.3) thành dạng số (0-4095)

analogRead (potPin);

Vì đầu ra analog có độ phân giải 12 bit, chúng ta cần lấy các giá trị trong phạm vi độ (0-170), nó chia giá trị ADC (0-4096) theo góc tối đa 170 độ để chúng ta chia cho 24.

angle = (reading/24);

Câu lệnh dưới đây giúp động cơ servo quay trục theo góc đã cho.

servo.write (angle);

Code hoàn chỉnh được đưa ra dưới đây.

//INTERFACE SERVO WITH STM32
//CIRCUIT DIGEST

#include<Servo.h>                                                          //including servo library
#include<LiquidCrystal.h>                                               //including LCD display library
const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14;   //declaring pin names and pin numbers of lcd
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);                               //setting lcd and its paramaters

int servoPin = PA0;                                //declare and initialize pin for servo output PWM 
int potPin = PA3;                                     //potentiometer ADC input 

Servo servo;                                            // creating variable servo with datatype Servo

void setup()                            

{ 
  lcd.begin(16,2);                                                           //setting lcd as 16x2
  lcd.setCursor(0,0);                                                        //setting cursor at first row and first column
  lcd.print("CIRCUIT DIGEST");                                               //puts CIRCUIT DIGEST in LCD
  lcd.setCursor(0,1);                                                        //setting cursor at second row and first column
  lcd.print("SERVO WITH STM32");                                             //puts SERVO WITH STM32 in LCD
  delay(3000);                                                               // delays for 3 seconds
  lcd.clear();                                                               //clears lcd display
  servo.attach(servoPin);   //it connects pin PA0 with motor as control feedback by providing pulses
  
}

void loop()
{
 lcd.clear();                                                                 //clears lcd
 int angle;                                                                   //declare varible angle as int
 int reading;                                                                 //declare varible reading as int
 reading = analogRead(potPin);                                                //read analog value from pin PA3
 angle = (reading/24);                                                        //it divides ADC the value according to max angle 170 deg
 servo.write(angle);                                                          //it puts angle value at servo
 lcd.setCursor(0,0);                                                          //setting cursor at first row and first column
 lcd.print("ANGLE:");                                                         //puts ANGLE in LCD
 lcd.print(angle);                                                            //puts value at angle
 delay(100);                                                                  //delay in time
}

Video

 

 

 

 

 

 

 

 

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *