Занятие 4. Среда программирования CodeComposerStudio. Использование симулятора
Среда программирования CodeComposerStudio (CCS) предназначена для создания программного обеспечения, запускаемого на DSP-процессорах фирмы Texas Instruments. CCS содержит все необходимые инструменты для набора и редактирования программ, конфигурирования ядра реального времени DSP|BIOS, получения машинного кода с использованием компилятора языка С, загрузки машинного кода в процессор, запуска и отладки программ, в том числе и в режиме реального времени. CCS позволяет работать как с реальным устройством, так и его моделью в режиме симулятора. Симулятор позволяет заниматься отладкой программного обеспечения без наличия реального процессора, но при этом не поддерживает периферийные устройства на борту процессора и осуществляет вычисления со скоростью, отличной от скорости реального процессора. Таким образом, при работе с симулятором скорость выполнения программы будет в несколько раз меньше (поскольку компьютеру приходится моделировать работу всех системных устройств архитектуры ядра процессора), входные сигналы возможно только смоделировать, выходные сигналы не могут быть физически переданы во внешний мир и могут наблюдаться только по значениям переменных, невозможно смоделировать многозадачность. Однако для отработки логики работы расчетных процедур и некоторых других случаев симулятор оказывается доступным инструментом.
Изначально необходимо с помощью утилиты CodeComposerStudioSetup ввести в CCS применяемые устройства. На рисунке 1 (слева) показано, что CCS может работать с отладочной платой eZdsp и симулятором процессора F2812.
Рис.1
После запуска CCS в появившемся окне Parallel Debug Manager необходимо выбрать устройство, с которым будет происходить работа (в нашем случае это F2812 Device Simulator, см.рис.2).
Примечание. Для установки драйвера платы eZdsp необходимо воспользоваться диском, поставляемым с платой. Драйвер с диска устанавливается поверх установленной версии CCS.
После запуска основного окна CCS необходимо создать проект, создать текст программы, подключить его к проекту, оттранслировать, загрузить его в память, запустить на исполнение, убедиться в правильности выполнения программы.
Рис.2
Ниже приведены инструкции по созданию простейшего приложения, позволяющего продемонстрировать работу простейшего цифрового фильтра.
1. Создать проект Project-New… В появившемся окне указать имя проекта, зафиксировать каталог проекта.
2. Создать текстовый файл File-New и ввести в него следующий код программы:
//для использования чисел с плавающей запятой
#include <float.h>
#include <math.h>
//объявление переменных программы
float t=0, //время
u, //входной сигнал
filtr=0, //отфильтрованный сигнал
k0=0.1, // коэффициент фильтра k0
k1=0.9; // коэффициент фильтра k1
void main()
{
while(1)// организация безусловных циклов вычислений
{ // начало цикла
t=t+0.1; // имитация времени
u=50*sin(t)+15*sin(100*t);// входной сигнал
filtr=k0*u+k1*filtr;// отфильтрованный сигнал
} // конец цикла
}
3. Сохранить данный файл под именем sim_1, в качетсве типа файла выбрать из предложенного C/C++ Source file (*.c). Сохранение должно быть выполнено в каталог проекта.
4. Добавить только что сохраненный файл исходного текста программы в проект с помощью меню Project-Add files to project.
5. Добавить в проект аналогичным образом файл библиотеки rts2800.lib
6. Открыть окно настроек CCS через Option-Customize и на закладке Program|Project Load установить галочку для свойства Load Program After Build.
7. Выполнить трансляцию проекта через нажатие F7 или Project-Build. В случае успешного завершения трансляции и компоновки в появившемся окне сообщений будет показано:
----------------------------- sim_1.pjt - Debug ----------------------
Build Complete,
0 Errors, 0 Warnings, 0 Remarks
После чего произойдет загрузка программы в память модели процессора.
8. Если программа содержит ошибки, их необходимо исправить и повторить трансляцию.
9. Для наблюдения за программой необходимо вывести окно WatchWindow, на нем открыть закладку Watch1, в клетки окна ввести переменные u и t.
10. Для наблюдения за формой изменения сигналов необходимо открыть графическое окно через View-Graph-TimeFrequency, в окне настроек сделать изменения согласно приведенному ниже окну (свойства Display Type – Dual Time, Start address – upper display - &u, Start address – lower display - &filtr, Acquisition Buffer Size – 1, DSP Data type – 32-bit floating points, см.рис.3).
11. Для отладки кода необходимо установить точку зондирования. Для этого необходимо щелкнуть левой клавишей мыши по строчке программы «t=t+0.1», затем правой клавишей и в появившемся контекстном меню выбрать Toggle Software Probe Point. Зелено-голубая точка появится слева от строчки, показывая место установки точки зондирования (при выполнении данной строчки будет происходить обновление показаний привязанных к данной точке окон).
12. Для привязки данной точки зондирования к окнам отображения графиков и переменных (WatchWindow) необходимо вызвать окно привязки через Debug-ProbePoints, в появившемся окне щелкнуть мышью по слову NoConnection (для автоматической установки поля Location), после этого в поле Connect To выбрать Watch Window, нажать на окне кнопку Add. Аналогичным образом добавить вывод на графический дисплей. Нажать Ок.
Рис.3
13. Для перезагрузки программы выполнить Project-Build.
14. Запустить программу клавишей F5 или через Debug-Run.
Результатом работы программы должно быть окно, показанное ниже(графический экран и WatchWindow показывают изменения переменных), см. рис.4:
Рис.4
Далее показан более сложный пример использования симулятора. В примере показана система позицирования между двумя конечными положениями (лифт на 2 этажа), созданная на основе модели двигателя постоянного тока, ПИ-регулятора скорости, контура положения на базе П-регулятора и логической системы управления.
В примере создается зацикленный расчет работы системы. Происходит моделирование времени, работы двигателя постоянного тока, далее происходит расчет регуляторов скорости и положения, в завершение – система логического управления на основе смены состояний режимов работы в зависимости от координат системы и команд. Пример показывает возможность отладки программного обеспечения без наличия реальной системы управления, при этом затрагиваются основные моменты разработки процедур управления. Нижнее положение соответствует значению «0» в переменной pos, верхнее – «10». Срабатывание кнопок происходит при вводе в соответствующие переменные значения «1».
#include <float.h>// в файле используются расчеты
// с плавающей запятой
// декларирование используемых переменных
float t=0,dt=0.001;
float w=0,i=0,u=0,R=3.6,L=0.034,Mc=1,Me=0,c=1.82,J=0.038,Mload;
float k0=2+0.001/0.01,k1=2,input=0,input_prev=0,output=0,w_error=0;
float w_set=0;
float pos_set=0,pos=0,pos_error;
int down_button=0,stop_button=0,up_button=0,mode=0;
int up_lamp=0,down_lamp=0,down_move_lamp=0,up_move_lamp=0;
void main()// процедура расчета
{
m1: // начало цикла
// модель времени
//--------------------------------------------------------------------
t=t+dt;
// модель двигателя постоянного тока
//--------------------------------------------------------------------
i=i+(u-R*i-c*w)/L*dt; // вычисление тока
Me=i*c;// вычисление крутящего момента
w=w+(Me-Mload)/J*dt;//вычисление скорости
pos=pos+w*0.1;//вычисление положения
// модель реактивной нагрузки (лифт с противовесом)
//--------------------------------------------------------------------
if (w<0) Mload=-Mc;else
if (w>0) Mload=Mc;else Mload=0;
// регулятор скорости
//--------------------------------------------------------------------
w_error=w_set-w;// расчет ошибки
input=w_error;// передача сигнала ошибки на вход регулятора
output=output+k0*input-k1*input_prev;// расчет регулятора
input_prev=input;//запоминание текущего значения как
// предыдущего
// для следующего цикла расчета
if (output>220) output=220; // ограничение
// максимального значения
if (output<-220) output=-220;
u=output; //соединение сигнала регулятора
// и напряжение якоря двигателя
// регулятор положения
//--------------------------------------------------------------------
pos_error=pos_set-pos;// расчет ошибки
w_set=pos_error*0.25;// расчет положения
// и передача задания на
// регулятор скорости
// управление сигнализацией положения
//--------------------------------------------------------------------
if (pos<1) down_lamp=1;else down_lamp=0;// лампа
//нижнего положения
if (pos>9) up_lamp=1;else up_lamp=0; // лампа
//верхнего положения
// режим работы «остановлен»
//--------------------------------------------------------------------
if (mode==0)
{
pos_set=pos_set;
u=0;//обесточиваем двигатель
w_set=0;//останавливаем регулятор скорости
down_move_lamp=0; // выключили лампы
// движения вниз
up_move_lamp=0; // выключили лампы
//движения вверх
if (up_button==1) mode=1; //реакция на
//нажатие
//кнопки up
if (down_button==1) mode=2; //реакция
//на нажатие
//кнопки down
if (stop_button==1) mode=0; // реакция
// на нажатие
// кнопки stop
}
// режим подъема
//--------------------------------------------------------------------
if (mode==1)
{
up_move_lamp=1; // включили лампы
//движения вверх
down_move_lamp=0; // выключили лампы
//движения вниз
pos_set=10;// задание целевого положения
if (up_button==1) mode=1; //реакция
// на нажатие
// кнопки up
if (down_button==1) mode=0; //реакция
//на нажатие
// кнопки down
if (stop_button==1) mode=0; // реакция
// на нажатие
// кнопки stop
if (pos>pos_set) mode=0;// требуемое
//положение достигнуто
}
// режим опускания
//--------------------------------------------------------------------
if (mode==2)
{
up_move_lamp=0; // выключили
//лампы движения вверх
down_move_lamp=1; // включили
//лампы движения вниз
pos_set=0; // задание целевого положения
if (up_button==1) mode=0; //реакция
// на нажатие кнопки up
if (down_button==1) mode=2; //реакция
// на нажатие кнопки down
if (stop_button==1) mode=0; // реакция
// на нажатие кнопки stop
if (pos<pos_set) mode=0;//требуемое
//положение достигнуто
}
goto m1;//конец цикла
}
При запуске программы и имитации включения кнопок возможно отслеживание отработки положения и срабатывания ламп сигнализации через окно WatchWindow. На графике, приведенном на рисунке 5, выводятся осциллограммы тока якоря и скорости.
Рис.5
Внимание!В представленной системе содержатся ошибки различного характера (как минимум 3), которые не позволяют применить разработанную систему для управления реальным лифтом с гарантией обеспечения безопасности доставки груза. В качестве задания для самостоятельной работы предлагается выявить эти ошибки и предложить способы по их устранению, а также установить в данную систему ПИ-регулятор тока