1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32

156 460 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 156
Dung lượng 4,78 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trong phần này các bạn sẽ thực hành qua 9 bài tập cơ bản sau: • BÀI TẬP 1: CÀI ĐẶT CÔNG CỤ PHẦN MỀM. • BÀI TẬP 2: BẬT SÁNG LED KẾT NỐI VỚI GPIO. • BÀI TẬP 3: ĐỌC TRẠNG THÁI CHÂN GPIO. • BÀI TẬP 4: TẠO HÀM DELAY VỚI SYSTEM TIMER. • BÀI TẬP 5: GIAO DIỆN SPI. • BÀI TẬP 6: GIAO DIỆN I2C. • BÀI TẬP 7: THỰC HÀNH VỚI LCD 16X2. • BÀI TẬP 8: ĐIỀU KHIỂN ĐỘNG CƠ. 8.1: TỔNG QUAN CÁC LOẠI ĐỘNG CƠ 8.2: ĐIỀU KHIỂN ĐỘNG CƠ BƯỚC ĐƠN CỰC 8.3: ĐIỀU KHIỂN ĐỘNG CƠ SERVO VỚI STM32 • BÀI TẬP 9: GIAO TIẾP MÔ ĐUN BLUETOOTH VỚI STM32 Sau đây chúng ta lần lượt thưc hành với các hướng dẫn chi tiết trình bày trong mỗi bài tập.

Trang 1

PHỤ LỤC: BÀI TẬP THỰC HÀNH VỚI ARM

Chúng ta đã tìm hiểu lý thuyết về ARM qua chương 2 Còn nhiều chủ đề ARM mà người cần phải tìm hiểu khi đọc bất kỳ vi xử lý hay vi điều khiển nào như: Tổ chức bộ nhớ thanh ghi; Truyền thông ( giao tiếp UART); Điều khiển LED

ma trận; Oled; Ngắt trong STM32; Điều chế độ rộng xung Chỉ có bài tập mới giúp các bạn đọc hiểu rõ phần lý thuyết khô khan như đã trình bày

Trong phần này các bạn sẽ thực hành qua 9 bài tập cơ bản sau:

 BÀI TẬP 1: CÀI ĐẶT CÔNG CỤ PHẦN MỀM

 BÀI TẬP 2: BẬT SÁNG LED KẾT NỐI VỚI GPIO

 BÀI TẬP 3: ĐỌC TRẠNG THÁI CHÂN GPIO

 BÀI TẬP 4: TẠO HÀM DELAY VỚI SYSTEM TIMER

 BÀI TẬP 5: GIAO DIỆN SPI

 BÀI TẬP 6: GIAO DIỆN I2C

 BÀI TẬP 7: THỰC HÀNH VỚI LCD 16X2

 BÀI TẬP 8: ĐIỀU KHIỂN ĐỘNG CƠ

8.1: TỔNG QUAN CÁC LOẠI ĐỘNG CƠ

8.2: ĐIỀU KHIỂN ĐỘNG CƠ BƯỚC ĐƠN CỰC

8.3: ĐIỀU KHIỂN ĐỘNG CƠ SERVO VỚI STM32

 BÀI TẬP 9: GIAO TIẾP MÔ ĐUN BLUETOOTH VỚI STM32

Sau đây chúng ta lần lượt thưc hành với các hướng dẫn chi tiết trình bày trong mỗi bài tập

Trang 2

BÀI TẬP 1: CÀI ĐẶT CÔNG CỤ PHẦN MỀM 1.1 Thư viện STM32 LL

Thư viện STM32 LOW LEVEL (LL) là thư viện mới để lập trình sêri STM32 Thư viện LL cung cấp một lớp hướng tới chuyên gia với kích thước nhẹ và tốc độ nhanh, lớp này gần với phần cứng hơn so với thư viện lớp trừu tượng phần cứng (HAL) LL và HAL là bổ sung và bao gồm một loạt các yêu cầu ứng dụng

Bạn có thể trộn chương trình LL với chương trình HAL Bạn có thể chọn cách sử lý từng thiết bị ngoại vi, tức là với LL hoặc HAL

Ví dụ: bạn có thể sử dụng LL cho các thiết bị ngoại vi nhỏ gọn như GPIO hoặc UART và sử dụng HAL cho các thiết bị ngoại vi cần cấu hình phần mềm nặng như USB hoặc Ethernet Thư viện LL cũng có thể được sử dụng trong chế độ độc lập (không có thư viện HAL) Thư viện LL hoạt động bằng cách viết trực tiếp vào các thanh ghi ngoại vi, do đó chương trình hiệu quả và gọn hơn

Thư viện LL thay thế thư viện ngoại vi chuẩn (SPL), đã bị ngưng sử dụng bởi ST Mặt khác, thư viện HAL kém hiệu quả hơn thư viện LL, nhưng cho phép

di chuyển chương trình dễ dàng giữa các dòng STM32 khác nhau Cả LL và HAL đều có thể được tạo bằng cách sử dụng STM32cubeMX

1.2 STM32F103

STM32F103 là một bộ vi điều khiển

32 bit STMicroelectronics, dựa trên bộ xử

lý ARM cortex-M3 Tốc độ xung nhịp của

bộ xử lý lên tới 72 Mhz Nó có bộ nhớ

flash 64 Kbyte và 20 Kbyte SRAM Có

một số bo phát triển cho vi điều khiển này

có sẵn trên thị trường

Trang 3

Trong hướng dẫn này sử dụng bo phát triển STM32 Blue pill, như trong hình trang bên Nó có 40 chân phù hợp với một bảng mạch Nó có 2 ADC 12 bit, 7

bộ định thì (timer) và lên đến 9 giao diện truyền thông (3 x USART, 2 x I2C, 2 x SPI, 1 x CAN, 1 x USB)

Trang 4

BÀI TẬP 2: BẬT SÁNG LED KẾT NỐI VỚI GPIO 2.1 GIPO TRONG STM32F103

STM32F103 GPIO là các chân chung có thể được cấu hình làm đầu vào hoặc đầu ra Trong hướng dẫn này, tôi sẽ giải thích cách sử dụng STM32F103 GPIO để điều khiển bật/tắt đèn LED STM32F103 GPIO có thể được cấu hình ở 4 chế độ khác nhau (chế độ đầu vào, chế độ đầu ra, chế độ đầu vào tương tự và chế

độ chức năng thay thế) Để điều khiển bật / tắt đèn LED, chúng ta cần định cấu hình chân GPIO ở chế độ đầu ra

2.2 Chế độ đầu ra GPIO

Có 2 chế độ đầu ra cho GPIO, đầu ra mở cống và đầu ra đẩy-kéo Điện áp logic của STM32F103 GPIO là 3,3V, do đó điện áp đầu ra chân là 3,3V Đây là đặc điểm của chân GPIO khi nó được cấu hình ở chế độ đầu ra:

Hình 2.1 Đây là đặc điểm của chân gpio khi được cấu hình ở chế độ đầu ra

Trang 5

 Driver đầu ra được bật

 Trong chế độ thoát mở, “0” trong thanh ghi dữ liệu đầu ra sẽ kích hoạt N-MOS trong khi “1” trong thanh ghi dữ liệu đầu ra rời cổng ở trạng thái Hi-Z (P-MOS không bao giờ được kích hoạt ở chế độ thoát nước mở)

 Trong chế độ đẩy-kéo, “0” trong thanh ghi dữ liệu đầu ra sẽ kích hoạt N-MOS trong khi “1” trong thanh ghi dữ liệu đầu ra sẽ kích hoạt P-MOS

 Đầu vào kích hoạt schmitt được kích hoạt

 Điện trở kéo lên và kéo xuống yếu bị vô hiệu hóa

 Dữ liệu hiện diện trên chân GPIO được lấy mẫu vào thanh ghi dữ liệu đầu vào mỗi chu kỳ đồng hồ APB2

 Truy cập đọc vào thanh ghi dữ liệu đầu vào sẽ nhận được trạng thái GPIO ở chế

vì vậy, khi tôi ghi “0” vào thanh ghi dữ liệu đầu ra, N-MOS sẽ bật, do đó đèn LED

sẽ bật (dòng điện có thể chạy từ Vdd sang Vss thông qua đèn LED và điện trở) Khi tôi ghi “1” vào thanh ghi dữ liệu đầu ra, P-MOS sẽ bật, do đó đèn LED sẽ tắt (dòng điện không thể chạy từ Vdd sang Vdd)

Trang 6

2.4 CHƯƠNG TRÌNH VÍ DỤ

Để cấu hình PA0 ở chế độ đẩy-kéo đầu ra, chúng ta phải thực hiện các bước sau:

1 Bật đồng hồ ngoại vi cho GPIOA GPIOA được kết nối với bus APB2

2 Khởi tạo GPIOA bằng cách sử dụng cấu trúc GPIO_InitTypeDef

Đây là mã để làm cho đèn LED nhấp nháy

/* Toggle LED on PA0 */

// Reset bit will turn on LED (because the logic is interved)

Trang 7

Cũng có thể sử dụng chế độ xả mở đầu ra để điều khiển đèn LED Mạch LED cũng vậy Khi tôi ghi “0” vào thanh ghi dữ liệu đầu ra, N-MOS sẽ bật, do đó đèn LED sẽ bật (dòng điện có thể chạy từ Vdd sang Vss thông qua đèn LED và điện trở) Khi tôi ghi “1” vào thanh ghi dữ liệu đầu ra, PA0 ở trạng thái Hi-Z (dòng điện không thể chạy vì PA0 là Hi-Z / nổi), do đó đèn LED sẽ tắt

Trang 8

BÀI TẬP 3: ĐỌC TRANG THÁI CHÂN GPIO

Giải thích cách sử dụng STM32F103 GPIO để đọc một nút nhấn STM32F103 GPIO có thể được cấu hình ở 4 chế độ khác nhau (chế độ đầu vào, chế độ đầu ra, chế độ đầu vào tương tự và chế độ chức năng thay thế) Để đọc một nút, chúng ta cần định cấu hình chân GPIO ở chế độ đầu vào kỹ thuật số

3.1 Chế độ đầu vào GPIO

STM32F103 GPIO có 3 chế độ đầu vào kỹ thuật số: đầu vào với kéo lên bên trong, đầu vào với kéo xuống bên trong và đầu vào nổi Điện áp logic của STM32

là 3,3V, vì vậy điện áp logic cho các chân đầu vào GPIO cũng là 3,3V, nhưng có một số chân có khả năng chịu 5V Chúng ta có thể sử dụng mức logic 5V đến các chân đầu vào chịu được 5V này Bảng dưới đây cho thấy mức điện áp I / O trên các chân đầu vào STM32F103 Đặc điểm của chân GPIO khi nó được cấu hình ở chế độ đầu vào được thể hiện trong hình bên dưới

 Driver đầu ra bị tắt

Trang 9

 Đầu vào Trigger Schmitt được kích hoạt

 Điện trở kéo lên và kéo xuống yếu có được kích hoạt hay không tùy thuộc vào cấu hình đầu vào (kéo lên, kéo xuống hoặc thả nổi)

Đây là mạch nút cho hướng dẫn này

Tôi cũng thêm một đèn LED trong mạch này

chỉ để hiển thị trạng thái của nút (được nhấn

hay không) Đối với chế độ đầu vào GPIO,

tôi sử dụng chế độ đầu vào có kéo lên bên

Trang 10

{ // If button on PA1 is pressed (button circuit is active low)

if (!(GPIO_ReadInputData(GPIOA) & GPIO_Pin_1))

{ // Turn on LED on PA0 (LED circuit is active low)

Trang 11

Bạn có thể sử dụng các chế độ đầu vào GPIO khác, được nhập bằng cách kéo xuống bên trong hoặc đầu vào nổi

Đối với đầu vào nổi, bạn phải thêm một điện trở kéo lên hoặc kéo xuống bên ngoài Đây là mạch ví dụ cho đầu vào với kéo xuống bên trong và đầu vào nổi với kéo lên bên ngoài Khi bạn sử dụng điện trở kéo xuống, logic hoạt động ở mức cao (khi nhấn nút, logic trong thanh ghi dữ liệu đầu vào là “1”)

Hình 3.2 nguyên lý mạch nút nhấn

Trang 12

BÀI TẬP 4: TẠO HÀM DELAY VỚI SYSTEM TIMER

4.1 SYSTEM TIMER TRONG STM32F103

STM32F103 System Timer hay SysTick là một bộ đếm thời gian bên trong CPU SysTick là một đồng hồ đếm ngược cơ bản SysTick có thể được thăm dò bằng phần mềm hoặc có thể được cấu hình để tạo ra một ngắt Để sử dụng SysTick, chúng ta phải tải một giá trị vào thanh ghi giá trị tải lại

Chiều rộng của thanh ghi giá trị tải lại là 24-bit, vì vậy nó có thể đếm từ 0x00FFFFFF đến 0 Trong hướng dẫn này, tôi sẽ giải thích cách sử dụng SysTick

để tạo hàm trì hoãn SysTick có thể được cấu hình thông qua các thanh ghi bên dưới

Để dễ dàng cấu hình SysTick, chúng ta có thể sử dụng hàm SysTick_Config ()

Hàm này được định nghĩa trong core_cm3.h Hàm này sẽ khởi tạo SysTick và ngắt của nó, sau đó khởi động SysTick Bộ đếm đang ở chế độ chạy tự do để tạo ra các ngắt định kỳ Tham số đầu vào của hàm này là số lần đánh dấu giữa hai lần ngắt

4.2 TẠO MỘT HÀM TRỄ

Trong hướng dẫn này, tôi sẽ tạo 2 hàm trì hoãn (DelayUs () và DelayMs ())

Để tạo hàm DelayUs (), chúng ta nên cấu hình ngắt SysTick để được kích hoạt mỗi

1 lần bằng cách sử dụng hàm SysTick_Config () Có một biến gọi là usTicks chứa giá trị của bọ ve trong chúng ta Mỗi khi chúng ta gọi hàm DelayUs (), chúng ta

nên tải biến này với giá trị trễ trong chúng ta và sau đó chúng ta thăm dò biến này

Trang 13

cho đến khi đạt đến 0 Biến này sẽ bị giảm đi 1 lần bởi SysTick_Handler () ISR

Để tạo hàm DelayMs (), chúng ta nên tải giá trị độ trễ tính bằng ms, sau đó giá trị này sẽ giảm đi 1 sau mỗi 1000 chúng ta sử dụng hàm DelayUs () Đây là mã cho thư viện trì hoãn Để sử dụng các hàm trì hoãn, bạn nên gọi hàm DelayInit () trước

// For store tick counts in us

static IO uint32_t usTicks;

Trang 15

BÀI TẬP 5: GIAO DIỆN SPI

STM32F103 SPI (Giao diện ngoại vi nối tiếp) là một giao thức truyền thông nối tiếp đồng bộ Trong giao diện này, ngoài các đường truyền và nhận, có một đường thứ ba được sử dụng cho đường đồng hồ Mỗi thiết bị phụ cũng có một chân chọn (bật) chip, được sử dụng để kích hoạt thiết bị Vì vậy để sử dụng SPI, chúng ta cần 2 dây cho đường dữ liệu (MOSI, MISO), 1 dây cho đường xung nhịp

và 1 dây cho mỗi thiết bị cho đường chọn chip MOSI (Master Out Slave In) được

sử dụng để truyền dữ liệu từ thiết bị chính sang thiết bị phụ MISO (Master In Slave Out) được sử dụng để truyền dữ liệu từ thiết bị phụ sang thiết bị chính

Hình 5.1 Giao diện ngoại vi nối tiếp

5.1 Giao thức SPI

Giao tiếp SPI khác với các giao tiếp nối tiếp khác, đặc biệt là về truyền dữ liệu Không có khái niệm như truyền và nhận dữ liệu, nhưng có một khái niệm giao dịch dữ liệu Khi giao dịch dữ liệu xảy ra, các bit dữ liệu trong thanh ghi chính được giao dịch với các bit dữ liệu trong thanh ghi phụ trên mọi đồng hồ từ chủ (một bit dữ liệu trên mỗi lần đánh dấu đồng hồ) Bạn có thể nghĩ SPI giống như các thanh ghi dịch chuyển Có 2 thanh ghi dịch chuyển, một trong thiết bị chủ

Trang 16

và một trong thiết bị phụ Mỗi đầu vào của thanh ghi shift được kết nối với đầu ra của thanh ghi kia thông qua các đường MOSI và MISO, để chúng tạo thành một vòng

Hình 5.2 giao dịch bit từ master đến slaveHình trên minh họa giao dịch bit từ master đến slave Thanh ghi chính chứa

dữ liệu 0xFF và thanh ghi phụ chứa dữ liệu 0x00 Sau một lần đánh dấu đồng hồ, cái chính sẽ còn lại bảy trong số các bit ban đầu của nó và một trong số các bit đầu tiên được đưa vào từ nô lệ, và ngược lại Sau tổng cộng tám lần tích tắc đồng hồ, tất cả tám bit của mỗi byte đã được giao dịch Đôi khi không phải tất cả byte dữ liệu đến từ slave hoặc được gửi đến slave đều có ý nghĩa

Trang 17

Điều này xảy ra bởi vì thiết bị tớ có thể chưa nhận được bất kỳ lệnh nào, vì vậy dữ liệu trong thanh ghi tớ không có ý nghĩa Một trường hợp khác, nếu chúng

ta chỉ muốn lấy dữ liệu từ slave, nhưng không muốn gửi bất kỳ lệnh nào đến slave, chúng ta có thể đặt byte giả vào thanh ghi chính và sau đó cung cấp tám tích tắc đồng hồ để giao dịch với các bit dữ liệu trong thanh ghi slave Chúng t1 cũng có thể lấy mẫu dữ liệu về cạnh rơi của đồng hồ, cài đặt này có thể được định cấu hình tùy thuộc vào tính năng của SPI phần cứng mà bạn sử dụng Trong ví dụ này, master là gửi byte dữ liệu 0x53 tới slave và sau đó slave gửi byte dữ liệu 0x46 đến master Thứ tự của dữ liệu là LSB trước, nhưng nó cũng có thể MSB trước tùy thuộc vào cấu hình

5.2 CHƯƠNG TRÌNH VÍ DỤ

Trong hướng dẫn này, tôi sẽ giải thích cách sử dụng SPI trong STM32F103 làm chủ và đối với nô lệ, tôi sẽ sử dụng Arduino Chúng tôi có thể gửi biểu đồ dữ liệu '1' từ SPI master để bật đèn LED nhấp nháy trên Arduino Để tắt nhấp nháy đèn LED, chúng tôi có thể gửi '0' từ SPI master Master cũng có thể đọc trạng thái nhấp nháy của đèn LED (tắt / bật) từ Arduino bằng cách gửi '?' đầu tiên, sau đó đọc trạng thái nhấp nháy của đèn LED sẽ trả về 0 hoặc 1 Đây là mã Arduino cho thiết bị phụ SPI

Trang 18

pinMode(MISO, OUTPUT); // Set MISO pin as output

// Turn on SPI in slave mode

Trang 19

Đối với SPI trên STM32F103, tôi tạo một số chức năng như để khởi tạo SPI, truyền dữ liệu SPI và bật / tắt thiết bị phụ Trong chức năng chính, tôi viết mã để bật và tắt đèn LED nhấp nháy trên Arduino, sau đó hỏi trạng thái nhấp nháy của đèn LED hiện tại sau mỗi 2500 ms Trạng thái nhấp nháy của đèn LED sẽ được hiển thị trên màn hình LCD

#define SPIx_RCC RCC_APB2Periph_SPI1

#define SPIx SPI1

#define SPI_GPIO_RCC RCC_APB2Periph_GPIOA

#define SPI_GPIO GPIOA

#define SPI_PIN_MOSI GPIO_Pin_7

#define SPI_PIN_MISO GPIO_Pin_6

#define SPI_PIN_SCK GPIO_Pin_5

#define SPI_PIN_SS GPIO_Pin_4

Trang 21

// GPIO pins for MOSI, MISO, and SCK

GPIO_InitStruct.GPIO_Pin = SPI_PIN_MOSI | SPI_PIN_MISO | SPI_PIN_SCK;

// Wait until transmit complete

while (!(SPIx->SR & (SPI_I2S_FLAG_TXE)));

// Wait until receive complete

while (!(SPIx->SR & (SPI_I2S_FLAG_RXNE)));

// Wait until SPI is not busy anymore

while (SPIx->SR & (SPI_I2S_FLAG_BSY));

// Return received data from SPI data register

Trang 22

5.3 SỬ DỤNG TRUYỀN THÔNG SPI TRONG STM32

Trong bài tập này chúng ta thưc hiện giao tiếp giữa bo Arduino và bo STM32F103C8 thông qua SPI

Chúng ta sẽ sử dụng Arduino UNO làm Slave và STM32F103C8 làm Master với Hai màn hình LCD 16X2 được gắn vào nhau riêng biệt Hai chiết áp cũng được kết nối với STM32 (PA0) và Arduino (A0) để xác định các giá trị gửi (0 đến 255)

 SPI trong STM32F103C8

So sánh bus SPI trong board Arduino & STM32F103C8 Blue Pill, STM32

có 2 bus SPI trong khi Arduino Uno có một bus SPI Arduino Uno có vi điều

khiển ATMEGA328 và STM32F103C8 có ARM Cortex-M3 làm cho nó nhanh hơn Arudino Board

Hình dưới là sơ đồ chân của bo STM32F103C8

Trang 23

 SPI TRONG ARDUINO

Trang 24

CÁC LINH KIỆN CẦN THIẾT

Trang 25

Hình mạch điện thực tế và mạch điện mô phỏng

Bảng bên dưới cho thấy các chân được kết nối cho giao tiếp STM32 SPI

với Arduino

Bảng dưới đây cho thấy các chân được kết nối cho Hai màn hình LCD (16x2) với STM32F103C8 và Arduino

Trang 26

Quan trọng:

 Đừng quên kết nối Arduino GND và STM32F103C8 GND với nhau

 Lập trình SPI STM32

Lập trình tương tự như mã Arduino Thư viện <SPI.h> tương tự được sử

dụng trong lập trình STM32F103C8 Nó có thể được lập trình bằng cổng USB mà không cần sử dụng bộ lập trình FTDI, để tìm hiểu thêm về lập trình STM32 với Arduino IDE, hãy làm theo liên kết

Trong Ví dụ STM32 SPI này, chúng ta sẽ sử dụng Arduino UNO làm Slave

và STM32F103C8 làm Master với Hai màn hình LCD 16X2 được gắn vào nhau riêng biệt Hai chiết áp cũng được kết nối với STM32 (PA0) và Arduino (A0) để xác định các giá trị gửi (0 đến 255) từ chính đến phụ và phụ đến chính bằng cách thay đổi chiết áp

Trang 27

Đầu vào tương tự được lấy tại STM32F10C8 chân PA0 (0 đến 3,3V) bằng cách xoay chiết áp Sau đó, giá trị đầu vào này được chuyển đổi thành giá trị Analog thành Digital (0 đến 4096) và giá trị kỹ thuật số này tiếp tục được ánh xạ tới (0 đến 255) vì chúng ta chỉ có thể gửi dữ liệu 8 bit (byte) thông qua giao tiếp SPI cùng một lúc

Tương tự ở phía Slave, chúng tôi lấy giá trị đầu vào tương tự tại chân A0 của Arduino từ (0 đến 5V) bằng cách sử dụng chiết áp Và một lần nữa giá trị đầu vào này được chuyển đổi thành giá trị Tương tự thành Giá trị kỹ thuật số (0 đến 1023) và giá trị kỹ thuật số này được ánh xạ thêm thành (0 đến 255)

Hướng dẫn này có hai chương trình một cho STM32 chính và một cho Arduino nô

lệ Các chương trình hoàn chỉnh cho cả hai bên được đưa ra ở phần cuối bài tập

5.4 PHÂN TÍCH CHƯƠNG TRÌNH SPI CHO STM32

 Bước 1 Trước hết chúng ta cần bao gồm thư viện SPI để sử dụng các chức

năng giao tiếp SPI và thư viện LCD để sử dụng các chức năng LCD Cũng xác định các chân LCD cho LCD 16x2

#include<SPI.h>

#include<LiquidCrystal.h>

const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

 Bước 2 Trong void setup()

Khởi động truyền thông nối tiếp ở tốc độ Baud 9600

Serial.begin (9600);

Tiếp theo khởi động giao tiếp SPI

Trang 28

 Bước 3 Trong vòng lặp void ()

 Trước khi gửi bất kỳ giá trị nào đến slave, chúng ta cần Slow giá trị chọn slave

để bắt đầu chuyển sang slave từ master

digitalWrite (SS, LOW);

 Tiếp theo đọc giá trị analogtừ POT STM32F10C8 chính được gắn vào chân PA0

int pot = analogRead (PA0);

Sau đó, chuyển đổi giá trị này theo một byte (0 thành 255)

byte MasterSend = map (pot, 0,4096,0,255);

 Đây là bước quan trọng, trong câu lệnh sau, chúng tôi gửi giá trị POT đã chuyển

đổi được lưu trữ trong biến Mastersend tới Arduino nô lệ, đồng thời nhận giá trị

từ Arduino nô lệ và lưu trữ giá trị đó trong biến mastereceive

Mastereceive = SPI.transfer (Mastersend);

Trang 29

 Tiếp theo, hiển thị các giá trị nhận được từ arduino nô lệ với độ trễ là 500 micro

giây và sau đó liên tục nhận và hiển thị các giá trị

 Serial.println("Slave Arduino to Master STM32");

Lưu ý: Chúng ta sử dụng serial.println () để xem kết quả trong Động cơ nối tiếp

của Arduino IDE

5.5 PHÂN TÍCH CHƯƠNG TRÌNH ARDUINO SPI

 Bước 1:Tương tự như master, trước hết chúng ta cần bao gồm thư viện SPI để

sử dụng các chức năng giao tiếp I2C và thư viện LCD để sử dụng các chức năng

 Bước 2: Trong void setup ()

 Chúng a bắt đầu giao tiếp nối tiếp với tốc độ truyền 9600

Trang 30

Serial.begin (9600);

 Câu lệnh dưới đây đặt MISO là OUTPUT (Phải gửi dữ liệu đến Master IN) Vì vậy, dữ liệu được gửi qua MISO của Slave Arduino

pinMode (MISO, OUTPUT);

 Bây giờ hãy bật SPI ở Chế độ nô lệ bằng cách sử dụng Đăng ký điều khiển SPI

SPCR | = _BV (SPE);

 Sau đó, BẬT ngắt cho giao tiếp SPI Nếu một dữ liệu được nhận từ chính, Quy trình Dịch vụ Ngắt được gọi và giá trị nhận được sẽ được lấy từ SPDR (Thanh ghi dữ liệu SPI)

SPI.attachInterrupt ();

Giá trị từ cái chính được lấy từ SPDR và được lưu trữ trong biến Slaverenition

Điều này diễn ra trong chức năng Quy trình ngắt sau

 Bước 3: Tiếp theo trong vòng lặp void ()

 Đọc giá trị tương tự từ Slave Arduino POT gắn vào chân A0

int pot = analogRead (A0);

Trang 31

 Chuyển đổi giá trị đó theo một byte dưới dạng 0 thành 255

Slavesend = map (pot, 0,1023,0,255);

 Bước quan trọng tiếp theo là gửi giá trị đã chuyển đổi đến Master STM32F10C8, vì vậy hãy đặt giá trị vào thanh ghi SPDR Thanh ghi SPDR được sử dụng để gửi và nhận các giá trị

SPDR = Slavesend;

Sau đó hiển thị giá trị nhận được ( SlaveReceive ) từ Master STM32F103C8 trên

LCD với độ trễ 500 micro giây rồi liên tục nhận và hiển thị các giá trị đó

Trang 32

Đây là cách giao tiếp SPI diễn ra trong STM32 Bây giờ bạn có thể giao tiếp

bất kỳ cảm biến SPI nào với bảng STM32

5.6 CHƯƠNG TRÌNH HOÀN CHỈNH

Chương trình cho Master (STM32)

#include<SPI.h> // Including Library for using SPI Communication

#define SS PA4

#include<LiquidCrystal.h> // Including LCD display library

const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14;

// Declaring pin names and pin numbers of lcd

LiquidCrystal lcd(rs,en,d4,d5,d6,d7); // Setting lcd and its paramaters

void setup (void)

{

lcd.begin(16,2); // Setting lcd as 16x2 mode

lcd.setCursor(0,0); // Setting cursor at first row and first column

Trang 33

lcd.print("STK BOOKS"); // Puts CIRCUIT DIGEST in LCD

delay(3000); // Delays for 3 seconds

lcd.clear(); // Clears lcd display

Serial.begin(9600); // Starts Serial Communication at Baud Rate 9600

pinMode(SS,OUTPUT); // Puts SS as Output

SPI.begin(); // Begins the SPI commnuication

SPI.setClockDivider(SPI_CLOCK_DIV16); // Sets clock for SPI

communication at 16 (72/16=4.5Mhz)

digitalWrite(SS,HIGH); // Setting SlaveSelect as HIGH (So master doesnt

connnect with slave)

MasterReceive=SPI.transfer(MasterSend); // Send the mastersend value to

slave also receives value from slave

Serial.println("Slave Arduino to Master STM32"); // Used in Serial Monitor

Trang 34

Serial.println(MasterReceive); // Puts value Received im Serail Monitor lcd.setCursor(0,0);

digitalWrite(SS, HIGH); // Again make SS line HIGH so that it doesnt

communicate with Slave

lcd.clear();

}

 Chương trình cho Slave (Arduino Uno)

#include<SPI.h> // Including Library for using SPI Communication

#include<LiquidCrystal.h> // Including LCD display library

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Define LCD Module Pins

(RS,EN,D4,D5,D6,D7)

volatile boolean received;

volatile byte SlaveReceived,Slavesend;

void setup()

{

lcd.begin(16,2); // Initilize LCD display

lcd.setCursor(0,0); // Sets Cursor at first line of Display

lcd.print("STK BOOKS"); // Prints CIRCUIT DIGEST in LCD

delay(3000); // Delay for 3 seconds

lcd.clear(); // Clears LCD display

Serial.begin(9600); // Starts Serial Communication at Baud Rate 9600

Trang 35

SlaveReceived = SPDR; // Value received from master

STM32F103C8 is stored in variable slavereceived

received = true; // Sets received as True

Slavesend = map(pot,0,1023,0,255); // Converts the value pot 1023) to

(0-255) for sending to master stm32

Trang 36

Serial.println(SlaveReceived); // Puts the received value from

Master STM32F103C8 at Serial Monitor

lcd.print(SlaveReceived); // Puts the received value from Master

STM32F103C8 at LCD display

delay(500);

lcd.clear();

}

Trang 37

BÀI TẬP 6: GIAO DIỆN I2C

I2C (Inter-Integrated Circuit) hay đôi khi được gọi là TWI (Two Wire Interface) là một giao thức nối tiếp đồng bộ chỉ cần 2 dây để giao tiếp Các dây là SCL cho đường đồng hồ và SDA cho đường dữ liệu Với I2C, bạn có thể kết nối các thiết bị như cảm biến nhiệt độ, EEPROM, RTC, v.v (lên đến 112 thiết bị) chỉ bằng 2 dây (cộng với dây GND) Để truy cập các thiết bị này, I2C sử dụng địa chỉ 7-bit Về mặt lý thuyết, không gian địa chỉ 7-bit cho phép 128 địa chỉ, tuy nhiên một số địa chỉ được dành riêng cho mục đích đặc biệt Vì vậy, chỉ có 112 địa chỉ

về mức logic 1 Mỗi đường tín hiệu (SCL và SDA) phải có một điện trở kéo lên để khôi phục tín hiệu về mức logic 1 khi không có thiết bị nào xác nhận nó thành logic 0

Hình bên dưới giải thích cách thức hoạt động của giao thức I2C Điều kiện START và STOP được định nghĩa là cạnh lên hoặc cạnh xuống trên đường SDA, trong khi đường SCL ở mức cao Sau khi master gửi điều kiện START, sau đó nó

Trang 38

sẽ được theo sau bởi địa chỉ phụ và bit R / W Sau đó, slave có trách nhiệm tạo ACK (xác nhận) ACK được định nghĩa là logic 0 trên đường SDA

Nếu master muốn ghi dữ liệu vào slave (được chỉ ra bởi bit R / W = 0), thì master sẽ gửi byte dữ liệu đến slave MSB của byte dữ liệu sẽ được gửi đầu tiên đến slave Slave chịu trách nhiệm tạo ACK cho mỗi byte dữ liệu nhận được

Nếu master muốn đọc dữ liệu từ slave (được chỉ ra bởi bit R / W = 0), thì sau ACK đầu tiên của địa chỉ slave và bit R / W, master sẽ đọc byte dữ liệu từ slave MSB của byte dữ liệu sẽ được đọc đầu tiên từ slave Nếu kích thước dữ liệu chỉ là một byte hoặc byte đó là byte dữ liệu cuối cùng, thì master sẽ gửi NACK tới slave, ngược lại master sẽ gửi ACK NACK được định nghĩa là logic 1 trên dòng SDA Từ hình bên dưới, bạn có thể thấy chi tiết của sơ đồ định thời bus I2C

Trang 39

6.2 CHƯƠNG TRÌNH VÍ DỤ

Trong hướng dẫn này, ta sẽ giải thích cách sử dụng I2C trên STM32F103 làm thiết bị chính và đối với thiết bị phụ mà tôi sử dụng Arduino Việc nô lệ rất đơn giản, khi master ghi byte dữ liệu 0x01 vào nó, thì đèn LED trên bảng Arduino

sẽ nhấp nháy sau mỗi 250 ms Để tắt đèn LED nhấp nháy, bản gốc phải ghi byte

dữ liệu 0x00 Master cũng có thể đọc trạng thái nhấp nháy của đèn LED (bật / tắt)

từ máy phụ, trả về 1 hoặc 0 Đây là mã cho Arduino dưới dạng nô lệ I2C

Trang 40

2500 ms Mỗi lệnh ghi được theo sau bởi lệnh đọc trạng thái nhấp nháy của đèn LED hiện tại, sau đó trạng thái được hiển thị trên màn hình LCD 16 × 2

#define I2Cx_RCC RCC_APB1Periph_I2C2

#define I2Cx I2C2

#define I2C_GPIO_RCC RCC_APB2Periph_GPIOB

#define I2C_GPIO GPIOB

Ngày đăng: 23/09/2021, 11:18

HÌNH ẢNH LIÊN QUAN

Hình 2.1. Đây là đặc điểm của chân gpio khi được cấu hìn hở chế độ đầu ra - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 2.1. Đây là đặc điểm của chân gpio khi được cấu hìn hở chế độ đầu ra (Trang 4)
Đây là mạch LED mà tôi sử dụng trong hướng dẫn này. Cấu hình đèn LED hoạt động ở mức thấp - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
y là mạch LED mà tôi sử dụng trong hướng dẫn này. Cấu hình đèn LED hoạt động ở mức thấp (Trang 5)
Hình 3.1. Mạch điện nút nhấn - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 3.1. Mạch điện nút nhấn (Trang 9)
Hình 3.2. nguyên lý mạch nút nhấn - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 3.2. nguyên lý mạch nút nhấn (Trang 11)
Để dễ dàng cấu hình SysTick, chúng ta có thể sử dụng hàm SysTick_Config (). Hàm này được định nghĩa trong core_cm3.h - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
d ễ dàng cấu hình SysTick, chúng ta có thể sử dụng hàm SysTick_Config (). Hàm này được định nghĩa trong core_cm3.h (Trang 12)
Hình 5.1. Giao diện ngoại vi nối tiếp - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 5.1. Giao diện ngoại vi nối tiếp (Trang 15)
Hình trên minh họa giao dịch bit từ master đến slave. Thanh ghi chính chứa dữ liệu 0xFF và thanh ghi phụ chứa dữ liệu 0x00 - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình tr ên minh họa giao dịch bit từ master đến slave. Thanh ghi chính chứa dữ liệu 0xFF và thanh ghi phụ chứa dữ liệu 0x00 (Trang 16)
Hình 5.2. giao dịch bit từ master đến slave - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 5.2. giao dịch bit từ master đến slave (Trang 16)
Hình dưới là sơ đồ chân của bo STM32F103C8 - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình d ưới là sơ đồ chân của bo STM32F103C8 (Trang 22)
Hình mạch điện thực tế và mạch điện mô phỏng - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình m ạch điện thực tế và mạch điện mô phỏng (Trang 25)
Bảng bên dưới cho thấy các chân được kết nối cho giao tiếp STM32 SPI - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Bảng b ên dưới cho thấy các chân được kết nối cho giao tiếp STM32 SPI (Trang 25)
Hình ảnh mạch điện trên testboard như sau - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
nh ảnh mạch điện trên testboard như sau (Trang 61)
7.2 CÁC LỆNH CƠ BẢN VÀ HIỂN THỊ VĂN BẢN BẬT NGUỒN LCD16X2  - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
7.2 CÁC LỆNH CƠ BẢN VÀ HIỂN THỊ VĂN BẢN BẬT NGUỒN LCD16X2 (Trang 61)
Trước khi có thể hiển thị các ký tự trên màn hình LCD, chúng ta phải gửi một số lệnh để cấu hình màn hình LCD - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
r ước khi có thể hiển thị các ký tự trên màn hình LCD, chúng ta phải gửi một số lệnh để cấu hình màn hình LCD (Trang 62)
Để xóa màn hình LCD, chúng ta có thể gửi lệnh 0b00000001 hoặc 0x01 đặt chân RS ở mức thấp (vì chúng ta muốn gửi lệnh) sau đó nhấn nút bật - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
x óa màn hình LCD, chúng ta có thể gửi lệnh 0b00000001 hoặc 0x01 đặt chân RS ở mức thấp (vì chúng ta muốn gửi lệnh) sau đó nhấn nút bật (Trang 64)
5. Trở về nhà (vị trí 0x00) và màn hình đã dịch chuyển trở lại bình thường. - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
5. Trở về nhà (vị trí 0x00) và màn hình đã dịch chuyển trở lại bình thường (Trang 71)
4. Gửi lệnh: 0b0000 xxxx (bật màn hình cao, gạch chân bật và nhấp nháy trên). 5.Gửi lệnh: 0b1111 xxxx (bật tắt màn hình, gạch chân bật và nhấp nháy trên) - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
4. Gửi lệnh: 0b0000 xxxx (bật màn hình cao, gạch chân bật và nhấp nháy trên). 5.Gửi lệnh: 0b1111 xxxx (bật tắt màn hình, gạch chân bật và nhấp nháy trên) (Trang 76)
Đơn vị hiển thị được sử dụng phổ biến nhất cho vi điều khiển là các màn hình số Alpha 16 × 2  - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
n vị hiển thị được sử dụng phổ biến nhất cho vi điều khiển là các màn hình số Alpha 16 × 2 (Trang 80)
Tên 16×2 ngụ ý rằng màn hình có 16 Cột và 2 Hàng, cùng nhau (1 6* 2) tạo thành 32 hộp - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
n 16×2 ngụ ý rằng màn hình có 16 Cột và 2 Hàng, cùng nhau (1 6* 2) tạo thành 32 hộp (Trang 81)
Tiếp theo, màn hình LCD phải được kết nối với bảng STM32. Chúng ta sẽ sử dụng màn hình LCD ở chế độ 4 bit  , vì vậy chúng ta phải kết nối 4 chân bit dữ  liệu (DB4 với DB7) và hai chân điều khiển (RS và EN) với bảng STM32  - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
i ếp theo, màn hình LCD phải được kết nối với bảng STM32. Chúng ta sẽ sử dụng màn hình LCD ở chế độ 4 bit , vì vậy chúng ta phải kết nối 4 chân bit dữ liệu (DB4 với DB7) và hai chân điều khiển (RS và EN) với bảng STM32 (Trang 82)
KIỂM TRA ĐẦU RA TRÊN CHẾ ĐỘ VẬN HÀNH - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
KIỂM TRA ĐẦU RA TRÊN CHẾ ĐỘ VẬN HÀNH (Trang 87)
Đây chỉ là một dự án giao diện đơn giản để giúp sử dụng màn hình LCD với bảng STM32, nhưng xa hơn nữa, bạn có thể sử dụng nó để xây dựng các dự án thú vị - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
y chỉ là một dự án giao diện đơn giản để giúp sử dụng màn hình LCD với bảng STM32, nhưng xa hơn nữa, bạn có thể sử dụng nó để xây dựng các dự án thú vị (Trang 87)
Trong bảng Arduino, nó chứa 6 kênh (8 kênh trên Mini và Nano, 16 kênh trên Mega), ADC 10 bit với dải điện áp đầu vào là 0V – 5V - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
rong bảng Arduino, nó chứa 6 kênh (8 kênh trên Mini và Nano, 16 kênh trên Mega), ADC 10 bit với dải điện áp đầu vào là 0V – 5V (Trang 89)
Sơ đồ mạch giao diện 16*2 LCD và Ngõ vào Analog vào bảng STM32F103C8T6 được hiển thị bên dưới - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Sơ đồ m ạch giao diện 16*2 LCD và Ngõ vào Analog vào bảng STM32F103C8T6 được hiển thị bên dưới (Trang 92)
 Trong các loại máy bay trực thăng mô hình - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
rong các loại máy bay trực thăng mô hình (Trang 103)
Hình 1: Đo điện trở giữa dây  đen  (  nhóm  1  )  và  dây  vàng     (  nhóm  2  ),  giá  trị  hiển  thị  là  vô  cùng,  do  hai  đầu  dây  này  không  nối với nhau  - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 1 Đo điện trở giữa dây đen ( nhóm 1 ) và dây vàng ( nhóm 2 ), giá trị hiển thị là vô cùng, do hai đầu dây này không nối với nhau (Trang 109)
Hình 3: Đo điện trở giữa dây màu đen và dây màu nâu giá trị hiển thị gần bằng 194 (Ω ) như vậy này hai đầu dây này thuộc cùng cuộn dây  - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 3 Đo điện trở giữa dây màu đen và dây màu nâu giá trị hiển thị gần bằng 194 (Ω ) như vậy này hai đầu dây này thuộc cùng cuộn dây (Trang 110)
Hình 4: Đo điện trở giữa, giá trị dây màu đen và dây màu đỏ, giá trị đo được gần bằng 97 (Ω), như vậy hai đầu dây này thuộc cùng một cuộn dây - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
Hình 4 Đo điện trở giữa, giá trị dây màu đen và dây màu đỏ, giá trị đo được gần bằng 97 (Ω), như vậy hai đầu dây này thuộc cùng một cuộn dây (Trang 110)
1. Chiết áp bên phải được sử dụng để thay đổi độ tương phản của màn hình LCD. Nó có ba chân, chân trái là + 5V và chân phải là GND và chân giữa được kết nối  với V0 của màn hình LCD - CAC BAI TAP THUC HANH UNG DUNG VI DIEU KHIEN STM32
1. Chiết áp bên phải được sử dụng để thay đổi độ tương phản của màn hình LCD. Nó có ba chân, chân trái là + 5V và chân phải là GND và chân giữa được kết nối với V0 của màn hình LCD (Trang 142)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w