Tải bản đầy đủ (.pdf) (27 trang)

Đồ án tốt nghiệp Hệ thống kiểm soát người ra vào phòng tự động + code

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.44 MB, 27 trang )

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ÁO CÁO
ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG
Đề tài: Hệ thống kiểm sốt người ra vào phịng tự động

MỤC LỤC

1


LỜI MỞ ĐẦU................................................................................................................................ 3
I, Tổng quan về RTOS: ................................................................................................................ 4
1.1 Khái niệm về RTOS: ............................................................................................................. 4
1.2 Các thành phần trong RTOS và phương thức hoạt động: ..................................................... 4
II, FreeRTOS ................................................................................................................................. 9
2.1 Tổng quan về FreeRTOS....................................................................................................... 9
2.2 Các Task trong FreeRTOS .................................................................................................. 12
III, STM32F103C8T6 ................................................................................................................. 14
3.1 Giới thiệu sơ lược: ............................................................................................................... 14
3.2 Cấu hình chi tiết của STM32F103C8T6: ............................................................................ 15
3.3 Thơng số kỹ thuật: ............................................................................................................... 18
IV, Màn hình LCD 16x2 ............................................................................................................. 20
V, Cảm biến vật cản hồng ngoại ................................................................................................ 23
VI, Giao tiếp STM32F103C8T6 với LCD 16×2 thơng qua moudle I2C ................................ 23
6.1 Kết nối MCU STM32 với LCD .......................................................................................... 23
6.2 Địa chỉ của Module I2C PCF8574 ...................................................................................... 24
VII, Mạch nguyên lý, PCB, mạch thực tế ................................................................................. 25

2




LỜI MỞ ĐẦU
Ngày nay, các hệ thống nhúng trở nên phổ biến và đóng vai trị quan trọng trong đời
sống con người. Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lị vi sóng, nồi cơm điện,
điều hịa, điện thoại di động, ô tô, xe máy, máy bay, tàu thủy, các đầu đo, cơ cấu chấp hành
thông minh, robot v.v… Ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi nơi trong
cuộc sống quanh chúng ta.
Qua môn học hệ thống nhúng, chúng em đã hiểu thêm về các hệ thống nhúng trong
thực tế, về đặc điểm, tính ưu việt cũng như tính ứng dụng của chúng đối với con người.
Với mong muốn làm rõ các kiến thức đã học và giới thiệu các ứng dụng cơ bản của hệ
thống nhúng, nhóm chúng em đưa ra mơ hình mạch đếm số người ra vào phịng tự động –
một sản phẩm rất quen thuộc và có tính ứng dụng cao trong thực tế.
Do thời tian thực hiện và kiến thức còn hạn chế nên còn nhiều sai sót trong q trình
thực hiện đề tài, nhóm chúng em rất mong nhận được sự bổ sung đóng góp của thầy và các
bạn để đề tài hoàn thiện hơn.
Chúng em xin chân thành cảm ơn thầy đã tận tình hướng dẫn, giảng dạy và giúp đỡ
chúng em thực hiện đề tài này!

Sinh viên thực hiện đề tài
Nhóm 8

3


I, Tổng quan về RTOS:
1.1 Khái niệm về RTOS:
+ RTOS là viết tắt của cụm từ Real-time operating system hay hệ điều hành thời gian thực
thường được nhúng trong các dòng vi điều khiển dùng để điều khiển thiết bị một cách
nhanh chóng và đa nhiệm (multi tasking).

+ Hệ điều hành thời gian thực (realtime): sinh ra cho các tác vụ cần sự phản hồi nhanh của
hệ thống, thường được nhúng trong các loại vi điều khiển và khơng có giao diện (GUI)
tương tác với người dùng. Chúng cần phản hồi nhanh bởi vì đa số các tác vụ tương tác với
thiết bị, máy móc khác chứ khơng phải con người. Các tài nguyên bên trong rất hữu hạn
nên chỉ một sự chậm trễ cũng có thể làm hệ thống làm việc hoàn toàn sai lệch.
1.2 Các thành phần trong RTOS và phương thức hoạt động:
+ Kernel hay còn gọi là Nhân có nhiệm vụ quản lý và điều phối các Task. Mọi sự kiện
(Even) như ngắt, Timer, data truyền tới… đều qua Kernel xử lý để quyết định xem nên làm
gì tiếp theo. Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp.

+ Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì đó, được Kernel quản
lý. Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của task sắp bị
hủy và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:


Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt
systick)



Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,
semaphore,…)



Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải
chờ cho hết time slice
4





Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task.

Một task trong RTOS thường có các trạng thái như sau:


RUNNING: đang thực thi



READY: sẵn sàng để thực hiện



WAITING: chờ sự kiện



INACTIVE: khơng được kích hoạt

+ Scheduler – Lập lịch: Đây là 1 thành phần của kernel quyết định task nào được thực thi.
Có một số luật cho scheduling như:
Cooperative: giống với lập trình thơng thường, mỗi task chỉ có thể thực thi khi task
đang chạy dừng lại, nhược điểm của nó là task này có thể dùng hết tất cả tài nguyên của
CPU.
Round-robin: mỗi task được thực hiện trong thời gian định trước (time slice) và
khơng có ưu tiên.
Priority base: Task được phân quyền cao nhất sẽ được thực hiện trước, nếu các task
có cùng quyền như nhau thì sẽ giống với round-robin, các task có mức ưu tiên thấp hơn sẽ

được thực hiện cho đến cuối time slice.
Priority-based pre-emptive: Các task có mức ưu tiên cao nhất ln nhường các task
có mức ưu tiên thấp hơn thực thi trước.
+ Kết nối Inter-task & Chia sẻ tài nguyên: để hệ thống hoạt động ổn định các task cần
phải kết nối và trao đổi dữ liệu với nhau để có thể chia sẻ tài nguyên, một số khái niệm cần
lưu ý:

5


Với Inter-task Communication:


Signal Events – Đồng bộ các task



Message queue – Trao đổi tin nhắn giữa các task trong hoạt động giống như FIFO



Mail queue – Trao đổi dữ liệu giữa các task sử dụng hằng đợi của khối bộ nhớ

Với Resource Sharing:


Semaphores – Truy xuất tài nguyên liên tục từ các task khác nhau




Mutex – Đồng bộ hóa truy cập tài nguyên sử dụng Mutual Exclusion

+ Signal event được dùng để đồng bộ các task, ví dụ như bắt task phải thực thi tại một sự
kiện nào đó được định sẵn. Mỗi task có thể được gán tối đa là 32 signal event.
+ Message queue – Hàng đợi tin nhắn là cơ chế cho phép các task có thể kết nối với nhau,
nó là một FIFO ( First In First Out) buffer được định nghĩa bởi độ dài (số phần tử mà buffer
có thể lưu trữ) và kích thước dữ liệu (kích thước của các thành phần trong buffer).
Task có thể ghi vào hằng đợi (queue)


Task sẽ bị khóa (block) khi gửi dữ liệu tới một message queue đầy đủ



Task sẽ hết bị khóa (unblock) khi bộ nhớ trong message queue trống



Trường hợp nhiều task mà bị block thì task với mức ưu tiên cao nhất sẽ được
unblock trước

Task có thể đọc từ hằng đợi (queue)


Task sẽ bị block nếu message queue trống



Task sẽ được unblock nếu có dữ liệu trong message queue.




Tương tự ghi thì task được unblock dựa trên mức độ ưu tiên

6


+ Mail queue truyền dữ liệu sẽ được truyền dưới dạng khối(memory block) thay vì dạng
đơn. Mỗi memory block thì cần phải cấp phát trước khi đưa dữ liệu vào và giải phóng sau
khi đưa dữ liệu ra.
Thao tác gửi dữ liệu với mail queue
1. Cấp phát bộ nhớ từ mail queue cho dữ liệu được đặt trong mail queue
2. Lưu dữ liệu cần gửi vào bộ nhớ đã được cấp phát
3. Đưa dữ liệu vào mail queue
Thao tác nhận dữ liệu trong mail queue bởi task khác
1. Lấy dữ liệu từ mail queue, sẽ có một hàm để trả lại cấu trúc/ đối tượng
2. Lấy con trỏ chứa dữ liệu
3. Giải phóng bộ nhớ sau khi sử dụng dữ liệu

7


+ Semaphore Được sử dụng để đồng bộ task với các sự kiện khác trong hệ thống. Có 2
loại:
Binary semaphore: Semaphore là một mã thông báo giống như một mã thông báo cho phép
một tác vụ thực hiện việc thực thi nếu tác vụ nhận được semaphore. Nếu không, tác vụ vẫn
ở trạng thái khối và không thể thực thi trừ khi nó có được semaphore nhị phân


Có duy nhất 1 token




Chỉ có 1 hoạt động đồng bộ

Counting semaphore: đưa ra các Token cho các Task sử dụng tài nguyên, nếu tài ngun
được sử dụng hết thì các Task cịn lại sẽ phải chờ đến khi Tài nguyên được giải phóng trở
lại. Couting semaphore được dùng để:
Counting event


Một event handler sẽ ‘give’ semaphore khi có event xảy ra (tăng giá trị đếm
semaphore)



Một task handler sẽ ‘take’ semaphore khi nó thực thi sự kiện (giảm giá trị đếm
semaphore)



Count value là khác nhau giữa số sự kiện xảy ra và số sự kiện được thực thi



Trong trường hợp counting event thì semaphore được khởi tạo giá trị đếm bằng 0

Resource management



Count value sẽ chỉ ra số resource sẵn có

8




Để điều khiển và kiểm soát được resource của task dựa trên count value của
semaphore(giá trị giảm), nếu count value giảm xuống bằng 0 nghĩa là khơng có
resource nào free.



Khi một task finish với resource thì nó sẽ give semaphore trở lại để tăng count value
của semaphore.



Trong trường hợp resouce management thì count value sẽ bằng với giá trị max của
count value khi semaphore được tạo.

+ Mutex: Sử dụng cho việc loại trừ (mutial exclution), hoạt động như là một token để bảo
vệ tài nguyên được chia sẻ. Một task nếu muốn truy cập vào tài nguyên chia sẻ


Cần yêu cầu (đợi) mutex trước khi truy cập vào tài nguyên chia sẻ (Sharing
Resourse)




Đưa ra token khi kết thúc với tài ngun.

Tại mỗi một thời điểm thì chỉ có 1 task có được mutex. Những task khác muốn cùng mutex
thì phải block cho đến khi task cũ thả mutex ra. Về cơ bản thì Mutex giống như binary
semaphore nhưng được sử dụng cho việc loại trừ chứ không phải đồng bộ.

II, FreeRTOS
2.1 Tổng quan về FreeRTOS
- Để sử dụng được FreeRTOS, cách cơ bản nhất là bạn phải biết sử dụng các API(nói dễ
hiểu là các hàm được cung cấp sẵn) của nó, dưới đây là bảng tổng quan về các API của
FreeRTOS và mô tả cụ thể
Phân loại API

FreeRTOS API

Mô tả

Tạo task

xTaskCreate

Tạo task mới

vTaskDelete

Xóa task

vTaskDelay

Delay task


Control task

9


Phân loại API

Control kernel

Messagequeues

Semaphores

Timers

FreeRTOS API

Mô tả

vTaskPrioritySet

Set quyền cho task

vTaskSuspend

Suspend task

vTaskResume


Tiếp tục task

vTaskStartScheduler

Start kernel scheduler

vTaskSuspendAll

Suspend taats cả task

xTaskResumeAll

Tiếp tục taất cả task

taskYIELD

Foce chuyển đổi context

taskENTER_CRITICAL

Vào critical section(dùng context switching)

taskEXIT_CRITICAL

Thoát khỏi critical section

xQueueCreate

Tạo một queue


xQueueSend

Gửi data vào queue

xQueueReceive

Nhận data từ queue

xSemaphoreCreateBinary

Tạo một binary semaphore

xSemaphoreCreateCounting

Tạo một counting semaphore

xSemaphoreCreateMutex

Tạo một mutex semaphore

xSemaphoreTake

Take semaphore

xSemaphoreGive

Give semaphore

xTimerCreate


Tạo timer

10


Phân loại API

FreeRTOS API

Mô tả

xTimerStart

Start timer

xTimerStop

Stop timer

Download thư viện FreeRTOS tại đây: />Link hướng dẫn cài đặt và cấu hình cơ bản kèm ví dụ:
/>
- Một số cấu hình quan trọng:
Config option

Mô tả

configUSE_PREEMPTION

Enable Preemption


configCPU_CLOCK_HZ

Tần số CPU(Hz)

configTICK_RATE_HZ

Tick rate (Hz)

configMAX_PRIORITIES

Số lượng priority task tối đa

configTOTAL_HEAP_SIZE

Tổng heap size cho dynamic allocation

configLIBRARY_LOWEST_INTERRUPT_
PRIORITY

Interrupt priority thấp nhất(0xF khi sử dụng 4 cortex
preemption bit)

configLIBRARY_MAX_SYSCALL_INTER
RUPT_PRIORITY

Highest thread safe interrupt priority (higher priorities are
lower numeric value)

- Cấu hình FreeRTOS và kernel:


11




Thẻ Config parameters cho phép ta có thể cấu hình cài đặt ban đầu những thứ liên
quan tới kernel và memory



Thẻ Include parameters cho phép bật/tắt một số define về Task,Queue,
Semaphore,….



Thẻ Tasks and Queue giúp ta có thể tạo/ thêm các task và queue



Thẻ Timers and semaphores cho phép thêm Timers, Mutexes, Semaphore, có
Mutex và Binary Semaphore mặc định là có thể add thêm mới, với Recursive
Mutexes cũng như Binary Semaphore để hiện được nút add thì cần phải enable các
define ở thẻ Include parameters



Thẻ User Constants để có thể thêm các constant của user có thể tự định nghĩa vào

- Khái niệm pre-emptive scheduling và co-operatieve scheduling: đây là 2 thuật toán dùng
để lập lịch, với các hệ thống hiện đại thì đều phụ thuộc vào các thuật tốn lập lịch để thực

hiện các tác vụ đa nhiệm hoặc ghép kênh(multiplexing) hiệu quả. Những thuật toán này sẽ
thực hiện thỏa hiệp để hoàn thành các mục tiêu cụ thể trong thời gian hạn hẹp.
Với pre-emptive scheduling khi start hệ thống thì task sẽ tiếp tục chạy cho tới khi nó từ bỏ
quyền kiểm sốt, thường là ở thời điểm đồng bộ hóa của nó.
Với co-operatieve scheduling thì sẽ giữ lại các thuộc tính như task, trạng thái của tas/ queue
và mức ưu tiên, task sẽ tiếp tục cho tới khi nó hồn tồn từ bỏ quyền kiểm sốt CPU, tuy
nhiên task có thể bị ép phải dừng (suspend) bằng cách dùng ngắt của CPU.

2.2 Các Task trong FreeRTOS
Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của task sắp bị hủy
và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:


Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt
systick)



Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,
semaphore,…)



Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải
chờ cho hết time slice

Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task.
- Task Switch: Kernel sẽ đảm nhiệm nhiệm vụ switch task, nó sẽ lưu lại context(trạng thái)
hiện tại của task bị suspend và khôi phục lại context của task đang được tiếp tục. Kernel
sẽ thực hiện công việc này trong các trường hợp

12




Sau khi có định nghĩa trước về thời gian thực thi (execution time), thời gian time
slide được lấy bởi systick interrupt



Khi có event unblock quyền ưu tiên cao hơn (higher priority) xảy ra như
signal,queue, semaphore,..



Khi task gọi hàm osThreadYield () để thông báo kernel chuyển sang task khác mà
không đợi tới kết thúc của time slice

- FreeRTOS OS interrupt: Với các core Cortex đã implement một số tính năng giúp hỗ trợ
can thiệp trực tiếp vào os hệ thống, 2 ngắt chuyên dụng cho os là
+ PendSV interrupt:


Trong interrupt này là một scheduler



Quyền ngắt NVIC sẽ ở mức thấp nhất




Khơng bị trigger bởi bất kì ngoại vi nào



Trạng thái chờ xử lý từ các ngắt khác hoặc từ các task muốn kết thúc sớm(non MPU
version)

+ SVC interrupt


Interrupt sẽ được gọi bởi các tập lệnh SVC



Được gọi nếu task muốn kết thúc sớm (MPU version)



Trong ngắt này sẽ set pending state (MPU version)

- Stack pointer: 2 stack pointer là
+ Process stack pointer


Được sử dụng trong các interrupt



Cấp phát bởi linker trong q trình compile


+ Main stack pointer


Mỗi task sẽ có stack pointer của chính nó



Trong q trình switch context thì stack pointer sẽ khởi tạo task chính xác

- Mức độ ưu tiên của task có thể được thay đổi bằng cách dùng hàm osThreadSetPriority()
Với CMSIS-RTOS thì sẽ có một số priority level như sau:
13




osPriorityIdle – priority thấp nhất



osPriorityLow



osPriorityBelowNormal



osPriorityNormal – priority mặc định




osPriorityHigh



osPriorityRealtime

III, STM32F103C8T6
3.1 Giới thiệu sơ lược:
- STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng như
F0,F1,F2,F3,F4….. Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3. STM32F103 là
vi điều khiển 32 bit, tốc độ tối đa là 72Mhz.
- Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng dụng
thông thường, máy tính và thiết bị ngoại vi chơi game, GPS cơ bản, các ứng dụng trong
công nghiệp, thiết bị lập trình PLC, biến tần, máy in, máy quét, hệ thống cảnh báo, thiết bị
liên lạc nội bộ…
- Phần mềm lập trình: có khá nhiều trình biên dịch cho STM32 như IAR Embedded
Workbench, Keil C…
- Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như: STM32snippets,
STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries, Mbed core.
- Mạch nạp: có khá nhiều loại mạch nạp như : ULINK, J-LINK , CMSIS-DAP, STLINK…
- Sơ lược về Board trên:



1 cổng Mini USB dùng để cấp nguồn, nạp cũng như debug.

14





2 MCU bao gồm 1 MCU nạp và 1 MCU dùng để lập trình.



Có chân Output riêng cho các chân mạch nạp trên MCU1.



Có chân Output đầy đủ cho các chân MCU2.



Chân cấp nguồn ngồi riêng cho MCU2 nếu khơng sử dụng nguồn từ USB.



Thạch anh 32,768khz dùng cho RTC và Backup.



Chân nạp dùng cho chế độ nạp boot loader.



Nút Reset ngoài và 1 led hiển thị trên chân PB9, 1 led báo nguồn cho MCU2.


3.2 Cấu hình chi tiết của STM32F103C8T6:

Minh họa các chân nối quanh các cạnh của PCB, bao gồm cả nguồn

15


Nguồn có thể được cấp vào các chân +5V, +3.3V hoặc cổng USB, với điện áp phù hợp.
Chân được đánh dấu là “5V” (khơng có dấu cộng) là các chân input chịu được áp 5V. Chân
được đánh dấu bằng dấu cộng là chân input nguồn.
Bốn chân ở đầu trên cùng của board (màu xanh đậm) được dùng để lập trình thiết bị. Lưu
ý rằng chân lập trình DIO cũng có khả năng là một chân GPIO PA13. Tương tự như vậy,
DCLK có khả năng trở thành một chân GPIO PA14. Xuyên suốt quyển sách này, bạn sẽ
học cách cấu hình cho chip STM32.
Ở chân lập trình, lưu ý rằng điện áp cấp vào là +3.3V. Về mặt điện, chân này tương tự như
các chân khác có nhãn “+3.3V”. Trong hình trên, chúng có màu cam nhạt.
Power USB/+5V khi được cấp nguồn bằng cáp USB, nguồn sẽ đến bằng đầu nối MicroUSB B. Nguồn cấp 5V này được điều chỉnh thành +3.3V mà MCU cần. Tương tự, một
chân có nhãn “+5V” (với dấu cộng), có thể được sử dụng như một chân nguồn vào. Dòng
này cũng đến cùng bộ điều áp như dịng được cấp qua cổng USB.
Nếu có Nguồn cấp +3.3V, có thể để ngỏ các chân input +5V. Nối trực tiếp nguồn cấp +3.3V
với chân input +3.3V (đảm bảo rằng khơng cắm cáp USB). Cách này dùng được vì bộ điều
áp tự vơ hiệu hóa khi khơng có gì cấp vào chân input 5V.
Khi cấp nguồn cho vào chân input +3.3V, chính là đang nối nguồn với đầu VOUT của bộ
điều áp. Trong trường hợp này, khơng có nguồn 5V nào chạy vào VIN của bộ điều áp.
Chân CE cũng được nối với VIN, nhưng khi VIN để hở, chân CE sẽ được nối đất qua một
tụ điện. Mức áp thấp trên CE làm cho bộ điều áp tắt các hệ thống con bên trong nó.

Sơ đồ khối của bộ điều áp 5V sang 3.3V

Tuy nhiên, có một dịng điện nhỏ đi vào bộ chiết áp của bộ điều áp. Dòng điện này sẽ đi từ

+3.3V của bạn xuống đất, thông qua các điện trở nội R1 và R2 của bộ điều áp. Các điện
16


trở này có trị số lớn, nên dịng qua đó là không đáng kể. Nhưng cần lưu ý điều này khi đo
dòng cho các ứng dụng nguồn-siêu-thấp dùng pin.
PCB cũng có một nút gắn nhãn RESET và một chân nối ở một bên board với nhãn “R.”
Chân nối này cho phép một mạch ngoài reset MCU khi cần.

Mạch Reset STM32F103C8T6. Kết nối “R” được tìm thấy ở mép của PCB



ARM 32-bit Cortex M3 với clock max là 72Mhz.



Bộ nhớ:





o

64 kbytes bộ nhớ Flash(bộ nhớ lập trình).

o

20kbytes SRAM.


Clock, reset và quản lý nguồn.
o

Điện áp hoạt động 2.0V -> 3.6V.

o

Power on reset(POR), Power down reset(PDR) và programmable voltage
detector (PVD).

o

Sử dụng thạch anh ngoài từ 4Mhz -> 20Mhz.

o

Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40khz.

o

Sử dụng thạch anh ngoài 32.768khz được sử dụng cho RTC.

Trong trường hợp điện áp thấp:
o

Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ.

o


Cấp nguồn ở chân Vbat bằng pin để hoạt động bộ RTC và sử dụng lưu trữ
data khi mất nguồn cấp chính.

17












2 bộ ADC 12 bit với 9 kênh cho mỗi bộ.
o

Khoảng giá trị chuyển đổi từ 0 – 3.6V.

o

Lấy mẫu nhiều kênh hoặc 1 kênh.

o

Có cảm biến nhiệt độ nội.

DMA: bộ chuyển đổi này giúp tăng tốc độ xử lý do khơng có sự can thiệp q sâu

của CPU.
o

7 kênh DMA.

o

Hỗ trợ DMA cho ADC, I2C, SPI, UART.

7 Timer.
o

3 timer 16 bit hỗ trợ các mode IC/OC/PWM.

o

1 timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ như ngắt
input, dead-time..

o

2 watdog timer dùng để bảo vệ và kiểm tra lỗi.

o

1 sysTick timer 24 bit đếm xuống dùng cho các ứng dụng như hàm Delay….

Hỗ trợ 9 kênh giao tiếp bao gồm:
o


2 bộ I2C(SMBus/PMBus).

o

3 bộ USART(ISO 7816 interface, LIN, IrDA capability, modem control).

o

2 SPIs (18 Mbit/s).

o

1 bộ CAN interface (2.0B Active)

o

USB 2.0 full-speed interface

Kiểm tra lỗi CRC và 96-bit ID.

3.3 Thơng số kỹ thuật:
• Vi điều khiển: STM32F103C8T6.


Đ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.
18




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



Sử dụng với các mạch nạp:
o

ST-Link Mini

o

J-link


o

USB TO COM



Kết nối chân khi nạp bằng ST-Link Mini



Nạp theo chuẩn SWD
o

TCK — SWCLK

o

TMS — SWDIO

o

GND — GND

o

3.3V — 3.3V

19



IV, Màn hình LCD 16x2
Màn hình LCD 16x2 sử dụng driver HD44780, có khả năng hiển thị 2 dịng với mỗi dịng
16 ký tự.

Màn hình LCD 16x02

- Thơng số kỹ thuật:


Điện áp hoạt động: 5V



Kích thước của màn hình LCD 1602: 8 x 3.6 x 0.8 cm



Màu nền: xanh lá hoặc xanh dương



Màu chữ: Màu đen



Khoảng cách giữa hai chân kết nối: 0.1 inch



Tiện dụng khi kết nối với Breadboard.


- Ưu điểm:


Tên các chân được ghi ở mặt sau của màn hình LCD hổ trợ việc kết nối, đi dây điện.



Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ sáng để sử dụng ít
điện năng hơn.



Có thể được điều khiển với 6 dây tín hiệu



Có bộ ký tự được xây dựng hổ trợ tiếng Anh và tiếng Nhật

20


Mặt sau của màn hình LCD 1602

- Sơ đồ kết nối của màn hình LCD:


Chân số 1 - VSS: Chân nối đất cho LCD được nối với GND của mạch điều khiển.




Chân số 2 - VDD: Chân cấp nguồn cho LCD, được nối với VCC 5V của mạch điều
khiển



Chân số 3 - VE: Điều chỉnh độ tương phản của LCD



Chân số 4 - RS: chân chọn thanh ghi, được nối với logic "0" hoặc logic "1":
o

Logic “0”: Bus DB0 - DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
“ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)

o

Logic “1”: Bus DB0 - DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD



Chân số 5 - R/W : chân chọn chế độ đọc/ghi (Read/Write), được nối với logic “0”
để ghi hoặc nối với logic “1” đọc



Chân số 6 - E : chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus DB0DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân này như sau:
o


Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào thanh ghi bên trong
khi phát hiện một xung (high-to-low transition) của tín hiệu chân E

o

Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên
(low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân
E xuống mức thấp

21




Chân số 7 đến 14 - D0 đến D7: 8 đường của bus dữ liệu dùng để trao đổi thông tin
với MPU. Có 2 chế độ sử dụng 8 đường bus này là: Chế độ 8 bit (dữ liệu được
truyền trên cả 8 đường, với bit MSB là bit DB7) và Chế độ 4 bit (dữ liệu được truyền
trên 4 đường từ DB4 tới DB7, bit MSB là DB7)



Chân số 15 - A : nguồn dương cho đèn nền



Chân số 16 - K : nguồn âm cho đèn nền

Sơ đồ kết nối của LCD 1602

- Chế độ 4 bit và 8 bit của LCD

Màn hình LCD có thể hoạt động ở hai chế độ khác nhau, đó là chế độ 4 bit và chế độ 8
bit. Ở chế độ 4 bit, chúng tôi gửi dữ liệu bằng nibble, đầu tiên là trên và sau đó nibble
dưới. Nibble là một nhóm bốn bit, vì vậy bốn bit dưới (D0-D3) của một byte tạo thành
nibble dưới trong khi bốn bit trên (D4-D7) tạo thành nibble trên. Điều này cho phép ta gửi
dữ liệu 8 bit.
Trong khi ở chế độ 8 bit, chúng ta có thể gửi dữ liệu 8 bit trực tiếp trong một hành trình vì
chúng ta sử dụng tất cả 8 dịng dữ liệu.
Chế độ 8-bit nhanh hơn và hồn hảo hơn so với chế độ 4-bit. Nhưng nhược điểm lớn là nó
cần 8 đường dữ liệu kết nối với vi điều khiển. Điều này sẽ làm cho chúng tôi sử dụng hết
các chân I / O trên MCU của chúng tơi, vì vậy chế độ 4-bit được sử dụng rộng rãi. Khơng
có chân điều khiển nào được sử dụng để thiết lập các chế độ này. Nó chỉ là cách lập trình
thay đổi.
22


V, Cảm biến vật cản hồng ngoại
Cảm biến có khả năng nhận biết vật cản ở môi trường với một cặp LED thu phát hồng
ngoại để truyền và nhận dữ liệu hồng ngoại. Tia hồng ngoại phát ra với tần số nhất định,
khi có vật cản trên đường truyền của LED phát nó sẽ phản xạ vào LED thu hồng ngoại, khi
đó LED báo vật cản trên module sẽ sáng, khi khơng có vật cản, LED sẽ tắt.
Với khả năng phát hiện vật cản trong khoảng 2 ~ 30cm và khoảng cách này có thể điều
chỉnh thơng qua chiết áp trên cảm biến cho thích hợp với từng ứng dụng cụ thể như: xe dò
line, xe tránh vật cản, …
- Thơng số kỹ thuật


IC so sánh: LM393




Điện áp: 3.3V - 6VDC



Dịng tiêu thụ:
▪ Vcc = 3.3V: 23 mA
▪ Vcc = 5.0V: 43 mA



Góc hoạt động: 35°



Khoảng cách phát hiện: 2 ~ 30 cm



LED báo nguồn và LED báo tín hiệu ngõ ra



Mức logic ngõ ra:
▪ Mức thấp - 0V: khi có vật cản
▪ Mức cao - 5V: khi khơng có vật cản



Kích thước: 3.2cm x 1.4cm


VI, Giao tiếp STM32F103C8T6 với LCD 16×2 thơng qua moudle I2C
6.1 Kết nối MCU STM32 với LCD
Module I2C PCF8574 được sử dụng để làm trung gian kết nối giữa MCU
STM32F103C8T6 và LCD như hình và bảng bên dưới:

23


Các chân GND, VCC, SDA, SCL được nối với STM32 như sau:
STM32

PCF8574

GND

GND

VCC (nối nguồn ngồi 5V)

PB6

SCL

PB7

SDA

Nguồn 5V của LCD có thể được lấy từ chân 5V trên kit nạp ST Link V2. Trên module
I2C có biến trở điều chỉnh độ tương phản của màn hình LCD khi cần.
6.2 Địa chỉ của Module I2C PCF8574

Module I2C PCF8574 hỗ trợ giao tiếp I2C với 7bit địa chỉ, trong đó có 4 bit cố định và 3
bit có thể được người dùng tùy chỉnh có dạng 0 1 0 0 A2 A1 A0. Mặc định, trên module
nhà sản xuất để các chân A0, A1, A2 ở mức logic cao nên PCF8574 có địa chỉ là 0x27. Để
thay đổi địa chỉ của IC này khi cần, bạn có thể tùy chọn thay đổi các mức logic của 3 chân
này.

24


Khi lập trình I2C để giao tiếp STM32 và module này, thì byte đầu tiên sẽ bao gồm 7bit địa
chỉ và 1bit W vào vị trí có trọng số thấp nhất(ghi dữ liệu), lúc này Byte đầu tiên của giao
tiếp I2C sẽ có giá trị: 01001110 (0x4E)

VII, Mạch nguyên lý, PCB, mạch thực tế

25


×