- Sơ đồ nối C6701 EVm với các thiết bị ngoài nh sau: C6701
Hình 4.14: Sơ đồ thực hiện trên EVMC6701 với nguồn ngoài
- Sơ đồ trong Simulink sau khi bổ sung các khối ADC và DAC (Xem phần phụ lục ).
Cấu hình khối ADC + ADB Source : Line in + Kích bỏ hộp Stereo
+Kích bỏ hộp + 20 dB Mic gain boost + Sample rate : 8000 Hz
+ Codec data format : 8 bit linear + Out put data type : Double + Scaling : Normalize
+ Source gain : 0.0 + Samples per frame : 1 Cấu hình khối DAC
+ Codec data format : 8bit linear +Scaling : Normalize
+ DAC attenuation : 0.0 + Overflow mode : Saturate
Các tham số còn lại, cách dựng và thực hiện mô hình đợc thực hiện nh trong ví dụ 3-1 của chơng 3.
Khi chạy mô hình trên C7601 EVM, ta có thể thay đổi tần số của máy tạo dao động và quan sát kết quả trên máy hiện sóng.
4.4. Kết luận chơng
Trong chơng này, tác giả đã nghiên cứu thực hiện các phơng pháp điều chế xung mã LDM và CVSD, chỉ ra tiêu chuẩn đánh giá chất lợng để tìm các thông số
Máy tạo dao động C6701 EVM Máy hiện sóng Line out Line out
tối u. Từ kết quả so sánh, ta thấy rằng, phơng pháp CVSD tốt hơn nhiều so với LDM.
Chơng này cũng đa ra đợc quy trình thực hiện CVSD, gồm dựng, tải và chạy trình khả thi trên bản mạch C6701EVM. Nhng do điều kiện thực tế không có bảng mạch này, nên kết quả chỉ dừng lại ở mức độ tạo mô hình, kiểm ngiệm thuật toán, lựa chọn tham số tối u, so sánh các phơng pháp điều chế khác nhau và phơng pháp thực hiện trên bảng mạch EVMC6701.
Kết luận luận văn
Nhờ sự giúp đỡ tận tình của các Thầy hớng dẫn, luận văn về cơ bản đã đạt đ- ợc các mục tiêu đặt ra. Đó là:
1/Trình bày đợc tổ chức của các bộ xử lí họ C6x và bảng mạch đánh giá EVMC6701.
2/Nghiên cứu và làm chủ đợc một phần công cụ Real-Time Workshop, đặc biệt là đối với môi trờng đích Generic Real-Time và Real-Time Windows Target.
3/Khai thác Bộ công cụ phát triển cho các bộ xử lí C6x của TI. Từ đó đa ra đợc một quy trình chung để phát triển các hệ thống xử lí tín hiệu số từ khâu lập thuật toán, tạo mô hình trong Simulink, chạy mô phỏng, chạy và đánh giá trình khả thi để có thể áp dụng vào sản phẩm thực tế.
4/ Đa ra đợc một mô hình xử lí tín hiệu số hoàn chỉnh về điều chế xung mã có khả năng áp dụng vào thực tế.
Quá trình nghiên cứu tài liệu làm luận văn cũng cho thấy những hớng mới cần đợc phát triển tiếp nh sau:
1/Real-Time Workshop là một công cụ rất phong phú và hữu ích để phát triển các hệ thống điều khiển và xử lí tín hiệu số theo thời gian thực. Nó cho phép giảm đáng kể thời gian phát triển hệthống nhờ khả năng kết hợp các công đoạn thiết kế thuật toán, phần cứng và phần mềm. Do đó việc tiếp tục nghiên cứu các công cụ này là hết sức cần thiết.
2/Bộ công cụ phát triển cho các bộ xử lí của TI mới chỉ hỗ trợ bảng mạch C6701EVM. Tuy nhiên, bộ công cụ này còn cho phép tạo Project từ mô hình Simulink cho môi trờng Code Composer Studio. Vấn đề đặt ralà cần nghiên cứu tiếp khả năng tạo trình khả thi cho các bản mạch đích khác từ các Project này.
Tài liệu tham khảo
[1]. Nguyễn Ngọc Bích, (1999), Cơ sở xử lí số tín hiệu và điều khiển số, Học viện Kỹ thuật quân sự, Hà nội.
[2]. Nasser Kehtarnavaz, Mansour Keramat, (2001), DSP System design using the TMS320C6000, Prentice Hall.Inc.
[3]. Smith, Mark J.T, (1992), Introduction to digital signak processing, John Wiley & Sons Inc.
[4]. Developer s Kit For Texas Instruments DSP,’ (2001), The MathWorks, Inc. [5]. DSP Blockset-User s Guide’ , (2002), The MathWorks, Inc.
[6]. MATLAB-user s Guide’ ,(1996), Prentice-Hall, Englewood Cliffs.
[7]. Real-Time Windows Target-User s Guide’ , (2000), The MathWorks, Inc. [8]. Real-Time Workshop-User s Guide’ , (2001), The MathWoks, Inc.
[9]. Signal Processing Toolbox-User s Guide’ , (2001),The MathWorks,Inc. [10]. Simulink-User s guide, ’ (1996), Prentice-Hall, Englewood Cliffs.
[11]. TMS320C6000 CPU and Instruction Set-Reference Guide, (2000), Texas Instruments, Inc.
[12]. TMS320C6000/6701 Evaluation Module-User s Guide’ , (2002), Texas Instruments, Inc.
[13]. TMS320C6000 Peripherals Reference Guide, (2001), Texas Instruments, Inc. [14]. TMS320C6000 Technical Brief, (1999), Texas Instruments, Inc.
[15]. Б.Голд, Ч.Рейдер, (1973), Цифровая Обработка Сигналов, Советское Радио, Москва.
Phụ lục
Phụ lục 1: Các file đợc tạo ra trong quá trình xây dựng cho đích là General Real- Time Target (Mô hình lấy từ ví dụ 2-1 của chơng 2).
1/ testgrt.c
*
* Real-Time Workshop code generation for Simulink model "testgrt.mdl". *
* Model Version : 1.2
* Real-Time Workshop file version : 4.1 $Date: 2001/05/16 13:59:43 $
* Real-Time Workshop file generated on : Sun May 18 14:16:08 2003 * TLC version : 4.1 (May 19 2001)
* C source code generated on : Sun May 18 14:16:11 2003 * * Relevant TLC Options: * InlineParameters = 0 * RollThreshold = 5 * CodeFormat = RealTime *
* Simulink model settings: * Solver : FixedStep * StartTime : 0.0 s * StopTime : 10.0 s * FixedStep : 0.001 s */ #include <math.h> #include <string.h> #include "testgrt.h" #include "testgrt_prm.h"
/* Start of Functions in model "testgrt" */ void MdlInitialize(void)
{
/* TransferFcn Block: <Root>/Transfer Fcn */ rtX.Transfer_Fcn_CSTATE[0] = 0.0;
rtX.Transfer_Fcn_CSTATE[1] = 0.0; }
/* Start the model */ void MdlStart(void) {
/* Scope Block: <Root>/Scope */ {
volatile int_T numCols = 2;
rtDWork.Scope_PWORK.LoggedData = rt_CreateLogVar(rtS, "y", SS_DOUBLE, 0, 0,
0.001, 1);
if (rtDWork.Scope_PWORK.LoggedData == NULL) return; }
MdlInitialize(); }
/* Compute block outputs */ void MdlOutputs(int_T tid) {
if (ssIsContinuousTask(rtS, tid)) { /* Sample time: [0.0, 0.0] */ /* TransferFcn Block: <Root>/Transfer Fcn */
rtB.Transfer_Fcn =
rtP.Transfer_Fcn_C[0]*rtX.Transfer_Fcn_CSTATE[0]+rtP.Transfer_Fcn_C[1]*rt X.Transfer_Fcn_CSTATE[1];
}
if (ssIsSampleHit(rtS, 1, tid)) { /* Sample time: [0.001, 0.0] */ /* Scope: '<Root>/Scope' */ { real_T u[2]; u[0] = ssGetTaskTime(rtS,tid); u[1] = rtB.Transfer_Fcn; rt_UpdateLogVar(rtDWork.Scope_PWORK.LoggedData, u); } }
if (ssIsContinuousTask(rtS, tid)) { /* Sample time: [0.0, 0.0] */ /* SignalGenerator: '<Root>/Signal Generator' */
{
real_T phase = rtP.Signal_Generator_Frequency*ssGetT(rtS); phase = phase-floor(phase); rtB.Signal_Generator = ( phase >= 0.5 ) ? rtP.Signal_Generator_Amplitude : -rtP.Signal_Generator_Amplitude; } } }
/* Perform model update */ void MdlUpdate(int_T tid) {
/* (no update code required) */ }
/* Compute model derivatives */ void MdlDerivatives(void)
{
/* TransferFcn Block: <Root>/Transfer Fcn */ {
real_T *dx = ssGetdX(rtS)+0; dx[0] = rtB.Signal_Generator; dx[0] +=
rtP.Transfer_Fcn_A[0]*rtX.Transfer_Fcn_CSTATE[0]+rtP.Transfer_Fcn_A[1]*rt X.Transfer_Fcn_CSTATE[1]; dx[1] = rtX.Transfer_Fcn_CSTATE[0]; } } /* Terminate function */ void MdlTerminate(void) {
/* (no terminate code required) */ }
/* End of Functions in model "testgrt" */ #include "testgrt_reg.h"
2/ testgrt.h
*
* Real-Time Workshop code generation for Simulink model "testgrt.mdl". *
* Model Version : 1.2
* Real-Time Workshop file version : 4.1 $Date: 2001/05/16 13:59:43 $
* Real-Time Workshop file generated on : Sun May 18 14:16:08 2003 * TLC version : 4.1 (May 19 2001)
* C source code generated on : Sun May 18 14:16:11 2003 * * Relevant TLC Options: * InlineParameters = 0 * RollThreshold = 5 * CodeFormat = RealTime *
* Simulink model settings: * Solver : FixedStep * StartTime : 0.0 s * StopTime : 10.0 s * FixedStep : 0.001 s */ #ifndef _RTW_HEADER_FILE_ #define _RTW_HEADER_FILE_
#define MODEL_NAME testgrt
#define NSAMPLE_TIMES (2) /* Number of sample times */
#define NINPUTS (0) /* Number of model inputs */
#define NOUTPUTS (0) /* Number of model outputs */
#define NBLOCKIO (2) /* Number of data output port signals */
#define NUM_ZC_EVENTS (0) /* Number of zero-crossing events */
#ifndef NCSTATES
# define NCSTATES (2) /* Number of continuous states */ #elif NCSTATES != 2
# error Invalid specification of NCSTATES defined in compiler command #endif
#include "testgrt_common.h" /*
* Comments are included throughout the generated code which allow you to * trace directly back to the approprate location in model. The basic format
* is <system>/block_name, where system is the system number (uniquely * assigned by Simulink) and block_name is the name of the block. *
* Use the MATLAB hilite_system command to trace the generated code back * to the model. For example,
* hilite_system('<S3>') - opens system 3
* hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
*
* Here is the system hierarchy for this model *
* <Root> : testgrt */
#endif /* _RTW_HEADER_FILE_ */ /* [EOF] testgrt.h */
3/ testgrt_export.h
*
* Real-Time Workshop code generation for Simulink model "testgrt.mdl". *
* Model Version : 1.2
* Real-Time Workshop file version : 4.1 $Date: 2001/05/16 13:59:43 $
* Real-Time Workshop file generated on : Sun May 18 14:16:08 2003 * TLC version : 4.1 (May 19 2001)
* C source code generated on : Sun May 18 14:16:11 2003 * * Relevant TLC Options: * InlineParameters = 0 * RollThreshold = 5 * CodeFormat = RealTime *
* Simulink model settings: * Solver : FixedStep * StartTime : 0.0 s * StopTime : 10.0 s * FixedStep : 0.001 s */ #ifndef _RTW_EXPORT_testgrt_ #define _RTW_EXPORT_testgrt_ #endif /* _RTW_EXPORT_testgrt */ /* [EOF] testgrt_export.h */
4/ testgrt_prm.h
*
* Real-Time Workshop code generation for Simulink model "testgrt.mdl". *
* Model Version : 1.2
* Real-Time Workshop file version : 4.1 $Date: 2001/05/16 13:59:43 $
* Real-Time Workshop file generated on : Sun May 18 14:16:08 2003 * TLC version : 4.1 (May 19 2001)
* C source code generated on : Sun May 18 14:16:11 2003 * * Relevant TLC Options: * InlineParameters = 0 * RollThreshold = 5 * CodeFormat = RealTime *
* Simulink model settings: * Solver : FixedStep * StartTime : 0.0 s * StopTime : 10.0 s * FixedStep : 0.001 s */ #include "simstruc.h" /* Default (RTW) Parameters */ Parameters rtP = { { /* Transfer_Fcn_A : '<Root>/Transfer Fcn' */ -70.0, -10000.0 } , { /* Transfer_Fcn_C : '<Root>/Transfer Fcn' */ 0.0, 10000.0 } , 1.0 , /*Signal_Generator_Amplitude : '<Root>/Signal Generator' */ 3.1830988618379070E+000 /*Signal_Generator_Frequency : '<Root>/Signal Generator' */ };
/* Block I/O Structure */ BlockIO rtB;
/* Continuous States Structure */ ContinuousStates rtX;
/* Data Type Work (DWork) Structure */ D_Work rtDWork;
/* Parent Simstruct */ static SimStruct model_S;
SimStruct *const rtS = &model_S; /* [EOF] testgrt_prm.h */
Phụ lục 2: Các file mã nguồn, file lệnh và Project của ví dụ 3-2.
/*---* * CCSTUT.C - Target Source code for demo : CCSTUTORIAL
* Simple program example to show Memory Read/Write *
*---*/ /* Copyright 2001 The MathWorks, Inc.
* $Revision: 1.4 $ $Date: 2001/01/17 14:56:09 $ */ #include "stdio.h"
int idat[] = { 1,508,647,7000};
double ddat[] = { 16.3, -2.13, 5.1, 11.8 };
/*--- main ---* * Simple main program to print values in ddat and idat
*---*/ void main()
{
puts("Link for Code Composer: Tutorial - Initialized Memory\n"); printf("Double Data array = %g %g %g
%g\n",ddat[0],ddat[1],ddat[2],ddat[3]);
printf("Integer Data array = %1d-%3d-%3d-%4d (Call me anytime!)\n",idat[0],idat[1],idat[2],idat[3]);
/* Breakpoint on next line ! */
printf("Link for Code Composer: Tutorial - Memory Modified by Matlab!\n");
printf("Double Data array = %g %g %g %g\n",ddat[0],ddat[1],ddat[2],ddat[3]); printf("Integer Data array = %d %d %d %d\n",idat[0],idat[1],idat[2],idat[3]); }
/******************************************************************* * CCSTUT_6x0x.CMD - Example Target Linker Command File
*
* This file is provided as an example linker command file
* for the target code that implements the Matlab tutorial: CCSTUTORIAL * This file was tested with the 6201/6702/6202 processors in
* memory map mode 1. *
* It may be necessary to modify this file to conform to * details of each DSP implementation.
*******************************************************************/ /*
* Copyright 2001 The MathWorks, Inc.
* $Revision: 1.2 $ $Date: 2001/02/07 21:14:43 $ */
-c
-heap 0x1000
-stack 0x1000 /* adequate for tutorial */ -lrts6201.lib
MEMORY {
PRAM : origin = 0x0, len = 0x10000 DRAM : origin = 0x80000000, len = 0x10000
SECTIONS { .vectors load=0x00000000 .text > PRAM .bss > DRAM .cinit > DRAM .const > DRAM .far > DRAM .stack > DRAM .cio > DRAM .sysmem > DRAM }
/************* Code Composer V1 Project Data ******************** The following section contains data generated by Code Composer to store project information like build options, source filenames and dependencies. [command filename] ccstut_6x0x.cmd 2 [Project Root] . [build options] 3 Linker = "-c -x " Assembler = "-s " Compiler = "-g -as " [source files] ccstut.c 0 1 vectors_6x.asm 0 1 -3656 [dependencies] 0 -802 0 -802 [version] 2.0 */ -q -c -x "vectors_6x.obj" "ccstut.obj" "ccstut_6x0x.cmd"
Phụ lục 3: Các hàm liên kết với CCS và RTDX
I. Các hàm toàn cục.
1/ ccsboardinfo: trả về thông tin về các board đợc cài đặt trên PC và đợc nhận diện bởi CCSIDE.
Cú pháp:
ccsboardinfo
Boards=ccsboardinfo
Vi dụ: Trên PC có 2 board. Dùng lệnh trên sẽ trả về: borads=2x1 struct array with fields
name Number Proc
Dùng ký hiệu (.) để xem tiếp thông tin. Ví dụ:
Boards.name
2/ boardprocsel: để chọn board và bộ xử lý đích. Tuy nhiên nên dùng lệnh ccsdsp để chọn đích.
3/ ccsdsp: tạo liên kết với CCSIDE Cú pháp:
cc=ccsdsp
cc=ccsdsp (‘Propertyname’, ‘Propertyvalue’, )… Ví dụ:
cc=ccsdsp (‘boardnum’, ‘Procnum’, 0);
tạo liên kết với CCSIDE và đích là board 1 bộ xử lý 0.
Chú ý: để xem số thứ tự các board và bộ xử lý đợc cài trên PC ta dùng lệnh ccsboardinfo
4/clear (cc): xoá liên kết cc
II. Các hàm kết nối với CCSIDE
1/ address: trả về địa chỉ và trang của 1 danh mục trong bảng ký tợng (Symbol table Cú pháp:
Stab = address (cc, ‘Symbolstring’) Ví dụ:
ddatv = read (cc, ‘ddat’ ),’double’, 4
sẽ đọc giá trị của mục ‘ddat’ từ bộ xử lý đợc quy chiếu bởi cc, kiểu dữ liệun là double, số dữ liệu đọc là 4.
2/ disp: Hiển thị các thuộc tính kênh của liên kết RTDX Cú pháp: disp (rx)
Ví dụ: trớc hết ta tạo liên kết cc cc =ccsdsp có các giá trị mặc định. Vì liên kết RTDX là lớp con của cc, nên ta gán
rx =cc.rtdx và disp(rx): hiển thị các thông tin về kênh của RTDX. 3/ halt: kết thúc việc thực hiện trên đích
Cú pháp:
halt (cc, timeout )
Đối số timeout xác định khoảng thời gian máy chủ chờ bộ xử lý đích ngừng chạy
Để chạy lại dùng lệnh run
4/ info: trả về các thông tin về bộ nhớ xử lý đích Cú pháp:
info = info (cc) info = info (rx) Ví dụ:
a) info = info (cc) trả về cấu trúc có các thuộc tính sau: Procname: Tên bộ xử lý
Isbigendian: xác định chế độ big hoặc little endian Family: Họ của bộ xử lý
Timeout: Mặc định là 10s
Để biết họ con của bộ xử lý dùng lệnh dec2hex
Lệnh dec2hex (info.Subfamily) sẽ trả về 67 nếu bộ xử lý thuộc họ 67xx. b) info = info (rx) trả về mảng chứa tên các kênh đã mở của liên kết RTDX Ví dụ ta đã mở 2 kênh có tên chan 1 và chan 2 thì info = info (rx) trả về info=
‘chan 1’ ‘chan 2’
5/ isrunning: Kiểm tra xem bộ xử lý đích đang chạy hay không. Cú pháp:
isrunning (cc)
Trả về 1 nếu bộ xử lý đích đang xử lý chơng trình và ngợc lại 6/ read: đọc giá trị từ bộ nhớ của bộ xử lý đích.
Cú pháp:
mem=read (cc, address,’datatype’, count, time out). mem = read (cc, address,’datatype’, count)
mem = read (cc, address,’datatype’)
+ address: địa chỉ bộ nhớ để bắt đầu đọc, đợc nhập dới dạng vector có 2 phần tử [ offset, page].Phần lớn DSP chỉ có 1 trang (mặc định là trang 0) nên chỉ cần nhập offset.
Ví dụ:‘1F’: offset là 31 10: offset là 10
[18,1]: offset là 18 trang 1
+ Count: giá trị vô hớng hoặc vectơ xác định số giá trị cần đọc Ví dụ: n: đọc n giá trị vào một vectơ cột và trả về trong mem. [m,n]: đọc m*n giá trị vào ma trận mxn và trả về trong mem.
[m,n,p ]: đọc m*n*p* giá trị vào ma trận mxnxp trả về trong mem… … …