Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора

Ниже будет показано, каким образом возможно создавать программы для DSP TMS320F2812 используя средства Матлаб, в частности приложение Simulink и его блок-бокс Embedded target for TI C2000 DSP. В данном блок-боксе находятся средства конфигурирования системных регистров, регистров периферийных устройств, процедуры библиотеки псевдоплавающей запятой IQmath, процедуры библиотеки управления двигателем DMClib.

Необходимо иметь плату eZdsp2812 и установленные на компьютере MatlabR2006a, CCS3.1

Будет показано, каким образом можно создать программу в среде Simulink/Matlab, позволяющую плавно изменять яркость свечения светодиода платы eZdsp2812, с заданной периодичностью наращивая и снижая яркость свечения светодиода, то есть светодиод будет не загораться/гаснуть, а периодически плавно изменять яркость свечения во времени. Светодиод будет подключен к пину процессора IOPF15, работающего в режиме дискретного выхода. Соответственно будет иметься возможность только либо включить светодиод, либо выключить. Яркость свечения будет изменяться визуально за счет изменения продолжительности включения светодиода за малый период времени. Последовательно изменяя скважность включения светодиода, за этот период времени удастся достигнуть визуального эффекта плавного изменения яркости.

Заданием на яркость свечения будет синусоидальный сигнал с частотой порядка 1 Гц. Параллельно будет запущен пилообразный сигнал высокой частоты (порядка 100 Гц). Сравнивая сигнал синусоиды и пилы, возможно определить время включения светодиода – если пилообразный сигнал больше значения синусоидального, то происходит включение светодиода, если меньше – то выключение. Соответственно светодиод будет «плавно» загораться с частотой 1 Гц.

Подразумевается, что вы уже знакомы с CCS и Симулником (в частности, механизмом создания )

Открываем Simulink, создаем в нем новое рабочее окно.

Находим компонент F2812 eZdsp (см.рисунок 1), перетаскиваем его в рабочее окно Simulink.

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.1

Раскрываем компонент, устанавливаем необходимые настройки согласно рисунку 2.

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.2

Собираем схему моделирования в Simulink согласно рисунку 3. В ней Subsystem – это подсистема для генерирования синусоидального сигнала на базе процедур с псевдофиксированной запятой из библиотек DMClib и IQmath_lib, Digital Output – готовый драйвер вывода сигнала на дискретную ножку, S-Function builder – блок генерирования пилообразного сигнала посредством S-функции, Relation Operator – стандартный компонент Simulink «если меньше, то…», Scope – стандартный компонент визуализации графиков Simulink.

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.3

Драйвер дискретного выхода находится согласно рисунку 4:

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.4

Выносим его в рабочее окно и двойным щелчком открываем его окно конфигурации, где необходимо выбрать IO port как GPIOF и установить галочку напротив bit14 и снять галочку напротив bit0 (см.рисунок 5). Последнее означает, что сигнал, пришедший на вход драйвера, будет выдан на ножку GPIOF14, сконфигурированную как дискретный выход.

Генератор пилы собираем через S-function builder, при этом необходимо выставить настройки вычисления кода S-функции как вычисление строго дискретное, с периодичностью 0,001с (см.рисунок 6)

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.5

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.6

В закладке Output набираем текст программы генерации пилы:

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.7

Для завершения построения S-функции необходимо установить ее имя (в данном случае показано имя sss111) и нажать клавишу Build (перед тем как нажать Build, необходимо в главном окне MatLab в Command Windows прописать mex -setup (обратить внимание на пробелы) и на предложенные вопросы ответить следующее: y, 1, y соответственно).

Переходим к построению блока генерации синусоидального сигнала. Так как вычисления Simulink выполняются в точном формате с плавающей запятой, а имеющийся DSP эффективно работает с целыми числами, собираем генератор синусоидального сигнала на базе процедур с псевдоплавающей запятой.

Примечание: при использовании блока constant необходимо в его свойствах (двойной клик мышью) на закладке Signal Data Types в поле output data type mode выбрать режим single.

Задания на такие процедуры происходят в формате с плавающей запятой, но перед тем как непосредственно передать значение в блок с фиксированной запятой, необходимо выполнить преобразование форматов, что осуществляется блоками Float to IQN.

Для генератора пилообразного сигнала, являющегося заданием изменения угла в диапазоне 0…2p для функции синуса от угла, используем процедуру RampGen из библиотеки DMC_lib (см.рисунок ниже)

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.8

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.9

Для задания параметров (установить как на рисунке) модуля генератора пилообразного сигнала необходимо также выполнить преобразование форматов, здесь это выполнено в виде подсистемы «преобразователь форматов» (см.рисунок 10)

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru


Рис.10

Для генерации синусоидального сигнала в функции от изменяющегося во времени угла используем стандартную процедуру генерации тригонометрического сигнала Trig Fcn IQN (см. рисунок 11).

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.11

Для генерации проекта в CCS из Simulink необходимо воспользоваться приложением Matlab с названием Real-Time Workshop. Для этого заходим в настройки меню Simulation, Configuration Parameters рабочего окна в набранной схеме Simulink, выставляем следующие параметры: в поле System target file прописать ti_c2000_grt.tcl (см. рисунок 12):

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.12

Перед тем как запустить генерацию проекта для CCS, существует возможность промоделировать работу будущего кода DSP. Для этого выставляем время моделирования в окне конфигурации как 10 секунд. Также необходимо выставить метод решения как дискретный (поле Solver), величину шага расчета задать как 0,001 секунда. Задание шага расчета также определяет шаг расчета в DSP (период дискретизации расчета). В данном примере с шагом расчета должен совпасть и шаг расчета S-функции.

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.13

После запуска моделирования в окне SCOPE появится график, при увеличении которого можно понять принцип изменения скважности (см.рисунок 14, верхний график – синусоидальное задание на яркость, нижний – генератор пилообразного сигнала для сравнения, средний – результирующее смоделированное мигание светодиода).

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.14

Для генерации кода проекта CCS необходимо вызвать окно конфигурации Simulation, Configuration Parameters и, убедившись в настройках согласно рисунку 15, нажать кнопку Generate code.

Занятие 6. Использование пакета Матлаб для разработки программного обеспечения сигнального процессора - student2.ru

Рис.15

При нажатии этой кнопки запускается CCS, в нем создается проект с тем названием, которым была названа модель при создании в приложении Simulink из пакета MatLab, происходит компиляция и загрузка файла в процессор (плата должна быть предварительно подключена и проверена работоспособность). Запустив программу на выполнение в DSP, светодиод начинает визуально постепенно набирать/уменьшать яркость с периодичностью 1 секунда.

В результате было показано, что при программировании DSP можно использовать Simulink для следующих целей:

1. Автоматическое создание проекта с включением всех необходимых файлов

2. Конфигурация системных регистров

3. Конфигурации периферии (была показано конфигурация прерывания таймера и дискретный вывод )

4. Использование стандартных блоков (показан блок больше-равно) для программирования DSP

5. Создание собственных процедур для DSP на основе механизма S-функций

6. Использование псевдоплавающей запятой.

7. Использование процедур специальной библиотеки для управления электродвигателями.

Создание полноценных приложений посредством такого подхода невозможно, однако при быстром создании прототипов программ и проверки работы алгоритмов на основе использования готовых блоков Симулинка, данный подход является весьма полезным.

Примечание: проект для CCS автоматически создается в рабочей директории work пакета MatLab при генерировании кода. Перед повторным генерированием кода одного и того же проекта для исключения появления ошибок старый проект для CCS необходимо удалить вручную из рабочей директории МаtLab work.

При генерации кода в CCS автоматически создается основной файл S-функции следующего содержания (название его зависит от названия S-функции в MatLab, в данном случае это sss111_wrapper.c), который находится в папке проекта Source рабочей директории work:

#if defined(MATLAB_MEX_FILE)

#include "tmwtypes.h"

#include "simstruc_types.h"

#else

#include "rtwtypes.h"

#endif

#include <math.h>

#define u_width 1

#define y_width 1

void sss111_Outputs_wrapper(const real_T *u0,

real_T *y0)

{

y0[0] = y0[0]+10;

if (y0[0]>150) y0[0]=0;

}

В теле программы (последние две строчки) прописан тот же текст программы генерации пилы, что был прописан нами в S-function builder при создании модели проекта в MatLab.

При генерации кода в CCS автоматически создается код блока «если не то» (Relational Operator) в основном файле eZdsp.c (названием файла является название модели проекта в MatLab), который находится в папке проекта Source рабочей директории work, состоящий из следующих строчек:

// вход на сравнение пилы с синусоидой

/* RelationalOperator: '<Root>/Relational Operator' */

eZdsp_B.RelationalOperator = ((real_T)rtb_Sum <= eZdsp_B.SFunctionBuilder);

// выход сигнала сравнения

/* S-Function Block: <Root>/Digital Output (c28xgpio_do) */

{

GpioDataRegs.GPFDAT.bit.GPIOF14 = eZdsp_B.RelationalOperator;

}

Опять же при генерации кода в CCS автоматически создается код блока Subsystem (блока генерации синусоидального напряжения на базе процедур с псевдофиксированной запятой из библиотек DMClib и IQmath_lib) в основном файле eZdsp.c, который находится в папке проекта Source рабочей директории work, состоящий из следующих строчек:

/* Model output function */

static void eZdsp_output(int_T tid)

{

/* local block i/o variables*/

real32_T rtb_IQNtoFloat;

real32_T rtb_Sum;

int32_T rtb_FloattoIQN;

int32_T rtb_IQNxIQN;

int32_T rtb_TrigFcnIQN;

int32_T rtb_FloattoIQN_d;

// блок преобразования форматов

/* C28x IQmath Library (stiiqmath_iq) - '<S3>/Float to IQN' */

{

rtb_FloattoIQN = _IQ10 (eZdsp_P.k_Value);

}

/* C28x IQmath Library (stiiqmath_iq) - '<S3>/Float to IQN1' */

{

rtb_IQNxIQN = _IQ10 (eZdsp_P.smech_Value);

}

/* C28x IQmath Library (stiiqmath_iq) - '<S3>/Float to IQN2' */

{

rtb_TrigFcnIQN = _IQ10 (eZdsp_P.frec_Value);

}

//генератор пилообразного сигнала

/* C28x DMC Library (tidmcrampgen) - '<S2>/Ramp Generator' */

{

int32_T* angleregPtr = &eZdsp_DWork.RampGenerator_ANGLE_REG;

*angleregPtr += _IQ10mpy (rtb_TrigFcnIQN, _IQ10(0.5));

if (*angleregPtr > _IQ10(1))

*angleregPtr -= _IQ10(1);

else if (*angleregPtr < _IQ10(-1))

*angleregPtr += _IQ10(1);

rtb_FloattoIQN_d = _IQ10mpy (*angleregPtr++, rtb_FloattoIQN) + rtb_IQNxIQN;

if (rtb_FloattoIQN_d > _IQ10(1))

rtb_FloattoIQN_d -= _IQ10(1);

else if (rtb_FloattoIQN_d < _IQ10(-1))

rtb_FloattoIQN_d += _IQ10(1);

}

// процедура генерации тригонометрического сигнала

/* C28x IQmath Library (stiiqmath_iqtrig) - '<S2>/Trig Fcn IQN' */

{

rtb_TrigFcnIQN = _IQ10sin(rtb_FloattoIQN_d);

}

//процедура преобразования форматов

/* C28x IQmath Library (stiiqmath_iq) - '<S2>/Float to IQN' */

{

rtb_FloattoIQN_d = _IQ10 (eZdsp_P.amplit_Value);

}

//процедура перемножения сигнала амплитуды и тригонометрического сигнала

/* C28x IQmath Library (stiiqmath_iqmpy) - '<S2>/IQN x IQN' */

{

rtb_IQNxIQN = _IQ10mpy (rtb_TrigFcnIQN, rtb_FloattoIQN_d);

}

//процедура обратного преобразования форматов

/*C28x IQmath Library (stiiqmath_iqtof) - '<S2>/IQN to Float' */

{

rtb_IQNtoFloat = _IQ10toF (rtb_IQNxIQN);

}

//блок суммирования сигналов

/* Sum: '<S2>/Sum' incorporates:

* Constant: '<S2>/smech sin'

*/

rtb_Sum = rtb_IQNtoFloat + eZdsp_P.smechsin_Value;

}

В данной работе приведено использование процедур с псевдофиксированной запятой из стандартных библиотек DMClib и IQmath_lib MatLab (подключение их показано на 5 странице данной методики).


Наши рекомендации