4.3.1. Giới thiệu Timer/Counter
Mỗi vi điều khiển điều có một tín hiệu Clock giúp xử lí chương trình, thông thường Clock thường có tín hiệu Digital với tần số cao và được thiết lập cả trong và ngoài quá trình xử lí dữ liệu. Tốc độ của Clock ảnh hưởng đến khả năng xử lí của Vi điều khiển nhanh hoặc chậm.
Tín hiệu Clock được sử dụng nhiều trong các mô-đun như mô-đun ADC, các mô-đun giao tiếp và đặc biệt là các mô-đun Timer.
• Đặc điểm của mô-đun Timer:
- Thanh ghi của bộ đếm có 16 bit kiểu dữ liệu số nguyên, khi có một cạnh lên hoặc một tín hiệu bên ngoài vào cổng của Timer thì bộ điếm sẽ hoạt động.
- Up counter: bắt đầu đếm từ 0 đến một giá trị đặt trước, khi đến ngưỡng giá trị đặt trước thì bộ đếm sẽ bắt đầu lại 0 và tiếp tục quá trình tương tự.
- Down counter: bắt đầu từ một giá trị đặt trước và đếm lùi về 0, khi về 0 bộ đếm sẽ bắt đầu lại giá trị đặt trước và tiếp tục quá trình tương tự.
- Up-Down counter: bắt đầu đếm từ 0 đến một giá trị đặt trước, khi đến ngưỡng giá trị đặt trước thì bộ đếm lùi về 0.
- Prescaler divider: một mạch đếm nó được dùng để giảm tín hiệu tần số cao thành tín hiệu tần số thấp bằng phép chia số nguyên. Người dùng có thể chọn một giá trị từ 0 đến 65535 như một hàm số chia.
Trong STM32F4DISCOVERY, có 17 mô-đun có kết hợp với tín hiệu Clock và trong đó có 14 mô-đun dùng cho Timer.
Hình 4.26 Sự hoạt động của Timer/Counter khi Prescaler thay đổi từ 1 đến 4
4.3.2. Thí nghiệm sử dụng khối Basic PWM
4.3.2.1. Khái quát PWM
PWM là một tín hiệu dạng sóng tuần hoàn với tần số rời rạc, cho phép có thể điều chỉnh độ rộng xung ở mức cao và mức thấp.
Có hai cách điều chỉnh xung: Dùng công thức tính toán:
% Độ rộng xung: = (𝑡𝑂𝑁 x 100) / Chu kì = (𝑡𝑂𝑁 x 100) / ( 𝑡𝑂𝑁+ 𝑡𝑂𝐹𝐹)
Với Period là chu kì
Việc điều chỉnh độ rộng xung có thể thực hiện bằng việc so sánh hai tín hiệu với nhau. Tín hiệu đầu tiên là tín hiệu tam giác (Triangular signal) tín hiệu thứ hai là tín hiệu mong muốn (reference signal)
Trong STM32F407VG DISCOVERY thường dùng giá trị Counter trong mô-đun Timer. Ví dụ một tín hiệu tam giác với tần số không đổi so sánh với một tín hiệu mong muốn. Nếu giá trị của Counter thấp hơn giá trị tín hiệu mong muốn thì trạng thái tín hiệu đầu ra sẽ được hiểu ở mức ON, còn ngược lại nếu giá trị của Counter cao hơn giá trị tín hiệu mong muốn thì tín hiệu đầu ra sẽ được hiểu ở mức OFF.
Hình 4.28 Điều chỉnh độ rộng xung với cạnh lên Hình 4.27 Cách điều chỉnh độ rộng xung
Ngoài ra giá trị Counter có thể đếm cả cạnh lên và xuống (Up-Down Counter)
Hình 4.29 Điều chỉnh độ rộng xung với cạnh lên và xuống 4.3.2.2. Cấu hình khối Basic PWM
Đường dẫn lấy khối PWM: Simulink Library >> Waijung Blockset >> STM32F4
target >> On Peripheral Chip >> TIM
Hình 4.30 Khối Basic PWM
Chọn Timer từ 1-14
Chu kì của tín hiệu PWM
Chọn các kênh PWM
Chọn cực tính của xung ‘’Cao hoặc Thấp’’
4.3.2.3. Điều chỉnh độ sáng của LED dùng PWM
• Mục đích:
- Điều chỉnh độ rộng xung PWM bằng biến trở. - Điều chỉnh độ rộng xung PWM với nhiều kênh. - Điều chỉnh độ sáng của LED bằng tín hiệu PWM. • Tiến hành:
Giá trị điện áp đầu ra Vout biến thiên theo biến trở và nó được kết nối với chân PA5 còn LED kết nối với chân PA0 như hình.. Biến trở được dùng để điều chỉnh độ rộng xung của giá trị điện áp đọc được từ chân PA5, khi điện áp ở chân PA5 tăng thì độ sáng của LED cũng sẽ tăng theo. Ngược lại khi điện áp ở chân PA5 giảm thì độ sáng của LED cũng sẽ giảm.
Khi LED được nối với chân PA1 độ sáng của LED sẽ tăng chậm và sau đó LED tắt, quá trình này sẽ được lặp lại.
Khi LED được nối với chân PA2 độ sáng của LED sẽ mạnh sau đó giảm dần rồi tắt và lặp lại như vậy.
• Kết quả lắp mạch: .
Hình 4.34 Kết quả đồ thị “Điều chỉnh độ sáng LED dùng PWM”
4.3.3. Thí nghiệm sử dụng khối Encoder Read
4.3.3.1. Giới thiệu khối Encoder Read
Encoder là một thiết bị cơ điện dùng để đo vị trí góc hoặc tốc độ quay của động cơ. Nó bao gồm một đĩa tròn xẽ rãnh được gắn vào trục chính. Đầu đọc gồm 1 - 3 bộ thu phát quang. Đầu ra là xung vuông Độ phân giải Phụ thuộc rãnh trên 1 vòng. Như bộ mã hóa với 180 số kênh có thể đo góc lên tới 360/180 = 2.0 độ.
Khi trục bộ mã hóa bắt đầu xoay, các khe trên đĩa sẽ chạy qua cảm biến ánh sáng. Máy dò ảnh ở đầu thu sẽ cảm nhận tín hiệu ánh sáng và khi bộ cảm biến được kết nối với mạch tín hiệu, hệ thống có thể nhận biết có bao nhiêu độ động cơ đã xoay.
Từ hình 4.35, người ta có thể quan sát thấy các đĩa nằm trong 2 hàng và bị chồng
chéo. Để phát hiện hướng xoay, chẳng hạn như động cơ quay theo chiều kim đồng hồ (CW) hoặc hướng ngược chiều kim đồng hồ (CCW), có thể được thực hiện bằng cách đo chênh lệch pha giữa tín hiệu kênh A và kênh B. Nếu các tín hiệu từ kênh A được dẫn từ tín hiệu của kênh B thì động cơ sẽ chuyển động theo chiều kim đồng hồ và nếu các tín hiệu từ kênh A bị trễ phía sau kênh B, thì động cơ sẽ di chuyển theo hướng ngược chiều kim đồng hồ và điều này được thể hiện trong hình 4.36.
Để phát hiện hướng quay, xung đòi hỏi hai bộ mạch giải mã để biểu thị hướng quay. CW và CCW xoay có giá trị 0 và 1 tương ứng. Dựa trên số đọc của bộ giải mã, tín hiệu đếm sẽ được tăng hoặc giảm.
Hình 4.35 Cấu trúc bộ mã hóa quay
Ngoài ra, một lợi thế khác của việc sử dụng tín hiệu với sự khác biệt pha 90 là người dùng có thể điều chỉnh độ phân giải của số đếm được hiển thị trong Hình 4.37.
Tín hiệu kênh A được chọn làm tín hiệu tham chiếu. Khi các cạnh tăng và giảm của kênh A bằng 3 thì số đếm là (x1). Khi các cạnh tăng và các cạnh rơi của tín hiệu bằng 6 (gấp hai lần số xung tín hiệu) thì số đếm là (x2). Khi các cạnh tăng và giảm của tín hiệu là 12 thì số đếm là (x4) gấp 4 lần số xung tín hiệu kênh A.
Nếu đĩa bộ mã hóa có 180 kênh thì làm thế nào để đếm bốn lần? Vì số kênh trên mỗi chu kỳ bằng 180 x 4 = 720 vị trí nên độ phân giải thấp nhất có thể là 360/720 = 0,5 độ và cứ như vậy.
4.3.3.2. Cấu hình khối Encoder Read
Encoder Read: Đường dẫn lấy khối Digital Output: Simulink library >> Waijung Blockset >> STM32F4 Target >> On-chip Peripherals >> I/O >> TIM >>Encoder Read
Hình 4.37 Giao diện tín hiệu xung vuông
Bảng 4.12 Mô tả khối hộp thoại Encoder Read
Cấu hình Tùy chọn Giá trị Mô tả
Timer 1|2|3|4|5|6|7|8 Chọn kiểu Timer
Channel A, B Kênh đọc tín hiệu encoder
PPR Số xung đếm được khi quay 1 vòng
Reset Counter Chọn/Không chọn
Sample Time giây Thời gian lấy mẫu
• Lưu ý
Số xung mà encoder đọc được tính:
- Từ 0 đến PPRx4 khi sử dụng cả 2 kênh A và B. - Từ 0 đến PPRx2 khi sử dụng 1 trong 2 kênh A, B.
4.3.3.3. Đọc tốc độ động cơ DC dùng khối Encoder Read
• Mục đích:
- Biết cách sử dụng khối Encoder.
- Đọc được tốc độ (xung) của DC thông qua khôi Encoder. - Kết nối Encoder với UART hiển thi tốc độ DC lên máy tính • Tiến hành
Thí nghiệm sẽ được trình bày rõ trong “Chương 5: Mô hình DC motor”.
4.3.4. Thí nghiệm sử dụng khối Timer IRQ
4.3.4.1. Khái quát ngắt ngoài
Được hiểu như là chúng ta tạm thời dừng một việc đang làm để làm một việc nào đó ưu tiên hơn và sau khi hoàn thành việc đó ta sẽ quay lại làm việc đang làm trước đó.
Trong STM32F407VG DISCOVERY có hỗ trợ 82 nguồn của ngắt bao gồm tín hiệu Digital Input, I2C, UART, Timer…
Tại cùng một thời điểm có thể nhiều hơn một lệnh ngắt, ví dụ một chương trình đang chạy có ngắt từ UART và ngắt từ Digital Input từ vi điều khiển. Để giải quyết vấn đề này ta sẽ cần đặt mức ưu tiên có mỗi ngắt và sẽ xử lí theo thứ tự ưu tiên.
4.3.4.2. Cấu hình khối Timer IRQ
Đường dẫn lấy khối Digital Output: Simulink library >> Waijung Blockset >> STM32F4 Target >> On-chip Peripherals >> TIM>> Timer IRQ.
Bảng 4.13 Mô tả khối hộp thoại Timer IRQ
4.3.4.3. Điểu khiển LED dùng khối Timer IRQ
• Mục đích:
- Biết cách sử dụng và chức năng của khối Timer IRQ. - Hiểu được chương trình con điều khiển LED.
• Tiến hành:
Tạo mô hình simulink như hình 4.42 trên với thiết lập 4 khối Timer IRO và chọn TIM2- TIM5 để sử dụng công việc ngắt. Khi có tín hiệu ngắt IRO sẽ truyền tín hiệu đến chương trình con như hình 4.43 để điều khiển LED.
Cấu hình Tùy chọn Gía trị Mô tả
Configuration module Ngắt thường (Basic) Ngắt nâng cao (Advance)
Tùy vào mục đích ngắt Timer mà ta chọn chế độ ngắt
Timer module 1-14 Chọn Timer ứng với chế độ
đã chọn
Priority Chọn chế độ ưu tiên khi cùng
một thời điểm ngắt có nhiều nhiệm vụ
Sample time Thời gian ngắt
Hình 4.43 Chương trình con đọc LED
• Kết quả:
4.4. Sử dụng cổng giao tiếp UART 4.4.1. Giới thiệu UART 4.4.1. Giới thiệu UART
Trong các hệ thống nhúng hiện này dựa vào chip vi điều khiển sẽ cho phép ta kết nối với nhiều thiết bị bên ngoài nhằm mục đích truyền và nhận thông tin từ các thiết bị đó. Trong STM32F407VG DISCOVERY có hỗ trợ chuẩn giao tiếp UART (chuyển và nhận thông tin không đồng bộ) sẽ giúp kết nối và giao tiếp với các thiết bị bên ngoài như máy tính, mô-đun GPS, Wi-Fi…Với lợi thế không đồng bộ giúp ta có thể dễ dàng nhận thông tin hai chiều vừa truyền lên vừa nhận được thông tin tương đương.
Để nhận dữ liệu lên máy tính hoặc truyền dữ liệu từ máy tính xuống ta sử dụng thư viện UART (UART Setup, UART Tx, UART Rx) trong Waijung Blockset và máy tính cần thiết lập phần mềm Terminal (xem phụ lục 3), phần mềm này là giao diện để truyền và nhận dữ liệu.
4.4.2. Thí nghiệm sử dụng khối UART Setup và UART Tx
4.4.2.1. Cấu hình khối UART Setup và UART Tx
• UART Setup:
Đường dẫn lấy khối Digital Output: Simulink library >> Waijung Blockset >> STM32F4 Target >> On-chip Peripherals >> UART >> UART Setup.
Bảng 4.14 Mô tả khối hộp thoại UART Setup
Cấu hình Tùy chọn, Gía trị Mô tả
UART Module 1| 2| 3| 4| 5| 6 Có 6 mô-đun lựa chọn Baud rate
(bps)
9600| 115200| 1000000| …
Tốc độ truyền dữ liệu
Nếu chọn mô-đun 1 và mô-đun 6: có thể chọn tốc độ truyền 10,5 Mbps (cao nhất) Nếu chọn mô-đun 2, 3, 4, 5: có thể chọn tốc độ truyền 5,25 Mbps (cao nhất)
Data bits 8
Parity None| Odd| Even Lựa chọn chẵn, lẻ Stop bit 0,5| 1| 1,5| 2
Tx pin Chọn chân truyền dữ liệu
Rx pin Chọn chân nhận dữ liệu
• UART Tx:
Khối UART Tx được sử dụng để truyền dữ liệu bên trong vi điều khiển ra thiết bị bên ngoài qua chân Tx đây là một cách thuận tiện để truyền dữ liệu. Có 3 gói kiểu dữ liệu cho phép ta lựa chọn để truyền: ASCII Mode, Binary Mode and String Buffer Mode.
Đường dẫn lấy khối Digital Output: Simulink library >> Waijung Blockset >> STM32F4 Target >> On-chip Peripherals >> UART >> UART Tx.
Hình 4.45 Khối UART Setup
Hình 4.47 Khối hộp thoại UART Tx
Bảng 4.15 Mô tả khối hộp thoại UART Tx
Cấu hình Tùy chọn, Giá trị Mô tả
UART Module 1|2|3|4|5|6 Có 6 mô-đun để lựa chọn Transfer Blocking
Non-blocking
Chọn cách truyền dữ liệu: Blocking: Phải đợi truyền xong dữ liệu này rồi mới xử lí dữ liệu tiếp theo
Non-Blocking : không cần đợi truyền hết dữ liệu mới gửi lên. Có thể cùng lúc truyền dữ liệu khác
Packet mode Ascii Binar
String Buffer
Chọn kiểu dữ liệu muốn truyền
End of packet CR (0x0D 0x0D - ''\r'') LF (0x0A - ''\n'') CRLF (0x0D 0x0D - ''\r\n''
None
Cách kết thúc khi dữ liệu được truyền lên
''\r'' chỉ nhận lên ''\n'' xuống dòng mới
''\r\n'' Nhận lên sau đó xuống dòng mới
Sample Time (sec)
-1 Thời gian lấy mẫu (chọn giá trị
"-1" thì thời gian lấy mẫu khối UART Tx bằng thời gian lấy
4.4.2.2. Truyền một giá trị từ STM32F407 DISCOVERY lên máy tính
• Mục đích:
- Biết cách hoạt động của khối UART Tx. - Hiểu được cách chọn kiểu dữ liệu ASCII. • Tiến hành:
• Kết quả:
4.4.3. Thí nghiệm sử dụng khối Host Serial
4.4.3.1. Cấu hình các khối Host Serial
• Khối Host Serial Setup
Hình 4.48 Code simulink “truyền một giá trị từ Board mạch lên máy tính
Hình 4.49 Kết quả lắp mạch “Truyền giá trị từ Board lên máy tính”
• Khối Host Serial Tx
Chọn cổng kết nối (Khi cổng chọn là <auto>, khối sẽ tự động quét cổng khả dụng)
Chọn tốc độ truyền
Hình 4.51 Hộp thoại Host Serial Setup
• Khối Host Serial Rx
Hình 4.53 Hộp thoại Host Serial Rx
4.4.3.2. Truyền một giá trị xuống board STM32F407 DISCOVERY
• Mục đích:
- Sử dụng các Host Serial để truyền giá trị từ máy tính xuống board và từ board gửi lên lại máy tính.
• Tiến hành:
- Ta cần tạo 2 mô hình bên dưới:
Hình 4.54 Mô hình code nạp xuống board
Hình 4.55 Mô hình chạy chế độ inf trên máy tính
• Kết quả:
Hình 4.56 Kết quả lắp mạch “Thí nghiệm truyền giá trị xuống board”
4.5. Sử dụng cổng giao tiếp I2C 4.5.1. Giới thiệu I2C 4.5.1. Giới thiệu I2C
Đầu năm 1980 hãng Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là I2C. I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường Bus giao tiếp giữa các IC với nhau. Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau như các loại Vi điều khiển AVR, ARM... chip nhớ như: RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tự(DAC), IC điểu khiển LCD, LED...
I2C sử dụng hai đường truyền tín hiệu: Một đường xung nhịp đồng hồ SCL (Serial Clock Line) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz). Hai là đường dữ liệu SDA (Serial Data Line) theo 2 hướng.
Có rất nhiều thiết bị có thể cùng được kết nối vào một bus I2C, tuy nhiên sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi mỗi thiết bị sẽ được nhận ra bởỉ một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại trong suốt thời gian kết nối. Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyền dữ liệu hay có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc vào việc thiết bị đó là chủ (master) hãy tớ (slave).
Về lý thuyết lẫn thực tế I2C sử dụng 7 bit để xác định địa chỉ, do đó trên một bus có thể có tới 2^7 địa chỉ tương ứng với 128 thiết bị có thể kết nối, nhưng chỉ có 112 , 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn lại quy định việc đọc hay ghi dữ liệu (1 là write, 0 là read)
Điểm mạnh của I2C chính là hiệu suất và sự đơn giản của nó: một khối điều khiển trung