You are on page 1of 9

BÁO CÁO THỰC TẬP VI XỬ LÝ

Sinh viên: Trần Thái Bảo MSSV: 20146054

Phòng học: E1-306 Ngày báo cáo: 20/1/2024

Nội dung: Khảo sát và lập trình điều khiển trạm băng tải Tuần học: 1

Khảo sát sơ đồ nguyên lý:


Sơ đồ nguyên lý khối Digital Input

Khối Digital Input được lắp 2 cảm biến loại NPN, 4 nút nhấn điện trở nội (pull-up) và công tắc gạt
3 chân có điện trở nội (pull-up)
Sơ đồ nguyên lý khối Digital Output

Bảng kết nối Input, output

STT Tên phần cứng


Vị trí chân vi điều Trạng thái phần Mức logic tại chân
khiển tương ứng cứng vi điều khiển

Đèn D1 Sáng 1

PA7
Đèn D1 Tắt 0
Đèn D2 Sáng 1
PB2
Đèn D2 Tắt 0

MOTOR băng tải Chạy 1

PB0
MOTOR băng tải Ngừng 0

Nút nhấn B1 (Xanh) Được nhấn 0

PD11
Nút nhấn B1 (Xanh) Chưa được nhấn 1

Nút nhấn B2 (Đỏ) Được nhấn 0

PC6
Nút nhấn B2 (Đỏ) Chưa được nhấn 1

Nút nhấn B3 (Vàng) Được nhấn 1

PC7
Nút nhấn B3 (Vàng) Chưa được nhấn 0

Nút nhấn B4 (Vàng) PE14 Được nhấn 1

Nút nhấn B4 (Vàng) Chưa được nhấn 0

Công tắt gạt PA15 Vị trí bên trái 1

Công tắt gạt PC8 Vị trí bên giữa 0

Công tắt gạt PB5 Vị trí bên phải 1

Dự án lập trình

Khi mới mở điện: đèn D1, D2 tắt; Motor M ngừng.


Sau khi mở điện 1 giây: Đèn D1 chớp tắt chu kỳ 500ms.

Bảng cấu hình GPIO: (GPIO configuration)


PIN Signal GPIO mode Max speed User label
PA7 n/a Input push pull

Bảng định nghĩa trạng thái (#define)


Tên trạng thái Giá trị Ý nghĩa

D1_ON 1 Vi điều khiển xuất ra mức cao thì đèn sang

D1_OFF 0 Vi điều khiển xuất ra mức thấp thì đèn tắt

Lưu đồ giải thuật

Mã nguồn chương trình (chỉ copy nội dung đã thêm hoặc chỉnh sửa từ code dự án)
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, D1_OFF);
HAL_Delay(1000);
while (1) {
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, D1_ON);
HAL_Delay(500);
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, D1_OFF);
HAL_Delay(500)
}

Yêu cầu 2:
Khi mới mở điện: đèn D1, D2 tắt; Motor M ngừng.
Khi nhấn nút nhấn B1 làm động cơ M chạy. (Dùng tay nhấn vào một lần rồi thả tay ra)
Khi nhấn nút nhấn B2 làm động cơ M ngừng. (Dùng tay nhấn vào một lần rồi thả tay ra)

Bảng cấu hình GPIO: (GPIO configuration)


PIN Signal GPIO mode Max speed User label

PD11 n/a INPUT MODE n/a BUTTON_1

PC6 n/a INPUT MODE n/a BUTTON_2

PB0 n/a Output Push Pull Low MOTOR

Bảng định nghĩa trạng thái (#define)

Tên trạng thái Giá trị Ý nghĩa

MOTOR_START 1 Vi điều khiển xuất ra mức cao thì động cơ hoạt động

MOTOR_STOP 0
Vi điều khiển xuất ra mức thấp thì động cơ ngưng
hoạt động

BUTTON_PRESSED 0
Khi nhấn nút thì ngõ vào nối đất thì vi điều khiển
nhận mức 0

Lưu đồ giải thuật


Mã nguồn chương trình (chỉ copy nội dung đã thêm hoặc chỉnh sửa từ code dự án)

HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, MOTOR_STOP);


uint8_t BUTTON_1_check = 1; uint8_t BUTTON_2_check = 1;
uint8_t State = 0;
while (1) {
BUTTON_1_check = HAL_GPIO_ReadPin(BUTTON_1_GPIO_Port,
BUTTON_1_Pin);
BUTTON_2_check = HAL_GPIO_ReadPin(BUTTON_2_GPIO_Port,
BUTTON_2_Pin);
if ((State == 0) && (BUTTON_1_check == BUTTON_PRESSED))
State = 1;
if ((State == 1) && (BUTTON_1_check != BUTTON_PRESSED))
State = 2;
if ((State == 2) && (BUTTON_2_check == BUTTON_PRESSED))
State = 3;
if ((State == 3) && (BUTTON_2_check != BUTTON_PRESSED))
State = 0;
if (State == 0) {
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_STOP);
}
if (State == 1) {
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_START);
}
if (State == 2) {
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_START);
}
if (State == 3) {
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_STOP);
}
Yêu cầu 3:
Khi mới mở điện: đèn D1, D2 tắt; Motor M ngừng.

Nút nhấn B1 làm chuyển trạng thái chạy – ngừng của động cơ M: Nếu động cơ đang ngừng thì nhấn
B1 rồi thả tay ra, động cơ chạy. Nếu động cơ đang chạy thì nhấn B1 rồi thả tay ra, động cơ ngừng.

Bảng cấu hình GPIO: (GPIO configuration)


PIN Signal GPIO mode Max speed User label

PD11 n/a INPUT MODE n/a BUTTON_1

PB0 n/a Output Push Pull Low MOTOR


Bảng định nghĩa trạng thái (#define)
Tên trạng thái Giá trị Ý nghĩa

MOTOR_START 1 Vi điều khiển xuất ra mức cao thì động cơ hoạt động
MOTOR_STOP 0
Vi điều khiển xuất ra mức thấp thì động cơ ngưng hoạt
động
BUTTON_PRESSED 0
Khi nhấn nút thì ngõ vào nối đất thì vi điều khiển
nhận mức 0

Lưu đồ giải thuật


Mã nguồn chương trình (chỉ copy nội dung đã thêm hoặc chỉnh sửa từ code dự án)

HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_STOP);
uint8_t BUTTON_1_check = 1;
uint8_t State = 0; uint8_t
MOTOR = 0;
while (1)
{
BUTTON_1_check = HAL_GPIO_ReadPin(BUTTON_1_GPIO_Port,
BUTTON_1_Pin);
if ((State == 0) && (BUTTON_1_check == BUTTON_PRESSED))
State = 1;
if ((State == 1) && (BUTTON_1_check != BUTTON_PRESSED))
State = 2;
if ((State == 2) && (BUTTON_1_check == BUTTON_PRESSED))
State = 3;
if ((State == 3) && (BUTTON_1_check != BUTTON_PRESSED))
State = 0;
if (State == 0)
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_STOP);
if (State == 1)
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_START);
if (State == 2)
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_START);
if (State == 3)
HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin,
MOTOR_STOP);
}

You might also like