Hệ thống truyền thông
Với khoảng cách truyền nằm trong khoảng 50m thì truyền thông không dây bằng sóng radio(RF) là phù hợp nhất và gia thành hợp lý.
Bộ thu phát tín hiệu RF có vai trò hết sức quan trọng trong điều khiển quadrotor, nó phát và thu tín hiệu lệch cho quadrotor bay lên, hạ xuống, quay theo trục z, di chuyển trái phải, trước sau.
Đây là khối truyền thông cơ bản nhất của thiết bị bay với người điều khiển. Khối điều khiển này gồm 3 bộ phận chính là:
Bàn phím
Bộ tạo dao động LC
Bộ mã hóa dữ liệu
Điều khiển từ xa được sử dụng là tay GAME playstation, với 8 phím bấm điều khiển. Các phím bấm điều khiển được mã hóa nhờ chip Pic16f84, sau đó truyền tín hiệu gửi đi qua RF phát.
RF thu nhận được tín hiệu từ RF phát đưa vào chip PIC16f84 giải mã và được chuyển vào mạch trung tâm để xử lý và đưa ra quyết định điều khiển các ESC.
a. Giới thiệu về truyền thông nối tiếp
Khi một bộ vi xử lý truyền thông với thế giới bên ngoài thì nó cấp dữ liệu dưới dạng từng khúc 8 byte một. Trong một số trường hợp chẳng hạn như các máy in thì thông tin đơn giản được lấy từ đường bus dữ liệu 8 bít và được gửi đi tới bus dữ liệu 8 byte của máy in. Điều này có thể làm việc chỉ khi đường cáp bus không quá dài vì các đường cáp dài làm suy giảm thậm chí làm méo tín hiệu. Ngoài ra, đường dữ liệu 8 byte giá thường đắt. Vì những lý do này, việc truyền thông nối tiếp được dùng để truyền dữ liệu giữa hai hệ thống ở cách xa nhau hàng trăm đến hàng triệu dặm. Hình dưới là sơ đồ truyền nối tiếp so với sơ đồ truyền song song.
Sơ đồ truyền nối tiếp so với sơ đồ truyền song song
Thực tế là trong truyền thông nối tiếp là một đường dữ liệu duy nhất được dùng thay cho một đường dữ liệu 8 byte của truyền thông song song làm cho nó không chỉ rẻ hơn rất nhiều mà nó còn mở ra khả năng để hai máy tính ở cách xa nhau có truyền thông qua đường thoại.
Truyền thông dữ liệu nối tiếp dị bộ được sử dụng rộng rãi cho các phép truyền hướng ký tự, còn các bộ truyền dữ liệu theo khối thì sử dụng phương pháp đồng bộ. Trong phương pháp dị bộ, mỗi ký tự được bố trí giữa các bít bắt đầu (start) và byte dừng (stop). Công việc này gọi là đóng gói dữ liệu. Trong đóng gói dữ liệu đối với truyền thông dị bộ thì dữ liệu chẳng hạn là các ký tự mã ASCII được đóng gói giữa một byte bắt đầu và một byte dừng. Byte bắt đầu luôn luôn chỉ là một byte, còn byte dừng có thể là một hoặc hai byte. Byte bắt đầu luôn là byte thấp (0) và các byte dừng luôn là các byte cao (bít 1). Ví dụ, hãy xét ví dụ trên hình vẽ sau, trong đó ký tự “A” của mã ASCII (8 bít nhị phân là 0100 0001) đóng gói khung giữa một byte bắt đầu và một byte dừng.
Đóng khung một ký tự “A” của mã ASCII (41H) có tín hiệu là 1 (cao) được coi như là một dấu (mark) , còn không có tín hiệu tức là 0 (thấp) thì được coi là khoảng trống (space) . Lưu ý rằng phép truyền bắt đầu với start sau đó byte D0, byte thấp nhất LSB, sau các byte còn lại cho đến byte D7, byte cao nhất MSB và cuối cùng là byte dừng stop để báo kết thúc ký tự “A”.
Trong truyền dữ liệu nếu dữ liệu có thể được vừa phát và vừa được thu thì gọi là truyền song công. Điều này tương phản với truyền đơn công chẳng hạn như các máy in chỉ nhận dữ liệu từ máy tính. Truyền song công có thể có hai loại là bán song công và song công hoàn toàn phụ thuộc vào truyền dữ liệu có thể xảy ra đồng thời không? Nếu dữ liệu được truyền theo một đường tại một thời điểm thì được gọi là truyền bán song công. Nếu dữ liệu có thể đi theo cả hai đường cùng một lúc thì gọi là song công toàn phần. Tất nhiên, truyền song công đòi hỏi hai đường dữ liệu (ngoài đường âm của tín hiệu), một để phát và một để thu dữ liệu cùng một lúc.
Các kiểu truyền dữ liệu
Xuất phát từ yêu cầu thực tế của đề tài Flying robot, nhóm đã nghiên cứu rất kỹ lý thuyết cũng như thực tế , từ đó quyết định sử dùng RF ( Radio frequency) để điều khiển không dây (wireless) Quadrotor.
b. Mã hóa, giải mã giữ liệu trong truyền thông RF
Trên không trung có rất nhiều sóng điện từ tồn tại, tác động vào máy thu gây nhiễu, việc mã hóa/ giải mã để đưa ra được tín hiệu truyền đi, thu về đạt độ chính xác cao và loại trừ các tác động sai do môi trường bị nhiễu tác động vào máy thu.
Việc mã hóa được coi là rất quan trọng trong điều khiển, nó nâng cao độ bảo mật, không bị nhiễu do môi trường xung quanh. Một máy phát có mã hóa và máy thu có giải mã sẽ ít bị nhận sai dữ liệu hoặc cũng có thể sửa sai dữ liệu, khó bị can nhiễu hơn so với không mã hóa.
Dữ liệu được đưa vào máy phát là dạng nối tiếp, trong truyền thông số, các bit 0 hoặc 1 sẽ được đưa vào đầu dữ liệu phát mã hóa và máy thu có nhiệm vụ giải điều chế, hoàn lại dạng của tín hiệu này.
Việc mã hóa dữ liệu cũng như mã hóa điều khiển vậy, ta có thể làm bằng nhiều cách: sử dụng các IC mã hóa – giải mã, lập trình bằng vi điều khiển, mã hóa trực tiếp với PC …
Có rất nhiều dạng mã hóa khác nhau như: NRZL (Non Return to Zero Level), NRZI ( Non Return to Zero Inverted), Manchester … Hình dưới là một số dạng mã hóa phổ biến.
Mã hóa dữ liệu RF
Điều chế là dùng tín hiệu cần truyền để làm thay đổi một thông số nào đó của một tín hiệu khác, tín hiệu này thực hiện nhiệm vụ mang tín hiệu cần truyền đến nơi thu nên được gọi là sóng mang.
Mục đích của điều chế là dời phổ tần của tín hiệu cần truyền đến một vùng phổ tần khác thích hợp với tính chất của đường truyền và nhất là có thể truyền đồng thời nhiều kênh một lúc.
Tóm lại, phương pháp điều chế là dùng tín hiệu cần truyền làm thay đổi một thông số nào đó của sóng mang (biên độ, tần số, pha …). Tùy theo thông số được lựa chọn ta có các phương pháp điều chế khác nhau: Điều chế biên độ AM (Amplitude Modulation), điêu chế tần số FM (Frequency Modulation), điều chế pha ΦM …
+ Điều chế AM (Amplitude Modulation)
Dữ liệu có thể được truyền bằng phương pháp điều chế AM, trong trường hợp này gọi là kỹ thuật dời biên (ASK – Amplitude Shift Keying). Bit 1 được truyền đi bởi sóng mang có biên độ E1, bít 0 được truyền đi bởi sóng mang có biên độ E2. Hình dưới minh họa tín hiệu ASK.
Điều chế AM
+ Điều chế FM (Frequency Modulation)
Dữ liệu có thể được truyền bằng phương pháp điều chế FM, trong trường hợp này gọi là kỹ thuật dời tần (FSK – Frequency Shift Keying).
FSK được dùng rộng rãi trong truyền số liệu. Trong FSK bit 1 được truyền đi bởi tần số FM, bít 0 được truyền đi bởi tần số FS.
Điều chế FM
c. Một vài định nghĩa căn bản cần nắm trước khi tiến hành xây dựng mạch thu phát tín hiệu RF.
+ Tốc độ truyền dữ liệu (Baud Rate)
Lấy ví dụ về việc truyền 1 bit trong 1ms, ta thấy rằng để việc truyền và nhận không đồng bộ xảy ra thành công thì các thiết bị tham gia phải “thống nhất” nhau về khoảng thời dành cho 1 bite truyền, hay nói cách khác tốc độ truyền phải được cài đặt như nhau trước, tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ baud là số bit truyền trong 1 giây. Ví dụ nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền là 1/19200 ~ 52.083us.
+ Khung truyền (Frame)
Do truyền thông nối tiếp mà nhất là nối tiếp không đồng bộ rất dễ mất hoặc sai lệch dữ liệu, quá trình truyền thông theo kiểu này phải tuân theo một số quy cách nhất định. Bên cạnh tốc độ baud, khung truyền là một yếu tốc quan trọng tạo nên sự thành công khi truyền và nhận. Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền. Hình 1 là một ví dụ của một khung truyền theo UART, khung truyền này được bắt đầu bằng một start bit, tiếp theo là 8 bit data, sau đó là 1 bit parity dùng kiểm tra dữ liệu và cuối cùng là 2 bits stop.
+ Start Bit
Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Ở module USART trong AVR, đường truyền luôn ở trạng thái cao khi nghỉ (Idle), nếu một chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi một bit start bằng cách “kéo” đường truyền xuống mức 0. Như vậy, với AVR bit start là mang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị điện áp của bit start là ngược lại). start là bit bắt buộc phải có trong khung truyền.
+ Stop Bit
Stop bits là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bits bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể là 1 hoặc 2 bits (Trong các thiết bị khác Stop bits có thể là 2.5 bits). Trong ví dụ ở hình 1, có 2 stop bits được dùng cho khung truyền.Giá trị của stop bit luôn là giá trị nghỉ (Idle) và là ngược với giá trị của start bit, giá trị stop bit trong AVR luôn là mức cao (5V).
+ Data
Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data không nhất thiết phải là gói 8 bit, với AVR bạn có thể quy định số lượng bit của data là 5, 6, 7, 8 hoặc 9 (tương tự cho hầu hết các thiết bị hỗ trợ UART khác). Trong truyền thông nối tiếp UART, bit có ảnh hưởng nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có ảnh hưởng lớn nhất (MSB – Most Significant Bit, bit bên trái).
+ Parity Bit
Parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số lẻ. Ví dụ, nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 số 1 trong dữ liệu này, nếu parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo tổng các số 1 là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của parity bit là 1. Hình 1 mô tả ví dụ này với parity chẵn được sử dụng. Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền.
+ Khung truyền phổ biến nhất là : start bit+ 8 bit data+1 stop bit
- Hai bit UPM1 và UPM0( Parity Mode) được dùng để quy định kiểm tra pariry. Nếu UPM1:0=00, parity không được sử dụng (mode này khá thông dụng), UPM1:0=01 không được sử dụng, UPM1:0=10 thì parity chẵn được dùng, UPM1:0=11 parity lẻ được sử dụng (xem thêm bảng 1).
Bảng 2.3 Chọn kiểm tra parity
UPM1 UPM0 Parity mode
0 0 Disabled
0 1 Reserved
1 0 Enable, Even Parity
1 1 Enable, Old Parity
- USBS (Stop bit Select), bit Stop trong khung truyền bằng AVR USART có thể là 1 hoặc 2 bit, nếu USBS=0 thì Stop bit chỉ là 1 bit trong khi USBS=1 sẽ có 2 Stop bit được dùng.
- Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền. Bảng 2 tóm tắt các giá trị có thể có của tổ hợp 3 bit này và độ dài dữ liệu truyền tương ứng.
Độ dài dữ liệu truyền
UCSZ2 UCSZ1 UCSZ0 KÍCH THƯỚC
0 0 0 5 bit
0 0 1 6 bit
0 1 0 7 bit
0 1 1 8 bit
1 0 0 Reserved
1 0 1 Reserved
1 1 0 Reserved
1 1 1 9 bit
Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC,ta phải set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ được USART dùng để tính tốc độ baud. Bảng 3 hướng dẫn cách tính tốc độ baud dựa vào giá trị của thanh ghi UBRR và ngược lại, cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đã biết tốc độ baud.
Tính tốc độ baud
Chế độ hoạt động Phương trình tính tốc độ baud Phương trình tính giá trị UBRR
Không đồng bộ thường (U2X=0)
Không đồng bộ tốc độ gấp đôi(U2X=1)
Chủ đồng bộ
Trong các công thức trong bảng 3, fOSC là tốc tần số xung nhịp của hệ thống (thạch anh hay nguồn xung nội…). Để tiện cho bạn theo dõi, tôi đính kèm bảng ví dụ cách đặt giá trị cho UBRR theo tốc độ baud mẫu.
Vài nét về vi điều khiển PIC16f84
a. Lịch sử phát triển vi điều khiển PIC
PIC là viết tắt của “Programable Intelligent Computer”, có thể tạm dịch là “máy tính thông minh khả trình” do hãng Genenral Instrument đặt tên cho vi điều khiển đầu tiên của họ : PIC1650 được thiết kế để dùng làm các thiết bị ngoại vi cho vi điều khiển CP 1600. Vi điều khiển này sau đó được nghiên cứu phát triển thêm và từ đó hình thành nên dòng vi điều khiển PIC ngày nay.
b. Kiến trúc vi điều khiển PIC
Tổ chức phần cứng của PIC được thiết kế theo kiến trúc Havard. Điểm khác biệt giữa kiến trúc Havard và kiến trúc Von-Neuman là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình.
Đối với kiến trúc Von-Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đó ta có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu. Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lý của CPU phải rất cao, vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình. Như vậy có thể nói kiến trúc Von-Neuman không thích hợp với cấu trúc của một vi điều khiển.
Đối với kiến trúc Havard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt. Do đó trong cùng một thời điểm CPU có thể tương tác với cả hai bộ nhớ, như vậy tốc độ xử lý của vi điều khiển được cải thiện đáng kể.
Một điểm cần chú ý nữa là tập lệnh trong kiến trúc Havard có thể tối ưu tùy theo yêu cầu kiến trúc của vi điều khiển mà không phụ thuộc vào cấu trúc dữ liệu. Ví dụ đối với vi điều khiển dòng 16F, độ dài lệnh luôn là 14bit (trong khi dữ liệu được tổ chức thành từng byte), còn đối với kiến trúc Von-Neuman, độ dài lệnh luôn là bội số của 1 byte (do dữ liệu được tổ chức thành từng byte).
c. RISC(Reduced Instruction Set Computer) và CISC(Complex Instruction Set Computer)
Như đã trình bày ở trên, kiến trúc Havard là khái niệm mới hơn so với kiến trúc Von-Neuman. Khái niệm này được hình thành nhằm cải tiến tốc độ thực thi của một vi điều khiển. Qua việc tách rời bộ nhớ chương trình và bộ nhớ dữ liệu, bus chương trình và bus dữ liệu, CPU có thể cùng một lúc truy xuất cả bộ nhớ chương trình và bộ nhớ dữ liệu, giúp tăng tốc độ xử lý của vi điều khiển lên gấp đôi. Đồng thời cấu trúc lệnh không còn phụ thuộc vào cấu trúc dữ liệu nữa mà có thể linh động điều chỉnh tùy theo khả năng và tốc độ của từng vi điều khiển. Và để tiếp tục cải tiến tốc độ thực thi lệnh, tập lệnh của họ vi điều khiển PIC được thiết kế sao cho chiều dài mã lệnh luôn cố định (ví dụ với họ 16Fxxxx chiều dài mã lệnh luôn là 14bit) và cho phép thực thi lệnh trong một chu kỳ của xung clock (ngoại trừ một số trường hợp đặc biệt như lệnh nhảy, lệnh gọi chương trình con cần hai chu kỳ xung đồng hồ). Điều này có nghĩa tập lệnh của vi điều khiển thuộc cấu trúc Havard sẽ ít lệnh hơn, ngắn hơn, đơn giản hơn để đáp ứng yêu cầu mã hóa lệnh bằng một số bit nhất định.
Vi điều khiển được tổ chức theo kiến trúc Havard còn được gọi là vi điều khiển RISC (Reduced Instruction Set Computer) hay vi điều khiển có tập lệnh rút gọn. Vi điều khiển được thiết kế theo kiến trúc Von-Neuman còn được gọi là vi điều khiển CISC (Complex Instruction Set Computer) hay vi điều khiển có tập lệnh phức tạp vì mã lệnh của nó không phải là một số cố định mà luôn là bội số của 8bit (1byte).
d. Pipelining
Đây chính là cơ chế xử lý lệnh của các vi điều khiển PIC. Một chu kỳ lệnh của vi điều khiển sẽ bao gồm 4 xung clock. Ví dụ ta sử dụng oscillator có tần số 4MHZ, thì xung lệnh sẽ có tấn số 1MHZ (chu kỳ lệnh sẽ là 1 us).
Thông thường, để thực thi một lệnh, ta cần một chu kỳ lệnh để gọi lệnh đó, và một chu kỳ xung clock nữa để giải mã và thực thi lệnh. Với cơ chế pipelining được trình bày ở trên, mỗi lệnh xem như chỉ được thực thi trong một chu kỳ lệnh. Đối với các lệnh mà quá trình thực thi nó làm thay đổi giá trị thanh ghi PC (Program Counter) cần hai chu kỳ lệnh để thực thi vì phải thực hiện việc gọi lệnh ở địa chỉ thanh ghi PC chỉ tới. Sau khi đã xác định đúng vị trí lệnh trong thanh ghi PC, mỗi lệnh chỉ cần một chu kỳ lệnh để thực thi xong.
e. Các dòng PIC và cách lựa chọn vi điều khiển PIC
Các ký hiệu của vi điều khiển PIC:
- PIC12xxxx: độ dài lệnh 12bit
- PIC16xxxx: độ dài lệnh 14bit
- PIC18xxxx: độ dài lệnh 16bit
C: PIC có bộ nhớ EPROM (chỉ có 16C84 là EEPROM)
F: PIC có bộ nhớ flash
LF: PIC có bộ nhớ flash hoạt động ở điện áp thấp
LV: tương tự LF, đây là ký hiệu cũ
Bên cạnh đó một số vi điều khiển có ký hiệu xxFxxx là EEPROM, nếu có thêm chữ A ở cuối là flash (ví dụ PIC16F877 là EEPROM, còn PIC16F877A là flash). Ngoài ra còn có thêm một dòng vi điều khiển PIC mới là dsPIC.
Nhóm muốn sử dụng các modun RF riêng để dễ dàng kiểm soát các vấn đề trục trặc khi gặp phải. Trong việc truyền nhận thì PIC có độ ổn định hơn các dòng VĐK mà chúng ta đang sử dụng khác như 89, AVR… Trong quá trình truyền nhận RF sẽ tạo ra một khoảng thời gian trễ nên thời gian thực để truyền nhận dữ liệu nên truyền nhận qua mođun đơn lẻ sẽ tiết kiệm thời gian xử lý mà ko bị phụ thuộc vào việc xử lý đó.
Với khoảng cách truyền nằm trong khoảng 50m thì truyền thông không dây bằng sóng radio(RF) là phù hợp nhất và gia thành hợp lý.
Bộ thu phát tín hiệu RF có vai trò hết sức quan trọng trong điều khiển quadrotor, nó phát và thu tín hiệu lệch cho quadrotor bay lên, hạ xuống, quay theo trục z, di chuyển trái phải, trước sau.
Đây là khối truyền thông cơ bản nhất của thiết bị bay với người điều khiển. Khối điều khiển này gồm 3 bộ phận chính là:
Bàn phím
Bộ tạo dao động LC
Bộ mã hóa dữ liệu
Điều khiển từ xa được sử dụng là tay GAME playstation, với 8 phím bấm điều khiển. Các phím bấm điều khiển được mã hóa nhờ chip Pic16f84, sau đó truyền tín hiệu gửi đi qua RF phát.
RF thu nhận được tín hiệu từ RF phát đưa vào chip PIC16f84 giải mã và được chuyển vào mạch trung tâm để xử lý và đưa ra quyết định điều khiển các ESC.
a. Giới thiệu về truyền thông nối tiếp
Khi một bộ vi xử lý truyền thông với thế giới bên ngoài thì nó cấp dữ liệu dưới dạng từng khúc 8 byte một. Trong một số trường hợp chẳng hạn như các máy in thì thông tin đơn giản được lấy từ đường bus dữ liệu 8 bít và được gửi đi tới bus dữ liệu 8 byte của máy in. Điều này có thể làm việc chỉ khi đường cáp bus không quá dài vì các đường cáp dài làm suy giảm thậm chí làm méo tín hiệu. Ngoài ra, đường dữ liệu 8 byte giá thường đắt. Vì những lý do này, việc truyền thông nối tiếp được dùng để truyền dữ liệu giữa hai hệ thống ở cách xa nhau hàng trăm đến hàng triệu dặm. Hình dưới là sơ đồ truyền nối tiếp so với sơ đồ truyền song song.
Sơ đồ truyền nối tiếp so với sơ đồ truyền song song
Thực tế là trong truyền thông nối tiếp là một đường dữ liệu duy nhất được dùng thay cho một đường dữ liệu 8 byte của truyền thông song song làm cho nó không chỉ rẻ hơn rất nhiều mà nó còn mở ra khả năng để hai máy tính ở cách xa nhau có truyền thông qua đường thoại.
Truyền thông dữ liệu nối tiếp dị bộ được sử dụng rộng rãi cho các phép truyền hướng ký tự, còn các bộ truyền dữ liệu theo khối thì sử dụng phương pháp đồng bộ. Trong phương pháp dị bộ, mỗi ký tự được bố trí giữa các bít bắt đầu (start) và byte dừng (stop). Công việc này gọi là đóng gói dữ liệu. Trong đóng gói dữ liệu đối với truyền thông dị bộ thì dữ liệu chẳng hạn là các ký tự mã ASCII được đóng gói giữa một byte bắt đầu và một byte dừng. Byte bắt đầu luôn luôn chỉ là một byte, còn byte dừng có thể là một hoặc hai byte. Byte bắt đầu luôn là byte thấp (0) và các byte dừng luôn là các byte cao (bít 1). Ví dụ, hãy xét ví dụ trên hình vẽ sau, trong đó ký tự “A” của mã ASCII (8 bít nhị phân là 0100 0001) đóng gói khung giữa một byte bắt đầu và một byte dừng.
Đóng khung một ký tự “A” của mã ASCII (41H) có tín hiệu là 1 (cao) được coi như là một dấu (mark) , còn không có tín hiệu tức là 0 (thấp) thì được coi là khoảng trống (space) . Lưu ý rằng phép truyền bắt đầu với start sau đó byte D0, byte thấp nhất LSB, sau các byte còn lại cho đến byte D7, byte cao nhất MSB và cuối cùng là byte dừng stop để báo kết thúc ký tự “A”.
Trong truyền dữ liệu nếu dữ liệu có thể được vừa phát và vừa được thu thì gọi là truyền song công. Điều này tương phản với truyền đơn công chẳng hạn như các máy in chỉ nhận dữ liệu từ máy tính. Truyền song công có thể có hai loại là bán song công và song công hoàn toàn phụ thuộc vào truyền dữ liệu có thể xảy ra đồng thời không? Nếu dữ liệu được truyền theo một đường tại một thời điểm thì được gọi là truyền bán song công. Nếu dữ liệu có thể đi theo cả hai đường cùng một lúc thì gọi là song công toàn phần. Tất nhiên, truyền song công đòi hỏi hai đường dữ liệu (ngoài đường âm của tín hiệu), một để phát và một để thu dữ liệu cùng một lúc.
Các kiểu truyền dữ liệu
Xuất phát từ yêu cầu thực tế của đề tài Flying robot, nhóm đã nghiên cứu rất kỹ lý thuyết cũng như thực tế , từ đó quyết định sử dùng RF ( Radio frequency) để điều khiển không dây (wireless) Quadrotor.
b. Mã hóa, giải mã giữ liệu trong truyền thông RF
Trên không trung có rất nhiều sóng điện từ tồn tại, tác động vào máy thu gây nhiễu, việc mã hóa/ giải mã để đưa ra được tín hiệu truyền đi, thu về đạt độ chính xác cao và loại trừ các tác động sai do môi trường bị nhiễu tác động vào máy thu.
Việc mã hóa được coi là rất quan trọng trong điều khiển, nó nâng cao độ bảo mật, không bị nhiễu do môi trường xung quanh. Một máy phát có mã hóa và máy thu có giải mã sẽ ít bị nhận sai dữ liệu hoặc cũng có thể sửa sai dữ liệu, khó bị can nhiễu hơn so với không mã hóa.
Dữ liệu được đưa vào máy phát là dạng nối tiếp, trong truyền thông số, các bit 0 hoặc 1 sẽ được đưa vào đầu dữ liệu phát mã hóa và máy thu có nhiệm vụ giải điều chế, hoàn lại dạng của tín hiệu này.
Việc mã hóa dữ liệu cũng như mã hóa điều khiển vậy, ta có thể làm bằng nhiều cách: sử dụng các IC mã hóa – giải mã, lập trình bằng vi điều khiển, mã hóa trực tiếp với PC …
Có rất nhiều dạng mã hóa khác nhau như: NRZL (Non Return to Zero Level), NRZI ( Non Return to Zero Inverted), Manchester … Hình dưới là một số dạng mã hóa phổ biến.
Mã hóa dữ liệu RF
Điều chế là dùng tín hiệu cần truyền để làm thay đổi một thông số nào đó của một tín hiệu khác, tín hiệu này thực hiện nhiệm vụ mang tín hiệu cần truyền đến nơi thu nên được gọi là sóng mang.
Mục đích của điều chế là dời phổ tần của tín hiệu cần truyền đến một vùng phổ tần khác thích hợp với tính chất của đường truyền và nhất là có thể truyền đồng thời nhiều kênh một lúc.
Tóm lại, phương pháp điều chế là dùng tín hiệu cần truyền làm thay đổi một thông số nào đó của sóng mang (biên độ, tần số, pha …). Tùy theo thông số được lựa chọn ta có các phương pháp điều chế khác nhau: Điều chế biên độ AM (Amplitude Modulation), điêu chế tần số FM (Frequency Modulation), điều chế pha ΦM …
+ Điều chế AM (Amplitude Modulation)
Dữ liệu có thể được truyền bằng phương pháp điều chế AM, trong trường hợp này gọi là kỹ thuật dời biên (ASK – Amplitude Shift Keying). Bit 1 được truyền đi bởi sóng mang có biên độ E1, bít 0 được truyền đi bởi sóng mang có biên độ E2. Hình dưới minh họa tín hiệu ASK.
Điều chế AM
+ Điều chế FM (Frequency Modulation)
Dữ liệu có thể được truyền bằng phương pháp điều chế FM, trong trường hợp này gọi là kỹ thuật dời tần (FSK – Frequency Shift Keying).
FSK được dùng rộng rãi trong truyền số liệu. Trong FSK bit 1 được truyền đi bởi tần số FM, bít 0 được truyền đi bởi tần số FS.
Điều chế FM
c. Một vài định nghĩa căn bản cần nắm trước khi tiến hành xây dựng mạch thu phát tín hiệu RF.
+ Tốc độ truyền dữ liệu (Baud Rate)
Lấy ví dụ về việc truyền 1 bit trong 1ms, ta thấy rằng để việc truyền và nhận không đồng bộ xảy ra thành công thì các thiết bị tham gia phải “thống nhất” nhau về khoảng thời dành cho 1 bite truyền, hay nói cách khác tốc độ truyền phải được cài đặt như nhau trước, tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ baud là số bit truyền trong 1 giây. Ví dụ nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền là 1/19200 ~ 52.083us.
+ Khung truyền (Frame)
Do truyền thông nối tiếp mà nhất là nối tiếp không đồng bộ rất dễ mất hoặc sai lệch dữ liệu, quá trình truyền thông theo kiểu này phải tuân theo một số quy cách nhất định. Bên cạnh tốc độ baud, khung truyền là một yếu tốc quan trọng tạo nên sự thành công khi truyền và nhận. Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền. Hình 1 là một ví dụ của một khung truyền theo UART, khung truyền này được bắt đầu bằng một start bit, tiếp theo là 8 bit data, sau đó là 1 bit parity dùng kiểm tra dữ liệu và cuối cùng là 2 bits stop.
+ Start Bit
Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Ở module USART trong AVR, đường truyền luôn ở trạng thái cao khi nghỉ (Idle), nếu một chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi một bit start bằng cách “kéo” đường truyền xuống mức 0. Như vậy, với AVR bit start là mang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị điện áp của bit start là ngược lại). start là bit bắt buộc phải có trong khung truyền.
+ Stop Bit
Stop bits là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bits bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể là 1 hoặc 2 bits (Trong các thiết bị khác Stop bits có thể là 2.5 bits). Trong ví dụ ở hình 1, có 2 stop bits được dùng cho khung truyền.Giá trị của stop bit luôn là giá trị nghỉ (Idle) và là ngược với giá trị của start bit, giá trị stop bit trong AVR luôn là mức cao (5V).
+ Data
Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data không nhất thiết phải là gói 8 bit, với AVR bạn có thể quy định số lượng bit của data là 5, 6, 7, 8 hoặc 9 (tương tự cho hầu hết các thiết bị hỗ trợ UART khác). Trong truyền thông nối tiếp UART, bit có ảnh hưởng nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có ảnh hưởng lớn nhất (MSB – Most Significant Bit, bit bên trái).
+ Parity Bit
Parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số lẻ. Ví dụ, nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 số 1 trong dữ liệu này, nếu parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo tổng các số 1 là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của parity bit là 1. Hình 1 mô tả ví dụ này với parity chẵn được sử dụng. Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền.
+ Khung truyền phổ biến nhất là : start bit+ 8 bit data+1 stop bit
- Hai bit UPM1 và UPM0( Parity Mode) được dùng để quy định kiểm tra pariry. Nếu UPM1:0=00, parity không được sử dụng (mode này khá thông dụng), UPM1:0=01 không được sử dụng, UPM1:0=10 thì parity chẵn được dùng, UPM1:0=11 parity lẻ được sử dụng (xem thêm bảng 1).
Bảng 2.3 Chọn kiểm tra parity
UPM1 UPM0 Parity mode
0 0 Disabled
0 1 Reserved
1 0 Enable, Even Parity
1 1 Enable, Old Parity
- USBS (Stop bit Select), bit Stop trong khung truyền bằng AVR USART có thể là 1 hoặc 2 bit, nếu USBS=0 thì Stop bit chỉ là 1 bit trong khi USBS=1 sẽ có 2 Stop bit được dùng.
- Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền. Bảng 2 tóm tắt các giá trị có thể có của tổ hợp 3 bit này và độ dài dữ liệu truyền tương ứng.
Độ dài dữ liệu truyền
UCSZ2 UCSZ1 UCSZ0 KÍCH THƯỚC
0 0 0 5 bit
0 0 1 6 bit
0 1 0 7 bit
0 1 1 8 bit
1 0 0 Reserved
1 0 1 Reserved
1 1 0 Reserved
1 1 1 9 bit
Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC,ta phải set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ được USART dùng để tính tốc độ baud. Bảng 3 hướng dẫn cách tính tốc độ baud dựa vào giá trị của thanh ghi UBRR và ngược lại, cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đã biết tốc độ baud.
Tính tốc độ baud
Chế độ hoạt động Phương trình tính tốc độ baud Phương trình tính giá trị UBRR
Không đồng bộ thường (U2X=0)
Không đồng bộ tốc độ gấp đôi(U2X=1)
Chủ đồng bộ
Trong các công thức trong bảng 3, fOSC là tốc tần số xung nhịp của hệ thống (thạch anh hay nguồn xung nội…). Để tiện cho bạn theo dõi, tôi đính kèm bảng ví dụ cách đặt giá trị cho UBRR theo tốc độ baud mẫu.
Vài nét về vi điều khiển PIC16f84
a. Lịch sử phát triển vi điều khiển PIC
PIC là viết tắt của “Programable Intelligent Computer”, có thể tạm dịch là “máy tính thông minh khả trình” do hãng Genenral Instrument đặt tên cho vi điều khiển đầu tiên của họ : PIC1650 được thiết kế để dùng làm các thiết bị ngoại vi cho vi điều khiển CP 1600. Vi điều khiển này sau đó được nghiên cứu phát triển thêm và từ đó hình thành nên dòng vi điều khiển PIC ngày nay.
b. Kiến trúc vi điều khiển PIC
Tổ chức phần cứng của PIC được thiết kế theo kiến trúc Havard. Điểm khác biệt giữa kiến trúc Havard và kiến trúc Von-Neuman là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình.
Đối với kiến trúc Von-Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đó ta có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu. Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lý của CPU phải rất cao, vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình. Như vậy có thể nói kiến trúc Von-Neuman không thích hợp với cấu trúc của một vi điều khiển.
Đối với kiến trúc Havard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt. Do đó trong cùng một thời điểm CPU có thể tương tác với cả hai bộ nhớ, như vậy tốc độ xử lý của vi điều khiển được cải thiện đáng kể.
Một điểm cần chú ý nữa là tập lệnh trong kiến trúc Havard có thể tối ưu tùy theo yêu cầu kiến trúc của vi điều khiển mà không phụ thuộc vào cấu trúc dữ liệu. Ví dụ đối với vi điều khiển dòng 16F, độ dài lệnh luôn là 14bit (trong khi dữ liệu được tổ chức thành từng byte), còn đối với kiến trúc Von-Neuman, độ dài lệnh luôn là bội số của 1 byte (do dữ liệu được tổ chức thành từng byte).
c. RISC(Reduced Instruction Set Computer) và CISC(Complex Instruction Set Computer)
Như đã trình bày ở trên, kiến trúc Havard là khái niệm mới hơn so với kiến trúc Von-Neuman. Khái niệm này được hình thành nhằm cải tiến tốc độ thực thi của một vi điều khiển. Qua việc tách rời bộ nhớ chương trình và bộ nhớ dữ liệu, bus chương trình và bus dữ liệu, CPU có thể cùng một lúc truy xuất cả bộ nhớ chương trình và bộ nhớ dữ liệu, giúp tăng tốc độ xử lý của vi điều khiển lên gấp đôi. Đồng thời cấu trúc lệnh không còn phụ thuộc vào cấu trúc dữ liệu nữa mà có thể linh động điều chỉnh tùy theo khả năng và tốc độ của từng vi điều khiển. Và để tiếp tục cải tiến tốc độ thực thi lệnh, tập lệnh của họ vi điều khiển PIC được thiết kế sao cho chiều dài mã lệnh luôn cố định (ví dụ với họ 16Fxxxx chiều dài mã lệnh luôn là 14bit) và cho phép thực thi lệnh trong một chu kỳ của xung clock (ngoại trừ một số trường hợp đặc biệt như lệnh nhảy, lệnh gọi chương trình con cần hai chu kỳ xung đồng hồ). Điều này có nghĩa tập lệnh của vi điều khiển thuộc cấu trúc Havard sẽ ít lệnh hơn, ngắn hơn, đơn giản hơn để đáp ứng yêu cầu mã hóa lệnh bằng một số bit nhất định.
Vi điều khiển được tổ chức theo kiến trúc Havard còn được gọi là vi điều khiển RISC (Reduced Instruction Set Computer) hay vi điều khiển có tập lệnh rút gọn. Vi điều khiển được thiết kế theo kiến trúc Von-Neuman còn được gọi là vi điều khiển CISC (Complex Instruction Set Computer) hay vi điều khiển có tập lệnh phức tạp vì mã lệnh của nó không phải là một số cố định mà luôn là bội số của 8bit (1byte).
d. Pipelining
Đây chính là cơ chế xử lý lệnh của các vi điều khiển PIC. Một chu kỳ lệnh của vi điều khiển sẽ bao gồm 4 xung clock. Ví dụ ta sử dụng oscillator có tần số 4MHZ, thì xung lệnh sẽ có tấn số 1MHZ (chu kỳ lệnh sẽ là 1 us).
Thông thường, để thực thi một lệnh, ta cần một chu kỳ lệnh để gọi lệnh đó, và một chu kỳ xung clock nữa để giải mã và thực thi lệnh. Với cơ chế pipelining được trình bày ở trên, mỗi lệnh xem như chỉ được thực thi trong một chu kỳ lệnh. Đối với các lệnh mà quá trình thực thi nó làm thay đổi giá trị thanh ghi PC (Program Counter) cần hai chu kỳ lệnh để thực thi vì phải thực hiện việc gọi lệnh ở địa chỉ thanh ghi PC chỉ tới. Sau khi đã xác định đúng vị trí lệnh trong thanh ghi PC, mỗi lệnh chỉ cần một chu kỳ lệnh để thực thi xong.
e. Các dòng PIC và cách lựa chọn vi điều khiển PIC
Các ký hiệu của vi điều khiển PIC:
- PIC12xxxx: độ dài lệnh 12bit
- PIC16xxxx: độ dài lệnh 14bit
- PIC18xxxx: độ dài lệnh 16bit
C: PIC có bộ nhớ EPROM (chỉ có 16C84 là EEPROM)
F: PIC có bộ nhớ flash
LF: PIC có bộ nhớ flash hoạt động ở điện áp thấp
LV: tương tự LF, đây là ký hiệu cũ
Bên cạnh đó một số vi điều khiển có ký hiệu xxFxxx là EEPROM, nếu có thêm chữ A ở cuối là flash (ví dụ PIC16F877 là EEPROM, còn PIC16F877A là flash). Ngoài ra còn có thêm một dòng vi điều khiển PIC mới là dsPIC.
Nhóm muốn sử dụng các modun RF riêng để dễ dàng kiểm soát các vấn đề trục trặc khi gặp phải. Trong việc truyền nhận thì PIC có độ ổn định hơn các dòng VĐK mà chúng ta đang sử dụng khác như 89, AVR… Trong quá trình truyền nhận RF sẽ tạo ra một khoảng thời gian trễ nên thời gian thực để truyền nhận dữ liệu nên truyền nhận qua mođun đơn lẻ sẽ tiết kiệm thời gian xử lý mà ko bị phụ thuộc vào việc xử lý đó.
Comment