BÀI 4: THỰC HIỆN MỘT SỐ MẠCH ĐIỀU CHẾ TRÊN KIT C6713
DSK
I- Thực hiện điều chế PAM trên kit C6713 DSK
Giải thuật điều chế:
Mỗi mẫu vào điều chế gồm 16 bits. Tùy vào loại điều chế PAM, một mặt nạ (mask)
thích hợp được sử dụng. Các mẫu nhập vào sẽ được AND với mặt nạ và dịch với số
lần thích hợp đến hết chiều dài chuỗi. Tương ứng với mỗi ký hiệu (symbol) trên 1
mẫu nhập vào và loại điều chế ta có mức điện áp khác nhau, để dạng sóng xuất sau
khi ra bộ A/D có dạng sóng vuông, mỗi mức sẽ được xuất ra 12 lần trước khi chuyển
sang symbol kế tiếp. Sau đây chúng ta sẽ đi vào cụ thể từng loại điều chế.
1. Điều chế PAM 4 mức
- Cấp nguồn điện cho kit và chạy chương trình CCS trên máy tính.
- Mở Project PAM.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\PAM4
- Trong cửa sổ File View, mở tập tin PAM4.c, nội dung tập tin này như sau:
// PAM
#include "DSK6713_aic23.h"
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
#include <math.h>
//Initialization:
int i_PAM;
int j_PAM;
int k;
int masked_value, output;
int data_4PAM[4] = {0x7FFF, 0x2AAA, -0x2AAB, -0x8000};//data table for 4-PAM MOD
int out_buffer[256];
int i=0;
interrupt void c_int11() //interrupt service routine
{
int sample_data; //4-PAM Modulator: Assigns sampled data coming from an input
//source to 4 predetermined voltage levels.
if (i_PAM==96) //new input is taken once every 96 samples (8 shifts x 12 repeated
}
void main()
{
i_PAM=0;
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Giải thích code:
+ Trong chương trình này hàm main() đặt giá trị biến i_PAM = 0 và khởi động kit. Sau
đó sẽ thực hiện một vòng lặp vô hạn với lệnh while(1) .
+ Khi có tín hiệu xung lấy mẫu (tần số 8Khz), ngắt 11 xảy ra và trình phục vụ ngắt
c_int11() được gọi. Trong trình phục vụ ngắt này, dữ liệu vào được đọc vào biến
sample_data (bằng lệnh sample_data = input_sample(), ô chú thích số 3). Mẫu dữ liệu
này biểu diễn ở dạng số nguyên 16 bits có dấu.
+ Do ở đây thực hiện điều chế PAM 4 mức, mà để biểu diễn được 4 mức thì cần 2 bit.
Do đó mẫu vào sẽ được chia làm 8 ký hiệu (symbol), mỗi ký hiệu 2 bit. Để thực hiện
việc chia này, mẫu dữ liệu được AND với mặt nạ 0x0003 (ô chú thích số 4 )để lấy 2 bit
LSB cảu mẫu dữ liệu. 2 bit này được ánh xạ thành 1 trong 4 mức điện áp theo bảng sau:
Bảng tra 4 mức:
Khối ký hiệu Mức điện áp (dạng
hex)
Mức điện áp (dạng thập phân)
00 0x7FFF 32767
01 0x2AAA 10922
10 -0x2AAB 10923
11 -0x8000 32768
4 giá trị này được khai báo ở đầu chương trình (ô chú thích số 1). Mỗi symbol sẽ cho ra
1 mức điện áp. Mỗi mức được xuất ra 12 lần trước khi chuyển sang mức ứng với symbol
kế tiếp. Biến đếm j_PAM để đếm số lần xuất ra cho đủ 12 lần. Như vậy ứng với mẫu
vào 16 bit, ta có 8 symbol. Mỗi symbol xuất 12 lần nên số lần xuất ra ứng với mỗi mẫu
110 -0x5B6D -23405
111 -0x7FFF -32767
Sửa lại tập tin PAM4.c như sau:
#include "DSK6713_aic23.h"
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
#include <math.h>
//Initialization:
int i_PAM;
int j_PAM;
int k;
int masked_value, output;
int data_4PAM[8] = {0x7FFF, 0x5B6D, 0x36DB, 0x1249, -0x1249, -0x36DB, -0x5B6D,
-0x7FFF};
int out_buffer[256];
int i=0;
interrupt void c_int11() //interrupt service routine
{
int sample_data;
if (i_PAM==60) //( 5 shifts x 12 repeated outputs = 60 samples)
{
sample_data = input_sample(); //inputs data
sample_data = sample_data >>1;
i_PAM=0;
j_PAM=0;
}
masked_value = sample_data & 0x0007;
output = data_4PAM[masked_value];
output_sample(output);
- Mở Project PAM.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\PAM4
7
- Điều chế PAM 16 mức, để biểu diễn cần 4 bit. Do đó mỗi mẫu ta có 4 symbol(16/4),
số lần xuất ra ứng với mỗi mẫu là 4x12 = 48. Mặt nạ là 0x000F để lấy 4 bit LSB của
mẫu dữ liệu.
Bảng tra 16 mức:
Khối ký hiệu Mức điện áp (dạng số Hex) Mức điện áp (dạng thập phân)
0000 0x7FFF 32767
0001 0x6EEE 28398
0010 0x 5DDD 24029
0011 0x4CCC 19660
0100 0x3BBB 15291
0101 0x2AAA 10922
0110 0x1999 6553
0111 0x0888 2184
1000 -0x0889 -2185
1001 -0x199A -6554
1010 -0x2AAB -10923
1011 -0x3BBC -15292
1100 -0x4CCD -19661
1101 -0x5DDE -24030
1110 -0x6EEF -28399
1111 -0x8000 -32768
Sửa lại tập tin PAM4.c như sau:
#include "DSK6713_aic23.h"
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
#include <math.h>
//Initialization:
int i_PAM;
int j_PAM;
return;
}
void main()
{
i_PAM=0;
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
- Biên dịch & nạp chương trình lên kit & kiểm tra kết quả tương tự PAM 4
sample_data = 0x3210 = 0b0011 0010 0001 0000
sample_data = 0xFEDC = 0b1111 1110 1101 1100
9
sample_data = 0x9687 = 0b1001 0110 1000 0111
Nhận xét: Kết quả thu được phù hợp với lý thuyết.
II- Thực hiện mạch điều chế PSK trên kit C6713 DSK
10
Giải thuật điều chế:
Mỗi mẫu vào được thu và lưu vào trong một vị trí nhớ, chứa 16 bits. Tùy theo kiểu
điều chế PSK (2 hay 4 pha), một mặt nạ thích hợp được sử dụng. Đối với BPSK, mỗi
giá trị vào được chia ra làm 16 phần, mỗi thành phần 1 bit; đối với QPSK, mẫu vào
được chia thành 8 dibits (mỗi dibit gồm 2 bit). Việc này đạt được bằng cách áp mặt
nạ tương ứng 0x0001 và 0x0003 lên mẫu vào. Sau đó, mẫu sẽ được dịch phải 1 bit
(BPSK) hoặc 2 bit (QPSK) và lặp lại cho hết chiều dài mẫu vào.
Mỗi mẫu vào được biểu diễn bằng 16 bits. Mỗi mẫu sẽ gồm 16 đoạn (với BPSK) và
8 đoạn (với QPSK). Do mỗi ký hiệu được truyền bởi 1 hình sine tạo theo phương
pháp số bằng 4 điểm, cứ mỗi 64 mẫu ra (với BPSK) hoặc 32 mẫu ra (với QPSK),
một mẫu vào được lấy vào.
output_sample(output*10);
out_buffer[i++] = output*10;
if (i==256)
i = 0;
j_BPSK++; //repeated output counter
if (j_BPSK==4) //checks if 1-bit segment was output
{
j_BPSK=0;
sample_data = sample_data >> 1;
}
i_BPSK++;
11
1
2
3 4
5
return;
}
void main()
{
i_BPSK=64;
j_BPSK=0;
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Giải thích code:
+ Hàm main() sẽ đặt 2 biến đếm i_BPSK = 64 và j_BPSK = 0, khởi động kit và bộ
codec rồi chạy một vòng lặp vô tận. Khi có xung lấy mẫu, ngắt 11 được kích hoạt và
’’’
sample_data = 0x0F0F = 0b0000 1111 0000 1111
đảo pha đảo pha đảo pha
sample_data = 0x5555 = 0b0101 0101 0101 0101
0 & 1 hoán đổi liên tục nên pha sẽ đảo liên tục từ phải sang trái như hình sau:
13
sample_data = 0x9999 = 0b1001 1001 1001 1001
Lý giải kết quả tương tự, ta có hình sau:
2. Điều chế QPSK
- Thực hiện hoàn toàn tương tự điều chế BPSK.
14
- Điều chế QPSK cần 4 pha: 0
o
, 90
o
, 180
o
, 270
o
nên cần khai báo 1 mảng 4x4: 4 sóng
sine lệch pha nhau 90
o
, mỗi sóng có 4 điểm. Số mẫu ra cho QPSK là 4x8 = 32. Mặt
nạ thích hợp để lấy 2 bit (biểu diễn 4 trạng thái) 0x0003, mỗi lần dịch 2 bit.
Do đó sửa lại tập tin BPSK.c như sau :
#include "DSK6713_aic23.h"
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
#include <math.h>
//Initialization:
int i_BPSK;
j_BPSK=0;
sample_data = sample_data >> 2;
}
i_BPSK++;
return;
}
void main()
{
i_BPSK=32;
j_BPSK=0;
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
- Sửa lệnh sample_data = input_sample() thành sample_data = 0x???? (một giá trị
bất kỳ 16 bit dạng số hex) rồi biên dịch, nạp và chạy chương trình. Kiểm chứng kết
quả thu được trên Plot của CCS.
15
sample_data = 0x00E4 = 0x00 00 00 00 11 10 01 00
0
o
270
o
180
o
90
o
0
o
sample_data = 0xE4FF = 0x11 10 01 00 11 11 11 11
o
ứng với 10 và 180
o
ứng với 11. Cần điều
chỉnh lại code điều chế.
17