Anda di halaman 1dari 42

Báo cáo thực tập tốt nghiệp

Lời giới thiệu

Vi điều khiển là 1 lĩnh vực khá lý thú đối với chuyên ngành Điện tử-Viễn thông.
Cùng với sự phát triển của ngành điện tử thì nhiều họ vi điều khiển lần lượt được các
hãng sản xuất chip cho ra đời như: Z80 của Zilog, AT89 của Atmel, PIC của Microchip,
AVR của Atmel...
Họ vi điều khiểnAVR của Atmel Corp là 1 bước phát triển trên nền của Vi điều
khiển AT89 đã khá quen thuộc. Nếu như AT89 là vi điều khiển có CPU CISC thì AVR
là RISC, với kiến trúc Harvard do vậy tốc độ sẽ nhanh hơn (tốc độ tối đa là 16 triệu
lệnh/giây). Ngoài ra AVR cũng tích hợp sẵn ngay trong chip mạch ADC, PWM,....cũng
như hỗ trợ các chuẩn giao tiếp thông dụng như UART/USART, I2C, 2-wires,... nên việc
thiết kế và thực hiện phần cứng cho những ứng dụng rất thuận tiện, nhanh chóng, nhỏ
gọn.
Về ngôn ngữ lập trình cho AVR thì có rất nhiều: assembly, C, Basic, Pascal... Trong
đó những phần mềm miễn phí do chính Atmel cung cấp, hay những hãng khác là rất
nhiều: avrasm, winasm (hợp ngữ), CodeVisionAVR, Win-GCC(ngôn ngữ C),
BASCOM (ngôn ngữ Basic).v.v.
Hơn thế việc mô phỏng, debug cũng được hỗ trợ các từ A-Z, nhiều phần mềm
simulator, emulator như: AVRStudio (miễn phí của Atmel), Proteus, ...
Trong phạm vi cuốn báo cáo này chỉ nghiên cứu về vi điều khiển ATmega16, phần
mềm mô phỏng mạch điện Proteus 7.0 và sử dụng Proteus để thiết kế máy phát trải phổ.
Trong quá trình viết báo cáo, người viết có tham khảo datasheet của ATmega16 từ
trang web của hãng Atmel (www.atmel.com) và một số tài liệu khác.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Mục lục

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 1. Giới thiệu chung

Phần 1. Vi điều khiển ATmega16


Chương 1. Giới thiệu chung

ATmega16 là vi điều khiển 8 bit dựa trên kiến trúc RISC. Với khả năng thực hiện
mỗi lệnh trong vòng một chu kỳ xung clock, ATmega16 có thể đạt được tốc độ 1MIPS
trên mỗi MHz (1 triệu lệnh/s/MHz).

Dưới đây là sơ đồ khối của ATmega16

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 1. Giới thiệu chung

Hình 1.1. Sơ đồ cấu trúc ATmega16


ATmega16 có các đặc điểm sau: 16KB bộ nhớ Flash với khả năng đọc trong khi ghi,
512 byte bộ nhớ EEPROM, 1KB bộ nhớ SRAM, 32 thanh ghi chức năng chung, 32
đường vào ra chung, 3 bộ định thời/bộ đếm, ngắt nội và ngắt ngoại, USART, giao tiếp
nối tiếp 2 dây, 8 kênh ADC 10 bit,....
ATmega 16 hỗ trợ đầy đủ các chương trình và công cụ phát triển hệ thống như: trình
dịch C, macro assemblers, chương trình mô phỏng/sửa lỗi, kit thử nghiêm,...

Lê Hải Đăng CTM5-k50-HUT


Chương 2. Cấu trúc nhân AVR

Chương 2. Cấu trúc nhân AVR

CPU của AVR có chức năng bảo đảm sự hoạt động chính xác của các chương trình.
Do đó nó phải có khả năng truy cập bộ nhớ, thực hiện các quá trình tính toán, điều
khiển các thiết bị ngoại vi và quản lý ngắt.

2.1.Cấu trúc tổng quát

Hình 2.1. Sơ đồ cấu trúc CPU của ATmega16

AVR sử dụng cấu trúc Harvard, tách riêng bộ nhớ và các bus cho chương trình và dữ
liệu. Các lệnh được thực hiện chỉ trong một chu kỳ xung clock. Bộ nhớ chương trình
được lưu trong bộ nhớ Flash.

2.2. ALU
ALU làm việc trực tiếp với các thanh ghi chức năng chung. Các phép toán được
thực hiện trong một chu kỳ xung clock. Hoạt động của ALU được chia làm 3 loại: đại
số, logic và theo bit.

2.3. Thanh ghi trạng thái


Đây là thanh ghi trạng thái có 8 bit lưu trữ trạng thái của ALU sau các phép tính số
học và logic.

Lê Hải Đăng CTM5-k50-HUT


Chương 2. Cấu trúc nhân AVR

Hình 2.2. Thanh ghi trạng thái SREG

C: Carry Flag ;cờ nhớ (Nếu phép toán có nhớ cờ sẽ được thiết lập)
Z: Zero Flag ;Cờ zero (Nếu kết quả phép toán bằng 0)
N: Negative Flag (Nếu kết quả của phép toán là âm)
V: Two’s complement overflow indicator (Cờ này được thiết lập khi tràn số bù 2)
V, For signed tests (S=N XOR V) S: N
H: Half Carry Flag (Được sử dụng trong một số toán hạng sẽ được chỉ rõ sau)
T: Transfer bit used by BLD and BST instructions(Được sử dụng làm nơi chung
gian trong các lệnh BLD,BST).
I: Global Interrupt Enable/Disable Flag (Đây là bit cho phép toàn cục ngắt. Nếu bit
này ở trạng thái logic 0 thì không có một ngắt nào được phục vụ.)

2.4. Các thanh ghi chức năng chung

Hình 2.3. Thanh ghi chức năng chung

2.5. Con trỏ ngăn xếp (SP)


Là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi chức năng
đặc biệt 8 bit. Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E (Trong bộ nhớ
RAM là $5E). Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa ngăn xếp.

Lê Hải Đăng CTM5-k50-HUT


Chương 2. Cấu trúc nhân AVR

Hình 2.4. Thanh ghi con trỏ ngăn xếp

Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí. Và con trỏ ngăn xếp sẽ giảm 1 khi
thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng 1 và
khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy con trỏ ngăn
xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi một chương
trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn xếp ít nhất
cũng phải lơn hơn hoặc bằng 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.

2.6. Quản lý ngắt


Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn
xàng cho đổi dữ liệu của mình.Ví dụ:Khi bộ truyền nhận UART nhận được một byte nó
sẽ báo cho CPU biết thông qua cờ RXC,hợc khi nó đã truyền được một byte thì cờ TX
được thiết lập…
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lưu vị trí
đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc vụ
ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp lệnh RETI (return from
interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chương trình mà trước
khi có ngăt nó đang thực hiện. Trong trường hợp mà có nhiều ngắt yêu cầu cùng một
lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt theo mức ưu
tiên .Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy ra hai trường hợp.
Trường hớp ngắt này có mức ưu tiên cao hơn thì nó sẽ được phục vụ. Còn nó mà có
mức ưu tiên thấp hơn thì nó sẽ bị bỏ qua.
Bộ nhớ ngăn xếp là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên. Để truy nhập
vào SRAM thông thường thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theo
kiểu ngăn xếp thì ta dùng con trỏ SP. Con trỏ này là một thanh ghi 16 bit và được truy
nhập như hai thanh ghi 8 bit chung có địa chỉ :SPL :0x3D/0x5D(IO/SRAM) và
SPH:0x3E/0x5E.
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí.Và con trỏ ngăn xếp sẽ giảm 1 khi
thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng 1 và
khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy con trỏ ngăn
xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi một chương
trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn xếp ít nhất
cũng phải lớn hơn 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.

Ví dụ:
char cSREG;

cSREG = SREG; /* store SREG value */

/* disable interrupts during timed sequence */


CLI();

EECR |= (1<<EEMWE); /* start EEPROM write */

Lê Hải Đăng CTM5-k50-HUT


Chương 2. Cấu trúc nhân AVR

EECR |= (1<<EEWE);

SREG = cSREG; /* restore SREG value (I-bit) */

Lê Hải Đăng CTM5-k50-HUT


Chương 3. Cấu trúc bộ nhớ

Chương 3. Cấu trúc bộ nhớ

AVR có 2 không gian bộ nhớ chính là bộ nhớ dữ liệu vào bộ nhớ chương trình.
Ngoài ra ATmega16 còn có thêm bộ nhớ EEPROM để lưu trữ dữ liệu.

3.1. Bộ nhớ chương trình (Bộ nhớ Flash)


Bộ nhớ Flash 16KB của ATmega16 dùng để lưu trữ chương trình. Do các lệnh của
AVR có độ dài 16 hoặc 32 bit nên bộ nhớ Flash được sắp xếp theo kiểu 8KX16. Bộ nhớ
Flash được chia làm 2 phần, phần dành cho chương trình boot và phần dành cho
chương trình ứng dụng.

Hình 3.1. Bản đồ bộ nhớ chương trình

3.2. Bộ nhớ dữ liệu SRAM


1120 ô nhớ của bộ nhớ dữ liệu định địa chỉ cho file thanh ghi, bộ nhớ I/O và bộ nhớ
dữ liệu SRAM nội. Trong đó 96 ô nhớ đầu tiên định địa chỉ cho file thanh ghi và bộ nhớ
I/O, và 1024 ô nhớ tiếp theo định địa chỉ cho bộ nhớ SRAM nội.

Lê Hải Đăng CTM5-k50-HUT


Chương 3. Cấu trúc bộ nhớ

Hình 3.2. Bản đồ bộ nhớ dữ liệu SRAM

3.3. Bộ nhớ dữ liệu EEPROM


ATmega16 chứa bộ nhớ dữ liệu EEPROM dung lượng 512 byte, và được sắp xếp
theo từng byte, cho phép các thao tác đọc/ghi từng byte một.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 4.Các cổng vào ra

Chương 4. Các cổng vào ra (I/O)

Vi điều khiểnATmega16có 32 đường vào ra chia làm bốn nhóm 8 bit một. Các
đường vào ra này có rất nhiều tính năng và có thể lập trình được. Ở đây ta sẽ xét chúng
là các cổng vào ra số. Nếu xét trên mặt này thì các cổng vào ra này là cổng vào ra hai
chiều có thể định hướng theo từng bit. Và chứa cả điện trở pull-up (có thể lập trình
được). Mặc dù mỗi port có các đặc điểm riêng nhưng khi xét chúng là các cổng vào ra
số thì dường như điều khiển vào ra dữ liệu thì hoàn toàn như nhau. Chúng ta có thanh
ghi và một địa chỉ cổng đối với mỗi cổng, đó là : thanh ghi dữ liệu cổng (PORTA,
PORTB, PORTC, PORTD), thanh ghi dữ liệu điều khiển cổng (DDRA, DDRB, DDRC,
DDRD) và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB, PINC, PIND).

4.1. Thanh ghi DDRx


Đây là thanh ghi 8 bit (ta có thể đọc và ghi các bit ở thanh ghi này) và có tác dụng
điều khiển hướng cổng PORTx (tức là cổng ra hay cổng vào). Nếu như một bit trong
thanh ghi này được set thì bit tương ứng đó trên PORTx được định nghĩa như một cổng
ra. Ngược lại nếu như bit đó không được set thì bit tương ứng trên PORTx được định
nghĩa là cổng vào.

4.2.Thanh ghi PORTx


Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi được) nó là thanh ghi dữ liệu
của cổng Px và trong trường hợp nếu cổng được định nghĩa là cổng ra thì khi ta ghi một
bit lên thanh ghi này thì chân tương ứng trên port đó cũng có cùng mức logic. Trong
trường hợp mà cổng được định nghĩa là cổng vào thì thanh ghi này lại mang dữ liệu
điều khiển cổng. Cụ thể nếu bit nào đó của thanh ghi này được set (đưa lên mức 1) thì
điện trở kéo lên (pull-up) của chân tương ứng của port đó sẽ được kích hoạt. Ngược lại
nó sẽ ở trạng thái hi-Z. Thanh ghi này sau khi khởi động Vi điều khiểnsẽ có giá trị là
0x00.

4.3. Thanh ghi PINx


Đây là thanh ghi 8 bit chứa dữ liệu vào của PORTx (trong trường hợp PORTx được
thiết lập là cổng vào) và nó chỉ có thể đọc mà không thể ghi vào được.

Tóm lại:
1. Để đọc dữ liệu từ ngoài thì ta phải thực hiện các bước sau:
 Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong
port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).
 Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).
 Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).

2. Để đưa dữ liệu từ vi điều khiển ra các cổng cũng có các bước hoàn toàn tương tự.
Ban đầu ta cũng phải định nghĩa đó là cổng ra bằng cách set bit tương ứng của cổng
đó….và sau đó là ghi dữ liệu ra bit tương ứng của thanh ghi PORTx.
Ví dụ:
unsigned char i;

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 4.Các cổng vào ra

...
/* Define pull-ups and set outputs high */
/* Define directions for port pins */
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINB;

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời

Chương 5. Bộ định thời

Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit, có các đặc điểm
sau:
 Bộ đếm một kênh
 Xóa bộ định thời khi trong mode so sánh (tự động nạp)
 PWM
 Tạo tần số
 Bộ đếm sự kiện ngoài
 Bộ chia tần 10 bit
 Nguồn ngắt tràn bộ đếm và so sánh
Sơ đồ cấu trúc của bộ định thời:

Hình 5.1. Sơ đồ cấu trúc bộ định thời

5.1. Các thanh ghi


TCNT0 và OCR0 là các thanh ghi 8 bit. Các tín hiệu yêu cầu ngắt đều nằm trong
thanh ghi TIFR. Các ngắt có thể được che bởi thanh ghi TIMSK.
Bộ định thời có thể sử dụng xung clock nội thông qua bộ chia hoặc xung clock
ngoài trên chân T0. Khối chọn xung clock điều khiển việc bộ định thời/bộ đếm sẽ dùng
nguồn xung nào để tăng giá trị của nó. Ngõ ra của khối chọn xung clock được xem là
xung clock của bộ định thời (clkT0).
Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ đếm. Kết quả so
sánh có thể được sử dụng để tạo ra PWM hoặc biến đổi tần số ngõ ra tại chân OC0.

5.2. Đơn vị đếm

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời

Phần chính của bộ định thời 8 bit là một đơn vị đếm song hướng có thể lập trình
được. Cấu trúc của nó như hình dưới đây:

Hình 5.2. Đơn vị đếm

count: tăng hay giảm TCNT0 1


direction: lựa chọn giữa đếm lên và đếm xuống
clear: xóa thanh ghi TCNT0
clkT0: xung clock của bộ định thời
TOP: báo hiệu bộ định thời đã tăng đến giá trị lớn nhất
BOTTOM: báo hiệu bộ định thời đã giảm đến giá trị nhỏ nhất (0)

5.3. Đơn vị so sánh ngõ ra

Hình 5.3. Sơ đồ đơn vị so sánh ngõ ra

Bộ so sánh 8 bit liên tục so sánh giá trị TCNT0 với giá trị trong thanh ghi so sánh
ngõ ra (OCR0). Khi giá trị TCNT0 bằng với OCR0, bộ so sánh sẽ tạo một báo hiệu.
Báo hiệu này sẽ đặt giá trị cờ so sánh ngõ ra (OCF0) lên 1 vào chu kỳ xung clock tiếp
theo. Nếu được kích hoạt (OCIE0=1), cờ OCF0 sẽ tạo ra một ngắt so sánh ngõ ra và sẽ
tự động được xóa khi ngắt được thực thi. Cờ OCF0 cũng có thể được xóa bằng phần
mềm.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời

5.4. Mô tả các thanh ghi


5.4.1. Thanh ghi điều khiển bộ định thời/bộ đếm TCCR0

Hình 5.4. Thanh ghi điều khiển bộ định thời

5.4.1.1. Bit 7-FOC0: So sánh ngõ ra bắt buộc


Bit này chỉ tích cực khi bit WGM00 chỉ định chế độ làm việc không có PWM. Khi
đặt bit này lên 1, một báo hiệu so sánh bắt buộc xuất hiện tại đơn vị tạo dạng sóng.
5.4.1.2. Bit 6, 3-WGM01:0: Chế độ tạo dạng sóng
Các bit này điều khiển đếm thứ tự của bộ đếm, nguồn cho giá trị lớn nhất của bộ
đếm (TOP) và kiểu tạo dạng sóng sẽ được sử dụng.
5.4.1.3. Bit 5:4-COM01:0: Chế độ báo hiệu so sánh ngõ ra
Các bit này điều khiển hoạt động của chân OC0. Nếu một hoặc cả hai bit COM01:0
được đặt lên 1, ngõ ra OC0 sẽ hoạt động.
5.4.1.4. Bit 2:0: CS02:0: Chọn xung đồng hồ
Ba bit này dùng để lựa chọn nguồn xung cho bộ định thời/bộ đếm.

5.4.2. Thanh ghi bộ định thời/bộ đếm

Hình 5.5. Thanh ghi bộ định thời


Thanh ghi bộ định thời/bộ đếm cho phép truy cập trực tiếp (cả đọc và ghi) vào bộ
đếm 8 bit.

5.4.3. Thanh ghi so sánh ngõ ra-OCR0

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời

Hình 5.6. Thanh ghi so sánh ngõ ra

Thanh ghi này chứa một giá trị 8 bit và liên tục được so sánh với giá trị của bộ đếm.

5.4.4. Thanh ghi mặt nạ ngắt

Hình 5.7. Thanh ghi mặt nạ ngắt TIMSK

5.4.4.1. Bit 1-OCIE0: Cho phép ngắt báo hiệu so sánh


5.4.4.2. Bit 0-TOIE0: Cho phép ngắt tràn bộ đếm

5.4.5. Thanh ghi cờ ngắt bộ định thời

5.4.5.1. Bit 1-OCF0: Cờ so sánh ngõ ra 0


5.4.5.2. Bit 0-TOV0: Cờ tràn bộ đếm
Bit TOV0 được đặt lên 1 khi bộ đếm bị tràn và được xóa bởi phần cứng khi vector
ngắt tương ứng được thực hiện. Bit này cũng có thể được xóa bằng phần mềm.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 6. USART

Chương 6. USART

Bộ truyền nhận nối tiếp đồng bộ và bất đồng bộ là một thiết truyền thông nối tiếp có
các chức năng chính như sau:
 Hoạt động song công (các thanh ghi truyền và nhận nối tiếp độc lập với nhau).
 Hoạt động đồng bộ hoặc bất đồng bộ
 Bộ tạo tốc độ baud có độ chính xác cao
 Hỗ trợ khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc 2 bit stop
 Kiểm tra chẵn lẻ
 Phát hiện tràn dữ liệu
 Phát hiện lỗi khung
 Lọc nhiễu, bao gồm phát hiện bit start lỗi và bộ lọc thông thấp số
 Ngắt khi kết thúc truyền, thanh ghi truyền hết dữ liệu và kết thúc nhận
 Chế độ truyền thông đa vi xử lý
 Chế độ truyền đồng bộ tốc độ cao
Sơ đồ khối của bộ USART như sau:

Hình 6.1. Sơ đồ khối bộ USART

USART bao gồm 3 phần chính: bộ tạo xung clock, bộ truyền và bộ nhận. Các thanh
ghi điều khiển được sử dụng chung giữa các phần này.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 6. USART

6.1. Tạo xung clock


Bộ tạo xung clock tạo ra xung đồng hồ căn bản cho bộ truyền và bộ nhận. USART
hỗ trợ 4 chế độ hoạt động xung clock: bất đồng bộ, bất đồng bộ tốc độ cao, truyền đồng
bộ master và truyền đồng bộ slave. Sơ đồ khối của bộ tạo xung clock như sau:

Hình 6.2. Đơn vị tạo xung clock


.
txclk: xung đồng hộ bộ truyền
rxclk: xung đồng hồ bộ nhận
xcki: tín hiệu vào từ chân XCK, sử dụng cho hoạt động truyền đồng bộ master
xcko: tín hiệu xung clock ngõ ra tới chân XCK, sử dụng cho hoạt động truyền đồng
bộ slave
fosc: tần số từ chân XTAL

6.2. Định dạng khung truyền


USART chấp nhận tất cả 30 tổ hợp của các định dạng khung truyền sau đây:
 1 bit start
 5, 6, 7, 8, hoặc 9 bit dữ liệu
 Có hoặc không có bit chẵn lẻ
 1 hoặc 2 bit stop
Một khung truyền bắt đầu với một bit start, theo sau đó là bit có trọng số thấp nhất
(LSB) của dữ liệu (có thể lên tới 9 bit), kết thúc bằng bit có trọng số lớn nhất (MSB) và
bit stop.

Hình 6.3. Định dạng khung truyền

St: bit start (mức thấp)


(n): bit dữ liệu (0 đến 8)

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 6. USART

P: bit chẵn lẻ
Sp: bit stop (mức cao)
IDLE: không có dữ liệu truyền (mức cao trong suốt thời gian idle)

6.3. Khởi tạo USART


Quá trình khởi tạo USART bao gồm việc thiết lập tốc độ baud, thiết lập định dạng
khung và kích hoạt bộ truyền và bộ nhận.
Ví dụ dưới đây thiết lập hoạt động truyền bất động bộ sử dụng polling (không dùng
ngắt) và định dạng khung truyền là cố định. Tốc độ baud là một tham số của hàm.

void USART_Init( unsigned int baud )


{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

6.4. Truyền thông dữ liệu-bộ truyền USART


Bộ truyền USART được kích hoạt bằng cách thiết lập bit TXEN trong thanh ghi
UCSRB. Khi bộ truyền được kích hoạt, chân TxD hoạt động như ngõ ra của bộ truyền
nối tiếp. Tốc độ baud, chế độ hoạt động và định dạng khung truyền phải được thiết lập
trước khi thực hiện truyền dữ liệu.

6.4.1. Truyền khung 5 đến 8 bit dữ liệu


Việc truyền dữ liệu được thiết lập bằng cách nạp dữ liệu truyền vào bộ đệm truyền.
Dữ liệu trong bộ đệm sẽ được đưa vào thanh ghi dịch khi thanh ghi dịch đã sẵn sàng
gửi một khung mới.
Ví dụ dưới đây là một hàm truyền USART dựa trên việc kiểm tra cờ UDRE.

void USART_Transmit( unsigned char data )


{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

6.4.2. Truyền khung 9 bit dữ liệu


Nếu sử dụng 9 bit dữ liệu, bit thứ 9 phải được ghi vào bit TXB8 trong thanh ghi
UCSRB trước khi byte còn lại được ghi vào UDR.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 6. USART

Ví dụ:

void USART_Transmit( unsigned int data )


{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE))) )
;
/* Copy 9th bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
/* Put data into buffer, sends the data */
UDR = data;
}

6.5. Nhận dữ liệu-bộ nhận USART


Bộ nhận USART được kích hoạt bằng cách đặt bit RXEN trong thanh ghi UCRSB
lên 1. Khi bộ nhận được kích hoạt, chân RxD hoạt động như ngõ vào của bộ nhận nối
tiếp. Tốc độ baud, chế độ hoạt động và định dạng khung truyền phải được thiết lập
trước khi thực hiện truyền dữ liệu.

6.5.1. Nhận khung với 5 đến 8 bit dữ liệu


Bộ nhận bắt đầu nhận dữ liệu khi nó phát hiện một bit start hợp lệ. Mỗi bit theo sau
bit start sẽ được lấy mẫu tại tốc độ baud hoặc tốc độ đồng hồ XCK, và được dịch vào
trong thanh ghi dịch của bộ nhận cho đến khi phát hiện một bit stop đầu tiên. Nội dung
của thanh ghi dịch sau đó được đưa vào bộ đệm. Bộ đệm của bộ nhận có thể được đọc
bằng cách đọc UDR.
Ví dụ sau đây là một hàm nhận USART dựa trên việc kiểm tra cờ kết thúc truyền
(RXC).

unsigned char USART_Receive( void )


{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

6.5.2. Nhận khung với 9 bit dữ liệu


Nếu nhận dữ liệu 9 bit, bit thứ 9 phải được đọc từ bit RXB8 trong thanh ghi UCSRB
trước khi đọc các bit thấp trong UDR.
Ví dụ sau đây là một hàm nhận dữ liệu 9 bit.

unsigned int USART_Receive( void )

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 6. USART

{
unsigned char status, resh, resl;
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get status and 9th bit, then data */
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* If error, return -1 */
if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )
return -1;
/* Filter the 9th bit, then return */
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 7. Bộ biến đổi A/D

Chương 7. Bộ biến đổi A/D

Vi điều khiểnATmega16 có một bộ biến đổi ADC tích hợp trong chip với các đặc
điểm:
 Độ phân giải 10 bit
 Sai số tuyến tính: 0.5LSB
 Độ chính xác +/-2LSB
 Thời gian chuyển đổi:65-260μs
 8 Kênh đầu vào có thể được lựa chọn
 Có hai chế độ chuyển đổi free running và single conversion
 Có nguồn báo ngắt khi hoàn thành chuyển đổi
 Loại bỏ nhiễu trong chế độ ngủ

Hình 7.1. Sơ đồ bộ biến đổi A/D

Tám đầu vào của ADC là tám chân của PORTA và chúng được chọn thông qua một
MUX.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 7. Bộ biến đổi A/D

Để điều khiển hoạt động vào ra dữ liệu của ADC và CPU chúng ta có 3 thanh ghi:
ADMUX là thanh ghi điều khiển lựa chọn kênh đầu vào cho ADC, ADCSRA là thanh
ghi điều khiển và thanh ghi trạng thái của ADC, ADCH và ADCL là 2 thanh ghi dữ
liệu.

7.1. ADMUX: Multiplexer select register


Đây là thanh ghi điều khiển 8 bit.

Hình 7.2. Thanh ghi ADMUX

Với 4 bit được định nghĩa là MUX3, MUX2, MUX1,và MUX0, ứng với các tổ hợp
logic ta có thể chọn kênh đầu vào. Cụ thể:

Các bit REFS1 và REFS0 dùng để chọn giá trị điện áp tham khảo cho ADC, như
sau:

Chú ý: Nếu như ta thay đổi kênh trong thời điểm mà ADC đang chuyển đổi thì khi quá
trình chuyển đổi đã hoàn thành thì kênh vào mới được thay đổi.
7.2. ADCSR-ADC control and status register
Đây là thanh ghi điều khiển và lưu trạng thái của ADC.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 7. Bộ biến đổi A/D

Hình 7.3. Thanh ghi điều khiển và trạng thái ADC

7.2.1. Bit 7-ADEN:ADC enable


Đây là bit điều khiển hoạt động của ADC.Khi bit này được set 1 thì ADC có thể
hoạt động và ngược lại.Nếu như ta ngừng hoạt động của ADC trong khi nó đang
chuyển đổi thì nó sẽ kết thúc quá trình chuyển đổi.Mặc dù chưa chuyển đổi xong.

7.2.2. Bit 6-ADSC: ADC start conversion


Trong chế độ chuyển đổi đơn thì bit này phải được set lên 1 để bắt đầu chuyển
đổi.Trong chế độ chuyển đổi tự do thì bit này cần được set lên 1 để bắt đầu lần chuyển
đổi đầu tiên.Bit này được giữ sốt trong quá trình chuyển đổi và được xóa khi mà
chuyển đổi xong.

7.2.3. Bit 5-ADATE :ADC Auto Trigger enable


Khi bit này được set thì ADC sẽ bắt đầu chuyển đổi mỗi khi có một nguồn kích hoạt
xuất hiện. Việc lựa chọn nguồn kích hoạt được thực hiện bằng cách set các bit trong
thanh ghi SFIOR.

7.2.4. Bit 4-ADIF: ADC interrupt Flag


Bit này được set lên 1 bởi phần cứng khi quá trình chuyển đổi đã hoàn thành và
thanh ghi dữ liệu đã được cập nhật. Bit này được xóa bằng phần cứng nếu như ngắt này
được phép và được phục vụ. Hoặc nó có thể được xóa bằng cách ghi giá trị logic
“0”vào cờ này. Cụ thể khi ngắt bị cấm ta có thể sử dụng các lệnh sbi và cbi để tác dụng
lên bit này.

7.2.5. Bit 3-ADIE:ACD interrupt Enable


Nếu bit này set 1 và ngắt toàn cục được cho phép thì ngắt này được phép phục vụ
(khi chuyển đổi xong dữ liệu) và nếu bị xóa thì ngược lại.

7.2.6. Bit 2.1.0-ADPS2…ADPS0: Bit lựa chọn xung nhịp(Tốc độ)


Nguồn xung được lấy từ nguồn xung của Vi điều khiển(XTAL) và được chia tần
thông qua bộ chia tần.
Các bit ADPS có nhiệm vụ chọn số chia cho bộ chia tần theo bảng sau:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 7. Bộ biến đổi A/D

7.3. Thanh ghi dữ liệu ACDH và ADCL


Thanh ghi này chứa dữ liệu chuyển đổi từ tương tự sang số, được sắp xếp như hình
dưới đây.

Hình 7.4. Thanh ghi dữ liệu ADC

7.4. Nguyên tắc hoạt động và lập trình điều khiển


ADC có nhiệm vụ chuyển đổi tín hiệu điện áp tương tự thành tín hiệu số có độ phân
giải 10 bit.Với giá trị nhỏ nhất của điện áp đặt ở chân AGND và giá trị cực đại của điện
áp tương tự được mắc vào chân AREF. Tám kênh tương tự đầu vào được chọn lựa
thông qua ADMUX và ADMUX này được điều khiển bởi thanh ghi ADMUX.
ADC này có thể hoạt động được ở hai chế độ. Đó là chuyển đổi đơn: chỉ chuyển đổi
một lần khi có lệnh chuyển đổi và chế độ tự chuyển đổi (Free running mode) đây là chế
độ mà ADC tự động chuyển đổi khi được hoạt động và công việc chuyển đổi có tính
tuần hoàn (chỉ cần khởi động một lần).
ADC được phép hoạt động nhờ thiết lập bit ADEN. Quá trình chuyển đổi được bắt
đầu bằng việc ghi vào bit ADSC mức logic 1 và trong suốt quá trình chuyển đổi bit này
luôn được giữ ở mức cao. Khi quá trình chuyển đổi hoàn thành thì bit này được xóa
bằng phần cứng và cờ AIDF được bật lên.
Dữ liệu sau khi chuyển đổi được đưa ra thanh ghi dữ liệu ADCL và ADCH, nhưng
chú ý khi đọc dữ liệu từ hai thanh ghi này thì đọc ADCL trước rồi mới đọc ADCH. Nếu
đọc ADCH trước thì dữ liệu cập nhật có thể ghi đè lên ADCL (Vi điều khiển nghĩ rằng
đã đọc xong dữ liệu).
Để điều khiển vào ra dữ liệu với ADC, các bước thực hiện như sau:
Bước 1: Định nghĩa các cổng vào cho tín hiệu tương tự
Xóa bit tương ứng với chân đó trong thanh ghi DDRA. Sau đó loại bỏ điện trở treo
bằng cách xóa bit tương ứng ở thanh ghi PORTA.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 7. Bộ biến đổi A/D

Bước 2: Chọn kênh tương tự vào (chọn chân vào cho ADC) thông qua thanh ghi
ADMUX (có thể thay đổi trong quá trình hoạt động).
Bước 3: Thiết lập các thông số cho ADC
Tốc độ chuyển đổi thông qua xung nhip chuyển đổi.
Chế độ chuyển đổi : đơn hoặc tự động.
Sử dụng ngắt hoặc không.
Bước 4: Bắt đầu chuyển đổi và đọc dữ liệu.

Ví dụ: (biến đổi ADC, ngõ vào analog PA2, hiển thị dữ liệu trên led ở PORTB)
#include <avr/io.h>
#include<avr/interrupt.h>
//ADC interrupt function
ISR(ADC_vect)
{PORTB=ADCH;
}

int main(void)
{
outp(0xFF, DDRB); //PORTB is output
outp(0xFF, PORTB); //all PIN’s high (LED’s off)
outp(0x22, ADMUX); //PINA2 as analog input (MUX0..2)
//left adjusted (ADLAR=1)
//AREF as reference voltage (connected to VCC 5V) (REFS0..1)
outp(0xA5, ADCSR); //ADC enable, ADC auto trigger, ADC prescaler= 32
outp((inp(SFIOR)&0x1F),SFIOR); //Trigger source = Free Running Mode
sbi(ADCSR,6);
for(;;)
{
}
return 1;
}

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Phần 2. Phần mềm mô phỏng mạch điện Proteus

Phần 2. Phần mềm mô phỏng mạch điện Proteus 7.0

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 1. Giới thiệu chung

Chương 1. Giới thiệu chung

1. Giới thiệu về Proteus


Phần mềm Proteus VSM được viết bởi công ty Labcenter Electronics . Proteus đã
được sử dụng khá rộng rãi trên 35 quốc gia. Proteus đã tự khẳng định thế mạnh của nó
về mô phỏng các mạch nguyên lý sát với thực tế, trên 12 năm càng ngày nó càng được
hoàn thiện và phát triển mạnh. Protesu cung cấp cho người sử dụng hầu như toàn bộ các
linh kiện điện tử để người dùng có thể tạo ra được các mạch nguyên lý và sau cùng là
chạy thử và so sánh với kết quả thực tế. Chính vì Proteus có thể tạo và chạy được các
mạch đơn giản cũng như các mạch phức tạp nên có thể dùng nó trong giảng dạy, trong
các phòng thí nhiệm điện tử cũng như trong thực hành vi xử lý …
Phần mềm Proteus chạy trong môi trường Window 32 bit, yêu cầu của nó về phần
cứng cũng đơn giản, CPU 300MHz trở lên.

2. Các ưu điểm
- Dễ dàng tạo ra một sơ đồ nguyên lý đơn giản từ các mạch điện đơn giản đến các
mạch có bộ lập trình vi xử lý .
- Dễ dàng chỉnh sửa các đặc tính của linh kiện trên sơ đồ nguyên lý : chỉnh sửa số
bước của động cơ bước, chỉnh sửa nguồn nuôi cho mạch ,thay đổi tần số hoạt động
cơ bản của vi xử lý…
- Công cụ hỗ trợ kiểm tra lổi thiết kế trên sơ đồ nguyên lý . Xem và lưu lại phần báo lỗi
.
- Chạy mô phỏng và phân tích các tính chất của mạch điện cơ bản. Công cụ hỗ trợ
cho việc chạy và mô phỏng rất mạnh và chính xác. Các công cụ và đồ thị hỗ trợ
mạnh cho việc phân tích tần số, sóng, âm thanh .. không nhưng thế phần mềm còn
có thêm các máy phân tích từ đơn giản như : đồng hồ đo Vôn, Ampe, đến các máy
đo dao động ,máy tạo sóng dao động …
- Ngoài ra Proteus còn cung cấp cho người sử dụng các công cụ mạnh mà các phần
mềm khác hầu như không có. Chẳng hạn thư viện LED với các loại màu sắc khác nhau
kể cả led 7 đoạn. Nhưng phần hiển thị mạnh nhất mà Proteus cung cấp là LCD, nó có
thể mô phỏng cho rất nhiều LCD từ đơn giản đến phức tạp.
- Một cái ưu điểm nữa của Proteus là có thể mô phỏng công cụ phát và thu tín hiệu
từ các mạch giao tiếp với máy tính qua công cụ RS232. Trong đó người sử dung có thể
điếu khiển được quá trình truyền phát, tốc độ Baud … giúp cho người lập trình có thể
mô phỏng các mặt truyền phát tín hiệu .
- Một điểm mạnh khác của Proteus là cung cấp cho người sử dụng công cụ biên dịch
cho các họ vi xử lý như MSC51, AVR, HC11 … qua đó tạo ra các tập tin HEX dùng để
nạp cho vi xử lý và tập tin DSI dùng để xem và chạy kiểm tra từng bước trong chương
trình mô phỏng.
- Đối với các mạch vi xử lý Proteus không những cung cấp hình ảnh thực tế của các
linh kiện xuất mà còn cung cấp cho người lập trình rất nhiều các cửa sổ thông báo các
nội dung của bộ nhớ, con trỏ, thanh ghi, …
- Proteus có một thư viện khá lớn với hơn 6000 linh kiện các loại và càng ngày càng
được bổ sung. Ngoài ra còn có keypad (ma trận phím tạo đơn giản cho người thiết kế
khi cần thao tác trên các ma trận phím ).

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 1. Giới thiệu chung

3. Khả năng ứng dụng


- Khả năng ứng dụng chính của Proteus là mô phỏng, phân tích các kết quả từ các
mạch nguyên lý. Proteus giúp cho người sử dụng có thể thấy trước mạch thiết kế
chạy đúng hay sai trước khi thiết kế trên bo mạch.
- Các công cụ phục vụ cho việc phân tích mạch có độ chính xác khá cao như đo vôn
hay ampe, máy đo dao động.
- Khả năng áp dụng chương trình Proteus vào trong giảng dạy là rất tốt cho các thầy
cũng như cho sinh viên học tập kỹ thuật điện tử vì hầu như Proteus cung cấp gần như
đầy đủ từ cơ bản đến phức tạp cho người học điện tử và vi xử lý.
- Đối với các sinh viên thì Proteus nếu mà được sử dụng rộng dãi thì nó gần như là thầy
dạy cho chính họ ở nhà. Nó giúp cho các sinh viên tự học, tự nhiên cứu và thiết kế thử
các phần đã học và chạy xem kết quả và rút ra các bài học tốt. Điều cơ bản nhất là tiết
kiệm tiền cho sinh viên không có điều kiện mà lại ham học, ham nghiên cứu.

4. Khả năng phân tích


- Phân tích một mạch đơn giản.
- Phân tích các mạch các họ vi xử lý.
- Phân tích mạch qua các đồ thị, các máy đo ví dụ :
+ Phân tích Analogue
+ Phân tích Digital
+ Phân tích tần số
+ Phân tích âm thanh
+ Phân tích truyền phát dữ liệu.
Nhiều và còn rất nhiều phương pháp phân tích từ đơn giản nhất đến khả năng phân
tích phức tạp mà ngoài thực tế khi cần phân tích nó thì cần rất nhiều chi phí cũng
như công cụ sử dụng.
- Phân tích quá tải, quá áp, đủ tải … Proteus cung cấp cho người sử dụng khả năng
phân tích quá tải giúp người sử dụng hình dung được khi quá tải thì ảnh hưởng đến các
linh kiện như thế nào mà không phải mất chi phí cũng như an toàn tuyệt đối.
- Lưu lại các kết quả phân tích .

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 2. Mô phỏng và phân tích mạch nguyên lý

Chương 2. Mô phỏng và phân tích mạch nguyên lý

Ta sẽ bắt đầu bằng việc phân tích các ví dụ. Xét mạch như hình dưới đây:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 2. Mô phỏng và phân tích mạch nguyên lý

Rb
+5V
PN

U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF

Đây là mạch sử dụng vi điều khiển ATmega16. Ta có thể phân tích dạng sóng ngõ ra
bằng hai cách: sử dụng Oscillocope hoặc dùng đồ thị (Graph).

Nếu dùng Oscillocope thì ta thêm vào mạch như hình dưới đây:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 2. Mô phỏng và phân tích mạch nguyên lý

Rb
+5V
PN

U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI A
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2 B
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD C
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 D
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF

Nhấn F12 để chạy mô phỏng ta có kết quả như hình sau:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp Chương 2. Mô phỏng và phân tích mạch nguyên lý

Nếu sử dụng đồ thị, chọn Graph mode, chọn Digital và vẽ một đồ thị như sau:

Rb
+5V
PN

U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI A
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2 B
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD C
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 D
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF

Kéo hai ký hiệu Rb và PN vào đồ thị và nhấn phím Space bar ta có kết quả như sau:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Phần 3. Thiết kế máy phát trải phổ

Ta cần thiết kế sơ đồ nguyên lý máy phát trải phổ với các chức năng biến đổi A/D,
tạo dữ liệu, tạo mã trải phổ và nhân tín hiệu để tạo tín hiệu trải phổ. Để làm được điều
đó ta cần một mạch biến đổi A/D, bộ nhân và bộ tạo mã trải phổ. Với mục đích làm đơn
giản mạch thiết kế ta sử dụng vi điều khiển ATmega16 để thực hiện chức năng biến đổi
A/D, tạo mã trải phổ và tạo dữ liệu ra. Sơ đồ khối của máy phát trải phổ như hình dưới
đây:

Tạo chuỗi PN

Nhân tín hiệu


Tạo dữ liệu vào

Dữ liệu ra

Biến đổi A/D

1. Biến đổi A/D


Mạch tiền biến đổi A/D gồm một microphone, một mạch khuếch đại, các bộ lọc (lọc
4kHz). Chức năng biến đổi A/D được thực hiện trong vi điều khiển ATmega16.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

R10
Out
10k +5V

R12 R13 R11


1k 10k U4:A 12k

4
3
Voice_in C26 R9 1
2
1k
1uF
R14

11
LM324
10k C24
4.7nF

Mô phỏng bằng đồ thị ta có kết quả như sau:

2. Nhân tín hiệu


Chức năng nhân tín hiệu được thực hiện bởi IC 4070 và 7404 như hình sau:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Data_out PN_out

U2:A U3:A
22 Data_out 1 U3:A(Y)
PC0/SCL
23 3 1 2
PC1/SDA
24 2
PC2/TCK
25 PN_out
PC3/TMS 7404
26 4070
PC4/TDO
27
PC5/TDI
28
PC6/TOSC1
29
PC7/TOSC2
Tín hiệu sau khi qua mạch nhân có dạng như sau:
14
PD0/RXD
15
PD1/TXD
16
PD2/INT0
17
PD3/INT1
18
PD4/OC1B
19
PD5/OC1A
20
PD6/ICP
21
0 PD7/OC2

AVCC 3.30Tạo chuỗi PN và tạo dữ liệu vào


32
AREF Việc tạo chuỗi PN và dữ liệu vào được thực hiện bởi vi điều khiển ATmega16. Ta sẽ
viết phần mềm để thực hiện chức năng này. Ở đây ta sẽ dùng ngôn ngữ C để lập trình
cho ATmega16. Dưới đây là lưu đồ thuật toán:

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Vòng lặp chính:

Start

Setup port

No

Analog Yes Start Yes


ADC
mode? ADC?

No

Processing
data

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Vòng lặp ADC

ADC

Initalize
ADC

Start ADC

Wait for ADC


completion

Return

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Vòng lặp tạo chuỗi PN, xử lý dữ liệu và gửi dữ liệu ra:

Processing
data

Send data
out

Send PN senquence
out

Return

Chương trình nạp vào vi điều khiển:

#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>

//asm
inline void PN_out(int PN_sequence) //send PN sequence to PC1
{
for(int j=0;j<=6; j++)
{asm volatile( "lsr %1 " "\n\t" //logical shift right PN_sequence variable
"brcs 1f" "\n\t" //branch 1 if carry flag is set
"cbi %2, %3" "\n\t" //or else clear PC1
"rjmp 2f" "\n\t" //then jump to 2
"1:" "\n\t"
"sbi %2, %3" "\n\t" //set PC1
"2:" "\n\t"
:"=r" (PN_sequence) //output
:"0"(PN_sequence), "I" (_SFR_IO_ADDR(PORTC)), "I"
(0x01) //input
);
_delay_loop_2(7);

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

}
}

//sending data and PN sequence out to PC0


inline void out_to_PC0(int m, int PN_sequence)
{if(m==1) {PORTC|=_BV(0);
PN_out(PN_sequence);
}
else {PORTC&=~_BV(0);
PN_out(PN_sequence);
}
}

//sending AD result to PC0, transmision frame: 8 bits data, 1 start bit, 1 stop bit
//generate PN sequence out to PC1
//asm
inline void data_processing(uint8_t data_in)
{
out_to_PC0(0,0x35);
for(int i=0;i<=7; i++)
{if(bit_is_set(data_in,i)) out_to_PC0(1,0x35);

else out_to_PC0(0,0x35);
}
out_to_PC0(1,0x35);

ISR(USART_RXC_vect) // USART, Rx Complete


{
//
}

//interrupt function, execute when ADC complete


ISR(ADC_vect)
{
uint8_t data_in=ADCL;
data_processing(data_in); //call function to send data out
ADCSRA|=(1<<ADSC); //start a new conversion
}

void ADC_init(void)
{
ADMUX=0x40; //AD0 input, left adjusted, 5V ref

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//ADC enable, interupt enabled, prescaler 128
}

void ports_init(void)
{DDRA=0x00; //input, ADC0
PORTA=0x0E;
DDRB=0x00; //input, for digital data
PORTB=0xFF;
DDRC=0xFF; //output, PN and data
PORTC=0xFF;
}

void USART_init(int baud)


{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver */
UCSRB |= (1<<RXEN)|(1<<RXCIE);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}

int main(void)
{
ports_init();
ADC_init();
sei(); //enable global interrupt
ADCSRA|=(1<<ADSC); //start conversion

while(1)
{out_to_PC0(1,0x35);
}
return 0;
}

Các kết quả mô phỏng khi nạp chương trình vào vi điều khiển đã được nêu ở trên. Tuy
nhiên chương trình này chỉ là chương trình demo, sẽ cần nhiều thay đổi nhằm mục đích
tối ưu hoạt động của mạch.

Lê Hải Đăng CTM5-k50-HUT


Báo cáo thực tập tốt nghiệp

Cuối cùng ta có sơ đồ nguyên lý của máy phát trải phổ như sau:

C1 Data_out PN_out
+5V

22pF
X1
CRYSTAL
C2 U1 U2:A U3:A
+5V
9 22 Data_out 1 U3:A(Y)
RESET PC0/SCL
23 3 1 2
PC1/SDA
22pF 13 24 2
XTAL1 PC2/TCK
12 25 PN_out
XTAL2 PC3/TMS 7404
26 4070
START_ADC PC4/TDO
R15 40
PA0/ADC0 PC5/TDI
27
1k 39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
D_IN 36
PA3/ADC3
14
+5V
PA4/ADC4 PD0/RXD ToRX
35 15
PA5/ADC5 PD1/TXD ToTX
34 16
SW_CODE 33
PA6/ADC6 PD2/INT0
17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
SW -SPST D0 1 19
PB0/XCK/T0 PD5/OC1A
D1 2 20
PB1/T1 PD6/ICP
R10 D2 3
PB2/INT2/AIN0 PD7/OC2
21 R16
D3 4
PB3/OC0/AIN1 100 R1R2R3R4R5R6R7R8
Out D4 5
10k +5V PB4/SS 10k10k10k10k10k10k10k10k
D5 6
D6 PB5/MOSI
7 30
PB6/MISO AVCC
D7 8 32
PB7/SCK AREF
ATMEGA16
C22
R12 R13 R11 D[0..7] 100nF
D0
1k 10k U4:A 12k
D1
D2
4

D3
3 D4
Voice_in C26 R9 1 D5
2 D6
D7
1k
1uF D[0..7]
R14
11

LM324
10k C24

1
2
3
4
5
6
7
8
4.7nF
DSW1

ON
DIPSW_8

OFF
16
15
14
13
12
11
10
9
Mạch này tuy đã mô phỏng tốt nhưng vẫn còn đang trong thời gian thử nghiệm. Và
phần mềm điều khiển vẫn còn phải tối ưu bằng cách nhúng ngôn ngữ assembly vào để
thực hiện những tác vụ cần sự chính xác về thời gian. Mà điều này thực sự quan trọng,
quyết định ổn định và chính xác của mạch.

Lê Hải Đăng CTM5-k50-HUT

Anda mungkin juga menyukai