Phân tích yêu cầu xử lý để đảm bảo tính thời gianthực cho các đối tượng 1 2 Giao tiếp UART Truyền thông số lên máy tính thông qua UART Triển khai ứng dụng thời gian thực trên vi điều khi
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG ĐIỆN – ĐIỆN TỬ
THIẾT KẾ HỆ THỐNG NHÚNG EE4251 – 154748 – Nhóm 24
ĐỀ TÀI: Lập trình STM32 đọc cảm biến nhiệt độ hiển thị lên LCD, giao tiếp máy tính qua UART Cài đặt thông số lập lịch và nhận lệnh điều khiển từ máy tính
GVHD: TS Lê Công Cường
Hà Nội, 1/2025
Trang 2MỤC LỤC
PHẦN 1: TỔNG QUAN ĐỀ TÀI 5
1.1 Yêu cầu bài tập lớn 5
1.2 Mục tiêu thiết kế 5
PHẦN 2: NỘI DUNG THỰC HIỆN 6
1 Ghép nối phần cứng 6
1.1 Lựa chọn phần cứng 6
1.2 Ngoại vi 11
1.3 Sơ đồ kết nối phần cứng 13
2 Thiết kế phần mềm 14
2.1 Phân tích yêu cầu xử lý để đảm bảo tính thời gian thực cho các đối tượng 14
2.2 Phân tích và tính toán tham số cho các task 17
2.3 Phân tích và lập trình theo mô hình đơn nhiệm 18
2.4 Phân tích và lập trình theo mô hình đa nhiệm 19
PHẦN 3: ĐÁNH GIÁ, THỬ NGHIỆM HỆ THỐNG 23
3.1 Các kết quả đạt được 23
3.2 Phân tích và đánh giá kết quả 24
3.3 Đánh giá công việc của các thành viên 24
3.4 Link share thư mục lập trình 25
Trang 3DANH MỤC HÌNH ẢNH
Hình 1: STM32F103C8T6 6
Hình 2: Sơ đồ chân của STM32F103C8T6 6
Hình 3: Module DHT11 7
Hình 4: Quá trình truyền tin tổng thể của DHT11 8
Hình 5: MCU gửi tín hiệu bắt đầu và phản hồi từ DHT 8
Hình 6: Chỉ ra dữ liệu bit 0 9
Hình 7: Chỉ ra dữ liệu bit 1 9
Hình 8: LCD 1602 module I2C 10
Hình 9: PL2303 10
Hình 10: Sơ đồ khối của hệ thống 13
Hình 11: Gửi giá trị đo được lên phần mềm Hercules 18
Hình 12: Mô hình lập trình đa nhiệm 20
Hình 13: Lưu đồ thuật toán cho 3 task 20
Hình 14: Cấu hình tác vụ trên CubeMX 21
Hình 15: Lập trình cho task 1 (đọc cảm biến DHT11) 21
Hình 16: Lập trình cho task 2 (hiển thị dữ liệu lên LCD) 21
Hình 17: Lập trình cho task 3 (truyền dữ liệu lên máy tính qua UART) 22
Hình 18: Kết quả đo kiểm thực tế của nhóm 23
Hình 19: Gửi dữ liệu lên máy tính thông qua UART, và gửi lệnh từ máy tính 24
Trang 4DANH MỤC BẢNG BIỂU
Bảng 1: Yêu cầu chung của bài tập lớn 5
Bảng 2: Bảng phân chia bit trong 1 lần đo 8
Bảng 3: So sánh hệ điều hành thông thường và hệ điều hành thời gian thực 14
Bảng 4: Tham số của từng task 17
Bảng 5: Các chế độ hiển thị của LCD 18
Bảng 6: Các lệnh gửi lên từ máy tính 19
Bảng 7: Tham số các task cho đa nhiệm 20
Bảng 8: Đánh giá công việc của các thành viên 26
Trang 5PHẦN 1: TỔNG QUAN ĐỀ TÀI1.1 Yêu cầu bài tập lớn
1 Đọc cảm biến, hiển
thị lên LCD
Lập trình STM32 đọc cảm biến,hiển thị lên LCD Phân tích yêu cầu
xử lý để đảm bảo tính thời gianthực cho các đối tượng
1
2 Giao tiếp UART Truyền thông số lên máy
tính thông qua UART
Triển khai ứng dụng thời gian thực trên vi điều khiển STM32 với các yêu cầu:
• Lập trình vi điều khiển STM32 giao tiếp với module đồng hồ thời gian thực DS1307 và
cảm biến DHT11 hiển thị thông số lên LCD, truyền thông số lên máy tính Cài đặt thời
gian và thông số bộ lập lịch từ máy tính
• Phân tích các yêu cầu xử lý để đảm bảo tính thời gian thực
• Thiết kế bộ lập lịch với chu kỳ lặp lại khác nhau và xây dựng chương trình theo
Trang 6Module STM32 Bluepill sử dụng chip STM32F103C8T6 phổ thông nhất củaSTM, có đầy đủ các ngoại vi cơ bản, bộ nhớ vừa đủ và giá thành rẻ.
Thông số cơ bản của chip STM32C8T6:
Trang 7Hình 2: Sơ đồ chân của STM32F103C8T6
1.1.2 Cảm biến nhiệt độ DHT11
Cảm biến DHT11 là một cảm biến phổ biến được sử dụng để đo nhiệt độ và độ
ẩm trong các ứng dụng IoT, tự động hóa và hệ thống nhúng Nó có thiết kế nhỏ gọn,
dễ sử dụng, và chi phí thấp, nên rất phù hợp cho các dự án DIY, học tập, và nghiêncứu
Hình 3: Module DHT11
- Thống số kỹ thuật:
Dải đo : Nhiệt độ: từ 0°C đến 50°C (độ chính xác ±2°C) Độ ẩm: từ 20% đến 90% RH (độ chính xác ±5% RH)
Trang 8 Cấu tạo: Gồm một cảm biến độ ẩm điện trở (resistive humidity sensor) và một nhiệt điện trở (thermistor) để đo nhiệt độ Vi mạch bên trong xử lý tín hiệu và truyền dữ liệu qua giao tiếp kỹ thuật số.
Nguồn cấp: Điện áp hoạt động: 3.3- 5V
Giao tiếp: Sử dụng giao tiếp một giây (single wire) để truyền dữ liệu
- Nguyên lý hoạt động: DHT11 dùng chuẩn truyền thông nối tiếp Single – Wire Two – Way, tức là trên cùng một bus, MCU có thể truyền hoặc nhận, cảm biến
có thể nhận hoặc truyền tương ứng
- Dữ liệu 1 lần đo từ cảm biến được gửi đến MCU, bắt đầu từ MSB, với tổng cộng 40 bit theo định dạng sau:
Phần thập phân độ ẩm Phần nguyên
nhiệt độ
Phần thập phân nhiệt độ
Check sum
Bảng 2: Bảng phân chia bit trong 1 lần đo
- Khung truyền của DH11 giao tiếp với vi điều khiển ở bảng sau:
Hình 4: Quá trình truyền tin tổng thể của DHT11
Trang 9- MCU gửi tín hiệu request đến DHT: tín hiệu ra của MCU kéo xuống mức thấp(tối thiểu 18ms), sau đó kéo lên mức cao để đợi response từ DHT (20-40us).
Hình 5: MCU gửi tín hiệu bắt đầu và phản hồi từ DHT
- DHT gửi tín hiệu response đến MCU: tín hiệu từ DHT kéo xuống mức thấp báo
có phản hồi (80us), sau đó kéo lên mức cao báo hiệu sẵn sàng đọc dữ liệu(80us)
- MCU nhận dữ liệu từ DHT theo định dạng 40 bit: Mỗi bit dữ liệu 0 hoặc 1 đềuđược bắt đầu bởi một tín hiệu mức thấp (kéo dài trong 50us), sau đó tín hiệunày kéo lên cao, nếu ở mức cao trong 26-28us thì xác định là bit 0, nếu ở mứccao trong 70us thì xác định là bit 1
Hình 6: Chỉ ra dữ liệu bit 0
Trang 10 VCC: Cấp nguồn cho module, thường là +5V (một số module hỗ trợ +3.3V).
GND: kết nối với GND của mạch
SDA: Dữ liệu (Serial Data), dùng để truyền dữ liệu qua giao tiếp I2C
SCL: Xung nhịp (Serial Clock), dùng để đồng bộ dữ liệu qua giao tiếp I2C
Trang 111.1.4 Mạch USB to UART PL230
Module UART PL2303 tích hợp với IC PL2303 từ hãng Prolific Technology,
là một chip bridge chuyển đổi tín hiệu USB sang UART Bộ điều khiển bridge USB toUART cho một giải pháp đơn giản để hỗ trợ thiết kế chuẩn giao tiếp RS232 với cáclinh kiện và không gian mạch PCB được tối ưu
Hình 9: PL2303
Mô tả các chân:
3.3V: Chân VCC 3V3
5.0V: Chân VCC 5V
TxD: Đầu ra dữ liệu không đồng bộ (truyền UART)
RxD: Đầu vào dữ liệu không đồng bộ (nhận UART)
Input floating: đầu vào thả nổi, điện áp không cố định
Input pull-up: đầu vào có trở kéo lên (mức logic mặc định là 1)
Input pull-down: đầu vào có trở kéo xuống (mức logic mặc định là 0)
Trang 12 Analog: đầu vào là tín hiệu tương tự, dùng cho các mode có sử dụng ADC hoặcDAC.
Output open-drain: cấu hình chân I/O là ngõ ra, khi output control = 0 thì MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS và N-MOS đều không dẫn, chân I/O được để nổi
Output push-pull: cấu hình chân I/O là ngõ ra, khi output control = 0 thì MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS dẫn,chân I/O được nối VDD
N- Alternate function push-pull: sử dụng chân I/O vừa là ngõ ra và vừa là ngõ vào,tuy nhiên sẽ không có trở kéo lên và kéo xuống ở input, chức năng outputgiống Output push-pull Ngoài ra nó còn để sử dụng cho chức năng remap
Alternate function open-drain: sử dụng chân I/O vừa là ngõ ra và vừa là ngõvào, tuy nhiên sẽ không có trở kéo lên và kéo xuống ở input, chức năng outputgiống Output open-drain Ngoài ra nó còn để sử dụng cho chức năng remap.Mỗi bit của cổng GPIO có thể được lập trình một cách tự do, tuy nhiên cácthanh ghi cổng GPIO phải được truy cập dưới dạng từ 32-bit
GPIO của STM32 được chia thành 2 khối cơ bản:
Input Driver: Bao gồm thanh ghi Input Data (IDR), và 1 trigger Tín hiệuInput ngoài việc được ghi vào IDR còn theo các đường Analog để vào bộADC, hoặc theo đường Alternate function input vào các ngoại vi khác
Output Drive: Bao gồm thanh ghi Output Data (ODR), một khối outputcontrol để chọn tín hiệu ra là từ ODR hay từ các ngoại vi khác Tiếp đếnđiều khiển 2 mosfet cho điện áp ra ở I/O pin
Trang 13 PWM Generation: Sinh ra tín hiệu PWM để điều khiển các thiết bị nhưđộng cơ hoặc LED.
Input Capture: Đo thời gian giữa các sự kiện ngoại vi
Output Compare: Kích hoạt một hành động khi giá trị Timer đạt đến mộtgiá trị cài đặt trước
Trong đề tài này, sử dụng các chế độ Timer sau:
Timer Mode: tạo các khoảng delay đúng đến micro giây để đọc giá trị nhiệt độ
và độ ẩm
Tần số sau bộ chia Prescaler:
fCK-CNT = fCK-PSC/(PSC+1)fCK-CNT: tần số sau bộ chia
fCK-PSC: tần số clock đầu vào cấp cho timer
PSC: giá trị truyền vào được lập trình bằng phần mềm
1.2.3 I2C
2C viết tắt của Inter - Integrated Circuit là một phương thức giao tiếp được phát triển bởi hãng Philips Semiconductors Dùng để truyền tín hiệu giữa vi xử lý và các IC trên các bus nối tiếp
Kết nối vật lý giao thức của I2C:
Bus I2C sử dụng 2 dây tín hiệu là SDA (Serial Data Line) và SCL (Serial Clock Line) Dữ liệu truyền trên SDA được đồng bộ với mỗi xung SCL Đường SCL chỉ master mới có quyền điều khiển
Tất cả các thiết bị đều dùng chung 2 đường tín hiệu này
Trang 14 Truyền không đồng bộ: Bên gửi và bên nhận không làm việc theo một nhịpchung Dữ liệu trao đổi thường được chia thành từng nhóm 7 hoặc 8 bit, gọi làcác ký tự Các ký tự được chuyển đi vào những thời điểm không đồng đều.
Truyền song công: Mỗi thiết bị đều có thể gửi và nhận thông tin cùng một lúc,
sử dụng hai đường truyền riêng biệt cho thu và phát
1.3 Sơ đồ kết nối phần cứng
Hình 10: Sơ đồ khối của hệ thống
2 Thiết kế phần mềm
2.1 Phân tích yêu cầu xử lý để đảm bảo tính thời gian thực cho các đối tượng
2.1.1 Hệ điều hành thời gian thực RTOS
Hệ thống thời gian thực là hệ thống mà sự hoạt động tin cậy của nó không chỉ phụ thuộc vào sự chính xác của kết quả mà còn phụ thuộc vào thời điểm đưa ra kết quả, hệ thống
có lỗi khi yêu cầu về thời gian không được đáp ứng Bảng dưới đây so sánh hệ điều hành thông thường và hệ điều hành thời gian thực:
Hệ điều hành thông thường Hệ điều hành thời gian thực
Trang 15Có thể kể đến Window, Linux,
Android, Ios, … Khi mở một phần
mềm trên đó, có thể chúng ta phải chờ
đợi thời gian tải dữ liệu khá lâu, việc
chờ đợi này cũng không ảnh hưởng gì
bởi vì đa số phần mềm tương tác với
con người chứ ít tương tác với các
phần mềm hay thiết bị khác
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 dòng vi điều khiển và không
có giao diện tương tác với người dùng.Chúng cần thời gian phản hồi nhanh bởi vì đa số 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ự trễ rất nhỏ cũng có thể làm hệ thống sai lệch hoàntoàn
Bảng 3: So sánh hệ điều hành thông thường và hệ điều hành thời gian thực
Chúng ta cần sử dụng RTOS khi thiết kế ứng dụng lớn, nhiều trạng thái máy hoặc liên quan tới các tác vụ xử lý nhanh, xử lý ảnh, âm thanh RTOS sẽ chia các ứng dụng phức tạp thành các phần nhỏ hơn và dễ quản lý hơn Ta có thể kể đến một số ưu điểm của RTOS:
• Chia sẽ tài nguyên một cách đơn giản: cung cấp cơ chế phân chia các yêu cầu
về bộ nhớ
và ngoại vi của MCU
• Dễ debug và phát triển: mọi người trong nhóm có thể làm việc một cách độc lập, các lập
trình viên có thể tránh được các tương tác với ngắt, timer, với phần cứng
• Tăng tính linh động và dễ dàng bảo trì: thông qua API của RTOS
Hệ điều hành thời gian thực được chia làm hai loại:
• Hệ điều hành thời gian thực cứng (Hard Real Time Operating System): là hệ điều hành thời gian thực mà các tác vụ không chỉ đúng về thực thi mà còn phải đúng
về thời gian, không cho phép sai lệch về thời gian Nó thường được sử dụng ở các lấp thấp với tầng vật lý Ví dụ như hệ thống điều khiển năng lượng ô tô, máy điều hòa nhịp tim, hệ thống điều khiểncác quá trình công nghiệp, …
• Hệ điều hành thời gian thực mềm (Soft Real Time Operating System): là hệ điều hành thời gian thực cho phép sai lệch về thời gian và dung sai lỗi ở một mức độ nhất định Nó thường được sử dụng ở những chỗ xảy ra sự tranh chấp và cần giữ số kết nối
hệ thống phản ứng với sự thay đổi hoàn cảnh Ví dụ: phần mềm duy trì và cập nhật kế hoạch bay hãng hàng không, hệ thống truyền hình, nghe nhạc trực tuyến, bộ điều khiển máy giặt, …
Một số khái niệm quan trọng trong hệ điều hành thời gian thực RTOS:
• Kernel (nhân): có nhiệm vụ quản lý và điều phối các task Mọi sự kiện (event)
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 (tác vụ): là một đoạn chương trình thực thi một hay nhiều nhiệm vụ, đượ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:
Trang 16o 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).
o Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,semaphore, …)
o Khi task gọi hàm Yield () để ép Kernel chuyển sang các task khác mà không phải chờ cho kết time slice
o Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Ilde Task
Các trạng thái hoạt động của task
Running: một task đang được thực thi bởi vi xử lý (trong time slice của task), Tại một thời điểm chỉ có duy nhất 1 task trong trạng thái running
Ready: trạng thái chờ của task để vào trạng thái running
Blocked: task không sẵn sàng chạy (vào trạng thái running) kể cả khi bộ vi xử lý trong trạng thái nghỉ Task ở trong trạng thái này vì chúng đợi một sự kiện bên ngoài tác động để kích hoạt nó trở lại trạng thái Ready (ví dụ task khác đang dùng
UART,task này cần chưa được giải phóng)
2.1.2 Hệ điều hành FreeRTOS
FreeRTOS là lõi của hệ điều hành thời gian thực miễn phí Hệ điều hành này được Richard Barry công bố rộng rãi từ năm 2003, phát triển mạnh đến nay và được cộng động mạng mã nguồn mở ủng hộ FreeRTOS có tính khả chuyển, mã nguồn mở, lõi có thể tải miễnphí và nó có thể dùng cho các ứng dụng thương mại Nó có nhiều ưu điểm nỗi bật so với các
hệ điều hành nhúng thời gian thực khác như có kích thước nhỏ gọn nên rất phù hợp với các
hệ thống nhúng thời gian thực nhỏ, được viết bằng ngôn ngữ C nên có độ phù hợp cao với nền phần cứng khác nhau Ngoài ra FreeTOS còn hỗ trợ các cơ chế như cho phép tạo cả task
và coroutie với số lượng task không giới hạn phụ thuộc vào tài nguyên của phần cứng chip,
hỗ trợ cơ chế truyền thông đồng bộ giữa các task hoặc giữa task và ngắt bằng cách sử dụng hàng đợi hoặc semaphore đếm và các mutex, cho phép nhận biết khi ngăn xếp bị tràn Ngay
cả trong các hệ thống nhúng lớn người ta vẫn có thể sử dụng FreeRTOS để tiết kiệm được dung lượng bộ nhớ và làm cho hệ thống ít bị quá tải
2.1.3 Quản lý hoạt động trong FreeRTOS
Quản lý các task: đây là nhiệm vụ quan trọng trong FreeRTOS Các nhiệm vụ mà
người lập trình muốn hệ thống thực hiện sẽ được viết trong nội dung các task Mỗi task sẽ được gán một độ ưu tiên phù hợp và được bộ lập lịch sắp xếp thời gian hoạt động
Quản lý hàng đợi: FreeRTOS cung cấp cơ chế hàng đợi (Queue) hoạt động theo
nguyên tắc FIFO (vào trước ra trước) Hàng đợi là nơi lưu trữ dữ liệu của các task Khi một task chờ để ghi dữ liệu vào hàng đợi hoặc là đọc dữ liệu ra từ hàng đợi thì nó
sẽ bị rơi vào trạng thái block
Quản lý sự kiện ngắt: FreeRTOS cho phép quản lý hiệu quả các ngắt Khi
ngắt xảy ra CPU sẽ chuyển vào hàm thủ tục ngắt, hàm thủ tục ngắt phát đi một tín hiệu để hàm thực hiện chức năng của ngắt thực hiện, hàm này có độ ưu tiên cao hơn tất cả các task khác nên nó sẽ được thực hiện ngay lập tức Tín hiệu ở đây chính là Semaphore, trong FreeRTOS có hai loại Semaphore là Binary Semaphore và Counting Semaphore với hai tác động chính vào Semaphore là
“Take” và “Give” "Take" là dùng cho hàm thực hiện chức năng của ngắt, khi