BÁO CÁO BÀI TẬP LỚN Môn: Thiết kế hệ thống nhúng Mục lục 1 Yêu cầu bài tập lớn ................................................................................................................................3 2 Giới thiệu về phần cứng……………………………………………………………………………………………………………………3 2.1 Nguyên lý của các module phần cứng.….………………………………………………………………………………….3 2.2 Các ngoại vi của STM32 cần sử dụng……….………………………………………………………………………….……11 2.3 Sơ đồ ghép nối giữa STM32 và module phần cứng.…………………………………………………………….……15 2.4 Lưu đồ thuật toán giao tiếp giữa STM32 và các module.……………………………………………………….…15 3 Thiết kế phần mềm……………………………………………………………………………………………………………….……….18 3.1 Phân tích yêu cầu xử lý để đảm bảo tính thời gian thực………………………………………………………...18 3.2 Thiết kế bộ lập lịch với chu kỳ lặp lại khác nhau.........................................................................18 3.3 Lập trình đa nhiệm…………………………………………………………………………………………………………………19 4 Kết quả và đánh giá…………………………………………………………………………………………………………………..……22 4.1 Các kết quả đạt được..................................................................................................................22 4.2 Đánh giá kết quả .........................................................................................................................23 4.3 Thống kê công việc và mức độ đóng góp của thành viên………………………………………………………..23
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN
BÁO CÁO BÀI TẬP LỚN Môn: Thiết kế hệ thống nhúng Giảng viên hướng dẫn: Thầy Lê Công Cường
Danh sách thành viên nhóm:
Vũ Hồng Quân 20181709 Nguyễn Tiến Đạt 20181386
Đỗ Năng Hiếu 20181470 Trần Quốc Thắng 20181758
Hà Nội, 02-2022
Trang 2Mục lục
1 Yêu cầu bài tập lớn 3
2 Giới thiệu về phần cứng………3
2.1 Nguyên lý của các module phần cứng.….……….3
2.2 Các ngoại vi của STM32 cần sử dụng……….……….……11
2.3 Sơ đồ ghép nối giữa STM32 và module phần cứng.……….……15
2.4 Lưu đồ thuật toán giao tiếp giữa STM32 và các module.……….…15
3 Thiết kế phần mềm……….……….18
3.1 Phân tích yêu cầu xử lý để đảm bảo tính thời gian thực……… 18
3.2 Thiết kế bộ lập lịch với chu kỳ lặp lại khác nhau 18
3.3 Lập trình đa nhiệm………19
4 Kết quả và đánh giá……… ……22
4.1 Các kết quả đạt được 22
4.2 Đánh giá kết quả 23
4.3 Thống kê công việc và mức độ đóng góp của thành viên……… 23
Trang 31 Yêu cầu bài tập lớn
Lập trình VĐK STM32 giao tiếp với cảm biến khí GAS, cảm biến nhiệt độ
độ ẩm, hiện thị LCD và truyền thông số lên máy tính Cài đặt bộ lập lịch từ máy tính
2 Giới thiệu phần cứng
2.1 Nguyên lý của các module phần cứng
2.1.1 Board STM32F103C8T6
Giới thiệu tổng quan
- STM32F103C8T6 là vi điều khiển 32bit, thuộc họ F1 của dòng chip STM32 hãng
Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ
được lưu trữ khi mất nguồn cấp chính
- 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ
- DMA:
Có hỗ trợ DMA cho ADC, UART, I2C, SPI
- 7 bộ Timer:
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:
Trang 42 bộ I2C
2 SPI
- Kiểm tra lỗi CRC và 96-bit ID
Giới thiệu về kit STM32F103C8T6
Kit phát triển STM32F103C8T6 Blue Pill ARM Cortex-M3 là loại được sử dụng
để nghiên cứu về ARM nhiều nhất hiện nay
Các thông số kĩ thuật:
Trang 5• Đ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
Cảm biến khí gas MQ-2 là cảm biến khí có độ nhạy cao với LPG, Propane và Hydrogen, mê-tan (CH4) và hơi dễ bắt lửa khác, với chi phí thấp và phù hợp cho các ứng dụng khác nhau
Cảm biến xuất ra cả hai dạng tín hiệu là Analog và Digital, tín hiệu Digital có thể điều chỉnh mức báo bằng biến trở
THÔNG SỐ KỸ THUẬT
Trang 6• Dòng sử dụng: 2.5mA max (khi truyền dữ liệu)
• Đo tốt ở độ ẩm 0 to 100%RH với sai số ±2%
• Đo tốt ở nhiệt độ -40 to 80°C sai số ±0.5°C
• Tần số lấy mẫu tối đa 0.5Hz (2 giây 1 lần)
• Kích thước 27mm x 59mm x 13.5mm (1.05" x 2.32" x 0.53")
Cấu tạo:
• Cảm biến nhiệt độ và độ ẩm kỹ thuật số DHT11 bao gồm cảm biến độ
ẩm điện dung và cảm biến nhiệt độ NTC (hoặc nhiệt điện trở) và một
IC ở phía sau của cảm biến
Trang 7• Để đo độ ẩm, họ sử dụng thành phần cảm biến độ ẩm có hai điện cực với chất giữ ẩm giữa chúng Vì vậy, khi độ ẩm thay đổi, độ dẫn của chất nền thay đổi hoặc điện trở giữa các điện cực này thay đổi Sự thay đổi điện trở này được đo và xử lý bởi IC khiến cho vi điều khiển luôn sẵn sàng để đọc.
Mặt khác, để đo nhiệt độ, các cảm biến này sử dụng cảm biến nhiệt độ NTC hoặc nhiệt điện trở
Một nhiệt điện trở thực sự là một điện trở thay đổi điện trở của nó với sự thay đổi của nhiệt độ Những cảm biến này được chế tạo bằng cách thiêu kết các vật liệu bán dẫn như gốm hoặc polyme để cung cấp những thay đổi lớn hơn trong điện trở chỉ với những thay đổi nhỏ về nhiệt độ Thuật ngữ có tên
là “NTC” có nghĩa là hệ số nhiệt độ âm, có nghĩa là điện trở giảm khi nhiệt
độ tăng
Nguyên lý hoạt động:
Trang 8• Nhận tín hiệu từ VĐK (Request)
• Thực hiện qua trình truyền 40 bit dữ liệu
DHT11 sẽ trả giá trị nhiệt độ và độ ẩm về dưới dạng 5 byte Trong đó:
+ Byte 1: giá trị phần nguyên của độ ẩm (RH%)
+ Byte 2: giá trị phần thập phân của độ ẩm (RH%)
+ Byte 3: giá trị phần nguyên của nhiệt độ (TC)
+ Byte 4 : giá trị phần thập phân của nhiệt độ (TC)
+ Byte 5 : kiểm tra tổng.(checksum)
Nếu Byte 5 = (8 bit) (Byte1 +Byte2 +Byte3 + Byte4) thì giá trị độ ẩm và nhiệt độ là chính xác, nếu sai thì kết quả đo không có nghĩa
Nó sẽ dựa vào thời gian để xác định truyền ra bit 0 hoặc là bit 1
Trang 9Sau khi tín hiệu được đưa về 0, ta đợi chân DATA của MCU được DHT11 kéo lên
1 Nếu chân DATA là 1 trong khoảng 26-28 us thì là bit 0, còn nếu tồn tại 70us là bit 1 Do đó trong lập trình ta bắt sườn lên của chân DATA, sau đó delay 40us Nếu giá trị đo được là 0 thì ta đọc được bit 0, nếu giá trị đo được là 1 thì ta đọc được là bit 1 Cứ như thế ta đọc các bit tiếp theo
2.2.4 Màn hình hiển thị LCD
Khối hiển thị LCD 2x16 (2 dòng, 16 cột)
Chức năng của từng chân LCD 1602:
- 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 - VEE : điều chỉnh độ tương phản của LCD, sử dụng một biến trở 10K
- Chân số 4 - RS : chân chọn thanh ghi, được nối với logic "0" hoặc logic "1": + 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)
+ Logic “1”: Bus DB0 - DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD
Trang 10- 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 DB0-DB7, 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:
+ Ở 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
+ Ở 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
- 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 MCU 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
Chỉ dùng LCD để hiển thị (Write) nên chân RW được nối mass
2.2.5 Module chuyển đổi USB to UART PL2303
Trang 11Thông số kỹ thuật:
không sử dụng để cấp nguồn, thường chỉ sử dụng để thiết đặt mức tín hiệu Logic
nhận RX của các module sử dụng mức tín hiệu TTL 3.3~5VDC
nhận TX của các module sử dụng mức tín hiệu TTL 3.3~5VDC
STM32 GPIO bao gồm nhiều Port, mỗi Port có tối đa 16 chân
STM32 GPIO bao gồm 2 khối cơ bản:
• Input Driver: Bao gồm thanh ghi Input Data (IDR), và 1 trigger Tín hiệu Input ngoài việc được ghi vào IDR còn theo các đường Analog
Trang 12để 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 output control để 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
Chức năng của STM32 GPIO bao gồm:
Input:
• Input pull up: Đầu vào có trở kéo lên (điện áp mặc định trên chân là Vcc)
• Input pull down: Đầu vào có trở kéo xuống (điện áp mặc định trên chân là 0V)
• Input floating: Đầu vào thả nổi, điện áp không cố định dao động từ 0V tới Vcc
• Analog: Đầu vào tương tự, dùng để đo ADC
• Alternate function Push Pull: Đầu ra kểu đẩy kéo sử dụng trong các ngoại vi
• Alternate function Open Drain: Đầu ra dạng cực máng hở, sử dụng trong các ngoại vi (thường gặp trong I2C)
2.2.2 ADC
ADC Analog to Digital Convert là bộ chuyển đôi tương tự sang số Đại lượng tương tự là Điện áp Vin được so sánh với điện áp mẫu Vref (giá trị lớn nhất), sau
đó được chuyển đổi thành số lưu vào thanh ghi DATA của bộ chuyển đổi đó
Các chức năng chính của ADC trong STM32
• Độ phân giải 12Bit
Trang 13• Sinh ra ngắt tại các sự kiện End of convert, End of Injected, Analog Watchdog
• Chế độ Single hoặc Continuous
• Chế độ Scan tự động quét từ Kênh 0 đến Kênh n (mỗi bộ có 10 kênh tối đa)
• Có cơ chế cân chỉnh tay
• Data Alignment (Căn chỉnh Data) căn trái hoặc căn phải
• Cài đặt thời gian chuyển đổi đến từng Kênh
• Có thể kích hoạt bằng xung bên ngoài
• Chế độ Dual mode sử dụng cùng lúc 2 hoặc nhiều bộ ADC
Sau đó là định dạng gói tin
Định dạng gói tin như sau:
Trang 14-Start Bit: Start-bit còn được gọi là bit đồng bộ hóa được đặt trước dữ liệu thực tế Nói chung, một đường truyền dữ liệu không hoạt động được điều khiển ở mức điện
áp cao Để bắt đầu truyền dữ liệu, truyền UART kéo đường dữ liệu từ mức điện áp cao (1) xuống mức điện áp thấp (0) UART thu được thông báo sự chuyển đổi này
từ mức cao sang mức thấp qua đường dữ liệu cũng như bắt đầu hiểu dữ liệu thực Nói chung, chỉ có một start-bit
-Stop Bit: Bit dừng được đặt ở phần cuối của gói dữ liệu Thông thường, bit này dài 2 bit nhưng thường chỉ sử dụng 1 bit Để dừng sóng, UART giữ đường dữ liệu
ở mức điện áp cao
-Partity Bit: Bit chẵn lẻ cho phép người nhận đảm bảo liệu dữ liệu được thu thập có đúng hay không Đây là một hệ thống kiểm tra lỗi cấp thấp & bit chẵn lẻ có sẵn trong hai phạm vi như Chẵn lẻ – chẵn lẻ cũng như Chẵn lẻ – lẻ Trên thực tế, bit này không được sử dụng rộng rãi nên không bắt buộc
-Data frame: Các bit dữ liệu bao gồm dữ liệu thực được truyền từ người gửi đến người nhận Độ dài khung dữ liệu có thể nằm trong khoảng 5 & 8 Nếu bit chẵn lẻ không được sử dụng thì chiều dài khung dữ liệu có thể dài 9 bit Nói chung, LSB của dữ liệu được truyền trước tiên sau đó nó rất hữu ích cho việc truyền
2.2.4 Timer
Trong STM32F103C8 có 4 bộ Timer trong đó:
• Timer 1: Là bộ Advanced – control Timer hay là bộ Timer điều khiển nâng cao, có nhiều chức năng nhất
• 3 bộ Timer chung là Timer 2,3,4 Có chức năng tương tự nhau và độc lập với nhau
Chế độ Timer-Base unit là chế độ chính của Timer bao gồm các chế độ đếm: lên, xuống hoặc cả lên lên và xuống
Xung Clock được chia bởi bộ chia tần Prescaler để lấy thời gian thích hợp đếm 1 lần
Các thanh ghi quản lý bao gồm:
Trang 15• Counter Register (TIMx_CNT): lưu giá trị đếm
• Prescaler Register (TIMx_PSC): lưu giá trị chia từ tần số cơ sở cấp cho Timer để tạo ra tần số thích hợp
• Auto-Reload Registor(TIMx_ARR): lưu giá trị đích đếm lên hoặc đếm xuống
Thanh ghi Auto-Reload sẽ được nạp trước khi Timer hoạt động và có thể nạp trong
khi Timer hoạt động, trước khi một sự kiện cập nhật xảy ra (UEV)
Chế độ đếm sẽ được hoạt động khi Bit CEN của thanh ghi TIMx_CR1 được bật
2.3 Sơ đồ ghép nối giữa STM32 và module phần cứng
2.4 Lưu đồ thuật toán giao tiếp giữa STM32 và các module
Trang 162.4.1 Giao tiếp với cảm biến nhiệt độ độ ẩm DHT11
Trang 172.4.2 Giao tiếp với cảm biến khí GAS MQ2
2.4.3 Giao tiếp với màn hình LCD 1602
Trang 183 Thiết kế phần mềm
3.1 Phân tích yêu cầu xử lý để đảm bảo tính thời gian thực
- Đối với đại lượng đo là khí Gas: việc rò rỉ khí Gas là rất nguy hiểm do đó cần đo và hiển thị nồng độ Gas một cách liên tục, thời gian lấy mẫu tính bằng đơn vị là giây
- Đối với đại lượng đo là nhiệt độ và độ ẩm môi trường: thay đổi chậm do đó thời gian lấy mẫu không cần thiết phải nhanh, khoảng 1 giờ lấy mẫu một lần
3.2 Thiết kế bộ lập lịch với chu kỳ lặp lại khác nhau
T1: đo và hiển thị nồng độ khí Gas lên màn hình LCD và máy tính
T2: đo và hiển thị giá trị nhiệt độ, độ ẩm lên màn hình LCD và máy tính t(k) có thể được set từ máy tính
Xây dựng chương trình: khi thực hiện xong một task T(k), VĐK sẽ đi vào chế độ ngủ, sử dụng một ngắt timer có nhiệm vụ đánh thức VĐK dậy để thực hiện task tiếp theo sau một khoảng thời gian có thể được thiết lập từ máy tính bằng việc dùng ngắt nhận UART Sau đó, VĐK lại đi vào chế
độ ngủ và chương trình tiếp tục lặp lại như vậy
Trang 193.3 Lập trình đa nhiệm
Phân tích bài toán: Đọc cảm biến nhiệt độ, cảm biến gas với chu kì khác nhau (có thể thay đổi chu kì thông qua UART) và in kết quả ra LCD16x02 và truyền qua UART
Với yêu cầu bài toán như trên nhóm chia thành các task với mức ưu tiên như sau:
• DHT task (cảm biến nhiệt độ): mức 3
• ADC task (cảm biến gas): mức 3
• LCD task (in ra lcd): mức 2
• MENU task (menu chọn các mode trên terminal): mức 1
• Change dht’period task (thay đổi chu kì đọc dht): mức 1
• Change adc’period task(thay đổi chu kì đọc adc): mức 1
• Print task (in ra terminal): mức 1
• Cmd task (xử lí yêu cầu gửi từ menu task): mức 1
Giải thích thiết kế chương trình và các kỹ thuật sử dụng trong lập trình RTOS:
- Dht task và adc task:
Do yêu cầu đọc cảm biến cần chính xác về thời gian và xét trong bài toán thực tế việc theo dõi cảm biến khí gas và nhiệt độ rất quan trọng nên nhóm em sử dụng mức ưu tiên là 3 (cao nhất)
Tuy nhiên do cảm biến dht cần chính xác về thời gian đọc do đó không thể có task khác được chen vào cho đến khi đọc xong cảm biến Hai task
“dht và adc” có cùng mức ưu tiên nên sẽ xảy ra việc “dht” đọc chưa xong
“adc” lại chen vào Do đó nhóm em sử dụng khóa “binary semaphore” để giải quyết vấn đề trên, khi nào thực hiện xong task mới trả khóa để task kia thực hiện
- Menu task, Change dht’period task, Change adc’period task, print task Nhiệm vụ của các task này là thay đổi chu kì đọc các cảm biến và in giá trị ra màn hình Nhiệm vụ không quan trọng để mức ưu tiên là 1
Các task này khi chạy sẽ in ra màn hình các cửa sổ sau
Trang 20xTaskNotifyWait() (cơ chế Task notifications) Trong API này có tham
số “uint32_t *pulNotification Value” thông qua tham số này ta có thể biết được giá trị mà người dùng gửi về từ terminal Có nghĩa là khi có giá trị gửi về task sẽ được thông báo để chạy và task cũng sẽ lấy được giá trị này Cụ thể trong bài toán là các lựa chọn khi ở Menu task hay giá trị chu
kì ở change dht, adc task
- Cmd task:
Khi chúng ta nhập kí tự ở terminal để truyền về thì sử dụng hàm cơ chế ngắt của USART và hàm HAL_UART_RxCpltCallback() để xử lí lưu trữ các kí tự gửi về
Với mục đích học tập nhóm em sử dụng hàng đợi (10 phần tử, phần tử có kích thước 1 byte (char) ) Do đó khi phát hiện kí tự ‘\n’ có nghĩa là người dùng ấn enter thì gửi tín hiệu đến “Cmd task” để task này thực thi (cmd task cũng sẽ bị block để đợi tín hiệu)
Trong “Cmd task” chúng ta sẽ đọc các giá trị trong hàng đợi, sử dụng xQueueReceive(), sau đó kiểm tra cửa sổ hiện tại để biết lệnh sẽ được sử dụng ở cửa sổ nào (chúng ta có 3 cửa sổ: menu, change dht’period, change adc’period)
Nhắc lại các task: menu, change dht’period, change adc’period đang bị block để đợi lệnh nên sau khi cmd task lấy được lệnh từ hàng đợi và biết được cửa sổ hiện tại sẽ gửi tín hiệu đến cửa sổ tương ứng Sử dụng API
Trang 21xTaskNotify(), trong API này ta sẽ gửi kèm giá trị mà người dùng đã nhập để các task nhận được sẽ xử lí tiếp
Đó là cơ bản về hoạt động của các task, thêm nữa còn một vấn đề về việc
sử dụng tài nguyên chung: thanh ghi USART_DR khi truyền dữ liệu qua uart mà các task sử dụng
Các task:
• menu task, print task, change dht’period task, change adc’period task:
sử dụng thanh ghi USART_DR và có mức ưu tiên 1
• adc task: sử dụng thanh ghi USART_DR (in cảnh báo khi nồng độ gas nguy hiểm) và có mức ưu tiên 3
ở đây, để tránh xung đột việc sử dụng, cụ thể là adc task cướp mất quyền
sử dụng thanh ghi USART_DR của các task có mức ưu tiên thấp hơn có thể gây ra sai thông tin cần truyền Do đó sử dụng kỹ thuật Mutex, cũng hoạt động như 1 cái khóa giống “Binary semaphore”
Tuy nhiên nếu trong trường hợp các task có mức ưu tiên thấp chưa trả khóa thì rõ ràng task có mức ưu tiên cao sẽ không thể thực hiện cảnh báo Trong bài toán “LCD task” có mức ưu tiên 2, rõ ràng khi task này cướp mất quyền thực thi trên CPU của các task có mức ưu tiên 1 thì mức ưu tiên 1 sẽ phải đợi đến khi “LCD task thực hiện xong” mới có thể trả khóa cho task có mức ưu tiên 3 sử dụng Vấn đề ở đây là task có mức ưu tiên lại bị trễ phải phụ thuộc mức ưu tiên thấp hơn
Kỹ thuật Mutex sẽ giải quyết vấn đề này, khi xảy ra hiện tượng trên, sẽ tạm thời chuyển mức ưu tiên của task có mức ưu tiên 1 lên cao nhất cụ thể là 3, đợi trả khóa rồi đưa lại về mức ưu tiên ban đầu