You are on page 1of 37

BỘ THÔNG TIN VÀ TRUYỀN THÔNG

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG


......🙡🙡🙡......

BÀI TẬP LỚN CUỐI KÌ


Nhóm 04

MÔN:
HỆ THỐNG NHÚNG
Hệ thống nhúng GV: Nguyễn Ngọc Minh

HÀ NỘI – 2022

2
Nhóm 4
BỘ THÔNG TIN VÀ TRUYỀN THÔNG

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG


......🙡🙡🙡......

BÀI TẬP LỚN CUỐI KÌ

MÔN: HỆ THỐNG NHÚNG

Giảng viên : Nguyễn Ngọc Minh

Sinh viên thực hiện:

Nguyễn Quang Khánh MSV: B18DCDT112

Lê Đăng Khoa MSV: B18DCDT116

Nguyễn Văn Tiến MSV: B18DCDT212

Nhóm : 04

HÀ NỘI – 2022
Hệ thống nhúng GV: Nguyễn Ngọc Minh

LỜI NÓI ĐẦU


Ngày nay việc ứng dụng vi điều khiển, vi xử lý đang ngày càng phát triển rộng rãi
và thâm nhập ngày càng nhiều vào các lĩnh vực kỹ thuật và đời sống xã hội. Tuy nhiên
ứng dụng cho các hệ thống nhúng ngày nay không đơn giản chỉ dừng lại ở điều khiển
đèn nhấp nháy, đếm số người vào/ra, hiển thị dòng thông báo trên matrix led hay điều
khiển ON-OFF của động cơ… mà nó ngày càng trở nên phức tạp. Và với xu hướng tất
yếu này cùng với sự phát triển mạnh mẽ của công nghệ chế tạo vi mạch, người ta đã
tạo ra những vi điều khiển có cấu trúc mạnh hơn, đáp ứng thời gian thực tốt hơn,
chuẩn hóa hơn so với các vi điều khiển 8 bit trước đây.
Với sự phát triển mạnh mẽ của khoa học, đặc biệt là ngành điện tử, sự phát minh ra
các linh kiện điện tử đã và đang ngày càng đáp ứng được yêu cầu của các hệ thống.
Ưu điểm của việc sử dụng các linh kiện điện tử làm cho các hệ thống linh hoạt và đa
dạng hơn, giá thành thấp hơn và độ chính xác cao hơn.
Để làm khái quát những kiến thức đã học được trong môn Hệ thống nhúng. Chúng
em xin làm bài tập lớn cuối kì này để tổng hợp lại những gì em đã học được sau khi
học xong môn học. Trong bài tập lớn này chúng em xin được làm hai bài đó là

Câu 1: Thuyết minh về hệ thống nhúng “xây dựng đồng hồ thời gian thực hiển thị
trên LED 7 thanh”
Câu 2: Thiết kế hệ thống đèn giao thông ngã tư, sử dụng led 7 thanh để hiển thị thời
gian đếm - Sử dụng timer để đếm thời gian chính xác 1s
Trong quá trình thực hiện vì kiến thức vẫn còn hạn chế nên chúng em không
tránh khỏi sai sót. Do vậy chúng em kính mong nhận được sự đánh giá và đóng góp ý
kiến của cô để bài tập của chúng em được hoàn thiện hơn.

Chúng em xin trân thành cảm ơn!

Mục Lục
LỜI NÓI ĐẦU 3
1. Phần 1: Thuyết minh về hệ thống nhúng “đồng hồ thời gian thực hiển thị trên LED 7 thanh”5
1.1. Giới thiệu chung 5
1.1.1 Giới thiệu về hệ thống thời gian thực 5
1.1.2. Khái niệm về hệ thống thời gian thực 5
1.2. Tổng quan về hệ thống 6

4
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

1.3 Sơ đồ tổng thể của hệ thống 6


1.4 Các khối của hệ thống 7
1.4.1 Khối nguồn 7
1.4.2 Khối Reset 8
1.4.3 Khối điều khiển 8
1.4.4 Khối tạo xung dao động 12
1.4.5 Khối hiển thị 13
1.4.6 Khối tạo thời gian thực 14
1.5 Lưu đồ thuật toán 17
2. Phần 2: Thiết kế hệ thống đèn giao thông ngã tư, sử dụng led 7 thanh để hiển thị thời gian đếm
- Sử dụng timer để đếm thời gian chính xác 1s 17
2.1 Vi xử lí ARM Cortex M3 17
2.2 STM32F103C8T6 18
2.3 Timer 19
2.4 Thiết kế đèn giao thông ngã tư 20
2.4.1 Sơ đồ khối hệ thống 20
2.4.2 Code hệ thống 22
2.4.3 Kết quả thực nghiệm 29

5
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

1. Phần 1: Thuyết minh về hệ thống nhúng “đồng hồ thời gian thực hiển thị
trên LED 7 thanh”
1.1. Giới thiệu chung
1.1.1 Giới thiệu về hệ thống thời gian thực
Trong những năm gần đây, các hệ thống điều khiển theo thời gian thực là một
trong những lĩnh vực thu hút nhiều sự chú ý trong giới khoa học nghiên cứu về khoa
học máy tính. Trong đó, vấn đề điều hành thời gian thực và vấn đề lập lịch là đặc biệt
quan trọng. Một trong ứng dụng quan trọng của hệ thống thời gian thực (RTS) đã và
đang được ứng dụng rộng rãi hiện nay là các dây truyền sản xuất tự động, robot, điều
khiển các thí nghiệm tự động, trong thiết kế đồng hồ hiển thị thời gian thực…

Tranh treo tường hiển thị thời gian thực

1.1.2. Khái niệm về hệ thống thời gian thực


Một hệ thống thời gian thực (RTC) có thể hiểu như là một mô hình xử lý mà
tính đúng đắn của hệ thống không chỉ phụ thuộc vào kết quả tính toán logic mà còn
phụ thuộc vào thời gian do kết quả này phát sinh ra.

Về cấu tạo, RTS thường được cấu thành từ các thành tố chính sau:

● Đồng hồ thời gian thực: Cung cấp thông tin thời gian thực.
● Bộ điều khiển ngắt: Quản lý các biến cố không theo chu kỳ.
● Bộ định hiểu: Quản lý các quá trình thực hiện.
● Bộ quản lý tài nguyên: Cung cấp các tài nguyên máy tính.
● Bộ điều khiển thực hiện: Khởi động các tiến trình.

6
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

1.2. Tổng quan về hệ thống


Đây là ứng dụng sử dụng vi điều khiển để thiết kế một đồng hồ thời gian thực
hiển thị trên led 7 thanh, với yêu cầu đảm bảo về:

+ Tính thực thi cao, có khả năng phát triển.

+ Đảm bảo về chất lượng, độ chính xác cao, làm việc lâu dài, bền bỉ.

+ Tiết kiệm chi phí, linh kiện dễ kiếm dễ sử dụng và dễ dàng thay thế khi xảy ra
sự cố.

+ Giảm thiểu chi phí, thời gian vận hành, bảo dưỡng và sửa chữa.

+ Có thể sử dụng riêng (đồng hồ vạn niên xem giờ, ngày tháng năm) hay có thể
sử dụng chung ( lắp vào các hệ thống mẹ).

Từ các yêu cầu trên về hệ thống chúng ta thiết kế hệ thống theo hướng sử dụng
hệ thống thời gian thực cứng với các ưu điểm của nó. Sau đây là một vài điểm giới
thiệu:

- Sử dụng LED 7 đoạn để hiển thị vì giá thành rẻ, dễ tìm kiếm.

- Sử dụng IC thời gian thực DS1307. IC này có tác dụng tạo ra thời gian thực
tương đối chính xác, bao gồm giờ, phút, giây, thứ, ngày, tháng, năm

- Sử dụng họ vi điều khiển MCS-51(Atmel).

- Sử dụng IC ghi dịch 74HC138 để tăng số lượng chân điều khiển cho vi điều
khiển.

1.3 Sơ đồ tổng thể của hệ thống

Sơ đồ tổng quát của hệ thống

7
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Nguyên lý hoạt động của sơ đồ tổng thể :

● Khi cho điện áp qua khối nguồn cho vi điều khiển, khi đó chương trình trong vi
điều khiển sẽ làm việc, đồng thời bộ tạo xung dao động tạo xung nhịp với tần
số 12MHz cho VĐK hoạt động.
● Chế độ ghi và nhận dữ liệu của IC thời gian thực đưa tới vi điều khiển, các điều
kiện START và STOP được nhận dạng khi bắt đầu hoặc kết thúc truyền một
chuỗi, lúc này các thanh ghi của IC thời gian thực nhận giá trị thời gian thực
(giờ, phút, giây, thứ, ngày, tháng, năm) và gửi đến vi điều khiển đồng thời lúc
này vi điều khiển sẽ gán một giá trị tương đương giá trị thời gian thực rồi gửi ra
khối hiển thị. Lúc này IC ghi dịch trong khối điều khiển sẽ gửi tín hiệu đến
khối hiển thị.
● Các nút ấn trong khối điều khiển có nhiệm vụ điều chỉnh thời gian.
● Khối Reset có nhiệm vụ đưa hệ thống về trạng thái ban đầu.

1.4 Các khối của hệ thống


1.4.1 Khối nguồn

Khối nguồn của hệ thống


Đây là mạch dùng để tạo ra nguồn điện áp chuẩn +5V cấp cho khối điều khiển
trung tâm sử dụng IC7805.

Đầu vào là điện áp xoay chiều sau khi được biến đổi qua máy biến thế, đưa vào
bộ Diode cầu để cho ra dòng điện một chiều( lúc này điện áp nằm trong khoảng từ 7-
10V). Sau khi đi qua IC ổn áp 7805 sẽ tạo ra nguồn điện áp chuẩn +5V cung cấp cho
mạch.

IC ổn áp 7805: đầu vào > 7V đầu ra 5V, 500 mA. Mạch ổn áp: cần cho vi điều
khiển vì nếu nguồn cho vi điều khiển không ổn định thì sẽ treo VĐK, không chạy
đúng hoặc reset liên tục thậm chí là chết chíp.

8
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

1.4.2 Khối Reset

Khối Reset

Khối RESET có tác dụng đưa vi điều khiển về trạng thái ban đầu. Khi nút
Reset được ấn điện áp +5V từ nguồn được nối vào chân Reset của vi điều khiển được
chạy thẳng xuống đất lúc này điện áp tại chân vi điều khiển thay đổi đột ngột về 0.
Khối điều khiển nhận biết được sự thay đổi này và khởi động lại trạng thái ban đầu
cho hệ thống

1.4.3 Khối điều khiển

Khối điều khiển

Gồm 4 nút ấn:cancel, down, up, menu. Khi 1 nút ấn được tác động làm thay đổi
điện áp trên chân nối với vi điều khiển từ +5V xuống 0V. Lúc này vi điều khiển nhận
biết được sự thay đổi và làm thay đổi giá trị đầu ra:

- Nút menu: Để chuyển chế độ chỉnh thời gian.

- Nút up: Tăng giá trị cần điều chỉnh ++1.

9
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

- Nút down: Giảm giá trị cần điều chỉnh –1.

- Cancel: thoát trạng thái điều chỉnh.

a. IC giải mã 74HC138

Sơ đồ chân của 74HC138

IC 74HC138 là bộ giả mã địa chỉ với 3 đầu vào ( A,B,C) và 8 đầu ra phủ định
(Y0 đến Y7 ). Nó có 3 đầu vào cho phép: 2 đầu vào tích cực thấp (G2A,G2B) và một
đầu vào tích cực mức cao (G1). Tất cả các đầu ra của 74HC138 sẽ ở mức cao trừ khi
G2A ở mức thấp và G1 ở mức cao. Khi các đầu vào G2A,G2B ở mức thấp và G1 ở
mức cao thì đầu ra của 74HC138 sẽ được quyết định bởi đầu vào .

10
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Bảng chức năng của 74HC138

b. Cấu tạo và chức năng các chân của AT89C52

IC AT89C52 và sơ đồ chân

11
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

● Bộ nhớ chương trình( ROM) gồm 8Kbyte Flash.


● Bộ nhớ dữ liệu( RAM) gồm 256 byte.
● Bộ UART, có chức năng truyền nhận nối tiếp.
● 3 bộ Timer/Counter 16 bit thực hiện chức năng định thời và đếm sự kiện.
● Khối điều khiển ngắt với 2 nguồn ngắt ngoài và 4 nguồn ngắt trong.
● Bộ lập trình ( ghi chương trình lên Flash ROM) cho phép người sử dụng có
thể nạp các chương trình cho chíp mà không cần các bộ nạp chuyên dụng.
● Bộ chia tần số với hệ số chia là 12.
● 4 cổng xuất nhập với 32 chân.

❖ Chức năng các chân của IC AT89C52:


● Port 0( P0.0-P0.7)
Port 0 gồm 8 chân, ngoài chức năng xuất nhập, port 0 còn là bus đa hợp dữ liệu
và địa chỉ ( AD0-AD7), chức năng này sẽ được sử dụng khi 89c52 giao tiếp với
các thiết bị ngoài có kiến trúc Bus như các vi mạch nhớ, mạch PIO…
● Port 1( P1.0-P1.7)
Chức năng duy nhất của Port 1 là chức năng xuất nhập cũng như các Port
khác. Port1 có thể xuất nhập theo bit và theo byte.
● Port 2( P2.0=>P2.7)
Port 2 ngoài chức năng là cổng vào/ra như Port 0 và 1 còn là byte cao của bus
địa chỉ khi sử dụng bộ nhớ ngoài.
● Port 3(P3.0=>P3.7)
Mỗi chân trên Port 3 ngoài chức năng xuất nhập còn có một chức năng riêng,
cụ thể như sau:

Bit Tên Chức năng


P3.0 RXD Dữ liệu nhận cho Port nối tiếp
P3.1 TXD Dữ liệu truyền cho Port nối tiếp
P3.2 INT0 Ngắt bên ngoài 0

12
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

P3.3 INT1 Ngắt ngoài 1


P3.4 TO Ngõ vào của Timer/counter0
P3.5 T1 Ngõ vào của Timer/counter1
P3.6 /WR Xung ghi bộ nhớ dữ liệu ngoài.
P3.7 /RD Xung đọc bộ nhớ dữ liệu ngoài.

● Chân /PSEN : là chân điều khiển đọc chương trình ở bộ nhớ ngoài.
● Chân ALE.
ALE là tín hiệu điều khiển chốt địa chỉ có tần số bằng 1/6 tần số dao động của
vi điều khiển. Tín hiệu ALE được dùng để cho phép vi mạch chốt bên ngoài
như 7473.
● Chân /EA.
Tín hiệu /EA cho phép chọn bộ nhớ chương trình là bộ nhớ trong hay ngoài.
EA=1 thì thực hiện chương trình trong RAM nội. EA=0 thực hiện ở RAM
ngoài.
● RST( reset)
Ngõ vào reset trên chân số 9. Khi RST=1 thì bộ vi điều khiển sẽ được khởi
động lại thiết lập ban đầu.
● XTAL1, XTAL2
2 chân này được nối song song với thạch anh tần số max=33 Mhz. Để tạo dao
động cho bộ vi điều khiển.
● Vcc, GND : cung cấp nguồn nuôi cho bộ vi điều khiển. Cấp qua chân 20
và 40.

1.4.4 Khối tạo xung dao động

13
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Khối tạo dao động thạch anh

Đây là bộ dao động thạch anh có tác dụng tạo xung nhịp với tần số 12MHz cho VĐK
hoạt động. Hai đầu này được nối vào 2chân XTAL1 và XTAL2 của VĐK.

1.4.5 Khối hiển thị

Khối hiển thị ra các led 7 thanh

Khối hiển thị bao gồm các LED 7 thanh đơn (Anode chung) có các đầu vào
a,b,c,d,e,f,g của các LED được nối song song với nhau và nối với các chân của VĐK
(từ chân P0-P3) có tác dụng làm cho LED hiển thị dạng số mong muốn. Và đầu còn
lại của 15 LED 7 thanh được nối với 15 chân C của transistor thuận và chân B của
14
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

transistor nối với các PORT của VĐK (từ P0->P3), chân E của transistor được nối với
+5V. VĐK làm nhiệm vụ điều khiển IC 74HC138 làm cho từng LED sáng trong
khoảng thời gian nhất định.

1.4.6 Khối tạo thời gian thực

Khối tạo thời gian thực

DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật
thời gian và ngày tháng với 56 bytes SRAM. Địa chỉ và dữ liệu được truyền nối tiếp
qua 2 đường bus 2 chiều. Nó cung cấp thông tin về giờ, phút, giây, thứ, ngày, tháng,
năm. Ngày cuối tháng sẽ tự động được điều chỉnh với các tháng nhỏ hơn 31 ngày, bao
gồm cả việc tự động nhảy năm. Đồng hồ có thể hoạt động ở dạng 24h hoặc 12h với
chỉ thị AM/PM.

Để không phải điều chình lại thời gian vào những lúc bị mất nguồn, có thể nối
thêm 1 pin khoảng 3V vào chân SQW/OUT của IC DS1307 (sao cho chân + của pin
nối vàoIC và chân – của pin nối xuống đất). Hai chân 1 và 2 (X1,X2) của DS1307
được nối vào bộ dao động thạch anh có tần số 32,768KHz để tạo dao động cho IC
hoạt động.

a. Cơ chế hoạt động và chức năng của DS1307

15
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Cơ chế hoạt động của DS1307

Vcc: nối với nguồn

X1,X2: nối với thạch anh 32,768 kHz

Vbat: đầu vào pin 3V

GND: đất

SDA: chuỗi data

SCL: dãy xung clock

SQW/OUT: xung vuông/đầu ra driver

DS 1307 hoạt động với vai trò slave trên đường bus nối tiếp. Việc truy cập
được thi hành với chỉ thị START và một mã thiết bị nhất định được cung cấp bởi địa
chỉ các thanh ghi. Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị
STOP được thực thi.

b. Mô tả hoạt động của các chân

● Vcc, GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào
5V. Khi 5V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có
thể đọc và viết. Khi pin 3 V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat
thì quá trình đọc và viết không được thực thi, tuy nhiên chức năng timekeeping
không bị ảnh hưởng bởi điện áp vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và

16
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

timekeeper sẽ được ngắt tới nguồn cung cấp trong ( thường là nguồn 1 chiều
3V).
● Vbat: Đầu vào pin cho bất kỳ một chuẩn pin 3V. Điện áp pin phải được giữ
trong khoảng từ 2,5 - 3V để đảm bảo cho sự hoạt động của thiết bị.
● SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên
đường dây nối tiếp.
● SDA(serial data input/out): Là chân vào ra cho 2 đường dây nối tiếp. Chân
SDA thiết kế theo kiểu cực máng hở, đòi hỏi phải có một điện trở kéo trong khi
hoạt động.
● SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được
thiết lập 1 chân SQW/OUT phát đi 1 trong 4 tần số (1Hz,4kHz,8kHz,32kHz).
Chân này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một
điện trở kéo trong. Chân này sẽ hoạt động khi cả Vcc và Vbat được cấp.
● X1, X2: được nối với một thạch anh tần số 32,768kHz. Là một mạch tạo dao
động ngoài, để hoạt động ổn định thì phải nối thêm 2 tụ 33pF . Cũng có
DS1307 với bộ tạo dao động trong tần số 32,768kHz, với cấu hình này thì chân
X1 sẽ được nối vào tín hiệu dao động trong còn chân X2 thì để hở.

17
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

1.5 Lưu đồ thuật toán

Lưu đồ thuật toán của chương trình chính

2. Phần 2: Thiết kế hệ thống đèn giao thông ngã tư, sử dụng


led 7 thanh để hiển thị thời gian đếm - Sử dụng timer để đếm
thời gian chính xác 1s
2.1 Vi xử lí ARM Cortex M3
ARM Cortex M3: là một dòng vi xử lý được thiết kế bởi ARM. ARM Cortex M3
được
thiết kế dựa trên nền tảng ARMv7-M. Lõi ARM-M3 hoạt động trên kiến trúc 32 bit
và hỗ trợ chế độ hoạt động của tập lệnh Thumb và Thumb-2.
ARM Cortex M3 có một số đặc tính sau:
• Cơ chế đường lệnh (pipeline) 3 giai đoạn.
• Kiến trúc Havard: Bộ nhớ và dữ liệu sử dụng chung không gian địa chỉ nhớ.

18
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

• 32-bit đánh địa chỉ: Hỗ trợ tối đa 4GB bộ nhớ.


• Bus nội được thiết kế dựa trên ARM AMBA (Advanced Microcontroller Bus
Architecture) Technology.
• Hỗ trợ hoạt động của nhiều hệ điều hành: System tick timer, Ngăn xếp ẩn.
• Hỗ trợ hoạt động ở chế độ ngủ để tiết kiệm năng lượng.
• Hỗ trợ chế độ hoạt động bảo vệ bộ nhớ bởi MPU (Memory Protection Unit).
• Hỗ trợ truy vấn đến từng bit theo dạng bit-band.

2.2 STM32F103C8T6
● STM32F103C8T6 là vi điều khiển 32bit, thuộc họ F1 của dòng chip STM32 hãng
ST.
● Lõi ARM COTEX M3.
● Tốc độ tối đa 72Mhz.
● Bộ nhớ : 64 kbytes bộ nhớ Flash, 20 kbytes SRAM
● Clock, reset và quản lý nguồn
● Điện áp hoạt động từ 2.0 → 3.6V.
● Sử dụng thạch anh ngoài từ 4Mhz → 20Mhz.
● Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40Khz.
● 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ
● DMA:
⮚ 7 kênh DMA
⮚ Có hỗ trợ DMA cho ADC, UART, I2C, SPI.
● 7 bộ Timer:
⮚ 3 Timer 16 bit hỗ trợ các mode Input Capture/ Output Compare/ PWM.
⮚ 1 Timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ ngắt Input,
dead-time.
⮚ 2 Watchdog Timer để bảo vệ và kiểm tra lỗi.
⮚ 1 Systick Timer 24 bit đếm xuống cho hàm Delay,….
● Có hỗ trợ 9 kênh giao tiếp:
⮚ 2 bộ I2C.
⮚ 3 bộ USART
⮚ 2 SPI
⮚ 1 CAN
⮚ USB 2.0 full-speed interface
● Kiểm tra lỗi CRC và 96-bit ID.

19
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Các thông số kĩ thuật:

● Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC qua
IC nguồn và cấp cho Vi điều khiển chính.
● Tích hợp sẵn thạch anh 8Mhz.
● Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC.
● Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART, USB,...
● Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset.
● Kích thước: 53.34 x 15.24mm.

2.3 Timer
Timer chia làm 3 loại bộ chính : Advanced-Control timers(TIM1 và TIM8) ;
General-purpose timers(TIM2 đến TIM5) ;Basic timers(TIM6 và TIM7).
Trong đó:
+Advanced-Control Timer gồm TIM1và TIM8 . Các bộ timer này có một số đặc
điểm như sau:
- Bộ đếm 16 bit có thể đếm tiến, lùi, tiến/lùi tự
động nạp lại
- Hỗ trợ bộ chia tần 16 bit có thể lập trình được.
- Hỗ trợ 4 kênh hoạt động độc lập cho các chức
năng:
• Caputre đầu vào
• So sánh đầu ra
• Điều chế độ rộng xung (PWM)
• Chế độ đầu ra một xung

20
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

- Hỗ trợ kích hoạt các sự kiến DMA


- Hỗ trợ kích hoạt ngắt
- Hỗ trợ trigger cho các sự kiện

Advanced-Control Timer bao gồm TIM2 đến TIM5 .Các bộ timer này có một số
đặc điểm như sau:

- Bộ đếm 16 bit có thể đếm tiến, lùi, tiến/lùi tự


động nạp lại
- Hỗ trợ bộ chia tần 16 bit có thể lập trình được.
- Hỗ trợ 4 kênh hoạt động độc lập cho các chức
năng:
182
• Caputre đầu vào
• So sánh đầu ra
• Điều chế độ rộng xung (PWM)
• Chế độ đầu ra một xung
- Hỗ trợ kích hoạt các sự kiến DMA
- Hỗ trợ kích hoạt ngắt
- Hỗ trợ trigger cho các sự kiện
- Hỗ trợ đọc cảm biến hall 4 đầu vào

Giá trị của UEV được tính theo công thức sau:

21
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Trong đó:
+TIM_CLK : clock cung cấp cho timer.
+PSC (prescaler): là thanh ghi 16bits làm bộ chia cho timer, có thể chia từ 1 tới
65535 ( 65535= 2^16-1)
+ARR (auto-reload register): là giá trị đếm của timer (16bits hoặc 32bits).
+RCR (repetition counter register): giá trị đếm lặp lại 16bits
+Timer của STM32 là timer 16 bits có thể tạo ra cácsự kiện trong khoảng thời
gian từ nano giây tới vài phút gọi là UEV(update event).
2.4 Thiết kế đèn giao thông ngã tư
2.4.1 Sơ đồ khối hệ thống

22
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Khối điều khiển

Đèn tín hiệu giao Đèn tín hiệu giao


Dual 7seg Dual 7seg
thông thông
Các chân tín hiệu

Hướng đi ngang
Hướng đi dọc

Giải thích: các cụm led 7 đoạn được kết nối các chân tín hiệu được kết nối với nhau và nối với vi xử lí
thông qua điện trở. Các chân tín hiệu tín hiệu anode chung của khối led bên trái và phải được chung
với nhau. Các chân anode chung của khối bên trên và dưới được nối chung với nhau. Như vậy đèn
bên trái và phải sẽ có trạng thái giống nhau. Tương tự như vậy đối với đèn bên trên và bên dưới.

Bảng trạng thái của hệ thống đèn giao thông như sau:

23
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

Trạng thái Hướng ngang Hướng dọc

1 Đỏ Xanh

Đếm từ 30 về 5 Đếm từ 25 về 0
2 Đỏ Vàng

Đếm từ 5 về 0 Hiển thị số 0

3 Xanh Đỏ

Đếm từ 25 về 0 Đếm từ 30 về 5
4 Vàng Đỏ

Hiển thị số 0 Đếm từ 5 về 0

2.4.2 Code hệ thống


Ý tưởng: nhóm em sử dụng một timer để tạo ra một tần số 1Hz, sau đó cài đặt ngắt tràn cho timer.
Chúng em sử dụng một biến toàn cục để hiển thị trạng thái của của ngắt: nếu có ngắt xảy ra thì biến
đó chuyển thành 1, nếu chưa xảy ra ngắt tràn thì biến đó bằng 0;

Khi chưa có ngắt tràn xảy ra thì em thực hiện quét led. Việc quét Led được thực hiện như sau: xuất
số cần hiển thị ra các chân tín hiệu trên led 7 đoạn, sau đó xuất tín chân anode chung của led cần
hiển thị ở mức hight, dừng lại 1 khoảng thời gian ngắn. Em làm lần lượt như vậy với các led còn lại.

Khi có ngắt tràn xảy ra thì việc quét led dừng lại để chuyển tới số tiếp theo hoặc trạng thái tiếp theo.

24
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

/*

Bai tap lon mon hoc: He thong nhung

Thiet ke den giao thong

Le Dang Khoa - B18DCDT116

Nguyen Quang Khanh - B18DCDT116

Nguyen Van Tien - B18DCDT212

*/

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "delay.h"

#define time_yel 5 //time for yellow light

#define LED7SEG_A GPIO_Pin_0

#define LED7SEG_B GPIO_Pin_1

#define LED7SEG_C GPIO_Pin_2

#define LED7SEG_D GPIO_Pin_3

#define LED7SEG_E GPIO_Pin_4

#define LED7SEG_F GPIO_Pin_5

#define LED7SEG_G GPIO_Pin_6

#define LED7SEG_DP GPIO_Pin_7

#define LED3 GPIO_Pin_0 //y

#define LED4 GPIO_Pin_1

#define LED1 GPIO_Pin_7 //x

#define LED2 GPIO_Pin_8

#define LED_Do GPIO_Pin_9

25
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

#define LED_Vang GPIO_Pin_10

#define LED_Xanh GPIO_Pin_11

#define LED_Do1 GPIO_Pin_12

#define LED_Vang1 GPIO_Pin_13

#define LED_Xanh1 GPIO_Pin_14

#define PORT_LED7SEG_CODE GPIOA

#define PORT_LED GPIOB

#define PORT_LED7SEG_CODE_CLOCK RCC_APB2Periph_GPIOA

#define PORT_LED_CLOCK RCC_APB2Periph_GPIOB

uint16_t LED7SEG[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

uint8_t Interup_Status;

void Delay(uint32_t);

void GPIO_Config(void);

void Clock_Config(void);

void Init_Timer2(void);

void TIM2_IRQHandler(void);

void Scan_LED_STT1(int i);

void Scan_LED_STT2(int i);

void Scan_LED_STT3(int i);

void Scan_LED_STT4(int i);

int main(void)

Clock_Config(); // configuraion clock

26
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

SystemCoreClockUpdate(); // update SystemCoreClock varibale

GPIO_Config();

Init_Timer2();

GPIO_ResetBits(PORT_LED, LED_Do);

GPIO_ResetBits(PORT_LED, LED_Vang);

GPIO_ResetBits(PORT_LED, LED_Xanh);

GPIO_ResetBits(PORT_LED, LED_Do1);

GPIO_ResetBits(PORT_LED, LED_Vang1);

GPIO_ResetBits(PORT_LED, LED_Xanh1);

while(1){

int i;

//status 1 x: red 30 -> 5

// y: green 25 -> 0

for(i = 30; i > time_yel; i--){

GPIO_SetBits(PORT_LED, LED_Do);

GPIO_SetBits(PORT_LED, LED_Xanh1);

Scan_LED_STT1(i);

GPIO_ResetBits(PORT_LED, LED_Xanh1);

//status 1 x: red 5 -> 0

// y: yellow

for(i = time_yel; i >= 0; i--){

GPIO_SetBits(PORT_LED, LED_Do);

GPIO_SetBits(PORT_LED, LED_Vang1);

Scan_LED_STT2(i);

GPIO_ResetBits(PORT_LED, LED_Do);

27
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

GPIO_ResetBits(PORT_LED, LED_Vang1);

//status 1 y: red 30 -> 5

// x: green 25 -> 0

for(i = 30; i > time_yel; i--){

GPIO_SetBits(PORT_LED, LED_Xanh);

GPIO_SetBits(PORT_LED, LED_Do1);

Scan_LED_STT3(i);

GPIO_ResetBits(PORT_LED, LED_Xanh);

//status 1 y: red 5 -> 0

// x: yellow

for(i = time_yel; i >= 0; i--){

GPIO_SetBits(PORT_LED, LED_Vang);

GPIO_SetBits(PORT_LED, LED_Do1);

Scan_LED_STT4(i);

GPIO_ResetBits(PORT_LED, LED_Vang);

GPIO_ResetBits(PORT_LED, LED_Do1);

/*Delay tuong doi*/

void Delay(uint32_t t)

unsigned int i;

for(i=0;i<t;i++){

// for(j=0;j < 4000; j++);

28
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

void GPIO_Config()

GPIO_InitTypeDef GPIO_InitStructure;

/*enble clock for GPIOC*/

RCC_APB2PeriphClockCmd(PORT_LED7SEG_CODE_CLOCK | PORT_LED_CLOCK, ENABLE);

/*Configuration GPIO pin*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = LED7SEG_A|LED7SEG_B|LED7SEG_C|LED7SEG_D|LED7SEG_E|
LED7SEG_F|LED7SEG_G|LED7SEG_DP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(PORT_LED7SEG_CODE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = LED1 | LED2 | LED3 | LED4;

GPIO_Init(PORT_LED, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = LED_Do | LED_Vang | LED_Xanh | LED_Do1 | LED_Vang1 |


LED_Xanh1 ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(PORT_LED, &GPIO_InitStructure);

void Clock_Config(void)

/* RCC system reset */

29
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

RCC_DeInit();

/* HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div2);

/* PCLK1 = HCLK/2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

/*enable HSI source clock*/

RCC_HSICmd(ENABLE);

/* Wait till PLL is ready */

while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET){}

/* Select PLL as system clock source */

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

/* Wait till PLL is used as system clock source */

while(RCC_GetSYSCLKSource() != 0x00) {}

//use timer2

void Init_Timer2(void)

TIM_TimeBaseInitTypeDef timerInit; //bien timer

NVIC_InitTypeDef NVIC_InitStruct; //Interup

RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2, ENABLE); //ENABLE clock


/
/tao tan so 1 Hz

timerInit.TIM_CounterMode = TIM_CounterMode_Up; //mode dem: len

timerInit.TIM_Period = 1000-1; //gt nap lai

timerInit.TIM_Prescaler = 8000-1; //gt chia tan

timerInit.TIM_RepetitionCounter = 0;

30
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

TIM_TimeBaseInit (TIM2,&timerInit); //ham khoi tao timer2

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // Enable TIM2 interrupt

TIM_Cmd(TIM2,ENABLE); //cho phep timer2 chay

// Nested vectored interrupt settings

NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStruct);

void TIM2_IRQHandler(void)

// Checks whether the TIM2 interrupt has occurred or not

if(TIM_GetITStatus(TIM2, TIM_IT_Update))

if(Interup_Status == 0){

Interup_Status = 1;

// Clears the TIM2 interrupt pending bit

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

//else Interup_Status = 0;

31
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

void Scan_LED_STT1(int i)

while( Interup_Status == 0 )

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)/10]);

GPIO_SetBits(PORT_LED, LED1); // LED1 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED1); //LED1 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)%10]);

GPIO_SetBits(PORT_LED, LED2); //LED2 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED2); //LED2 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i-time_yel)/10]);

GPIO_SetBits(PORT_LED, LED3); // LED3 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED3); //LED3 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i-time_yel)%10]);

GPIO_SetBits(PORT_LED, LED4); //LED4 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED4); //LED4 = 0

Interup_Status = 0;

void Scan_LED_STT2(int i)

while( Interup_Status == 0 )

32
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)/10]);

GPIO_SetBits(PORT_LED, LED1); // LED1 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED1); //LED1 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)%10]);

GPIO_SetBits(PORT_LED, LED2); //LED2 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED2); //L7S2 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[0]);

GPIO_SetBits(PORT_LED, LED3); // LED3 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED3); //LED3 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[0]);

GPIO_SetBits(PORT_LED, LED4); //LED4 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED4); //LED4 = 0

Interup_Status = 0;

void Scan_LED_STT3(int i)

while( Interup_Status == 0 )

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i-time_yel)/10]);

GPIO_SetBits(PORT_LED, LED1); // LED1 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED1); //LED1 = 0

33
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i-time_yel)%10]);

GPIO_SetBits(PORT_LED, LED2); //LED2 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED2); //LED2 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)/10]);

GPIO_SetBits(PORT_LED, LED3); // LED3 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED3); //LED3 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)%10]);

GPIO_SetBits(PORT_LED, LED4); //LED4 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED4); //LED4 = 0

Interup_Status = 0;

void Scan_LED_STT4(int i)

while( Interup_Status == 0 )

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[0]);

GPIO_SetBits(PORT_LED, LED1); // LED1 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED1); //LED1 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[0]);

GPIO_SetBits(PORT_LED, LED2); //LED2 = 1

Delay(1);

34
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

GPIO_ResetBits(PORT_LED, LED2); //L7S2 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)/10]);

GPIO_SetBits(PORT_LED, LED3); // LED3 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED3); //LED3 = 0

GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[(i)%10]);

GPIO_SetBits(PORT_LED, LED4); //LED4 = 1

Delay(1);

GPIO_ResetBits(PORT_LED, LED4); //LED4 = 0

Interup_Status = 0;

35
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

2.4.3 Kết quả thực nghiệm


Chúng em đã nạp và chạy thử trên kit STM32F103C8T6 và cho kết quả phù hợp

Video test thử https://www.youtube.com/watch?v=Lok9aPGQIS0&t=13s

● Trạng thái 1: Hướng dọc bật đèn đỏ, đếm lùi từ 30;
Hướng ngang bật đèn xanh và đếm lùi từ 25

● Trạng thái 2: Hướng ngang đếm về 0 thì chuyển sang đèn vàng;
Hướng dọc tiếp tục bật đèn đỏ và đếm từ 5 về 0;

● Trạng thái 3: Hướng ngang chuyển sang đèn đỏ và đếm lùi từ 30;
Hướng dọc chuyển sang đèn xanh và đếm lùi từ 25;

36
Nhóm 4
Hệ thống nhúng GV: Nguyễn Ngọc Minh

● Trạng thái 4: Hướng dọc chuyển sang đèn vàng


Hướng ngang tiếp tục bật đèn đỏ và đếm lùi từ 5 về 0

37
Nhóm 4

You might also like