Đồ án đo lường và điều khiển

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 63

BỘ CÔNG THƯƠNG

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI


KHOA CƠ KHÍ

----------------------

ĐỒ ÁN MÔN HỌC

ĐO LƯỜNG VÀ ĐIỀU KHIỂN

Xây dựng hệ thống đo và điều khiển tốc độ động cơ sử dụng cảm


biến enconder tương đối
Giáo viên hướng dẫn: ThS. Phạm Tiến Hùng

Sinh viên thực hiện: Nghiêm Văn Quý 2020608578

Nguyễn Xuân Phúc 2020608702

Nguyễn Văn Nam 2020608626

Hà Nội-2021
MỤC LỤC
CHƯƠNG I. TỔNG QUAN VỀ HỆ THỐNG .......................... 2
1. Lịch sử nghiên cứu ..........................................................................................2

2. Mục tiêu đề tài ................................................................................................ 2

3. Phương pháp nghiên cứu ................................................................................3

4. Dự kiến kết quả ............................................................................................... 3

CHƯƠNG II. XÂY DỰNG MÔ HÌNH HỆ THỐNG............... 5


1. Cấu tạo mô hình .............................................................................................. 5

2. Nguyên lý hoạt động .......................................................................................6

3. Phân tích lựa chọn thiết bị..............................................................................8

3.1. Động cơ ........................................................................................................8

3.2. Encoder ......................................................................................................13

4. Phân tích và lựa chọn bộ điều khiển ............................................................ 18

4.1. Arduino chip dán R3 ..................................................................................18

4.2. MẠch cầu H-43ABTS1960 ........................................................................28

4.3. Các linh kiện điện tử khác .........................................................................30

CHƯƠNG III. CHẾ TẠO VÀ THỬ NGHIỆM HỆ THỐNG 31


1. Tổng quan mô hình .......................................................................................31

2. Chế tạo các bộ phận cơ khí ..........................................................................32

3. Lưu đồ thuật toán ..........................................................................................33

4. Chương trình điều khiển ...............................................................................34

5. Thử nghiệm và đánh giá hệ thống ................................................................ 36


DANH MỤC HÌNH ẢNH
Hình 1- Giao diện điều khiển Control Ardunio App ..............................................7
Hình 2- Sơ đồ khối mô hình ....................................................................................8
Hình 3 Động cơ tích hợp encoder...........................................................................9
Hình 4 Pha 1 ...........................................................................................................9
Hình 5 Pha 3 .........................................................................................................10
Hình 6 Pha 2 .........................................................................................................10
Hình 7 Chuyển động của động cơ ........................................................................10
Hình 8 Sơ đồ động cơ và encoder .........................................................................11
Hình 9- Động cơ không tích hợp Encoder ............................................................ 12
Hình 10 Cấu tạo encoder ......................................................................................14
Hình 11 Hình minh họa encoder ..........................................................................15
Hình 12 Tính tốc độ động cơ trường hợp thứ 1 ....................................................17
Hình 13 Tính tốc độ động cơ trường hợp thứ 2 ....................................................18
Hình 14-Bo mạch Arduino R3 ..............................................................................19
Hình 15- Thiết kế nguồn ......................................................................................23
Hình 16- Thiết kế mạch dao động.........................................................................25
Hình 17- Thiết kế mạch reset ................................................................................26
Hình 18-Thiết kế mạch nạp...................................................................................27
Hình 19-Vị trí chân ............................................................................................... 27
Hình 20- Bo mạch cầu Mạch cầu H - BTS7960 43A ............................................28
Hình 21 Mô hình hoàn thiện .................................................................................31
Hình 22 Giá đỡ encoder và động cơ .....................................................................32
Hình 23 Lưu đồ thuật toán điều khiển ..................................................................33
Hình 24 Cấu hình vi điều khiển trên phầm mềm Visual Studio ........................... 34
Hình 25 Arduino IDE ............................................................................................ 35
Hình 26-Control Arduino App ..............................................................................36
DANH MỤC BẢNG BIỂU
Bảng 1-Bảng thiết bị ............................................................................................... 5
Bảng 2- Thông số kỹ thuật ......................................................................................5
Bảng 3- Bảng linh kiện điện tử .............................................................................30
LỜI NÓI ĐẦU

Trong quá trình sản xuất hiện đại, đo tốc độ động cơ là việc làm
không thể thiếu, nó giúp cho quá trình giám sát sản xuất nhanh hơn, tốt hơn,cho
ra những sản phẩm như ý, chính xác. Nếu ta không đo được tốc độ của động cơ
thì không thể điều khiển tốc độ chính xác được. Với những máy móc hiện đại như
ngày nay, trong quá trình sản xuất luôn chạy với nhiềutốc độ khác nhau, tùy theo
mỗi giai đoạn làm việc của nó, chính vì thế mà tacần phải biết tốc độ động cơ là
bao nhiêu để điều chỉnh cho phù hợp.Từ lâu con người đã nghiên cứu chế tạo ra
những máy đo tốc độ và được sử dụng rộng rãi. Trong các hệ truyền động kinh
điển người ta dùng máy phát tốc đo tốc độ động cơ, máy phát tốc một chiều hay
xoay chiều thực chất cũng chỉ là máy phát điện công suất nhỏ, có suất điện động
ra tỷ lệ với tốc độ cần đo. Về sau nền sản xuất công nghiệp ngày càng phát
triểnhiện đại người ta bắt đầu nghiên cứu và cho ra đời các máy đo tốc độ có độ
chính xác cao hơn như máy đo góc tuyệt đối, máy đo sử dụng cảm biến quang tốc
độ với đĩa giải mã …
Trong đề tài đồ án môn “Xây dựng hệ thống đo và điều khiển tốc độ động cơ sử dụng
cảm biến encoder tương đối” này, nhóm sinh viên chúng em xin trình bày một cách
cụ thể về quá trình nghiên cứu tìm hiểu và tính toán, thiết kế mô hình. Thông qua
đó có thể áp dụng nó vào các bài nghiên cứu khoa học hay vào đồ án tốt nghiệp
chuyên ngành khi ra trường.
Để bài báo cáo được hoàn thiện hơn, nhóm chúng em hi vọng nhận được những
góp ý từ phía các thầy cô. Qua đây, chúng em cũng xin được gửi lời cảm ơn đến
các thầy cô trong Khoa Cơ khí nói chung và thầy cô trong nghành Cơ điện tử nói
riêng đã nhiệt tình hướng dẫn đồ án môn cho chúng em.
Hà Nội, Ngày tháng 05 năm 2021

1
CHƯƠNG I. TỔNG QUAN VỀ HỆ THỐNG
1. Lịch sử nghiên cứu
Thế giới đang có những thách thức lớn, những biến đổi lớn về kinh tế xã hội, sự
tiến bộ về khoa học công nghệ, và thách thức của biến đổi khí hậu. Sự chính xác
trở thành tiêu chí đầu tiên và quan trọng trong thế giới công nghệ 4.0. Ở Việt
Nam, vấn đề an toàn, chính xác ngày càng trở nên quan trọng và đặc biệt quan
trọng tại các thành phố lớn, với những dự án lớn. Vì vậy tình hình nghiên cứu về
những máy móc, hệ thống có độ chính xác và an toàn cao ngày càng phát triển
vô cùng mạnh mẽ và được sự quan tâm của các nước phát triển và đang phát triển
trên toàn thế giới.
Theo thời gian và sự phát triển của công nghệ, con người đã cải tiến được những
thiết bị đo tốc của mình, từ những chiếc thước đo tốc thô sơ được phát triển từ
năm trăm năm về trước thì giờ đây chúng ta lại sáng tạo ra những thiết bị hiện
đại sử dụng điện để đo tốc độ một cách chính xác tuyệt đối và có ứng dụng rất đa
dạng trên nhiều máy móc công nghiệp hiện đại.
Ngày nay có rất nhiều quy trình công nghiệp sử dụng các thiết bị máy mọc công
nghệ cao, hiện đại và hầu như những cỗ máy đó không thể thiếu những chiếc cảm
biến đo tốc độ. Cảm biến đo tốc độ không chỉ giúp chúng ta đo được tốc độ là bao
nhiêu mà nó có nhiều ứng dụng khác điển hình như cảnh báo tốc độ giới hạn.
Trong công nghiệp có hầu như mọi trường hợp đều cần đến đo tốc độ của máy
người ta thường theo dõi tốc độ của máy vì lý do an toàn hoặc để khống chế các
điều kiện đặt trước cho hoạt động của máy móc thiết bị.
Sơ lược về hệ thống đo tốc độ
Hệ thống đo tốc độ thiết bị bao gồm tập hợp các bộ phận cấu thành có nhiệm vụ
đo tốc độ và cảnh báo giới hạn đo khi quá giới hạn quy định. Ngày nay đa phần
hệ thống máy móc công nghiệp đều sử dụng thiết bị này.
2. Mục tiêu đề tài
- Điều khiển tốc độ động cơ điện 1 chiều bằng núm xoay, Winform PC
- Đo tốc độ động cơ.

2
- Hiển thị tốc độ theo thời gian thực trên màn hình LCD.
- Có chức năng lựa chọn giới hạn mức tốc độ trên và dưới để đưa ra cảnh báo
khi giá trị mức vượt ngoài khoảng cho phép.
3. Phương pháp nghiên cứu
Phương pháp nghiên cứu lý thuyết

- Dựa vào kiến thức đã được học, tìm hiểu qua internet, sách vở và tham khảo ý
kiến bạn bè, thầy cô.
- Tìm hiểu những hệ thống đo tốc độ trên thực tế phổ biến để học hỏi cách thiết
kế chi tiết, cấu tạo tối ưu nhất có thể.
- Tìm hiểu phương pháp xây dựng hệ thống điều khiển và chương trình điều khiển
- Tìm hiểu các phần mền lập trình để hỗ trợ như:Visual Studio, STM, Altium
desginer, Keil uVision5...
Phương pháp nghiên cứu và thực nghiệm

- Thực hiện hoàn thiện từng thành phần của hệ thống: bộ phận cảm biến, bộ phận
hiển thị số liệu tốc độ, hiển thị đèn cảnh báo quá giới hạn , bộ phận nhập tốc độ
giới hạn , bộ phận vi điều khiển.
- Mô hình hóa, tính toán thiết kế mô hình cơ khí cho hệ thống đảm bảo độ chính
xác và độ bền cần thiết đáp ứng nhu cầu hệ thống.
-Sử dụng phần mềm STM thiết lập chương trình điều khiển.
- Kiểm tra chương trình code cho hệ cho hệ thống điều khiển.
- Tính toán, thiết kế và nghiên cứu độ an toàn và độ chính xác của hệ thống để
lựa chọn những thiết bị phù hợp như: Động cơ điện 1 chiều, …
- Cho hệ thống hoạt động và chỉnh sửa những chi tiết chưa phù hợp.
4. Dự kiến kết quả
Phạm vi nghiên cứu

- Nghiên cứu động cơ có gắn sẵn encoder, động cơ không gắn encoder , Arduino
Uno R3 chíp dán, bộ điều chỉnh tốc độ L298, PWM thông qua các kiến thức đã
học, tìm hiểu ở các tài liệu trên thư viện sách, trên mạng internet...

3
- Cơ sở tính toán, liên kết và điều khiển linh hoạt, sáng tạo, khoa học các mô hình
mô phỏng để đưa ra một hệ thống hoàn chỉnh, tạo tiền đề cho việc chế tạo mô
hình của hệ thống
Giới hạn nghiên cứu

-Kích thước đưới dạng mô hình thực nghiệm


-Tốc độ động cơ từ 0 đến 1500v/p
- Công suất động cơ 10W và có điện áp động cơ 12VDC.
-Encoder tương đối có độ phân giải lớn hơn 100 xung/vòng
-Bộ điều khiển vi xử lý Arduino Uno R3 chíp dán
Ý nghĩa thực tiễn

Hệ thống đo tốc độ bằng cảm biến encoder tương đối và điều khiển tốc độ bằng
PWM là một trong những đề tài mang tính thiết thực, mức cần thiết cao trong sự
phát triển của khoa học, công nghệ. Nhằm mục đích cho việc ứng dụng vào máy
móc thiết bị công nghiệp cũng như các thiết bị công nghệ trong đời sống hiệu quả
hơn và tạo tính an toàn cho người lao động, đây chính là động lực để nhóm em
tìm hiểu và có thêm nhiều hiểu biết hơn và cách điều khiển, thiết kế và chế tạo hệ
thống tối ưu và đáp ứng đủ các yêu cầu đưa ra.
Kết luận

Giới thiệu về hệ thống đo và điều chỉnh tốc độ sử dụng cảm biến encoder tương
đối, quá trình phát triển, phạm vi và giới hạn trong đề tài nghiên cứu.
Đây là phần đầu tiên cũng là phần thể hiện sự quan trọng của hệ thống máy móc
trong đời sống. Qua đó, hiểu được thêm nhiều điều về thiết kế , chế tạo và thử
nghiệm hệ thống điều khiển, cách giải quyết các vấn đề và ứng dụng vào đồ án
sau này.

4
CHƯƠNG II. XÂY DỰNG MÔ HÌNH HỆ THỐNG
1. Cấu tạo mô hình

Bảng 1-Bảng thiết bị

Thiết bị Loại sử dụng

Encoder tương đối 600 xung/vòng

Động cơ DC Motor 775

Bộ điều khiển Arduino Uno R3 chíp dán

Hiển thị thông tin Ứng dụng Winform PC

Phím chức năng nhập dữ liệu Ứng dụng Winform PC

Mạch điều khiển động cơ Mạch cầu H-43A BTS7960.

Tín hiệu cảnh báo Đèn, Ứng dụng Winform PC

Nguồn Nguồn tổ ong 12v 15A

Đặc tính kỹ thuật


Bảng 2- Thông số kỹ thuật

Thông số Giá trị

Điện áp hoạt động Max 12VDC

Dòng điện tiêu thụ Max 10A

Giới hạn 6000 vòng/Phút

5
Cấu tạo

Khối nguồn
Nguồn tổ ong biến đổi điện áp từ 220V AC về 12V DC.
Mạch cầu H-43A BTS7960 biến đổi nguồn 12V về 3-4.5V
Khối hiển thị
Màn hình Winform PC giúp hiện thị tốc độ đọng cơ và giới hạn của nó.
Led/ứng dụng Winform PC giúp cảnh báo khi tốc độ nằm ngoài khoảng giá trị.
Khối điều khiển
Arduino Uno R3 chíp dán là MCU điều khiển hệ thống nhận tín hiệu từ encoder
và động cơ, đưa dữ liệu ra LCD/PC, băm xung PWM cho driver động cơ.
Mạch cầu H-43ABTS1960 tạo dead time, chống quá nhiệt, quá áp, quá dòng, sụt
áp và ngắn mạch.
Winform PC để nhập giá trị các giới hạn của tốc độ động cơ.
Khối đo
Encoder tương đối dùng để đo tốc độ động cơ
Khối cơ cấu chấp hành:
Động cơ tạo chuyển động quay để đo tốc độ
2. Nguyên lý hoạt động
Nguồn tổ ong biến đổi điện áp từ 220V xoay chiều về 12V một chiều rồi cung
cấp cho Mạch cầu H-43ABTS1960
Mạch cầu H-43ABTS1960 nhận điện áp 12V từ nguồn tổ ong sau đó chuyển đổi
điện áp từ 12V về 4,8V để cấp nguồn cho Arduino Uno R3 chíp dán
Mạch cầu H-43ABTS1960 nhận và truyền thông tin để điều khiển hệ thống, cấp
nguồn cho LCD, ENCODER, VR

6
Ở mô hình này , nhóm có tích hợp chương trinh điều khiển thành một bảng Điều
khiển Control Panel để điều khiển mô hình một cách dễ dàng

Hình 1- Giao diện điều khiển Control Ardunio App

7
Sơ đồ khối

Hình 2- Sơ đồ khối mô hình

3. Phân tích lựa chọn thiết bị


3.1. Động cơ
Động cơ được chia làm hai loại: Động cơ có gắn sẵn Encoder và động cơ thường
không gắn Encoder .
Động cơ có gắn sẵn encoder
Sử dụng động cơ có gắn sẵn enconder để thuận tiện trong việc thực hiện và có
tính đồng bộ cao.

8
Hình 3 Động cơ tích hợp encoder

Stato của động cơ điện 1 chiều thường là 1 hay nhiều cặp nam châm vĩnh cửu,
hay nam châm điện, roto có các cuộn dây quấn và được nối với nguồn điện một
chiều, một phần quan trọng khác của động cơ điện 1 chiều là bộ phận chỉnh lưu,
nó có nhiệm vụ là đổi chiều dòng điện trong khi chuyển động quay của rotor là
liên tục. Thông thường bộ phận này gồm có một bộ cổ góp và một bộ chổi than
tiếp xúc với cổ góp.
Pha 1: Từ trường của rotor cùng
cực với stator, sẽ đẩy nhau tạo ra
chuyển động quay của rotor

Pha 2: Rotor tiếp tục quay

Hình 4 Pha 1

9
Hình 5 Pha 3
Hình 6 Pha 2

Pha 3: Bộ phận chỉnh điện sẽ đổi cực sao cho từ trường giữa stator và rotor cùng
dấu, trở lại pha 1

Hình 7 Chuyển động của động cơ

Nếu trục của một động cơ điện một chiều được kéo bằng 1 lực ngoài, động cơ sẽ
hoạt động như một máy phát điện một chiều, và tạo ra một sức điện động cảm
ứng Electromotive force (EMF). Khi vận hành bình thường, rotor khi quay sẽ phát
ra một điện áp gọi là sức phản điện động counter-EMF (CEMF) hoặc sức điện
độngđối kháng, vì nó đối kháng lại điện áp bên ngoài đặt vào động cơ. Sức điện
động này tương tự như sức điện động phát ra khi động cơ được sử dụng như một
máy phát điện (như lúc ta nối một điện trở tải vào đầu ra của động cơ, và kéo trục
động cơ bằng một ngẫu lực bên ngoài). Như vậy điện áp đặt trên động cơ bao
gồm 2 thành phần: sức phản điện động, và điện áp giáng tạo ra do điện trở nội
của các cuộn dây phần ứng.
10
Các thông số của động cơ

Trục động cơ: trục 8mm


Điện áp: 12V – 24V
Công suất : <300W
Tốc độ vòng tua: 11300-22600RPM
Encoder phân giải: 200 xung áp 5v
Số kênh: 2 kênh A,B
Hình 8 Sơ đồ động cơ và encoder
Thứ tự từ trái qua phải: B-VCC-A-GND
Một số cách đo tốc độ động cơ

Tốc độ kế điện từ đo vận tốc góc


Tốc độ kế dòng xoay chiều
Tốc độ kế xung
Tốc độ kế từ trở biến thiên
Tốc độ kế quang ( encoder)
Động cơ thường Motor 775
Motor 775 là loại động cơ cỡ nhỏ sử dụng nguồn điện một chiều DC từ 12V-36V.
Chủ yếu được sản xuất từ Trung Quốc.
Vì có rất nhiều dòng motor từ công suất nhỏ đến lớn và kích thước khác nhau nên
người ta đặt tên 775 là do kích thước của nó.
Đường kính trục: 5mm
Chiều dài trục: 17mm
Chiều dài motor: 66.7mm
Đường kính mặt tròn trước trục: 17.5mm
Độ cao của mặt tròn trước trục: 4mm
Đường kính motor: 42mm
Chiều dài tổng thể của động cơ: 98mm

11
Kích thước vít cố định motor: M4
Mô men xoắn: 2kg.cm hoặc 0.2N.M
Nguyên tắc hoạt động

Motor 775 có một phần lõi là Roto được ghép bởi 5 miếng kim loại và có dây
đồng quấn xung quanh thành các vòng tròn.
Phần vỏ có 2 cục nam châm to (là phần Stato), phần này không quay.
Hiểu đơn giản là khi có dòng điện chạy qua thì roto sẽ tạo ra từ trường với stato
và làm quay trục động cơ.
Một điều lưu ý hết sức quan trọng là việc chọn nguồn cho dòng motor này đòi hỏi
phải sử dụng nguồn từ 12v đến 24V, và dòng tối thiểu để cấp cho motor hoạt động
tốt là từ 5mAh

Hình 9- Động cơ không tích hợp Encoder

12
3.2. Encoder
Encoder là một bộ phận rất quan trọng trong sơ đồ cấu tạo của máy CNC.
Có thể dễ hình dung rằng nó giống như bộ phận công tơ mét ở xe máy hay ô tô,
nó sẽ đo đạc và hiển thị các thông số về tốc độ của máy cho người sử dụng biết
thông qua hệ thống giám sát của máy tính điều khiển.
Encoder ở các hệ thống điều khiển tự động là bộ phận để đo lường dịch chuyển
thẳng hoặc góc, đồng thời chuyển đổi vị trí góc/vị trí thẳng mà nó ghi nhận được
thành tín hiệu nhị phân

Phân loại Encoder

Encoder có nhiều xuất xứ và chủng loại khác nhau, nhóm sẽ phân loại chúng theo
2 loại chính như sau:
Encoder tuyệt đối (adsolute encoder): sử dụng đĩa theo mã nhị phân hoặc mã
Gray.
Encoder tương đối (encremental encoder): có tín hiệu tăng dần hoặc theo chu kỳ.
Trong quá trình nghiên cứu nhóm quyết định chọn đo tốc độ động cơ bằng
encoder tương đối do yêu cầu của đề tài , và sự phổ biến của nó trong cuộc sống
Ưu điểm: giá thành rẻ, chế tạo đơn giản, xử lý tín hiệu trả về dễ dàng.
Nhược điểm: dễ bị sai lệch về xung khi trả về. Sẽ tích lũy sai số khi hoạt động lâu
dài.
Encoder hay còn gọi là Bộ mã hóa quay hoặc bộ mã hóa trục, là một thiết bị cơ
điện chuyển đổi vị trí góc hoặc chuyển động của trục hoặc trục thành tín hiệu đầu
ra analog hoặc kỹ thuật số. Encoder được dùng để phát hiện vị trí, hướng di
chuyển, tốc độ… của động cơ bằng cách đếm số vòng quay được của trục.
Trong máy CNC encoder được dùng gia công cơ khí chính xác hoàn toàn tự động.
Điều khiển và xác định các góc quay của dao hoặc bàn gá, hiển thị trên máy tính
là đường thẳng hoặc góc bao nhiêu độ.

13
Trong robot tự động, encoder được dùng để xác định tọa độ cánh tay robot. Ngoài
ra, encoder còn được gặp trong thang máy, máy cán tôn, máy cắt thép, máy dán
tem sản phẩm, băng tải băng chuyền...
Encoder cấu tạo chính gồm

Đĩa quang tròn có rảnh nhỏ quay quanh trục: Trên đĩa được đục lỗ (rãnh), khi
đĩa này quay và chiếu đèn led lên trên mặt đĩa thì sẽ có sự ngắt quãng xảy ra. Các
rãnh trên đĩa chia vòng tròn 360o thành các góc bằng nhau. Và một đĩa có thể có
nhiều dãy rãnh tính từ tâm tròn.
Bộ cảm biến thu (photosensor)
Nguồn sáng (Light source).

Hình 10 Cấu tạo encoder

Nguyên lý hoạt động


Khi đĩa quay quanh trục, trên đĩa có các rãnh để tín hiệu quang chiếu qua (Led).
Chỗ có rãnh thì ánh sáng xuyên qua được, chỗ không có rãnh ánh sáng không
xuyên qua được. Với các tín hiệu có/không người ta ghi nhận đèn Led có chiếu
qua hay không.
Số xung Encoder được quy ước là số lần ánh sáng chiếu qua khe. Ví dụ trên đĩa
chỉ có 100 khe thì cứ 1 vòng quay, encoder đếm được 100 tín hiệu. Đây là nguyên
lý hoạt động của loại Encoder cơ bản, còn đối với với nhiều chủng loại khác thì
đương nhiên đĩa quay sẽ có nhiều lỗ hơn và tín hiệu thu nhận cũng sẽ khác hơn.

14
Hình 11 Hình minh họa encoder

Cảm biến thu ánh sáng sẽ bật tắt liên tục, từ đó:
Tạo ra các tín hiệu dạng xung vuông.
Tín hiệu dạng xung sẽ được truyền về bộ xử lý trung tâm để đo đạc, xác định vị
trí/ tốc độ của động cơ.
Ứng dụng

Ứng dụng về biểu thị tốc độ


Khi một máy bơm được kết nối với biến tần để bơm chất lỏng vào bồn chứa. Khi
đó chất lỏng chảy vào bồn phải có tốc độ nhất định. Encoder được kết nối với
biến tần sẽ phản hồi tốc độ thực tế dòng chảy của chất lỏng.
Ứng dụng về đo lường
Khi chúng ta cần cắt các cuộn nhôm dài hàng trăm, hàng nghìn mét thành từng
tấm có kích thước nhất định thông qua máy cắt. Encoder khi đó sẽ được lắp vào
băng tải, đọc nguyên liệu mỗi khi đi qua Encoder và tính độ dài của tấm nhôm từ
khi cho vào đến vị trí cắt. Có thể điều chỉnh dao cắt theo độ dài được yêu cầu
thông qua các thông số về kích thước tấm nhôm.
Ứng dụng về đếm số lượng
Việc lắp đặt bộ mã hóa Encoder vào chương trình của các băng chuyền sản phẩm.
Nó sẽ giúp chúng ta xác nhận mỗi chai sản phẩm vào và trạm trên băng chuyền.
Nếu các chai không ra khỏi trạm trong khoảng thời gian đã được lập trình và
không đúng như giá trị mà Encoder đã đếm. Cũng có nghĩa là máy móc đã bị hư
hỏng.
15
Ứng dụng của Encoder trong ngành cơ khí
Nói về cấu tạo của máy CNC thì Encoder được trang bị như một thiết bị giúp đo
lường và xác định được vị trí chính xác nhất của các trục máy cũng như vị trí mà
dao cắt. Do đó khi sử dụng máy CNC để gia công sẽ đạt được sự chính xác nhất.
Hơn thế nữa, thông qua mà Encoder ghi nhận sẽ báo về hệ thống điều khiển của
PLC. Từ đó, người sử dụng có thể điều chỉnh được vị trí cắt dao nhằm hạn chế
sai sót.
Ứng dụng trong các ngành công nghiệp
+ Ô tô
Trong ngành công nghiệp ô tô thì Encoder được sử dụng làm cảm biến chuyển
động cơ học, có thể được áp dụng để kiểm soát tốc độ.
+ Điện tử tiêu dùng và thiết bị văn phòng:
Bộ mã hóa Encoder được sử dụng như thiết bị dựa trên PC, máy in và máy quét.
+ Công nghiệp:
Encoder được sử dụng trong máy dán nhãn, đóng gói và chế tạo máy với bộ điều
khiển động cơ đơn và đa trục.
+ Y tế:
Bộ mã hóa Encoder được sử dụng trong máy quét y tế, điều khiển chuyển động
bằng kính hiển vi hoặc nano của các thiết bị tự động và bơm phân phối.
+ Quân đội:
Encoder được sử dụng trong ứng dụng ăng ten định vị.
+ Dụng cụ khoa học:
Thiết bị khoa học thực hiện các bộ mã hóa Encoder trong việc định vị kính viễn
vọng quan sát.

Cách tính tốc độ động cơ


Sau khi đã xoay chiết áp để có tốc độ, chúng ta bắt đầu tính tốc độ của
động cơ với đơn vị vòng/phút.
16
Xét trong khoảng thời gian 500ms để tính toán tốc độ:
• Đọc giá trị counter trong timer 3 lưu vào biến enc
• Biến enc_pre lưu giá trị counter quá khứ 500ms của enc
• Trường hợp 1: enc ≤ enc_pre

Hình 12 Tính tốc độ động cơ trường hợp thứ 1

Với giá trị counter thuộc kiểu int tức có 65536 xung đếm, trong chương trình
này động cơ quay theo chiều như mũi tên, counter đếm giảm dần từ 65535 về 0.
Vậy tốc độ:
tocdo = 60*2*(enc_pre-enc)/800.
Giải thích:
- Nhân 2 để tính tốc độ động cơ trong vòng 1s (vì trước đó ta đang xét trong
500ms)
- Nhân 60 để tính tốc độ động cơ trong vòng 60s (tức 1 phút)
- Chia 800 vì sử dụng 2 pha của encoder, mỗi pha có 200 xung dương. Mà
giá trị counter nhảy khi xảy ra hiện tượng lên xuống sườn xung. Tức 200 xung có
400 sườn lên xuống, 2 pha đan nhau thì có 800 sườn lên xuống.
• Trường hợp 2: enc > enc_pre

17
Hình 13 Tính tốc độ động cơ trường hợp thứ 2

Tốc độ: tocdo = 60*2*[65535-(enc-enc_pre)]/800.

Giải thích
- Trường hợp này rơi vào trạng thái tràn bộ đếm counter. Vậy nên để tính
được giá trị xung của 2 thời điểm ta cần tính số xung nhảy trên đoạn màu cam, ví
dụ như trong hình: số xung=30+(65535-65530)=35 (xung)
số xung = 65535-(65530-30)=35 (xung)
(lưu ý: tránh hiểu nhầm 1 vòng có 65536 xung)
- Nhân 2 để tính tốc độ động cơ trong vòng 1s (vì trước đó ta đang xét trong
500ms)
- Nhân 60 để tính tốc độ động cơ trong vòng 60s (tức 1 phút)
- Chia 800 vì sử dụng 2 pha của encoder, mỗi pha có 200 xung dương. Mà
giá trị counter nhảy khi xảy ra hiện tượng lên xuống sườn xung. Tức 200 xung có
400 sườn lên xuống, 2 pha đan nhau thì có 800 sườn lên xuống.

4. Phân tích và lựa chọn bộ điều khiển


4.1. Arduino chip dán R3
Giới thiệu về Arduino
Arduino đã và đang được sử dụng rất rộng rãi trên thế giới, và ngày
càng chứng tỏ được sức mạnh của chúng thông qua vô số ứng dụng độc đáo của
người dùng trong cộng đồng nguồn mở( open-source). Tuy nhiên tại Việt Nam
Arduino vẫn còn chưa được biết đến nhiều. Bài viết này là cố gắng nhằm giới

18
thiệu một số thông tin về Arduino với hy vọng cung cấp cho người dùng DIY
thêm một lựa chọn mới đầy tiềm năng để thực hiện các dự án của mình.

Hình 14-Bo mạch Arduino R3

Hiện tượng Arduino:

Arduino thực sự đã gây sóng gió trên thị trường dùng DIY (là những người tự
chế ra sản phẩm của mình) trên toàn thế giới trong vài năm gần đây, gần giống
với những gì Apple đã làm được trên thị trường thiết bị di động. Số lượng người
dùng cực lớn và đa dạng với trình độ trải rộng từ bậc phổ thông lên đến Đại Học
đã làm cho ngay cả những người tạo ra chúng phải ngạc nhiên về mức độ phổ
biến.
Arduino thật ra là một bo mạch vi xử lý được dùng để lập chương trình tương
tác với các thiết bị khác. Đặc điểm nổi bật của Arduino là môi trường phát triển
ứng dụng cực kỳ dễ sử dụng, với một ngôn ngữ lập trình có thể học một cách
nhanh chóng ngay cả với người ít am hiểu về điện tử và lập trình. Và điều làm
nên hiện tượng Arduino chính là mức giá rất thấp và tính chất nguồn mở từ phần

19
cứng tới phần mềm. Chỉ khoảng $30, người dùng đã có thể sở hữu một bo Arduino
có 20 ngõ I/O có thể tương tác và điều khiển chừng ấy thiết bị.
Arduino ra đời tại thị trấn lvrea thuộc nước Ý và được đặt theo tên một vị vua
vào thế kỷ thức 9 là king Arduin. Arduino chính thức được đưa ra giới thiệu vào
năm 2005 như một công cụ khiêm tốn dành cho các sinh viên của giáo sư Massimo
Banzi, là một trong những người phát triển Arduino, tại trường Interaction Design
Instistutelvrea (ldll). Mặc dù hầu như không được tiếp thị gì cả, tin tức về Arduino
vẫn lan truyền với tốc độ chóng mặt nhờ những lời truyền miệng tốt đẹp của những
người dùng đầu tiên. Hiện nay Arduino nổi tiếng tới nỗi có người tìm đến thị trấn
lvrea chỉ dể tham quan nơi đã sản sinh ra Arduino.
Khả năng của bo mạch Arduino:

Bo mạch Arduino sử dụng dòng vi xử lý 8-bit megaAVR của Atmel với 2 chíp phổ
biến nhất là ATmega328 và ATmega2560. Các dòng vi xử lý này cho phép lập
trình các ứng dụng điều khiển phức tạp đo được trang bị cấu hình mạch với các
loại bộ Nhớ ROM, RAM và Flash, các ngõ vào ra digital I/O trong đó có nhiều
ngõ có khả năng xuất tín hiệu PWM, các ngõ đọc tín hiệu Analog và các chuẩn
giao tiếp đa dạng như UART,SPI,TWI(I2C)
Sức mạnh xử lý:
Xung nhịp :16MHz
EEPROM:1KB(ATmega328) và 4KB (ATmega2560)
SRAM:2KB(ATmega328) và 8KB (ATmega2560)
Flash:32KB (ATmega328) và 256KB(ATmega2560)
Đọc tín hiệu cảm biến ngõ vào:
Digital:
Các bo mạch Arduino đều có các cổng digital có thể cấu hình làm ngõ vào hoặc
ngõ ra bằng phần mềm. Do đó người dùng có thể linh hoạt quyết định số lượng
ngõ vào và ngõ ra. Tổng số lượng cổng digital trên các mạch dùng Atmega328 là
14, và trên Atmega 256 là 54.
Analog:

20
Các bo mạch Arduino đều có trang bị các ngõ vào analog với độ phân giải 10-
bit(1024 phân mức, ví dụ với điện áp chuẩn là 5V thì độ phân giải khoảng
0.5mV).Số lượng cổng vào analog là 6 đối với Atmega328, và 16 đối với
Atmega2560. Với tính năng đọc analog, người dùng có thể đọc nhiều loại cảm
biến như nhiệt độ, độ ẩm, áp suất, ánh sang,gyro, accelerometer…
Xuất tín hiệu điều khiển ngõ ra:
Digital output:
Tương tự như các cổng vào digital, người dùng có thể cấu hình trên phần mềm
để quyết định dùng ngõ digital nào là ngõ ra. Tổng số lượng cổng digital trên các
mạch dùng Atmega328 là 14, và Atmega 2560 là 54.
PWM output:
Trong số các cổng digital, người dùng có thể chọn một số cổng dùng để xuất tín
hiệu điều chế xung PWM. Độ phân giải của cá tín hiệu PWM này là 8bit. Số lượng
cổng PWM đối với các bo dùng ATmega328 là 6, và đối với các bo dùng
Atmega2560 là 14.PWM có nhiều ứng dụng trong viễn thông,xử lý âm thanh hoặc
điều khiển động cơ mà phổ biến nhất là động cơ servos trong các máy bay mô
hình. Chuẩn giao tiếp dùng rất phổ biến trên các bo mạch Arduino. Mỗi bo có
trang bị một số cổng Serial cứng (việc giao tiếp do phần cứng trong chip thực
hiện). Bên cạnh đó, tất cả các cổng digital còn lại đều có thể thực hiện giao tiếp
nối tiếp bằng phần mềm (có thư viện, người dùng không cần phải viết code). Mức
tín hiệu của các cổng này là TTL5V. lưu ý cổng nối tiếp RS-232 trên các thiết bị
hoặc PC có mức tín hiệu là UART 12V. Để giao tiếp được giữa hai mức tín hiệu
cần phải có bộ chuyển đổi chuyển mức, ví dụ như chip MAX232. Số lượng cổng
Seria cứng của Atmega 328 là 1 của Atmega2560 là 4. Với tính năng giao tiếp
nối tiếp, các bo Arduino có thể giao tiếp được với rất nhiều thiết bị như
PC,touchscreen, các game console…
USB:
Các bo Arduino tiêu chuẩn đều có các trang bị một cổng USB để thực hiện kết
nối với máy tính dùng cho việc tải chương trình.

21
Tuy nhiên các chip AVR không có cổng USB, do đó các bo Arduino phải trang bị
thêm phần chuyển đổi từ USB thành tín hiệu USART. Do đó máy tính nhân diện
cổng USB này là cổng COM chứ không phải là cổng USB tiêu chuẩn..
SPI:
Đây là một chuẩn giao tiếp nối tiếp đồng bộ có bus gồm có 4 dây. Với tính năng
này các bo Arduino có thể kết nối với các thiết bị như LCD, bộ điều khiển video
game, bộ điều khiển cảm biến các loại, đọc thẻ nhớ SD và MMC…
TWI(I2C):
Đây là một chuẩn giao tiếp đồng bộ khác nhưng bus chỉ có hai dây. Với tính năng
này, các bo Arduino có thể giao tiếp với một số loại cảm biến như thermostat của
CPU, tốc độ quạt, một số màn hình OLED/LCD, đọc real-time clock, chỉnh âm
lượng cho một số loại loa…
Môi trường lập trình bo mạch Arduino thiết kế bo mạch càng gọn, trang bị nhiều
tính năng thông dụng mang lại nhiều lợi thế cho Arduino, tuy nhiên sức mạnh
thực sự của Arduino nằm ở phần mềm. môi trường lập trình đơn giản dễ sử dụng,
ngôn ngữ lập trình Wiring dễ hiểu và dựa trên nền tảng C/C++ rất quen thuộc
với người làm kỹ thuật. và quan trọng là số lượng thư viện code được viết sẵn và
chia sẻ bởi cộng đồng nguồn mở là cực kỳ lớn.
Môi trường lập trình Arduino IDE có thể chạy trên ba nền tảng phổ biến nhất
hiện nay là Windows, Macintosh OSX và Linux. Do có tính chất nguồn mở nên
môi trường lập trình này hoàn toàn miễn phí và có thể mở rộng thêm bởi người
dùng có kinh nghiệm. ngôn ngữ lập trình có thể được mở rộng thông qua các thư
viện C++ và do ngôn ngữ lập trình này dựa trên nền tảng ngôn ngữ C của AVR
nên người dùng hoàn toàn có thể nhúng thêm code viết bằng AVR C vào chương
trình nếu muốn.

Các loại bo mạch Arduino:

Về mặt chức năng, các bo mạch Arduino được chia thành hai loại bo mạch chính
có chip ATmega và loại mở rộng thêm chức năng cho bo mạch chính ( thường

22
được gọi là shield ). Các bo mạch chính cơ bản là giống nhau về chức năng, tuy
nhiên về mặt cấu hình như số lượng I/O, dung lượng bộ nhớ, hay kích thước có
sự khác nhau. Một số bo có trang bị thêm các tính năng kết nối như Ethenrnet và
Bluetooth.
Các bo mở rộng chủ yếu mở rộng thêm một số tính năng cho bo mạch chính ví dụ
như tính năng kết nối Ethernet, Wireless, điều khiển động cơ.
Thiết kế nguồn
Phần nguồn của Board mạch Arduino được thiết kế để thực hiện các nhiệm
vụ sau:

Hình 15- Thiết kế nguồn

23
Lựa chọn nguồn cung cấp cho board mạch (khối màu cam trong hình dưới).
Board mạch Arduino có thể được cung cấp nguồn bởi Adapter thông qua Jack
DC hoặc từ cổng USB (2 mũi tên màu đỏ). Trong trường hợp chỉ có 1 trong 2
nguồn cung cấp thì Board Arduino sẽ sử dụng nguồn cung cấp đó. Trong trường
hợp có cả 2 nguồn cung cấp thì Arduino sẽ ưu tiên lựa chọn nguồn cung cấp từ
Jack DC thay vì từ cổng USB. Việc ưu tiên này được thực hiện bởi OpAmp trong
IC LMV358 và MOSFET FDN340P. Điện áp từ Jack DC sau khi qua Diode bảo
vệ D1 thì được gọi là điện áp VIN. Điện áp VIN qua cầu phân áp để tạo
thành VIN/2 để so sánh với điện áp 3.3V. Vì VIN/2 >3.3V nên điện áp đầu ra của
OpAmp là 5V, điều này làm cho MOSFET không được kích, nguồn cung cấp cho
Board Arduino là từ Jack DC sau khi qua ổn áp.

Tạo ra các điện áp 5v và 3.3v (2 khối màu xanh) để cung cấp cho vi điều
khiển và cũng là điểm cấp nguồn cho các thiết bị bên ngoài sử dụng. Mạch
Arduino sử dụng IC ổn áp NCP1117 để tạo điện áp 5V từ nguồn cung cấp lớn và
IC ổn áp LP2985 để tạo điện áp 3.3V. Đây đều là những IC ổn áp tuyến tính, tuy
hiệu suất không cao nhưng ít gợn nhiễu và mạch đơn giản.

Bảo vệ ngược nguồn, quá tải (vòng tròn màu đỏ). F1 là một cầu chì tự phục
hồi, trong trường hợp bạn chỉ sử dụng dây cáp USB để cấp nguồn thì tổng dòng
tiêu thụ không được quá 500mA. Nếu không cầu chì sẽ ngăn không cho dòng điện
chạy qua. D1 là một Diode, chỉ cho dòng điện 1 chiều chạy qua (từ Jack DC vào
mạch), trong trường hợp mạch Arduino của bạn có mắc với các thiết bị khác và
có nguồn cung cấp lớn hơn nguồn vào Jack DC, nếu có sai sót chập mạch..vv..
thì sẽ không có trường hợp nguồn các thiết bị bên ngoài chạy ngược vào Adapter.

Báo nguồn. Đèn nguồn ON sáng lên báo thiết bị đã được cấp nguồn. Nếu
các bạn đã cắm nguồn mà đèn nguồn không sáng thì có thể nguồn cung cấp của
bạn đã bị hỏng hoặc jack kết nối lỏng, hoặc mạch Arduino kết nối với các linh
kiện bên ngoài bị ngắn mạch.

24
Thiết kế mạch dao động

Mạch giao động tạo ra các xung clock giúp cho vi điều khiển hoạt động, thực thi
lệnh… Board mạch Arduino Uno R3 sử dụng thạch anh 16Mhz làm nguồn dao
động. Thiết kế mạch dao động cần phải tham khảo Datasheet của vi điều khiển
Atmega328p ở Table 8-5 và Figure 8-3 trang 27,28.

Hình 16- Thiết kế mạch dao động

Thiết kế mạch reset

Để vi điều khiển thực hiện khởi động lại thì chân RESET phải ở mức logic LOW
(~0V) trong 1 khoản thời gian đủ yêu cầu. Mạch reset của board Arduino UnoR3
phải đảm bảo được 02 việc:
– Reset bằng tay: Khi nhấn nút, chân RESET nối với GND, làm cho MCU RESET.
25
Khi không nhấn nút chân Reset được kéo 5V.
– Reset tự động: Reset tự động được thực hiện ngay khi cấp nguồn cho vi điều
khiển nhờ sự phối hợp giữa điện trở nối lên nguồn và tụ điện nối đất.
– Khởi động vi điều khiển trước khi nạp chương trình mới.

Hình 17- Thiết kế mạch reset

Thiết kế mạch nạp và kết nối máy tính


– Vi điều khiển Atmega328P trên Board Arduino UnoR3 đã được nạp sẵn 1
bootloader, cho phép nhận chương trình mới thông qua chuẩn giao tiếp UART
(chân 0 và 1) ở những giây đầu sau khi vi điều khiển Reset.
– Máy tính giao tiếp với Board mạch Arduino qua chuẩn giao tiếp USB (D+/D-),
thông qua một vi điều khiển trung gian là ATMEGA16U2 hoặc một IC trung gian
là CH340 (thường thấy trong các mạch sử dụng chip dán). Vi điều khiển hoặc IC
này có nhiệm vụ chuyển đổi chuẩn giao tiếp USB thành chuẩn giao tiếp UART để
nạp chương trình hoặc giao tiếp truyền nhận dữ liệu với máy tính (Serial).
26
– Phần thiết kế mạch nạp có tích hợp thêm 02 đèn LED,nên khi nạp chương trình
các bạn sẽ thấy 2LED này nhấp nháy. Còn khi giao tiếp, nếu có dữ liệu từ máy
tính gửi xuống vi điều khiển thì đèn LED Rx sẽ nháy. Còn nếu có dữ liệu từ vi điều
khiển gửi lên máy tính thì đèn Tx sẽ nháy.

Hình 18-Thiết kế mạch nạp

Hình 19-Vị trí chân

27
4.2. MẠch cầu H-43ABTS1960
Mạch cầu H - BTS7960 43A được sử dụng để giao tiếp với Arduino và các vi mạch
vi điều khiển khác với driver tích hợp sẵn trong IC đầy đủ các tính năng như cảm
nhận dòng (kết hợp với điện trở đo dòng), chống quá nhiệt, quá áp, quá dòng, sụt
áp và ngắn mạch,...

Hình 20- Bo mạch cầu Mạch cầu H - BTS7960 43A

Thông số kỹ thuật:
Nguồn cấp: 6 ~ 27V.
Dòng điện tải mach: 43A.
Nguồn điều khiển: 3.3 ~ 5V, có thể sử dụng nguồn trên Arduino để cấp.
Tần số điều khiển tối đa: 25KHz.
Tự động ngắt khi điện áp thấp: để tránh điều khiển động cơ ở mức điện áp thấp
thiết bị sẽ tự ngắt. Nếu điện áp < 5.5V, driver sẽ tự ngắt điện và sẽ mở lại sau khi
điện áp > 5.5V.
Bảo vệ quá nhiệt: BTS7960 bảo vệ chống quá nhiệt bằng cảm biến nhiệt tích hợp
bên trong. Đầu ra sẽ bị ngắt khi có hiện tượng quá nhiệt.
Kích thước: 40 x 50 x12mm.

28
Sơ đồ chân:
VCC: Nguồn điều khiển (5V - 3V3)
GND: Chân âm.
R_EN = 0 Disable nửa cầu H phải. R_EN = 1: Enable nửa cầu H phải.
L_EN = 0 Disable nửa cầu H trái. L_EN = 1: Enable nửa cầu H trái.
RPWM và LPWM: chân điều khiển đảo chiều và tốc độ động cơ.
RPWM = 1 và LPWM = 0 : Mô tơ quay thuận.
RPWM = 0 và LPWM = 1 : Mô tơ quay nghịch.
RPWM = 1 và LPWM = 1 hoặc RPWM = 0 và LPWM = 0 : Dừng.
R_IS và L_IS: kết hợp với điện trở để giới hạn dòng qua cầu H
Với ứng dụng bình thường RPWM, LPWM nối với GPIO (VD: chân digital 2,3
của Arduino) để điều khiển chiều quay của động cơ.

29
4.3. Các linh kiện điện tử khác

Bảng 3- Bảng linh kiện điện tử

T Tên thiết Mục đích sử


Thông số kỹ thuật Hình ảnh
T bị, vật tư dụng

- Chuẩn cổng: USB 2.0 đực - USB


2.0 Type B đực
- Chất liệu vỏ: nhựa
Dây cáp Nạp code
- Màu sắc: Xanh dương trong suốt
chuyển điều khiển
- Lõi có bọc vỏ chống nhiễu
1 đổi vào mạch
Arduino điều khiển
- Chiều dài dây: 30cm

R3 Arduino R3 - Tương thích sử dụng cho arduino


Uno, Arduino Uno smd, Arduino
Mega2560

Cấp nguồn Bộ đổi nguồn điện 220v sang


Bộ cho động cơ, 12V-10A (DC) (tổ ong) AC/DC
chuyển MẠch cầu ADAPTER (12V/10A)
2
đổi điện H- Vỏ kim loại, tản nhiệt tốt
áp 43ABTS1960 Đầu vào: AC 100-240V/50-60 Hz
Đầu ra: DC12V/10A

30
CHƯƠNG III. CHẾ TẠO VÀ THỬ NGHIỆM HỆ THỐNG

1. Tổng quan mô hình

Hình 21 Mô hình hoàn thiện

31
2. Chế tạo các bộ phận cơ khí
Thiết kế giá đỡ cho động cơ và encoder
Giá đỡ bao gồm
1 tấm nhựa hình chữ nhật 30x30x1 cm
Tấm thép hình chữ nhật được uốn thành
2 mặt vuông góc với nhau như hình vẽ

Hình 22 Giá đỡ encoder và động cơ

32
3. Lưu đồ thuật toán

Hình 23 Lưu đồ thuật toán điều khiển

33
4. Chương trình điều khiển
Chương trình điều khiển được xây dựng trên 2 phầm mềm và tích hợp một Control
Panel để thuận tiện cho việc điểu khiển mô hình
Visual Studio

Hình 24 Cấu hình vi điều khiển trên phầm mềm Visual Studio

34
Arduino IDE

Hình 25 Arduino IDE

35
Control Arduino App

Ở mô hình này, nhóm có tích hợp chương trinh điều khiển thành một bảng Điều
khiển Control Panel để điều khiển mô hình một cách dễ dàng

Hình 26-Control Arduino App

5. Thử nghiệm và đánh giá hệ thống


Thử nghiệm, lỗi và khắc phục

Sai chân nối vào keypad. Đã sửa nối lại đúng


Tốc độ động cơ chậm hơn so với bình thường. Đã sửa lại code
Lỗi chương trình kết nối với Control Arduino App. Đã sửa lại
Lỗi tính toán sai tốc độ vòng quay, không tính ra tốc độ trung binh thực tế . Đã
sửa lại chương trình thêm phần tính tốc độ vòng quay trung bình/phút để so sánh.
Khớp nối lò xo (Coupling) lỏng lẻo: cố định lại chắc chắn hơn
Đánh giá hệ thống
36
Về tốc độ khá ổn định với sai số: ±10 v/p (< 5%)
Tốc độ động cơ lớn nhất : 2000 rpm
Đã đưa ra cảnh báo đúng bằng LED khi tốc độ ngoài khoảng giới hạn đặt.
Đã tinh toán được tốc độ trung binh /phút để so sánh với tốc độ thực tế .

37
KẾT LUẬN
Sau quá trình thiết kế và chế tạo mô hình đo và điều khiển tốc độ động cơ bằng
encoder tương đối hiển thị tốc độ lên LCD, Winform PC và cảnh báo bằng LED
khi tốc độ ngoài khoảng giới hạn đặt
Mô hình của nhóm vẫn còn một yêu cầu chưa đáp ứng được
Về tốc độ: tốc độ lớn nhất động cơ có thể đạt được là 6000 v/p nhưng do kết cấu
cơ khí và linh kiện kết nối có phần hạn chế nên nhóm đã đặt giới hạn đo :0-3000
v/p
Còn những yêu cầu khác: đo, điều khiển tốc độ động cơ, hiển thị lên LCD,Winform
PC cảnh báo bằng đèn khi tốc độ ngoài khoảng giới hạn thì nhóm đã làm được.
Nhóm đã học được nguyên lý hoạt động của encoder tương đối, động cơ điện 1
chiều, LCD, ... cách đo tốc độ động cơ bằng encoder. Và còn tìm hiểu được về
Arduino Uno R3.

DANH MỤC THAM KHẢO

1.https://tapit.vn/tong-hop-cac-bai-huong-dan-lap-trinh-vi-dieu-khien-s
http://arduino.vn/reference/howto
Link (Ctrl +Click )
2. Lê Ngọc Duy, Bùi Thanh Lâm & Nhữ Quý Thơ. Giáo trình cảm biến và hệ thống
đo. Hà Nội: Trường DHCN Hà Nội, 2019
1
PHỤ LỤC
Chương trình điều khiển
Visual Studio

// Standand library
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
//Add SerialPort library
using System.IO;
using System.IO.Ports;
using System.Xml;

namespace ControlArduino
{

public partial class ControlPanel : Form


{
// *******************************************************
// Variable

2
string[] strBaudRate = { "9600" };
string[] strGate = { "COM1", "COM2", "COM3", "COM4",
"COM5","COM6", "COM7", "COM8", "COM9", "COM10" };
string[] strChar = { "U", "D", "N", "R", "S", "L" };
string[] strArrList = { "", "" ,""};
string strRecived = "";
string strCurPos = "";
string strCurRpm = "";
string strCur_Revolution_Cnt = "";
// *******************************************************
int intRPM_Limit = 0;
int intRpm_Compare = 0;
int intRPM_Old = 0;
int intRPM_New = 0;
int intRPM_Out = 0;
int intMinute = 0;
// *******************************************************
bool bNormal_Click = false;
bool bReverse_Click = false;
// *******************************************************
// The function checks whether the string is numeric or not

public bool IsNumeric(string strText)


{
try
{

3
char[] chars = strText.ToCharArray();
foreach (char Symbol in chars)
{
if (!char.IsNumber(Symbol))
return false;
}
return true;
}
catch (Exception) { return false; }
}
// *******************************************************

public ControlPanel()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
// *******************************************************
// Initialize
cb_Gate.Items.AddRange(strGate);
cb_Baurate.Items.AddRange(strBaudRate);
// *******************************************************
cb_Gate.Text = "Chose here";
cb_Baurate.Text = "Chose here";
txt_RpmLimit.Text = "0";
lb_ConnectionStatus.Text = ("DisConnected!");
lb_ConnectionStatus.ForeColor = Color.Red;

4
txt_StopWatch.Text = "59";
// *******************************************************
strRecived = "";
intRPM_Limit = 0;
intRpm_Compare = 0;
bNormal_Click = false;
bReverse_Click = false;
}

// *******************************************************
//Recived from Arduino
private void serialPort_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{

strRecived = "";
intRpm_Compare = 0;

strRecived = serialPort.ReadLine();

strRecived = strRecived.Replace("\r", string.Empty);


strArrList = strRecived.Split(new char[] { ',' });
strCurPos = strArrList[0];
strCurRpm = strArrList[1];
strCur_Revolution_Cnt = strArrList[2];
intRpm_Compare = int.Parse(strCurRpm);

5
CompareRPM(intRpm_Compare);
//*******************************************************
new Thread(() =>
{
//Caculate Angle
float fltCurPos = float.Parse(strCurPos);
float Result = fltCurPos * 360 / 600;
string strCurAngle = Result.ToString("0.00");

//*******************************************************
txt_CurRpm.Text = strCurRpm;
txt_CurPositon.Text = strCurPos;
txt_CurDegree.Text = strCurAngle;
txt_CurRevolutionCnt.Text = strCur_Revolution_Cnt;

//*******************************************************
if (strCurPos.Contains("-"))
{
txt_CurDirection.Text = "Reverse";
}
else if (!strCurPos.Contains("-"))
{
txt_CurDirection.Text = "Normal";

}
}){IsBackground = true }.Start();
}
6
// *******************************************************
//Send to Arduino
public void SendtoArduino(string text)
{
// *******************************************************
// Send to Arduino
if (serialPort.IsOpen)
{
serialPort.WriteLine(text);
}

// *******************************************************
public void CompareRPM(int intInput)
{
// *******************************************************
// Compare Rpm
if (intInput >= intRPM_Limit)
{

txt_CurRpm.BackColor =Color.Red;
lb_PopUp.Text = "Over speed limit!";
lb_PopUp.ForeColor = Color.Red;
}

7
else
{
txt_CurRpm.BackColor = Color.White;
lb_PopUp.Text = "";
}

// *******************************************************
// Counter round timer
private void StopWatch_Tick(object sender, EventArgs e)
{
new Thread(() =>
{
txt_StopWatch.Text = intMinute.ToString();
if (intMinute == 0)
{
StopWatch.Stop();
txt_StopWatch.Text = "59";
intRPM_New = int.Parse(txt_CurRevolutionCnt.Text);
intRPM_Out = intRPM_New - intRPM_Old;
txt_RPMOut.Text = intRPM_Out.ToString();
}
intMinute--;
})
{ IsBackground = true }.Start();

8
}

private void btn_Connect_Click(object sender, EventArgs e)


{

// *******************************************************
// Check Port's parameter
if (cb_Gate.Text == "Chose here" && cb_Baurate.Text == "Chose here")
{
MessageBox.Show("Please! choose Gate and BaudRate\n then click
Apply again", "Information", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

else if (cb_Gate.Text == "Chose here" || cb_Baurate.Text == "Chose


here")
{
if (cb_Gate.Text == "Chose here")
{
MessageBox.Show("Please! choose Gate\n then click Apply again",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

if (cb_Baurate.Text == "Chose here")


{
MessageBox.Show("Please! choose BaudRate\n then click Apply
again", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

9
}
}
else
{

// Open the Port


if (!serialPort.IsOpen)
{
//
*******************************************************
// Setting Port's parameter
serialPort.PortName = cb_Gate.Text;
serialPort.BaudRate = int.Parse(cb_Baurate.Text);
//
*******************************************************
try
{
serialPort.Open();
}
catch
{
MessageBox.Show("Please! Connect the caple", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (serialPort.IsOpen)
{
btn_Connect.BackColor = Color.Orange;
10
btn_Connect.Text = ("Disconnect!");
lb_ConnectionStatus.Text = ("Connected!");
lb_ConnectionStatus.ForeColor = Color.Black;
}
}
// Close the Port
else if (serialPort.IsOpen)
{
serialPort.Close();
//
*******************************************************
// Popup Status Disconnect
if (!serialPort.IsOpen)
{
btn_Connect.BackColor = Color.Green;
btn_Connect.Text = ("Connect!");
lb_ConnectionStatus.Text = ("DisConnected!");
lb_ConnectionStatus.ForeColor = Color.Black;

//
*******************************************************
// reset data
txt_CurRpm.Text = "";
txt_CurPositon.Text = "";
txt_CurDegree.Text = "";
txt_CurDirection.Text = "";
txt_CurRevolutionCnt.Text = "";
11
}
}

}
}

private void btn_Apply_Click(object sender, EventArgs e)


{
// *******************************************************
// Handling RPM limit
if (txt_RpmLimit.Text != "")
{
if (IsNumeric(txt_RpmLimit.Text) == true)
{
//
*******************************************************
// Get value
intRPM_Limit = int.Parse(txt_RpmLimit.Text);

if ((intRPM_Limit < 0))


{
MessageBox.Show("RpmLimit isn't suitable'", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
12
txt_RpmLimit.Text = "";
MessageBox.Show("Please! Input number'", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}

// *******************************************************
//Control Button
private void btn_SpeedUp_Click(object sender, EventArgs e)
{
SendtoArduino(strChar[0]);
}

private void btn_SpeedDown_Click(object sender, EventArgs e)


{
SendtoArduino(strChar[1]);
}

private void btn_Normal_Click(object sender, EventArgs e)


{
if (bReverse_Click == false || intRpm_Compare ==0 )
{
SendtoArduino(strChar[2]);
bNormal_Click = true;
}

13
else
{
MessageBox.Show("Please! Stop motor before changing direction",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btn_Reverse_Click(object sender, EventArgs e)
{
if (bNormal_Click == false || intRpm_Compare == 0)
{
SendtoArduino(strChar[3]);
bReverse_Click = true;
}
else
{
MessageBox.Show("Please! Stop motor before changing direction",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void btn_Stop_Click(object sender, EventArgs e)


{
SendtoArduino(strChar[4]);
bNormal_Click = false;
bReverse_Click = false;
}

14
// *******************************************************
// Start StopWatch 60 seconds
private void btn_StopWatchStart_Click(object sender, EventArgs e)
{
intMinute = int.Parse(txt_StopWatch.Text);
StopWatch.Enabled = true;
StopWatch.Start();
intRPM_Old = int.Parse(txt_CurRevolutionCnt.Text);
}

}
}
• Arduino IDE

#define encoderPinA 2
#define encoderPinB 3
#define AnalogOut1 5
#define AnalogOut2 6
#define LEDOUT 8
//*****************************************
//Int
int intCurPosition = 0;
int intEncPos = 0;
int intNewpos = 0;
int intOldpos = 0;
int intCurRpm = 0;
int intSpeedtomotor = 0;

15
int intCurSpeedtomotor = 0;
int intRound_count = 0;
int intNewTime = 0;
int intOldTime = 0;
//*****************************************
//String
String strCurDir = "";
String strRecived = "";
//****************************************************
//Char
//****************************************************
//Process
void setup()
{
// initialize digital
pinMode(AnalogOut1, OUTPUT);
pinMode(AnalogOut2, OUTPUT);
pinMode(LEDOUT, OUTPUT);
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
//Value Interrupt(Pin)
attachInterrupt(0, doEncoderA, FALLING);
//Serial Port
Serial.begin(9600);
}
void loop()

16
{
Motorcontrol();
}
//****************************************************
void Motorcontrol()
{
LedBlink();
Data_Motor();
delay (200);

if (Serial.available() > 0)
{
strRecived = String((char)Serial.read());
}

if (strRecived == "N" || strRecived == "R")


{
strCurDir = strRecived;
}

if (strRecived == "S")
{
if (strCurDir == "N")
{
for(int i=intCurSpeedtomotor; i>0; i=i-5)
{

17
analogWrite(AnalogOut2, 0);
analogWrite(AnalogOut1, i);
LedBlink();
Data_Motor();
delay(200);
}
intCurSpeedtomotor = 0;
intSpeedtomotor = 0;
}
else if (strCurDir == "R")
{
for(int i=intCurSpeedtomotor; i>0; i=i-5)
{
analogWrite(AnalogOut1, 0);
analogWrite(AnalogOut2, i);
LedBlink();
Data_Motor();
delay(200);

}
intCurSpeedtomotor = 0;
intSpeedtomotor = 0;
}
}
else
{

18
if (strCurDir == "N")
{
if (strRecived == "U")
{
intSpeedtomotor = intSpeedtomotor + 5;
}
if (strRecived == "D")
{
intSpeedtomotor = intSpeedtomotor - 5;
}
if (intSpeedtomotor >= 255)
{
intSpeedtomotor = 255;
}
if (intSpeedtomotor <= 0)
{
intSpeedtomotor = 0;
}
analogWrite(AnalogOut2, 0);
analogWrite(AnalogOut1, intSpeedtomotor);
}

if (strCurDir == "R")
{
if (strRecived == "U")
{

19
intSpeedtomotor = intSpeedtomotor + 5;
}
if (strRecived == "D")
{
intSpeedtomotor = intSpeedtomotor - 5;
}
if (intSpeedtomotor >= 255)
{
intSpeedtomotor = 255;
}
if (intSpeedtomotor <= 0)
{
intSpeedtomotor = 0;
}
analogWrite(AnalogOut1, 0);
analogWrite(AnalogOut2, intSpeedtomotor);
}
}

intCurSpeedtomotor = intSpeedtomotor;
}

void LedBlink()
{

if (Serial.available() > 0)

20
{
strRecived = String((char)Serial.read());
}

if (strRecived == "L")
{
digitalWrite(LEDOUT, HIGH);
}
else
{
digitalWrite(LEDOUT, LOW);
}
}

void Data_Motor()
{
intNewpos = intEncPos;
detachInterrupt(0);
intCurRpm = (intNewpos-intOldpos)*0.5;

Serial.println(intCurPosition+String(",")+abs(intCurRpm)+String(",")+intRou
nd_count);
intOldpos=intNewpos;
attachInterrupt(0, doEncoderA, FALLING);
}

void doEncoderA()
21
{

if(digitalRead(encoderPinB) == LOW)
{
intEncPos--;
intCurPosition--;
if(intCurPosition == -600)
{
intCurPosition = 0;
intRound_count ++;
}
}
else if(digitalRead(encoderPinB) == HIGH)
{
intEncPos++;
intCurPosition++;
if(intCurPosition == 600)
{
intCurPosition = 0;
intRound_count ++;
}
}
}
//****************************************************

22

You might also like