Скачать 1.7 Mb.
|
Разработка моделей внешних устройств Разработаем модель электрической сети и модель двигателя. Причем для реализации модели двигателя воспользуемся готовой процедурой его моделирования, разработанной компанией Texas Instruments. Процедуру моделирования электрической сети будем создавать, исходя из особенностей модели двигателя. Так как последняя является двухфазной, то необходимо генерировать 2 синусоидальных сигнала, сдвинутых относительно друг друга на 90 градусов. Особенностью реализации подобной процедуры является использование библиотеки псевдоплавающей запятой для ускорения расчетов, что накладывает определенные ограничения на разрядность проводимых вычислений. Процедура будет носить имя V380, таким же образом необходимо назвать исходный файл и заголовочный. Содержание заголовочного файла следующее: #ifndef __V380_H__ #define __V380_H__ #include "IQmathLib.h" typedef struct { _iq a; _iq b; float w; _iq time; _iq wt; int (*init)(); int (*update)(); } V380; typedef V380 *V380_handle; void V380_init(V380_handle); void V380_update(V380_handle); #define V380_DEFAULTS { 0,\ 0,\ 0,\ 0,\ 0,\ (int (*)(int))V380_init,\ (int (*)(int))V380_update\ } #endif Файл исходного текста будет следующий: #include "V380.h" #include "main.h" #include "float.h" /* процедура инициализации */ void V380_init(V380 *v) { v->w=314; } /* процедура расчета */ void V380_update(V380 *v) { v->time=v->time+_IQ(SampleTime); v->wt=v->wt+_IQ(SampleTime*v->w); if (v->time>_IQ(2*3.142/v->w)) {v->wt=0;v->time=0;} v->a=_IQsin(v->wt); v->b=_IQsin(v->wt+_IQ(3.142/2)); } В переменную w можно вводить электрическую частоту в единицах “с-1”(радианы в секунду). Переменная SampleTime будет добавлена позже. Соответственно, порядок компоновки необходимо настроить в окне настроек BuildOptions. Как уже говорилось, будет использована готовая модель двигателя, для чего необходимо подключить ее исходные файлы: aci.c (Файл модели) и aci_const.c (файл пересчета коэффициентов модели). Основным файлом проекта будет main.c с заголовочным файлом main.h. Содержимое заголовочного файла будет следующее: #include "DSP281x_Device.h" #include #include "IQmathLib.h" #include "aci.h" #include "aci_const.h" #include "parameter.h" #include "v380.h" #define SampleTime 0.0001 #include "dlog4ch.h" (Как видно, в этом файле появилось описание константы SampleTime, так как она необходима не только для генерирования синусов, но и для расчета коэффициентов модели). Содержимое файла main.c следующее: int long isrCounter=0; #include "main.h" ACI aci1 = ACI_DEFAULTS; ACI_CONST aci1_const = ACI_CONST_DEFAULTS; V380 v380_1=V380_DEFAULTS; DLOG_4CH dlog = DLOG_4CH_DEFAULTS; int16 DlogCh1 = 0; int16 DlogCh2 = 0; int16 DlogCh3 = 0; int16 DlogCh4 = 0; float T=SampleTime; void main() { Sys_init(); // Инициализация модуля для расчёта констант уравнения модели АД aci1_const.Rs = RS; aci1_const.Rr = RR; aci1_const.Ls = LS; aci1_const.Lr = LR; aci1_const.Lm = LM; aci1_const.p = P; aci1_const.B = BB; aci1_const.J = JJ; aci1_const.Ib = BASE_CURRENT; aci1_const.Vb = BASE_VOLTAGE; aci1_const.Wb = 2*PI*BASE_FREQ; aci1_const.Tb = BASE_TORQUE; aci1_const.Lb = BASE_FLUX; aci1_const.Ts = T; aci1_const.calc(&aci1_const); // Инициализация модуля для расчёта модели АД aci1.K1 = _IQ(aci1_const.K1); aci1.K2 = _IQ(aci1_const.K2); aci1.K3 = _IQ(aci1_const.K3); aci1.K4 = _IQ(aci1_const.K4); aci1.K5 = _IQ(aci1_const.K5); aci1.K6 = _IQ(aci1_const.K6); aci1.K7 = _IQ(aci1_const.K7); aci1.K8 = _IQ(aci1_const.K8); aci1.K9 = _IQ(aci1_const.K9); aci1.K10 = _IQ(aci1_const.K10); aci1.BaseRpm = 120*BASE_FREQ/P; aci1.LoadTorque = _IQ(TL/BASE_TORQUE); V380_init(&v380_1); //конфигурируем осциллограф dlog.iptr1 = &DlogCh1; // устанавливаем указатель на первую переменную вывода dlog.iptr2 = &DlogCh2; //устанавливаем указатель на вторую переменную вывода dlog.iptr3 = &DlogCh3; dlog.iptr4 = &DlogCh4; dlog.trig_value = 1;// включаем синхронизацию dlog.size = 0x400; // задаем размер буфера для каждого сигнала dlog.prescalar = 1; //задаем коэффициент масштабирования 1 dlog.init(&dlog); // вставлен вызов функции конфигурации объекта } _iq torque; _iq wr; float freq=314,load=0.5,amplitude=1; void isr_PRD_main() { isrCounter++; v380_1.update(&v380_1); aci1.Ualpha =_IQmpy(v380_1.b,_IQ(amplitude)); aci1.Ubeta = _IQmpy(v380_1.a,_IQ(amplitude)); aci1.LoadTorque = _IQ(load); aci1.calc(&aci1); wr=(int16)_IQtoIQ15(aci1.Wr); torque=(int16)_IQtoIQ15(aci1.Torque); // подключили осциллограф DlogCh1 = (int16)_IQtoIQ15(aci1.Ualpha); DlogCh3 = (int16)_IQtoIQ15(aci1.Ubeta); DlogCh2 = torque; DlogCh4 = wr; dlog.update(&dlog); } Необходимо создать файл конфигурации работы процессора initDSP.c следующего содержания: #include "main.h" void Sys_init(void) { EALLOW; SysCtrlRegs.HISPCP.all = 0x0001; SysCtrlRegs.LOSPCP.all = 0x0002; SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1; SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; SysCtrlRegs.PCLKCR.bit.ADCENCLK=1; EDIS; } Необходимо создать файл конфигурации ядра операционной системы, в котором ввести одну периодическую задачу, запускающую процедуру isr_PRD_main() с частотой 1000 Гц (не забыть установить перед именем знак «_»!). Далее создаем проект и в каталог проекта копируем все созданные файлы. Внутри каталога проекта создаем каталог lib, в который помещаем библиотеки DMC, с учетом все исходных и заголовочных файлов. Добавляем все созданные, а также файлы модели в проект. (Также необходимо добавить файл DSP281x_GlobalVariablesDefs.c., а также скопировать необходимые заголовочные файлы, см. главу о конфигурации ядра операционной системы.) В окно настроек BuidOptions на закладке Compiler в параметр Include Search Path (Category - Preprocessor) необходимо поместить возможные пути подключения заголовочных файлов: ..\include;..\include;..\lib\dmclib\cIQmath\include;..\lib\drvlib280x\include;..\lib\drvlib281x\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_headers\cmd;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_headers\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_common\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_examples\include;..\..\..\..\..\..\..\c28\dsp280x\v110\DSP280x_common\include;..\..\..\..\..\..\..\c28\dsp280x\v110\DSP280x_examples\include;..\..\DSP281x_headers\include Также необходимо добавить командный файл распределения памяти, например из прошлого проекта. При компиляции проекта возможны сообщения о двойном объявлении переменных, которые исчезают при повторной компиляции. В данной модели переменная amplitude отвечает за напряжение на статоре двигателя (в относительных единицах, от 0 до 1), с помощью переменной v380_1.w возможно задавать частоту напряжения электрической сети в с-1, переменная load отвечает за момент сопротивления на валу двигателя (в относительных единицах, от 0 до 1). На экран допускается выводить более одного сдвоенного экрана графиков, в окне настроек второго экрана необходимо в полях StartAddress указать DLOG_4CH_buff3 и DLOG_4CH_buff4. При запуске программы на выполнение появится изображение, аналогичное приведенному на рис.27: Рис.27 Разработка программного обеспечения для скалярной системы управления Далее будет рассмотрена последовательность создания ПО для скалярной системы управления асинхронным двигателем (посредством регулирования амплитуды и частоты напряжения на статоре в зависимости от задания скорости) без обратных связей по координатам системы. Создаём проект с именем scalar (Project-New), автоматически будет создан каталог проекта с именем scalar. В данном каталоге создаем подкаталоги source, include, lib. В каталог lib копируем файлы библиотеки DMC-library (в том числе исходные тексты и заголовочные файлы процедур библиотеки). В каталог Source копируем файл описания регистров DSP DSP281x_GlobalVariableDefs.c, а также его заголовочный файл DSP281x_Device.h в каталог include. Скопировать заголовочные файлы конфигурации периферийных устройств в каталог include. Создаем файл конфигурации ядра операционной системы (File-New-DSP|BIOSConfiguration), в появившемся окне выбираем шаблон для платы eZdsp dsk2812.cdb. Для использования внешней микросхемы памяти для организации памяти программ создаем новый блок MEM: в окне конфигурации ядра операционной системы раскрыть ветку System, на иконке MEM раскрыть правой клавишей мыши контекстное меню и выбрать Insert Mem. Присвоить название появившемуся блоку xintf6, раскрыть его свойства (контекстное меню, Propeties), установить начальный адрес блока (поле base) как 0х100000, размер (поле len) 0x80000, убрать галочку в поле create heap in this memory, в поле space установить code, нажать Применить и ОК. Для создания периодически запускающейся задачи раскрыть ветку Scheduling, через Periodic Function Manager создать новую задачу (например, PRD0), в свойствах задачи установить свойства period как «1» (1 милисекунда), function – как _isr_PRD0. Сохранить файл конфигурации ядра в каталог source с именем Conf_scalar, закрыть окно. Скопировать в каталог проекта командный файл распределения памяти DSP281x_Headers_BIOS.cmd, убедиться (и при необходимости добавить), что в конце файла присутствует выделение памяти под секции DLOG и IQmath: DLOG : > L0SARAM, PAGE = 1 IQmathTables : > BOOTROM, PAGE = 0, TYPE = NOLOAD IQmath : > L0SARAM, PAGE = 1 Добавить файлы DSP281x_Headers_BIOS.cmd и Conf_scalar.cdb (файлы конфигурации ядра операционной системы и памяти) в проект через Project-Add files to project… Добавляем в проект файл GlobalVariableDefs.c. Создаем, сохраняем в каталог Source и добавляем в проект файл инициализации ядра DSP initDSP.с, содержание следующее: #include "main.h" void Sys_init(void) { EALLOW; SysCtrlRegs.HISPCP.all = 0x0001; SysCtrlRegs.LOSPCP.all = 0x0002; SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1; SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; SysCtrlRegs.PCLKCR.bit.ADCENCLK=1; EDIS; } Создаем, сохраняем в каталог Source и добавляем в проект основной файл main.c, содержание следующее: #include "main.h" // подключение заголовочного файла long int IsrCounter=0;// счетчик прерываний void main() { Sys_init(); } void isr_PRD0() { IsrCounter++; } Создаем, сохраняем в каталог include заголовочный файл main.h, содержание следующее (содержит подключение всех используемых в данном проекте заголовочных файлов, а также задание ключевой константы периода дискретизации): #define SampleTime 0.0001 #include #include "DSP281x_Device.h" #include "dmctype.h" #include "IQmathLib.h" #include "aci.h" #include "aci_const.h" #include "parameter.h" #include "v380.h" #include "dlog4ch.h" #include "rmp_cntl.h" #include "rampgen.h" #include "vhzprof.h" #include "ipark.h" #include "svgen_dq.h" #include "f281xpwm.h" Полное содержание файла main.h смотри на рисунке 28 Указываем возможные пути до заголовочных файлов: ..\include;..\include;..\lib\dmclib\cIQmath\include;..\lib\drvlib280x\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_headers\cmd;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_headers\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_common\include;..\..\..\..\..\..\..\c28\dsp281x\v100\DSP281x_examples\include;..\..\..\..\..\..\..\c28\dsp280x\v110\DSP280x_common\include;..\..\..\..\..\..\..\c28\dsp280x\v110\DSP280x_examples\include;..\..\DSP281x_headers\include; \lib\drvlib281x\include Задание путей осуществляется через Project-BuildOptions-Compiler-Preprocessor-IncludesSearchPath. Каталог include должен иметь следующее содержание: Добавляем библиотеки F281xDRV_ml.L28, iqDMC_ml.l28, IQmath.lib (из каталога lib), библиотеку rts2800.lib (найти на компьютере, в каталоге, где установлен CCS). Если плата отключена от CCS, подключаем ее через alt-c. Нажимаем F7 (компиляция), в случае успешного завершения компиляции произойдет загрузка кода в память. Включаем режим реального времени (Debug-RealTime Mode). В появившемся окне ответить Да. Выводим WatchWindow, в закладку Watch1 добавляем переменную IsrCounter, включаем через контекстное меню окна WatchWindow режим постоянного обновления (Continuous Refresh). Запускаем программу (F5). Если все было сделано правильно, то происходит увеличение переменной IsrCounter. Останавливаем программу (Shift-F5). Рис.28 В ходе проделанного была произведена настройка приложения. Дальнейшие действия связаны с созданием самого кода приложения. Добавляем в файл переменную temp (промежуточная переменная для вывода информации в процессе отладки), SpeedRef (задание скорости). Первым шагом к построению системы управления будет введение в проект процедуры задачтика интенсивности на основе стандартной процедуры из библиотеки DMCLib. Добавляем следующие строки в файл (объявление экземпляра объекта, инициализация его параметров, запуск процедуры расчета). #include "main.h" // подключение заголовочного файла long int IsrCounter=0;// счетчик прерываний |
Учебно-методическое пособие Рекомендовано методической комиссией... Методы молекулярной диагностики: Учебно-методическое пособие. Авторы: А. Д. Перенков, Д. В. Новиков, С. Г. Фомина, Л. Б. Луковникова,... |
Учебно-методическое пособие Елабуга 2016 ббк 74. 58 Учебно-методическое... Методическое пособие предназначено для студентов 1 курса высших учебных заведений неязыковых специальностей |
||
Учебно-методическое пособие по клинической фармакологии Оренбург, 2007 Учебно-методическое пособие предназначено для самостоятельной работы студентов медицинских вузов, обучающихся по специальности «Лечебное... |
Методическое пособие Саратов 2008 г. Организация комплексной системы... Методическое пособие предназначено для руководителей и преподавателей- организаторов обж образовательных учреждений |
||
Учебно-методическое пособие ... |
Организация и технология документационного обеспечения управления учебно-методическое пособие ... |
||
Учебно-методическое пособие «Учебные игры и ситуационные задачи в... Учебные игры и ситуационные задачи в гинекологии: Учебно-методическое пособие / Под ред. А. А. Радионченко. – Томск: Сибгму,... |
Учебно-методическое пособие Казань 2010 Печатается по рекомендации... Учебно-методическое пособие по курсу «Организационное поведение» /Д. М. Сафина. – Казань: Казанский (Приволжский) федеральный университет;... |
||
Учебно-методическое пособие. Новосибирск, 2006 Учебно-методическое пособие предназначено инструкторам детско-юношеского и спортивного туризма с целью повышения уровня знаний и... |
Учебно-методическое пособие к лабораторным занятиям по курсу «Основы кристаллооптики» Практическое руководство по работе с поляризационным микроскопом для исследования петрографических объектов: Учебно-методическое... |
||
Учебно-методическое пособие организация инженерной защиты населения Учебно-методическое пособие разработано применительно к Программе обучения слушателей на курсах гражданской защиты Копейского городского... |
Учебно-методическое пособие Санкт-Петербург 2007 Автор: Черемисов... Учебно-методическое пособие предназначено для подготовки руководящего состава, специалистов гочс и пб, руководителей служб, аварийно-спасательных... |
||
Учебно-методическое пособие для студентов пм. 04.(07.) «Выполнение... Учебно-методическое пособие составлено в соответствии с требованиями Федерального Государственного образовательного стандарта по... |
Учебно-методическое пособие санкт-Петербург 2009г. Автор: Г. П. Подвигин... Учебно-методическое пособие предназначено для должностных лиц, специалистов го и рсчс организаций |
||
Учебно-методическое пособие Кемерово 2015 г. Согласовано: кроо «памск» Учебно-методическое пособие предназначено для студентов стоматологического факультета, гигиенистов стоматологических со средним медицинским... |
Федеральное государственное образовательное учреждение Высшего профессионального... Вакуумный практикум: Учебно-методическое пособие. Ростов-на-Дону, 2008. 55с |
Поиск |