You are on page 1of 49

BỘ CÔNG THƯƠNG

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


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

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC CNKT ĐIỆN TỬ - VIỄN THÔNG

THIẾT KẾ MẠCH ĐO TẦN SỐ


SỬ DỤNG VI ĐIỀU KHIỂN STM32F103

CBHD : Th.S Vũ Trung Kiên


Sinh viên : Đào Thị Thu Hà
Mã số sinh viên : 1041050045

Hà Nội - 2019
I

MỤC LỤC
MỤC LỤC .......................................................................................................... I
DANH MỤC HÌNH VẼ .................................................................................. III
DANH MỤC BẢNG BIỂU ............................................................................ IV
DANH MỤC TỪ VIẾT TẮT ........................................................................... V
LỜI MỞ ĐẦU ................................................................................................... 1
CHƯƠNG 1: TỔNG QUAN ............................................................................. 2
1.1. Mục tiêu, nội dung của đề tài ..................................................................... 2
1.2. Giới thiệu về các thiết bị đo tần số hiện tại trên thị trường ....................... 2
1.3. Nguyên tắc đo tần số .................................................................................. 2
1.3.1. Nguyên tắc đo tần số cao ........................................................................ 2
1.3.2. Nguyên tắc đo tần số thấp ....................................................................... 3
1.4. Các phần mềm phục vụ thiết kế ................................................................. 4
1.4.1. Altiume PCB, đặt vị trí linh kiện trên PCB. ........................................... 4
1.4.2. KeilC ....................................................................................................... 5
1.4.3. STM32CubeMX ...................................................................................... 5
1.4.4. LCD Font Maker ..................................................................................... 5
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT ................................................................. 7
2.1. Vi điều khiển STM32F103C8T6 ............................................................... 7
2.1.1. Khái niệm ................................................................................................ 7
2.1.2. Cấu hình chi tiết của IC STM32F103C8T6 ............................................ 7
2.1.3. Sơ lược về các chân IC STM32F103C8T6 ........................................... 10
2.1.4. Chức năng I/O của STM32F103C8T6 .................................................. 16
2.1.5. Chức năng timer của STM32F103C8T6............................................... 17
2.2. Graphic-LCD............................................................................................ 18
2.2.1. Tổng quan LCD..................................................................................... 18
2.2.2. Giới thiệu về Graphic-LCD .................................................................. 19
2.2.3. Sơ đồ chân của graphic_LCD 128x64 .................................................. 19
2.2.4. Tập lệnh của GLCD sử dụng chip KS0108 .......................................... 21
II

2.3. Mạch tạo xung dùng IC 555 ..................................................................... 23


2.3.1. Cấu tạo của IC 555 ................................................................................ 23
2.3.2. Giải thích sự giao động ......................................................................... 24
2.3.4. Giai đoạn ngõ ra ở mức 0 ...................................................................... 24
2.3.5. Sơ đồ nguyên lý và mạch tạo xung ....................................................... 25
CHƯƠNG 3: THIẾT KẾ MẠCH ĐO TẦN SỐ VÀ THỰC NGHIỆM ......... 26
3.1. Yêu cầu..................................................................................................... 26
3.2. Thiết kế phần cứng mạch đo tần số.......................................................... 26
3.2.1. Sơ đồ khối của mạch đo tần số.............................................................. 26
3.2.2. Thiết kế nguyên lý các khối trong mạch ............................................... 27
3.3. Thiết kế phần mềm ................................................................................... 30
3.3.1. Thuật toán đo tần số .............................................................................. 30
3.3.2. Thuật toán hiển thị trên GLCD ............................................................. 34
3.4. Kết quả đã đạt được ................................................................................. 40
3.5. Hướng phát triển ...................................................................................... 41
KẾT LUẬN ..................................................................................................... 42
TÀI LIỆU THAM KHẢO ............................................................................... 43
III

DANH MỤC HÌNH VẼ


Hình 2.1: Sơ đồ khối hiệu suất của STM32F103XX. ....................................... 9
Hình 2.2: Sơ đồ chân STM32F103C8T6. ....................................................... 10
Hình 2.3: Ảnh thực tế graphic_LCD 128x64. ................................................. 19
Hình 2.4: Sơ đồ kết nối cơ bản giữa vi điều khiển và GLCD 128x64............ 21
Hình 2.5: Sơ đồ mạch cấu tạo IC555. ............................................................. 23
Hình 2.6: Sơ đồ nguyên lý mạch tạo xung IC555. .......................................... 25
Hình 2.7: Ảnh thực tế mạch tạo xung. ............................................................ 25
Hình 3.1: Sơ đồ khối mạch đo tần số. ............................................................. 26
Hình 3.2: Sơ đồ nguyên lý khối nguồn. .......................................................... 27
Hình 3.3: Sơ đồ nguyên lý khối đo tần số. ...................................................... 27
Hình 3.4: Sơ đồ nguyên lý khối hiển thị. ........................................................ 28
Hình 3.5: Hình ảnh mạch nguyên lý mạch đo tần số. ..................................... 29
Hình 3.6: Hình ảnh mạch thật mạch đo tần số. ............................................... 29
Hình 3.7: Lưu đồ thuật toán đo tần số............................................................. 30
Hình 3.8: Cấu hình xung clock hệ thống. ....................................................... 31
Hình 3.9: Cấu hình ngắt timer3. ...................................................................... 32
Hình 3.10: Cấu hình timer3 counter................................................................ 33
Hình 3.11: Trình tự điều khiển hiển thị trên GLCD. ...................................... 34
Hình 3.12: Sử dụng phần mềm tạo mảng dữ liệu LCD Font Maker. ............. 39
Hinh 3.13: Kết quả đạt được. .......................................................................... 40
IV

DANH MỤC BẢNG BIỂU


Bảng 1.1: Bảng định nghĩa chân STM32F103C8T6. ..................................... 10
Bảng 1.2: bảng định nghĩa chân graphic_LCD 128x64. ................................. 20
Bảng 1.3: bảng các lệnh dùng để giao tiếp với chip KS0108. ........................ 21
V

DANH MỤC TỪ VIẾT TẮT


H I
Hz: Hertz IC: integrated circuit
I/O: input/output
G V
GLCD: graphic liquid crystal display VCC: Voltage colector to colector
VDD: Voltage Drain drain
VSS: Voltage for substrate and
source
1

LỜI MỞ ĐẦU
Như chúng ta đã biết, khoa học công nghệ đang phát triển một cách
nhanh chóng trong những năm gần đây, đặc biệt là ngành kĩ thuật điện – điện
tử. Sự xuất hiện của các vi mạch, IC số đã làm cho kích thước mạch nhỏ gọn,
sử dụng tiện lợi hơn.
Trong ngành kĩ thuật điện – điện tử tần số xuất hiện trong hầu hết các
loại mạch giao động. Vì vậy, việc sử dụng máy đo tần số rất cần thiết để biết
chính xác được giá trị của tần số giúp chúng ta dễ dàng trong việc điều khiển
tín hiệu. Hiện nay trên thị trường giá bán của một chiếc máy đo tần số khá cao
so với việc sử dụng IC số để tạo ra mạch đo tần số đơn giản phục vụ cho công
việc học tập và nghiên cứu của sinh viên.
Xuất phát từ nhu cầu trên cùng với việc ứng dụng những kiến thức đã có
được trong gần 4 năm học tập và rèn luyện tại trường đại học công nghiệp Hà
Nội em đã chọn “thiết kế mạch đo tần số sử dụng vi điều khiển
STM32F103” làm đề tài đồ án tốt nghiệp. Được sự chỉ bảo và giảng dạy nhiệt
tình của thầy cô, đặc biệt là quý thầy cô khoa Điện Tử đã giúp đỡ em trong
suốt quá trình học tập tại trường để em có thêm các kiến thức về lý thuyết và
thực hành trong chuyên ngành điện tử của mình. Cùng với sự nỗ lực của bản
thân và đặc biệt là thầy Th.s Vũ Trung Kiên đã tận tình hướng dẫn giúp đỡ
em hoàn thành đề tài đồ án tốt nghiệp của mình.
Trong giới hạn thời gian cho phép, đồng thời có sự hạn chế về nguồn tài
liệu và kiến thực của bản thân nên đề tài nghiên cứu của em còn nhiều thiếu
sót và lỗi kĩ thuật, nên em rất mong nhận được sự đóng góp ý kiến từ thầy cô
để đề tài nghiên cứu của em được hoàn thiện hơn.
Em xin chân thành cảm ơn!
2

CHƯƠNG 1: TỔNG QUAN


1.1. Mục tiêu, nội dung của đề tài
* Mục tiêu:
Thiết kế mạch đo tần số dùng vi điều khiển STM32F103C8T6 đo được
tần số có độ lớn nằm trong một dải tần nhất định.
* Nội dung:
- Tạo một bộ xung đầu vào để thực hiện phép đo.
- Sử dụng vi điều khiển STM32F103C8T6 viết chương trình thực hiện
đo tần số vào.
- Hiển thị giá trị tần số đo được lên Graphic-LCD.
1.2. Giới thiệu về các thiết bị đo tần số hiện tại trên thị trường
- Máy hiện sóng số Tektronix TBS1052B-EDU (50MHz, 2CH, 1GS/s,
sai số ±3%, nặng 2kg, giá bán 10.000.000 đồng).
- Máy hiện sóng số Tektronix DP02022B (200MHz, 2CH, 1GS/s, sai
số ± 0.0025%, nặng 3.6 kg, giá bán 62.000.000 đồng).
- Máy hiện sóng số Gwinstek GDS-1052-U (50 Mhz, 2 kênh, sai
số ±3%, nặng 2kg, giá bán 7.000.000 đồng )
- Máy hiện sóng số Owon SDS1022 (2 kênh, 20Mhz, 100Ms/s, sai
số ±3%, nặng 2kg, giá bán 4.500.000 đồng ).
- Máy hiện sóng số Tektronix TBS1102B-EDU (100Mhz, 2CH, 2GS/s,
sai số ±3%, giá bán 32.000.000 đồng).
1.3. Nguyên tắc đo tần số
Trong kĩ thuật điện tử, thường hay dùng các tín hiệu có phổ tần rất rộng.
Dải phổ của chúng từ 0.01Hz đến MHz. Toàn bộ phổ này có thể chia làm 2
dải tần số có tính chất khác nhau: dải tần số thấp và dải tần số cao (sự phân
chia này chỉ là tương đối).
1.3.1. Nguyên tắc đo tần số cao
Nguyên tắc đo: đếm số xung trong một khoảng thời gian nhất định.
3

- Thiết lập bộ timer thứ nhất có chức năng ngắt timer với một khoảng
thời gian nhất định. Thiết lập bộ timer thứ hai thực hiện chức năng timer
counter.
- Nguồn xung đầu vào được đưa vào chân thực hiện chức năng timer
counter trên chân vi điều khiển trong những khoảng thời gian tương ứng của
xung mở cửa. Số xung trong khoảng thời gian ngắt của bộ timer thứ nhất sẽ
được bộ timer counter ghi lại. Khi đó tần số cần đo bằng:
𝒏
Fx =
𝜟𝑻
Trong đó:
+ n: số lượng xung đếm được trong khoảng thời gian ΔT.
+ ΔT: khoảng thời gian mở cửa (bằng chu kì của bộ timer tạo ngắt).
- Sai số:
Sai số của phương pháp này chủ yếu là do sai số của khoảng thời gian
chuẩn. Ngoài ra, còn có sai số do không đồng bộ giữa xung mở cửa và xung
đếm, cũng như sai số do số lượng xung đếm được sai. Sai số này nằm trong
khoảng ±1 xung, sai số này có ảnh hưởng lớn khi tần số càng thấp (số lượng
xung đếm được càng ít).
- Ưu điểm: có độ chính xác cao với giải tần cao (được xếp vào loại hàng
đầu).
1.3.2. Nguyên tắc đo tần số thấp
Nguyên tắc đo: đo khoảng thời gian của một xung.
- Thiết lập một bộ timer với thời gian ngắt nhỏ nhất có thể.
- nguồn xung đầu vào được đưa vào chân thực hiện chức năng ngắt, chân
ngắt sẽ thực hiện chức năng lưu lại giá trị số lần xảy ra ngắt trong khoảng
giữa hai sườn lên liên tiếp hoặc hai sườn xuống liên tiếp. Khi đó tần số cần đo
bằng:
𝟏
Fx =
𝒏.𝜟𝑻
4

Trong đó:
+ n: số lần ngắt trong khoảng giữa hai sườn lên liên tiếp hoặc hai sườn
xuống liên tiếp.
+ ΔT: khoảng thời gian mở cửa (bằng chu kì của bộ timer tạo ngắt).
- Ưu điểm: có độ chính xác cao với giải tần thấp.
1.4. Các phần mềm phục vụ thiết kế
1.4.1. Altium PCB, đặt vị trí linh kiện trên PCB
- Mô phỏng mạch PCB 3D, đem lại hình ảnh mạch điện trung thực trong
không gian 3 chiều, hỗ trợ MCAD-ECAD, liên kết trực tiếp với mô hình
STEP, kiểm tra khoảng cách cách điện, cấu hình cho cả 2D và 3D
- Hỗ trợ thiết kế PCB sang FPGA và ngược lại.
- Hỗ trợ các thư viện linh kiện phong phú như: syhaunguyen.SchLib,
LYBRARY.IntLib, lybrary_MH. SchLib, …
Từ đó, chúng ta thấy Altium designer có nhiều điểm mạnh so với các
phần mềm khác như đặt luật thiết kế, quản lý đề tài mô phỏng dễ dàng, giao
diện thân thiện,…
Việc thiết kế mạch điện tử trên phần mềm altium designer có thể được
tóm tắt gồm các bước như sau:
- Đặt ra các yêu cầu bài toán.
- Lựa chọn linh kiện.
- Thiết kế mạch nguyên lý.
- Lựa chọn các chân linh kiện để chuyển sang mạch in Update mạch
nguyên lý sang mạch in.
- Lựa chọn kích thước mạch in Sắp sếp các vị trí các loại linh kiện như
điện trở , tụ điện, IC...
- Đặt kích thước các loại dây nối.
- Đi dây trên mạch.
- Kiểm tra toàn mạch.
5

1.4.2. KeilC
Keil C uvision 5 là một phần mềm hỗ trợ cho người dùng trong việc lập
trình cho vi điều khiển các dòng khác nhau (Atmel, AVR, …). Keil C giúp
người dùng soạn thảo và biên dịch chương trình C hay cả ASM thành ngôn
ngữ máy để nạp vào vi điều khiển giúp chúng ta tương tác giữa vi điều khiển
và người lập trình.
Để thực hiện chương trình giải quyết bài toán này e đã sử dụng phần
mềm STM32CubeMX để cấu hình chân và sinh code ra phần mềm keilC V5
để tiếp tục thực hiện chương trình.
1.4.3. STM32CubeMX
Phần mềm tạo Project cho STM32, được hãng cung cấp free. Sử dụng
phần mềm này khởi tạo các chức năng, tài nguyên cho VĐK sử dụng thư viện
HAL library.
*lưu ý: lần tạo project cho 1 dòng STM cần kết nối internet cho PC để
Cube32Mx cập nhật thư viện HAL cho dòng VĐK đó.
1.4.4. LCD Font Maker
LCD Font Maker: là phần mềm biên tập cho các loại Graphic LCD loại
chấm không màu.
Xử lí hình ảnh:
- LCD Font Maker cho phép nhập hầu hết các định dạng file ảnh màu
hay đen trắng.
- LCD Font Maker hỗ trợ "Auto Resize" để tự động thay đổi kích thước
hình ảnh khớp với kích thước Graphic LCD.
- LCD Font Maker cho phép nhận dạng biên dạng vật thể trong ảnh trước
khi chuyển sang hình ảnh cho Graphic LCD.
- Có thể tùy chọn mức độ xám (Gray level) trước khi chuyển sang hình
ảnh cho Graphic LCD.
Xử lí chữ viết:
6

- Chức năng "Text Input" cho phép nhập chữ trực tiếp từ bàn phím, chữ
được "trộn" với hình ảnh.
- Có thể tùy chọn Font cho chữ nhập vào.
Vẽ trên LCD Font Maker:
- Có thể tự vẽ hoặc xóa các "chấm" trên màn hình Graphic LCD ảo.
- Kết quả tạm thời được xem trên Previewer.
Điều khiền kết quả:
- Kết quả có thể được lưu lại bằng định dạng "lcd".
- Xuất kết quả trực tiếp trong một cửa sổ "Text", kết quả được sắp xếp
thành các phần tử của một mảng .
- Cho phép đảo kết quả hiển thị (chấm trắng thành chấm đen và ngược
lại).
7

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1. Vi điều khiển STM32F103C8T6
2.1.1. Khái niệm
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… STM32F103C8T6 thuộc họ F1 với lõi
ARM COTEX M3. STM32F103C8T6 là vi điều khiển 32 bit, tốc độ tối đa là
72 MHZ. Giá thành cũng khá rẻ so với các loại vi điều khiển có chức năng
tương tự. Mạch nạp cũng như công cụ lập trình khá đa dạng và dễ sử dụng.
Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều
khiển các thiết bị ứng dụng thông thường, thiết bị cầm tay, 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ị
PLC, biến tần, máy in, các hệ thống cảnh báo, đo đạc thông tin, thiết bị liên
lạc,…
Phần mềm lập trình: có rất nhiều trình biên dịch để lập trình cho STM32
như IAR compiler, keilC compiler, eclipse compiler, cocos code IDE,… Em
đã chọn phần mền Keil uVision5 để thực hiện lập trình giải quyết bài toán của
mình.
Thư viện lập trình: có một số thư viện lập trình cho STM như
STM32snippets, STM32cube LL, STM32cube HAL, standard peripheral
libraries, mbed core,… Em đã chọn STM32CubeMX được hãng cung cấp
free. Sử dụng phần mềm này khởi tạo các chức năng, tài nguyên cho vi điều
khiển sư dụng thư viện HAL library.
Mạch nạp: STM32 có thể sử dụng các loại mạch nạp như ULINK, J-
LINK, CMSIS-DAP, STLINK… Em sử dụng mạch nạp STLINK để nạp code
cho chip với nguồn nuôi chip bằng 3.3V.
2.1.2. Cấu hình chi tiết của IC STM32F103C8T6
- ARM 32-bit Cortex M3 với clock mã là 72Mhz.
- Bộ nhớ:
64 kbytes bộ nhớ Flash(bộ nhớ lập trình).
8

20kbytes SRAM.
- Clock, reset và quản lý nguồn.
Điện áp hoạt động 2.0V → 3.6 V.
Power on reset (POR), power down reset (PDR) và programmable voltage
detecor (PVD).
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.
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:
Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ.
Cấp nguồn cho 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.
- 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ.
Khoảng giá trị chuyển đổi từ 0 – 3.6V.
Lấy mẫu nhiều kênh hoặc một kênh.
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 quá sâu của CPU.
7 kênh DMA.
Hỗ trợ DMA cho ADC, I2C, SPI, UART.
- 7 timer.
3 timer 16 bit hỗ trợ các mode IC/OC/PWM.
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…
2 watdog timer dùng để bảo vệ và kiểm tra lỗi.
1 systick timer 24 bit đếm xuống dùng cho các ứng dụng như hamd delay...
- Hỗ trợ 9 kênh giao tiếp bao gồm:
2 bộ I2C (SMBus/PMBus).
3 bộ USART (ISO 7816 interface, LIN, IrDA capability, modem, control).
9

2 SPIs (18Mbit/s).
1 bộ CAN interface (2.0B Active).
USB 2.0 full-speed interface.
- kiểm tra lỗi CRC và 96-bit ID.

Hình 2.1: Sơ đồ khối hiệu suất của STM32F103XX.


10

2.1.3. Sơ lược về các chân IC STM32F103C8T6

Hình 2.2: Sơ đồ chân STM32F103C8T6.

Bảng 2.1: Bảng định nghĩa chân STM32F103C8T6.


Pins Pin name Type I/O Main
(1) Level function(3) Alternate functions(4)
(2) (after reset)
Default Remap
1 VBAT S - VBAT - -
2 PC13- I/O - PC13(6) TAMPER- -
TAMPERRTC RTC
(5)
3 PC14- I/O PC14(6) OSC32_IN
OSC32_IN(5)
4 PC15OSC32_ I/O
OUT(5)
5 OSC_IN I - OSC_IN - PD0(7)
6 OSC_OUT O - OSC_OUT PD1(7)
11

7 NRST I/O - NRST


8 VSSA S - VSSA
9 VDDA S - VDDA
10 PA0-WKUP I/O - PA0 WKUP/ -
USART2_CTS
(9)/
ADC12_IN0/
TIM2_CH1_
ETR(9)
11 PA1 I/O - PA1 USART2_RTS -
(9)/
ADC12_IN1/
TIM2_CH2
(9)
12 PA2 I/O - PA2 USART2_TX -
(9)/
ADC12_IN2/
TIM2_CH3
(9)
13 PA3 I/O - PA3 USART2_RX -
(9)/
ADC12_IN3/
TIM2_CH4
(9)
14 PA4 I/O - PA4 SPI1_NSS(9)/ -
USART2_CK
(9)/
ADC12_IN4
15 PA5 I/O - PA5 SPI1_SCK(9)/ -
ADC12_IN5
16 PA6 I/O PA6 SPI1_MISO TIM1_
12

(9)/ BKIN
ADC12_IN6/
TIM3_CH1
(9)
17 PA7 I/O - PA7 SPI1_MOSI TIM1_
(9)/ CH1N
ADC12_IN7/
TIM3_CH2
(9)
18 PB0 I/O - PB0 ADC12_IN8/ TIM1_
TIM3_CH3 CH2N
(9)
19 PB1 I/O - PB1 ADC12_IN9/ TIM1_
TIM3_CH4 CH3N
(9)
20 PB2 I/O FT PB2/BOOT - -
1
21 PB10 I/O FT PB10 I2C2_SCL/ TIM2_
USART3_TX CH3
(9)
22 PB11 I/O FT PB11 I2C2_SDA/ TIM2_
USART3_RX CH4
(9)
23 VSS_1 S - VSS_1 - -
24 VDD_1 S - VDD_1 - -
25 PB12 I/O FT PB12 SPI2_NSS/ -
I2C2_SMBAl/
USART3_CK
(9)/
TIM1_BKIN
(9)
13

26 PB13 I/O FT PB13 SPI2_SCK/ -


USART3_CTS
(9)/
TIM1_CH1N
(9)
27 PB14 I/O FT PB14 SPI2_MISO/
USART3_RTS
(9)
TIM1_CH2N
(9)
28 PB15 I/O FT PB15 SPI2_MOSI/ -
TIM1_CH3N
(9)
29 PA8 I/O FT PA8 USART1_CK/ -
TIM1_CH1
(9)/ MCO
30 PA9 I/O FT PA9 USART1_TX -
(9)/TIM1_CH2
(9)
31 PA10 I/O FT PA10 USART1_RX -
(9)/
TIM1_CH3(9)
32 PA11 I/O FT PA11 USART1_CTS -
/ CANRX(9)/
USBDM/
TIM1_CH4(9)
33 PA12 I/O FT PA12 USART1_RTS -
/ CANTX(9)
/USBDP
TIM1_ETR(9)
34 PA13 I/O FT JTMS/ - PA13
14

SWDIO
35 VSS_2 S - VSS_2
36 VDD_2 S - VDD_2
37 PA14 I/O FT JTCK/ - PA14
SWCLK
38 PA15 I/O FT JTDI - TIM2_
CH1_
ETR/
PA15
/SPI1_
NSS
39 PB3 I/O FT JTDO - TIM2_
CH2 /
PB3
TRACE
SWO
SPI1_
SCK
40 PB4 I/O FT JNTRST -
TIM3_
CH1/
PB4/
SPI1_
MIS
41 PB5 I/O PB5 I2C1_SMBAl TIM3_
CH2 /
SPI1_
MOSI
42 PB6 I/O FT PB6 I2C1_SCL(9)/ USART
TIM4_CH1(9) 1_TX
43 PB7 I/O FT PB7 I2C1_SDA(9)/ USART
15

TIM4_CH2 (9) 1_RX


44 BOOT0 I BOOT0 - -
45 PB8 I/O FT PB8 TIM4_CH3 I2C1_
(9) SCL/
CANRX
46 PB9 I/O FT PB9 TIM4_CH4 I2C1_
(9) SDA/
CANTX
47 VSS_3 S - V DD_3 - -
48 VDD_3 S - V DD_3 - -

1. I = đầu vào, O = đầu ra, S = nguồn cung cấp.


2. FT = 5V dung sai.
3. Chức năng sẵn có tùy thuộc vào thiết bị được chọn. Đối với các thiết
bị có số lượng ngoại vi giảm, nó luôn luôn thấp hơn số lượng thiết bị ngoại vi
được bao gồm. Ví dụ: nếu một thiết bị chỉ có một SPI và hai USART, chúng
sẽ được gọi là SPI1 và USART1 & USART2, tương ứng.
4. Nếu một số thiết bị ngoại vi chia sẻ cùng một pin I / O, để tránh xung
đột giữa các chức năng thay thế này, chỉ một thiết bị ngoại vi nên được bật tại
một thời điểm thông qua bit kích hoạt đồng hồ ngoại vi (trong thanh ghi kích
hoạt đồng hồ ngoại vi RCC tương ứng).
5. PC13, PC14 và PC15 được cung cấp thông qua công tắc nguồn. Vì
công tắc chỉ chìm một lượng dòng điện giới hạn (3 mA), việc sử dụng GPIO
PC13 đến PC15 ở chế độ đầu ra bị hạn chế: tốc độ không được vượt quá 2
MHz với mức tối đa tải 30 pF và các IO này không được sử dụng làm nguồn
hiện tại (ví dụ: để điều khiển đèn LED).
6. Chức năng chính sau khi khởi động miền dự phòng đầu tiên. Sau đó,
nó phụ thuộc vào nội dung của các thanh ghi Sao lưu sau khi thiết lập lại (vì
các thanh ghi này không được thiết lập lại bởi thiết lập lại chính).
16

7. Các chân số 2 và 3 trong gói VFQFPN36, 5 và 6 trong các gói


LQFP48, UFQFP48 và LQFP64 và C1 và C2 trong gói TFBGA64 được định
cấu hình là OSC_IN / OSC_OUT sau khi đặt lại, tuy nhiên chức năng của
PD0 và PD1 có thể được ánh xạ lại bằng phần mềm trên các chân này. Đối
với gói LQFP100, PD0 và PD1 có sẵn theo mặc định, vì vậy không cần ánh
xạ lại. Việc sử dụng PD0 và PD1 ở chế độ đầu ra bị hạn chế vì chúng chỉ có
thể được sử dụng ở 50 MHz trong chế độ đầu ra.
8. Không giống như trong gói LQFP64, không có PC3 trong gói
TFBGA64. Thay vào đó, chức năng VREF + được cung cấp.
9. Chức năng thay thế này có thể được ánh xạ lại bằng phần mềm đến
một số chân cổng khác (nếu có trên gói đã sử dụng).
2.1.4. Chức năng I/O của STM32F103C8T6
General-purpose Input/Output (GPIO) rất phổ biến, là một chức năng
ngoại vi cơ bản của mỗi loại vi điều khiển, bao gồm các chân đầu vào và chân
đầu ra, có thể được điều khiển bởi người dùng. Nó tương tự với các dòng vi
điều khiển 8bit như AVR hoặc PIC. Không giống như những dòng vi điều
khiển 8bit, chỉ có 8 chân IO trên 1 port thì ở các vi điều khiển 32bit, có đến 16
chân IO trên 1 port. Cụ thể đối với chip STM32F103C8Tx gồm có 3 Port
chính đó là GPIOA, GPIOB, GPIOC. Không phải tất cả các port đều có 16
chân, chỉ riêng GPIOA, GPIOB trên kit thì có đủ 16 chân GPIO.
Với chức năng I/O của VĐK, sau khi tạo Project bằng Cube32Mx chúng
ta sẽ sử dụng các hàm:
Xuất dữ liệu ra các chân VĐK:
Xuất bit 0:
HAL_GPIO_WritePin(GPIOx,GPIO_PIN_y,GPIO_PIN_RESET);
Xuất bit 1:
HAL_GPIO_WritePin(GPIOx,GPIO_PIN_y,GPIO_PIN_SET);
Đảo dữ liệu Out trên chân VĐK
HAL_GPIO_TogglePin(GPIOx,GPIO_PIN_y);
17

Trong đó:
x là tên PORT: A, B, C đối với VĐK STM32F103C8T6.
y là tên PIN: 1,2,3,….,16.
2.1.5. Chức năng timer của STM32F103C8T6
- STM32F103C8T6 có tất cả 7 timer nhưng trong đó đã bao gồm 1
systick timer, 2 watchdog timer. Vậy chỉ còn lại 4 timer dùng cho các chức
năng như ngắt, timer base, PWM, Encoder, Input capture…. Trong đó TIM1
là Timer đặc biệt, chuyên dụng cho việc xuất xung với các mode xuất xung,
các mode bảo vệ đầy đủ hơn so với các timer khác. TIM1 thuộc khối clock
APB2, còn các TIM2,TIM3,TIM4 thuộc nhóm APB1.
- Timer là bộ định thời có thể sử dụng để tạo ra thời gian cơ bản dựa trên
các thông số: clock, prescaler, autoreload, repetition counter. Timer của
STM32 là timer 16 bits có thể tạo ra các sự kiện trong khoảng thời gian từ
nano giây tới vài phút gọi là UEV (update event).
* Ngắt timer:
- TIM_Period : Period có nghĩa là chu kỳ của timer (không phải là chu
kỳ của 1 xung clock timer). Ví dụ một chu kỳ gồm 1000 xung clock mà mỗi
xung clock = 1us ta sẽ được period là 1ms.
FTIMER= FSYSTEM/[(PSC+1)(Period+1)]
Ftimer: là giá trị cuối cùng của bài toán, đơn vị là Hz.
Fsystem: tần số clock hệ thống được chia cho timer sử dụng, đơn vị là Hz.
PSC: giá trị nạp vào cho bộ chia tần số của timer. Tối đa là 65535.
Period: giá trị bộ đếm nạp vào cho timer. Tối đa là 65535.
Ngắt timer: khi giá trị đếm của bộ đếm timer(thanh ghi CNT) vượt qua giá trị
của Auto Reload Value thì cờ báo tràn sẽ được kích hoạt. Trình phục vụ ngắt
tràn sẽ xảy ra nếu được cấu hình cho phép trước đó.
- Sử dụng hàm HAL_TIM_Base_Start_IT để cho phép ngắt timer hoạt
động.
VD: HAL_TIM_Base_Start_IT(&htim2);
18

* Timer counter:
- TIM_CounterMode: Thiết lập mode cho timer là đếm lên hay đếm
xuống. Nếu chọn mode đếm tăng có nghĩa là mỗi xung nhịp timer, bộ đếm
counter sẽ tự tăng lên một giá trị theo chiều dương cho đến khi nào bằng
giá trị period sẽ đếm lại từ đầu, người ta thường gọi trường hợp này là tràn
bộ đếm.
Ở chế độ counter chỉ cần thiết lập Period là giá trị để thanh ghi bộ đếm
counter tràn và tự động xoá về 0 với chế độ counter up hoặc 65535 với chế độ
counter down, khi thiết lập thường sẽ mặc định ở chế độ counter up.
- Dùng hàm __HAL_TIM_GetCounter để đọc giá trị bộ đếm của
counter.
VD: x=__HAL_TIM_GetCounter(&htim2);
2.2. Graphic-LCD
2.2.1. Tổng quan LCD
Hiện nay trên thị trường có rất nhiều loại LCD với hình dạng và mẫu mã
khác nhau. Dựa vào kích thước màn hình và yêu cầu hiển thị có thể phân
thành 2 loại LCD chính:
- Loại hiển thị kí tự (character LCD) có các kích cỡ 16x1, 16x2, 16x4…
mỗi kí tự được tạo thành bởi một ma trận điểm sáng 5x7 hoặc 75x10 điểm
ảnh.
- Loại hiển thị đồ họa (Graphic LCD) đen trắng hoặc màu, gồm các kích
thước 1.47 inch (128x64 điểm ảnh), 1.47 inch (128x128 điểm ảnh), 1.8 inch
(128x160 điểm ảnh), 2 inch (176x220 điểm ảnh), 2.4 inch (240x320 điểm
ảnh), 4.3 inch (480x272 điểm ảnh), 7 inch (800x480 điểm ảnh), 8 inch
(800x600 điểm ảnh), …
19

2.2.2. Giới thiệu về Graphic-LCD


Graphic-LCD (Graphic Liquid Crystal Display - GLCD) là loại màn
hình tinh thể lỏng cho phép hiển thị thông tin dưới dạng hình ảnh. Màn hình
hiển thị của GLCD 128x64 gồm 8192 điểm ảnh, chia thành 128 cột và 64
hàng. Việc hiển thị thông tin trên GLCD thực chất là việc điều khiển các điểm
ảnh “sáng” hoặc “tắt”. Chip điều khiển hiển thị sẽ làm nhiệm vụ nhận lệnh
điều khiển từ ngoài và điều khiển các điểm ảnh trên màn hình. Hiện có nhiều
loại chip điều khiển của các hãng khác nhau, tuy nhiên trong tài liệu này,
chúng tôi chỉ giới thiệu loại chip phổ thông nhất: Chip KS0108 của Samsung.
Chip KS0108 chỉ có 512 bytes RAM (4096 bits = 64x64) vì thế chỉ điều khiển
hiển thị được 64 dòng x 64 cột. Để điều khiển GLCD 128x64 cần 2 chip
KS0108. Thực tế trong loại GLCD 128x64 cũng có 2 chip KS0108.

Hình 2.3: Ảnh thực tế graphic_LCD 128x64.


2.2.3. Sơ đồ chân của graphic_LCD 128x64
Các graphic_LCD 128x64 dùng KS0108 thường có 20 chân trong đó chỉ
có 18 chân là thực sự điều khiển trực tiếp GLCD, 2 chân (thường là chân 19
và 20) là 2 chân Anode và Cathode của LED nền. Trong 18 chân còn lại, có 4
chân cung cấp nguồn và 14 chân điều khiển, giao tiếp dữ liệu. Khác với các
Character-LCD (chẳng hạn như loại HD44780U), GLCD 128x64 dùng chip
KS0108 không hỗ trợ chế độ giao tiếp 4 bits, do đó khi kết nối với vi điều
20

khiển, cần dành ra 14 chân để điều khiển một GLCD 128x64. Sơ đồ chân phổ
biến của GLCD 128x64 được mô tả trong bảng 1.2.

Bảng 2.2: Bảng định nghĩa chân graphic_LCD 128x64.


Thứ tự chân Tên Mô tả chức năng
1 Vss GND (0VDC)
2 Vdd Vcc (+5VDC)
3 Vo Điều chỉnh độ tương phản
cho màn hình
4 RS(DI) Điều khiển hoạt động của
GLCD
5 RW
6 E
7 D0 Đường bus trao đổi dữ liệu
8 D1 giữa chip KS0108 với bộ
9 D2 điều khiển bên ngoài
10 D3
11 D4
12 D5
13 D6
14 D7
15 CS1 Chọn chip KS0108 điều
khiển nửa trái của màn hình:
=1: chọn; =0: Không chọn
16 CS2 Chọn chip KS0108 điều
khiển nửa phải của màn hình:
=1: chọn; =0: Không chọn
17 RST Reset chip KS0108 (tích cực
mức thấp)
18 VEE Điện áp âm (-9VDC) do
21

GLCD tạo ra
19 A Anode của LED nền
20 K Cathode của LED nền

Cách kết nối cơ bản của GLCD với vi điều khiển:

Hình 2.4: Sơ đồ kết nối cơ bản giữa vi điều khiển và GLCD 128x64
2.2.4. Tập lệnh của GLCD sử dụng chip KS0108
Chi tiết các lệnh dùng để giao tiếp với chip KS0108 phục vụ điều khiển
hiển thị trên LCD được mô tả trong bảng sau.

Bảng 2.3: Bảng các lệnh dùng để giao tiếp với chip KS0108.
Lệnh RS R/W D7 D6 D5 D4 D3 D2 D1 D0 Mô tả
Điều khiển
Bật/T hiển thị:
ắt 1/ D0=1: Hiển
0 1 0 0 1 1 1 1 1
hiển 0 thị
thị D0=0: Không
hiển thị
Đặt 0 0 1 1 D5-D0= 0 ÷63 Chọn vị trí cột
22

địa cần hiển thị


chỉ (cột 0 ÷ 63)
cột
(Y)
Đặt Chọn vị trí
địa hàng (Page)
D5-D0= 0 ÷
chỉ 0 0 1 0 1 1 1 cần hiển thị
7
Page (Page 0 ÷ 7)
(X)
Di chuyển
Cuộn
toàn bộ phần
màn D5-D0= 0 ÷63
0 0 1 1 hiển thị lên
hình
phía trên từ 1
(*)
đến 63 dòng
B=1: LCD
đang thực
hiện lệnh;
B=0: LCD
sẵn sàng nhận
một lệnh
Đọc O/F=1: LCD
trạng 0 1 B 0 O/F R 0 0 0 0 đang “tắt”
thái O/F=0: LCD
đang “hiển
thị”
R=1: LCD
đang reset
R=0: LCD
đang hoạt
23

động bình
thường
1 0 D7-D0 = 0 ÷ 255 Ghi giá trị vào
Ghi RAM tương
vào ứng các điểm
RAM ảnh cần hiển
thị
Đọc 1 1 D7-D0 = 0 ÷ 255 Đọc dữ liệu ra
từ từ RAM
RAM

2.3. Mạch tạo xung dùng IC 555


2.3.1. Cấu tạo của IC 555
Cấu tạo của IC 555 gồm OP-amp so sánh điện áp, mạch lật và transistor
để xả điện. Cấu tạo của IC đơn giản nhưng hoạt động tốt. Bên trong gồm 3
điện trở mắc nối tiếp chia điện áp VCC thành 3 phần. Cấu tạo này tạo nên
điện áp chuẩn. Điện áp 1/3 VCC nối vào chân dương của OP-amp 1 và điện
áp 2/3 VCC nối vào chân âm của OP-amp 2. Khi điện áp ở chân 2 nhỏ hơn
1/3 VCC, chân S=[1] và FF được kích. Khi điện áp ở chân 6 lớn hơn 2/3
VCC, chân R của FF=[1] và FF được reset

Hình 2.5: Sơ đồ mạch cấu tạo IC555.


24

2.3.2. Giải thích sự giao động


Ký hiệu 0 là mức thấp bằng 0V, 1 là mức cao gần bằng VCC. Mạch FF
là loại RS Flip-flop, khi S=[1] thì Q=[1] và QB=[0]. Sau đó, khi S=[0] thì
Q=[1] và QB=[0]. Khi R=[1] thì QB=[1] và Q=[0]. Tóm lại, khi S=[1] thì
Q=[1] và khi R=[1] thì Q=[0] bởi vì QB=[1], transistor mở dẫn, cực C nối đất.
Cho nên điện áp không nạp vào tụ C, điện áp ở chân 6 không vượt quá V2.
Do lối ra của OP-amp 2 ở mức 0, FF không reset.
2.3.3. Giai đoạn ngõ ra mức 1
Khi bấm công tắc khởi động, chân 2 ở mức 0.
Vì điện áp ở chân 2 (V-) nhỏ hơn V1 (V+), ngõ ra của OP-amp 1 ở mức
1 nên S=[1], Q=[1] và QB=[0]. Ngõ ra của IC ở mức 1. Khi QB=[0],
transistor tắt, tụ C tiếp tục nạp qua R, điện áp trên tụ tăng. Khi nhấn công tắc
lần nữa OP-amp 1 có V-=[1] lớn hơn V+ nên ngõ ra của OP-amp 1 ở mức ),
S=[0], Q và QB vẫn không đổi. Trong khi điện áp tụ C nhỏ hơn V2, FF vẫn
giữ nguyên trạng thái đó.
2.3.4. Giai đoạn ngõ ra ở mức 0
Khi tụ C nạp điện, OP-amp 2 có V+ lớn hơn V-=2/3 VCC, R=[1] nên
Q=[0] và QB=[1]. Ngõ ra cảu IC ở mức 0. Vì QB=[1], transistor mở dẫn, Op-
amp 2 có V+=[0] bé hơn V-, ngõ ra của Op-amp 2 ở mức 0. Vì vậy Q và QB
không đổi giá trị, tụ C xả điện thông qua transistor.
25

2.3.5. Sơ đồ nguyên lý và mạch tạo xung

Hình 2.6: Sơ đồ nguyên lý mạch tạo xung IC555.

Hình 2.7: Ảnh thực tế mạch tạo xung.


26

CHƯƠNG 3: THIẾT KẾ MẠCH ĐO TẦN SỐ VÀ THỰC NGHIỆM


3.1. Yêu cầu
- Dạng xung: vuông.
- Biên độ: 2V → 3.6V.
- Dải tần đo: 1KHz÷1MHz.
- Sai số cho phép 1.6%.
- Thời gian đáp ứng 1s.
- Thông tin hiển thị trên màn hình LCD, bao gồm: giá trị tần số đo được,
đơn vị (của tần số xung đo được).
3.2. Thiết kế phần cứng mạch đo tần số
3.2.1. Sơ đồ khối của mạch đo tần số

Khối nguồn

Khối vi điều khiển Khối


Bộ phát
hiển thị
xung (STM32F103C8T6)
(LCD)

Hình 3.1: Sơ đồ khối mạch đo tần số.


- Khối nguồn: khối này có nhiệm vụ cấp nguồn cho toàn mạch.
- Bộ phát xung: tạo nguồn xung thực hiện phép đo.
- Khối vi điều khiển (sử dụng STM32F103C8T6): thực hiện chương
trình chính nhận xung đầu vào, đo tần số và xuất dữ liệu lên màn hình LCD.
- Khối hiển thị: hiển thị tần số đo được lên màn hình GLCD.
27

3.2.2. Thiết kế nguyên lý các khối trong mạch


* Thiết kế khối nguồn.

Hình 3.2: Sơ đồ nguyên lý khối nguồn.


Theo sơ đồ khối của mạch đo tần số khối nguồn cần cung cấp điện áp
cho 2 khối: khối vi điều khiển và khối hiển thị.
- Khối hiển thị sử dụng Graphic-LCD cần nguồn nuôi 5V. Khi cấp
nguồn đầu vào 12V qua IC nguồn LM2576–12V tạo ra nguồn 5V cấp vào
khối hiển thị.
- Khối vi điều khiển dùng STM32F103C8T6 cần nguồn nuôi 3.3V. Khi
có nguồn 5V sau bộ LM2576 cho qua IC nguồn LM1117-5V tạo ra nguồn
3.3V cấp vào khối vi điều khiển.
* Thiết kế khối đo tần số.

Hình 3.3: Sơ đồ nguyên lý khối đo tần số.


28

- Em đã dùng kit STM32F103C8T6 để thực hiện bài toán nguồn xung


đầu vào được cấp vào chân A15 với chức năng đếm counter timer 2.
- Các chân A3,A4,A5,…….A12 là các chân cấp tín hiệu lên LCD.
* Thiết kế khối hiển thị.
Sử dụng graphic – LCD 128x64 với chân VSS nối với một con biến trở để
điều chỉnh độ tương phản của màn hình. Chân 15,16 tương ứng với chức năng
điều khiển nửa màn hình trái và nửa màn hình phải.

Hình 3.4: Sơ đồ nguyên lý khối hiển thị.


29

* sơ đồ nguyên lý.

Hình 3.5: Hình ảnh mạch nguyên lý mạch đo tần số.


* Hình ảnh mạch thật.

Hình 3.6: Hình ảnh mạch thật mạch đo tần số.


30

3.3. Thiết kế phần mềm


3.3.1. Thuật toán đo tần số
* Lưu đồ thuật toán đo tần số:

Bắt đầu

Đếm số xung trong 1s

Tính f

sai
báo không có
f>0
xung lên LCD
đúng

Hiển thị giá trị f lên LCD

Uin=0

sai đúng

Kết thú

Hình 3.7: Lưu đồ thuật toán đo tần số.


31

* Thuật toán đếm số xung trong 1s.


- Dùng timer3 với chức năng ngắt với chu kì 1s, timer2 chức năng đếm
counter.
- Theo cấu hình của STM32F103C8T6 timer3 và timer2 dùng xung nội
với tốc độ xử lý max là 36MHz → cấu hình nguồn xung cho hệ thống sử dụng
xung nội với tốc độ 36MHz.

Hình 3.8: Cấu hình xung clock hệ thống.


Dùng phần mềm STM32CubeMX thiết lập cho bộ timer3 với chu kì ngắt
1s.
- Cấu hình thời gian cho timer3:
Ta có công thức thiết lập thời gian ngắt cho timer:
FTIMER= FSYSTEM/[(PSC+1)(Period+1)](1)
Trong đó:
+ timer ngắt chu kì 1s → TTIMER=FTIMER.
32

+ FSYSTEM = 36MHz.
+ Chúng ta có xung hệ thống là 36MHz chọn bộ chia tần 1000.
Vậy giá trị bộ chia tần là:
𝟑𝟔𝑴𝑯𝒛
PSC = – 1= 35999.
𝟏𝟎𝟎𝟎
+ Theo công thức (1) → period=999.

Hình 3.9: Cấu hình ngắt timer3.


- Cấu hình counter cho timer2:
Thiết lập Period là giá trị để thanh ghi bộ đếm counter tràn và tự động
xoá về 0 với chế độ counter up 65535.
Thiết lập bộ chia tần đầu vào 16 lần → khai báo giá trị của prescaled =
16-1=15.
33

Sử dụng kênh timer2-CH1 tương đương chân PA15 cấp nguồn xung vào.

Hình 3.10: Cấu hình timer3 counter.


34

3.3.2. Thuật toán hiển thị trên GLCD


* Lưu đồ thuật toán hiển thị GLCD:

Start

Khởi tạo GLCD:


- Chọn chíp KS0108 thứ nhất => bật hiển thị

- Chọn địa chỉ Page (X)


- Chọn địa chỉ cột (Y)

Ghi dữ liệu cần hiển thị Có


vào RAM

Hiển thị tiếp?

Không

END

Hình 3.11: Trình tự điều khiển hiển thị trên GLCD.


- Cấu hình các chân giao tiếp output từ vi điều khiển và GLCD trên phần
mềm STM32CubeMX.
- Trên GLCD có 2 chip điều khiển cho 2 nửa màn hình CS1 (trái) và
CS2 (phải).
* Hàm chọn chip trái/phải và truyền địa chỉ cho GLCD.
Khởi tạo biến cs tương đương với giá trị cs=0 chọn chip trái, cs=1 chọn
chip phải. Biến cmd: địa chỉ bắt đầu của mảng cần truyền.
Dùng câu lệnh: HAL_GPIO_WritePin() để SET và RESET cho các chân
dữ liệu.
35

void glcd_cmd(uint8_t cs,uint8_t cmd)


{
if(cs==1)
{
HAL_GPIO_WritePin(CS1_GPIO_Port,CS1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(RW_GPIO_Port,RW_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(D0_GPIO_Port,D0_Pin,(cmd&(1<<0))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,(cmd&(1<<1))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,(cmd&(1<<2))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
//………………………………………………………………………………
HAL_GPIO_WritePin(D7_GPIO_Port,D7_Pin,(cmd&(1<<7))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_Delay(DELAY);
HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_RESET);
}
else{
HAL_GPIO_WritePin(CS1_GPIO_Port,CS1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(RW_GPIO_Port,RW_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(D0_GPIO_Port,D0_Pin,(cmd&(1<<0))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,(cmd&(1<<1))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,(cmd&(1<<2))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
36

//………………………………………………………………..
HAL_GPIO_WritePin(D7_GPIO_Port,D7_Pin,(cmd&(1<<7))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_Delay(DELAY);
HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_RESET); }}
* Hàm chọn chip trái/phải và truyền dữ liệu cho GLCD.
Để truyền dữ liệu data cho GLCD chúng ta cũng sử dụng câu lệnh:
HAL_GPIO_WritePin() để tạo lập chương trình cho hàm:
void glcd_data(uint8_t cs,uint8_t data)
{
/* Các câu lệnh tương tự như hàm chọn chip trái/phải và truyền địa chỉ cho
GLCD khác ở hàm ghi dữ liệu chân bus trao đổi dữ liệu giữa chip KS0108
với bộ điều khiển bên ngoài. Ở hàm chọn chip trái/phải và truyền địa chỉ tham
số mình truyền vào là địa chỉ bắt đầu của màng còn ở hàm chọn chip trái/phải
và truyền dữ liệu thì truyền giá trị mảng cần hiển thị*/
HAL_GPIO_WritePin(D0_GPIO_Port,D0_Pin,(data&(1<<0))>0 ?
GPIO_PIN_SET:GPIO_PIN_RESET);
//…………………………………………………….
}
* Hàm đặt địa chỉ page (X) và địa chỉ cột (Y).
- Khởi tạo giá trị cho địa chỉ hàng X_ADRESS và địa chỉ cột
Y_ADRESS (theo bảng 1.3).
- Với từng nửa màn hình được chia ra 8 page (1 page=8 điểm ảnh) và 64
cột (1 cột=1 điểm ảnh). Chúng ta sử dụng hàm: void glcd_clr() để quét xác
định vị trí của điểm ảnh trên từng page và cột.
37

#define X_ADRESS 0xB8


#define Y_ADRESS 0x40
void glcd_clr(void)
{
uint8_t Page=0;
uint8_t Colum=0;
for (Page = 0; Page < 8; Page++)
{
glcd_cmd(0,X_ADRESS+Page);
glcd_cmd(1,X_ADRESS+Page);
for (Colum = 0; Colum < 64; Colum++)
{
glcd_cmd(1,Y_ADRESS+Colum);
glcd_data(1,0x00);
glcd_cmd(0,Y_ADRESS+Colum);
glcd_data(0,0x00);
}}}
* Hàm đưa con trỏ đến vị trị hiển thị.
Sử dụng hàm: void glcd_gotoxy(uint8_t x,uint8_t y) với x là địa chỉ page
và y là địa chỉ cột. Hàm này có chức năng đưa con trỏ đến điểm mà mình
muốn bắt đầu hiển thị mảng, với x[0,7] và y[0,64].
void glcd_gotoxy(uint8_t x,uint8_t y) {
if(y<64)
{ glcd_cmd(0,X_ADRESS+x);
glcd_cmd(0,Y_ADRESS+y);
}
else{
glcd_cmd(1,X_ADRESS+x);
glcd_cmd(1,Y_ADRESS+y-64);
}}
38

* Hàm khởi tạo GLCD.


Sử dụng hàm: void glcd_init(void).
Chức năng của hàm này là truyền giá trị 0x3E (theo bảng 1.3) để tắt chức
năng hiển thị GLCD sau đó khởi tạo các hàm truyền dữ liệu và địa chỉ và
GLCD khi nhận xong sẽ truyền giá trị 0x3F (theo bảng 1.3) để bật lại màn
hình và hiển thị các dữ liệu nhận được cho cả hai nửa màn hình.
#define START_LINE 0xC0
#define DISPLAY_ON 0x3F
#define DISPLAY_OFF 0x3E
void glcd_init(void)
{
glcd_cmd(0,DISPLAY_OFF);
glcd_cmd(0,START_LINE);
glcd_cmd(0,X_ADRESS);
glcd_cmd(0,Y_ADRESS);
glcd_cmd(0,DISPLAY_ON);

glcd_cmd(1,DISPLAY_OFF);
glcd_cmd(1,START_LINE);
glcd_cmd(1,X_ADRESS);
glcd_cmd(1,Y_ADRESS);
glcd_cmd(1,DISPLAY_ON);
glcd_clr();
}
* Ví dụ hiển thị lên màn hình GLCD.
- Hàm truyền mảng hình ảnh.
Bước 1: Sử dụng phần mềm LCD Font Maker để chấm tạo hình ảnh
muốn hiển thị sau đó tiến hành xuất ra mảng dữ liệu số.
+ Giả sử chúng ta tạo một page ảnh 8*8
39

Hình 3.12: Sử dụng phần mềm tạo mảng dữ liệu LCD Font Maker.
+ Mảng dữ liệu:
uint16_t chu[8]={
0x00,0x06,0x06,0xFE,0xFE,0x06,0x06,0x00,};
Bước 2: Tiến hành khai báo hàm truyền địa chỉ và dữ liệu tong chương trình
chính:
Main(){
glcd_gotoxy(7,0);
for(i=0;i<8;i++){
glcd_data(0,chu[i]);
}//T
}
40

3.4. Kết quả đã đạt được


* Ưu điểm:
- Chi phí làm mạch thấp, dễ thực hiện.
- Độ chính xác cao.
* Nhược điểm:
- Hạn chế giải tần đo được.
* Đánh giá kết quả:
- Đo được tần số có dải tần từ 1KHz đến 1MHz với sai số cho phép
1.6%.
- Đáp ứng tần số với thời gian t=1s.
- Hiển thị giá trị tần số đo được, đơn vị tần số lên màn hình Graphic-
LCD.

Hinh 3.13: Kết quả đạt được.


41

3.5. Hướng phát triển


- Đo được xung vuông có dải tần 1Hz đến dưới 1KHz với sai số cho
phép 1.6%.
- Hiển thị được hình dạng xung trên LCD với độ rộng xung thay đổi theo
độ lớn tần số.
42

KẾT LUẬN
Sau quá trình thực hiện đề tài em đã rút ra được một số kết luấn sau: về
yêu cầu của đề tài đã giải quyết được cơ bản yêu cầu của đề tài và tạo ra mạch
thực tế tiến hành đo tần số. Mặc dù chưa giải quyết được tối ưu bài toán đưa
ra nhưng đã nghiên cứu và chỉ rõ hướng phát triển để tài hoàn thiện hơn. Với
sự cần thiết của một dụng cụ đo tần số cùng với sự phát triển ngày càng mạnh
mẽ của IC số đã giúp cho đề tài mạng lại tính thực tế cao.
Tuy đã cố gắng thực hiện đề tài nhưng do kĩ năng, kiến thức còn hạn chế
và trong khoảng thời gian giới hạn nên đề tài còn chưa đạt được yêu cầu hạn
chế giải đo tần số.
Qua quá trình nghiên cứu về đề tài này em thấy đây là một đề tài có tính
ứng dụng trong học tập rất cao, dễ dàng để tất cả các bạn sinh viên tiếp cận và
thực hiện, giúp các bạn dễ hiểu hơn về các chức năng của IC số, có hứng thú
hơn, nhớ lâu hơn khi tạo ra được một sản phẩm của riêng mình.
Một lần nữa em xin chân thành cảm ơn sự tận tình hướng dẫn của thầy
Th.s Vũ Trung Kiên cũng như sự đóng góp ý kiến của các thầy cô trong hội
đồng!
Em xin chân thành cảm ơn!
43

TÀI LIỆU THAM KHẢO


[1]. https://www.alldatasheet.com.
[2]. http://vidieukhien.xyz.
[3].https://mpe.epu.edu.vn.
[4]. http://tratu.soha.vn.

You might also like