Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
5,18 MB
Nội dung
Học viện Cơng nghệ Bưu Viễn Thơng Ngành Cơng Nghệ Thông Tin _o0o _ Báo Cáo Bài Tập Lớn Chủ đề : Sử dụng STM32 để thực đọc giá trị cảm biến nhiệt độ độ ẩm Môn học: Vi xử lý Hoàng Trung Hiếu - B21DCCN353 Văn Ngọc Long – B21DCDT139 Đào Quang Hưng - B21DCVT219 Giảng viên hướng dẫn: Vũ Hoài Nam Hà Nội, năm 2023 I LINH KIỆN CẦN THIẾT LÀM MẠCH CẢM BIẾN DHT11 GIAO TIẾP STM32 1.1 VI ĐIỀU KHIỂN STM TRONG MẠCH CẢM BIẾN DHT11 GIAO TIẾP STM32 1.1.1 GIỚI THIỆU 1.1.2 SƠ LƯỢC VỀ STM32: .4 1.1.3.THÔNG SỐ KỸ THUẬT STM32 .5 1.1.4 CẤU HÌNH 1.1.5.BỘ NHỚ .7 1.2 CẢM BIẾN DHT11 GIAO TIẾP STM32 1.2.1 GIỚI THIỆU DHT11 GIAO TIẾP STM32 .7 1.2.2 THÔNG SỐ KỸ THUẬT DHT11 GIAO TIẾP STM32 1.3 OLED CHO CẢM BIẾN DHT11 GIAO TIẾP STM32 1.3.1 GIỚI THIỆU 1.3.2 THÔNG SỐ KỸ THUẬT II CÁCH SỬ DỤNG DHT11 SENSOR 10 III CÁCH NỐI DÂY 11 IV GIẢI THÍCH PHẦN MỀM 11 4.1 Cài đặt stm32cubeide: 11 4.2 Lập trình stm32: .13 4.2.1 Các thư viện/ mã nguồn mở: 13 4.2.2 Mã ngôn ngữ C: .13 4.2.3 Giải thích hàm: 18 I LINH KIỆN CẦN THIẾT LÀM MẠCH CẢM BIẾN DHT11 GIAO TIẾP STM32 1.1 VI ĐIỀU KHIỂN STM TRONG MẠCH CẢM BIẾN DHT11 GIAO TIẾP STM32 1.1.1 GIỚI THIỆU STM32 dòng chip phổ biến ST với nhiều họ thông dụng F0,F1,F2,F3,F4… Stm32f103 thuộc họ F1 với lõi ARM COTEX M3 STM32F103 vi điều khiển 32 bit, tốc độ tối đa 72Mhz Giá thành rẻ so với loại vi điều khiển có chức tương tự Mạch nạp công cụ lập trình đa dạng 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 ứng dụng thông thường, thiết bị cầm tay thuốc, máy tính thiết bị ngoại vi chơi game, GPS bản, ứng dụng 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ó nhiều trình biên dịch cho STM32 IAR Embedded Workbench, Keil C… Ở sử dụng Keil C nên viết sau đề cập đến Keil C 1.1.2 SƠ LƯỢC VỀ STM32: cổng Mini USB dùng để cấp nguồn, nạp debug MCU bao gồm MCU nạp MCU dùng để lập trình Có chân Output riêng cho chân mạch nạp MCU1 Có chân Output đầy đủ cho chân MCU2 Chân cấp nguồn ngồi riêng cho MCU2 khơng sử dụng nguồn từ USB Thạch anh 32,768khz dùng cho RTC Backup Chân nạp dùng cho chế độ nạp boot loader Nút Reset led hiển thị chân PB9, led báo nguồn cho MCU2 1.1.3.THÔNG SỐ KỸ THUẬT STM32 Vi điều khiển: STM32F103C8T6 Điện áp cấp 5VDC qua cổng Micro USB chuyển đổi thành 3.3VDC qua IC nguồn cấp cho Vi điều khiển Tích hợp sẵn thạch anh 8Mhz Tích hợp sẵn thạnh anh 32Khz cho ứng dụng RTC Ra chân đầy đủ tất GPIO 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 mạch nạp: ST-Link Mini J-link USB TO COM Kết nối chân nạp ST-Link Mini Nạp theo chuẩn SWD TCK — SWCLK TMS — SWDIO GND — GND 3.3V — 3.3V 1.1.4 CẤU HÌNH ARM 32-bit Cortex M3 với clock max 72Mhz Bộ nhớ: 64 kbytes nhớ Flash(bộ nhớ lập trình) 20kbytes SRAM Clock, reset quản lý nguồn Điện áp hoạt động 2.0V -> 3.6V Power on reset(POR), Power down reset(PDR) programmable voltage detector (PVD) Sử dụng thạch anh từ 4Mhz -> 20Mhz Thạch anh nội dùng dao động RC mode 8Mhz 40khz Sử dụng thạch anh 32.768khz sử dụng cho RTC Trong trường hợp điện áp thấp: Có mode :ngủ, ngừng hoạt động hoạt động chế độ chờ Cấp nguồn chân Vbat pin để hoạt động RTC sử dụng lưu trữ data nguồn cấp ADC 12 bit với kênh cho Khoảng giá trị chuyển đổi từ – 3.6V Lấy mẫu nhiều kênh kênh Có cảm biến nhiệt độ nội DMA: chuyển đổi giúp tăng tốc độ xử lý khơng có can thiệp sâu CPU kênh DMA Hỗ trợ DMA cho ADC, I2C, SPI, UART timer timer 16 bit hỗ trợ mode IC/OC/PWM timer 16 bit hỗ trợ để điều khiển động với mode bảo vệ ngắt input, dead-time watdog timer dùng để bảo vệ kiểm tra lỗi sysTick timer 24 bit đếm xuống dùng cho ứng dụng hàm Delay… Hỗ trợ kênh giao tiếp bao gồm: I2C(SMBus/PMBus) USART(ISO 7816 interface, LIN, IrDA capability, modem control) SPIs (18 Mbit/s) CAN interface (2.0B Active) USB 2.0 full-speed interface Kiểm tra lỗi CRC 96-bit ID 1.1.5.BỘ NHỚ Vi điều khiển ATmega328: 64 KB nhớ Plash: bootloader chiếm 0.5KB 20 KB cho SRAM: (Static Random Access Menory): giá trị biến khai báo lưu Khai báo nhiều biến tốn nhiều nhớ RAM Khi nguồn liệu SRAM bị KB cho EEPROM: (Electrically Eraseble Programmable Read Only Memory): Là nơi đọc ghi liệu vào không bị liệu nguồn 1.2 CẢM BIẾN DHT11 GIAO TIẾP STM32 1.2.1 GIỚI THIỆU DHT11 GIAO TIẾP STM32 Document continues below Discover more from: Kỹ thuật vi xử lý Học viện Công ng… 113 documents Go to course TÀI LIỆU THI TÍN 39 HIỆUHỆ THỐNG Cảm biến độ ẩm nhiệt độ DHT11 cảm biến rấtKỹ thông dụng thuật vi 100% (9) xử(giao lý tiếp digital chi phí rẻ dễ lấy liệu thông qua giao tiếp wire dây truyền liệu nhất) Bộ tiền xử lý tín hiệu tích hợp cảm biến giúp bạn có liệu xác mà khơng phải qua tính tốn So với Giao trinh cảm biến đời DHT22 DHT11 cho khoảng đo độ chínhKythuat xác Vixuly nhiều 143 Kỹ thuật vi xử lý 100% (4) KTS2013 - Bài giảng 146 kỹ thuật số ptithcm Kỹ thuật vi xử lý 100% (3) Tiểu luận KTCT maclenin Cảm biến nhiệt độ, độ ẩm DHT11 11 Kỹ thuật vi 1.2.2 THÔNG SỐ KỸ THUẬT DHT11 GIAO TIẾP STM32 xử lý Nguồn: -> VDC 100% (2) Dòng sử dụng: 2.5mA max (khi truyền liệu) BÀI TẬP TÌNH HUỐNG Đo tốt độ ẩm 2080%RH với sai số 5% MÔN KỸ NĂNG LÀM… Đo tốt nhiệt độ to 50°C sai số ±2°C Tần số lấy mẫu tối đa 1Hz (1 giây lần) Kỹ thuật vi Kích thước 15mm x 12mm x 5.5mm xử lý chân, khoảng cách chân 0.1” 71% (14) 1.3 OLED CHO CẢM BIẾN DHT11 GIAO TIẾP STM32 1.3.1 GIỚI THIỆU Sách hướng dẫn học tập vật lý đại cươn… Màn hình Oled 1.3 inch giao tiếp I2C cho khả60 hiển thị đẹp, sang Kỹ thuật vi mức chi trọng, rõ nét vào ban ngày khả tiết kiệm lượng tối đa với 100% (1) xử lý phí phù hợp, hình sử dụng giao tiếp I2C cho chất lượng đường truyền ổn định dễ giao tiếp với chân GPIO Màn hình OLED SH1106 với kích thước 1.3 inch, cho khả hiển thị hình ảnh tốt với khung hình 128×64 pixel Ngồi ra, hình cịn tương thích với hầu hết vi điều khiển thông qua giao tiếp SPI Màn hình sử dụng driver SH1106 thiết kế nhỏ gọn giúp bạn phát triển sản phẩm DIY ứng dụng khác cách nhanh chóng Màn hình Oled chuẩn truyền I2C 1.3.2 THÔNG SỐ KỸ THUẬT Điện áp sử dụng: 2.2~5.5VDC Cơng suất tiêu thụ: 0.04w Góc hiển thị: lớn 160 độ Số điểm hiển thị: 128×64 điểm Độ rộng hình: 1.3 inch Màu hiển thị: Trắng / Xanh Dương Giao tiếp: I2C SPI tùy loại Driver: SH1106 Kích thước 1.3 inch (128x64px) Góc nhìn tối đa: 160° Nhiệt độ làm việc: -30°V đến 80°C Tương thích với hầu hết board như: Arduino, ESP8266, ESP32, STM32, II CÁCH SỬ DỤNG DHT11 SENSOR Định dạng liệu dây sử dụng để giao tiếp đồng hóa MCU cảm biến DHT11 Một quy trình giao tiếp kéo dài khoảng 4ms Dữ liệu bao gồm phần thập phân phần nguyên Một chuỗi liệu hoàn chỉnh 40 bit, cảm biến gửi bit liệu cao trước Định dạng liệu: bit phần nguyên RH + bit phần thập phân RH + bit phần nguyên T + bit phần thập phân T + bit checksum Nếu truyền liệu đúng, checksum bit cuối "8 bit phần nguyên RH + bit phần thập phân RH + bit phần nguyên T + bit phần thập phân T" 2.1 Quy trình Giao tiếp Tồn diện (Hình 2, đây) Khi MCU gửi tín hiệu bắt đầu, DHT11 chuyển từ chế độ tiêu thụ điện thấp sang chế độ chạy, đợi MCU hồn thành tín hiệu bắt đầu Ngay hồn thành, DHT11 gửi tín hiệu phản hồi 40 bit liệu bao gồm thông tin độ ẩm tương đối nhiệt độ cho MCU Người dùng chọn thu thập (đọc) số liệu Nếu khơng có tín hiệu MCU, DHT11 khơng phản hồi tín hiệu cho MCU Ngay sau liệu thu thập, DHT11 chuyển sang chế độ tiêu thụ điện thấp nhận tín hiệu MCU lại 2.2 MCU Gửi Tín Hiệu Bắt Đầu đến DHT (Hình 3, đây) Trạng thái tự Dữ liệu Single-bus mức điện áp cao Khi giao tiếp MCU DHT11 bắt đầu, chương trình MCU đặt mức điện áp Dữ liệu Single-bus từ cao xuống thấp q trình phải 18ms để đảm bảo DHT phát tín hiệu MCU, sau MCU kéo lên điện áp đợi 20-40us để đợi phản hồi từ DHT 2.3 DHT Phản Hồi đến MCU (Hình 3, trên) Khi DHT phát tín hiệu bắt đầu, gửi tín hiệu phản hồi mức điện áp thấp, kéo dài 80us Sau đó, chương trình DHT đặt mức điện áp Dữ liệu Single-bus từ thấp lên cao giữ 80us để DHT chuẩn bị gửi liệu Khi DATA Single-Bus mức điện áp thấp, điều có nghĩa DHT gửi tín hiệu phản hồi Ngay sau DHT gửi tín hiệu phản hồi, kéo lên điện áp giữ 80us để chuẩn bị cho truyền liệu Khi DHT gửi liệu cho MCU, bit liệu bắt đầu với mức điện áp thấp 50us độ dài tín hiệu mức điện áp cao xác định xem bit liệu "0" hay "1" (xem Hình đây) III CÁCH NỐI DÂY Nối đầu B7 với đầu SDA Nối đầu B6 với đầu SLC Nối đầu G với đầu âm DHT11 đầu GND Nối đầu 3.3 với đầu dương DHT11 đầu VCC Nối đầu B9 với đầu out DHT11 IV GIẢI THÍCH PHẦN MỀM 4.1 Cài đặt stm32cubeide: 4.1.1 Trong RCC chọn High Speed Clock (HSE) to Crystal/Ceramic Resonator: - RCC (Reset and Clock Control) cung cấp cài đặt liên quan đến nguồn xung clock tham số đồng hồ khác vi điều khiển - "HSE" cài đặt đề cập đến "High-Speed External" (bên tốc độ cao), nguồn xung clock sử dụng bên ngồi vi điều khiển từ tinh thể (crystal) kích thích rung (ceramic resonator) để cung cấp xung clock cho vi điều khiển - chọn "High Speed Clock (HSE) to Crystal/Ceramic Resonator" cài đặt vi điều khiển để cấu hình vi điều khiển sử dụng tinh thể ceramic resonator nguồn xung clock cho hệ thống 4.1.2 Trong Clock Configuration tab chọn HCLK (MHz) 72: - HCLK (High-Speed Bus Clock) tro ng bus vi điều khiển STM32 Nó cung cấp tín hiệu clock cho nhiều phần khác vi điều khiển, bao gồm CPU, bus định hướng, nhớ, module ngoại vi chức khác - cấu hình HCLK lên 72MHz để đáp ứng nhu cầu xử lý tốc độ cao 4.1.3 Trong Pinout and Configuration tab chọn Timer → TIM1 →Clock Source set to Internal Clock: "Clock Source set to Internal Clock" đề cập đến việc thiết lập nguồn xung clock cho Timer nguồn xung clock nội (internal clock) vi điều khiển Điều có nghĩa Timer sử dụng tín hiệu xung clock tạo sinh xung nội vi điều khiển, không phụ thuộc vào nguồn xung clock ngoại vi (ví dụ tinh thể nguồn clock ngoại khác) 4.1.4 Configuration → Parameter Settings → Prescaler set to 71: - Trong vi điều khiển STM32, Prescaler (bộ chia tần số) thường sử dụng để chia tần số clock đầu vào chức Timer (bộ đếm thời gian) Việc giúp thay đổi tốc độ đếm đếm thời gian - Khi Prescaler thiết lập thành 71, chia tần số đầu vào Timer tỉ lệ 1:71 trước Timer bắt đầu đếm Điều có nghĩa số xung clock từ nguồn đầu vào chia nhỏ 71 lần trước sử dụng để đếm Khi Prescaler thiết lập thành 71, chia tần số đầu vào Timer tỉ lệ 1:71 trước Timer bắt đầu đếm Điều có nghĩa số xung clock từ nguồn đầu vào chia nhỏ 71 lần trước sử dụng để đếm Ví dụ, tần số nguồn đầu vào Timer MHz bạn đặt Prescaler 71, thay Timer đếm theo tần số MHz, đếm với tần số MHz / 71 ≈ 14.08 kHz 4.1.5 Set PB9 GPIO_Output:thiết lập chân GPIO có mã PB9 vi điều khiển STM32 thành chế độ đầu (Output) 4.1.6 Chọn connectivity > I2C1 > For I2C select I2C: lựa chọn để cấu hình I2C1 để hoạt động với giao thức I2C 4.1.7 Trong Configuration > Parameter Settings > For I2C speed select Fast Mode: Giao thức I2C hoạt động nhiều tốc độ khác nhau, tốc độ phổ biến "Fast Mode" Fast Mode I2C có tốc độ truyền liệu lên đến 400kHz 4.2 Lập trình stm32: 4.2.1 Các thư viện/ mã nguồn mở: - fonts: chứa thông tin font kích thước, ký tự ký hiệu định nghĩa dạng ma trận (bitmap) dùng cho hình - ssd1306: chứa mã nguồn (code) viết ngơn ngữ lập trình C để điều khiển tương tác với hình OLED thơng qua driver SSD1306 Trong file này, bạn tìm thấy hàm để gửi lệnh liệu tới hình, cấu hình hiển thị,vẽ hình ảnh ký tự lên hình, hàm điều khiển khác liên quan đến việc sử dụng hình OLED SSD1306 4.2.2 Mã ngôn ngữ C: /* USER CODE BEGIN Includes */ #include "fonts.h" #include "ssd1306.h" #include "stdio.h" /* USER CODE END Includes */ /* USER CODE BEGIN */ #define DHT11_PORT GPIOB #define DHT11_PIN GPIO_PIN_9 uint8_t RHI, RHD, TCI, TCD, SUM; uint32_t pMillis, cMillis; float tCelsius = 0; float tFahrenheit = 0; float RH = 0; uint8_t TFI = 0; uint8_t TFD = 0; char strCopy[15]; void microDelay (uint16_t delay) { HAL_TIM_SET_COUNTER(&htim1, 0); while ( HAL_TIM_GET_COUNTER(&htim1) < delay); } uint8_t DHT11_Start (void) { uint8_t Response = 0; GPIO_InitTypeDef GPIO_InitStructPrivate = {0}; GPIO_InitStructPrivate.Pin = DHT11_PIN; GPIO_InitStructPrivate.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStructPrivate.Pull = GPIO_NOPULL; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as output HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 0); // pull the pin low HAL_Delay(20); // wait for 20ms HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 1); // pull the pin high microDelay (30); // wait for 30us GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT; GPIO_InitStructPrivate.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as input microDelay (40); if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) { microDelay (80); if ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) Response = 1; } pMillis = HAL_GetTick(); cMillis = HAL_GetTick(); while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + > cMillis) { cMillis = HAL_GetTick(); } return Response; } uint8_t DHT11_Read (void) { uint8_t a,b; for (a=0;a cMillis) { // wait for the pin to go high cMillis = HAL_GetTick(); } microDelay (40); // wait for 40 us if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) // if the pin is low b&= ~(1