
Настройки параметров блока шим-1
Текст программы на языке С
#include "DSP280x_PieVect.h" // Стандартная таблица векторов PIE
#include "DSP280x_Device.h" // Основной заголовочный файл DSP280x
#include "DSP280x_Examples.h" // Файл стандартных определений и настроек
#include <math.h> // Файл математических функций
// Объявления функций, описанных ниже
// Константы для начальной настройки блока EPWM1
#define EPWM1_TIMER_TBPRD 4999 // Период следования импульсов = 4999 + 1
#define EPWM1_MIN_CMPA 1000 // MIN_CMPA (основной уровень)
#define EPWM1_MIN_CMPB 1000 // MIN_CMPB
// Глобальные переменные
float Y0=4.5, // напряжение на выходе
K=1, // коэффициент пропорцианальности
Ts=1, // время дискретизации
K1=0.5, //интегральный коэффициент усиления
U=0; // начальное значение напряжения
int G=0; // начальное значение гамма
float E0=0; // величина ошибки отстающая на такт
float Y,E;
Uint16 Voltage1[1000];
// Прототипы (объявления) функций и процедур обработки
// прерываний.
void InitEPwm1Example(void);
interrupt void timer0_isr(void);
////////////////////////////////////////////////////////
void main(void)
{
InitSysCtrl(); // Настройка основных параметров управления системой:
// PLL, сторожевого таймера и тактовой синхронизации
// периферийных устройств.
// Перенастройка HISPCP на режим SYSCLKOUT / 8.
// То есть, тактовая частота периферийных устройств 100/8 = 12.5МГц.
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0004;
EDIS;
////////////////////////////////////////////////////////
// Настройка системы прерываний и таблицы PIE-векторов
DINT; // Запрещение прерываний (Disable INTerrupts)
InitPieCtrl(); // Инициализация регистров управления PIE
IER = 0x0000; // Interrupt Enable Register
IFR = 0x0000; // Interrupt Flag Register
InitPieVectTable(); // Инициализация и разрешение таблицы PIE
////////////////////////////////////////////////////////
// Внесение своих изменений в таблицу векторов PIE
EALLOW;
PieVectTable.TINT0 = &timer0_isr;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Разрешение прерывания от таймера
////////////////////////////////////////////////////////
/// Настройка таймера CPU-Timer 0 (DSP280x_CpuTimers.c)
InitCpuTimers(); // Настройка вспомогательных параметров
ConfigCpuTimer(&CpuTimer0, 100, 100); // Настройка основных параметров:
// тактовая частота = 100 МГц,
// период = 1 мкс (250 кГц).
////////////////////////////////////////////////////////
/// Настройка АЦП (DSP280x_Adc.c)
InitAdc(); // Настройка вспомогательных параметров
AdcRegs.ADCMAXCONV.all = 0x0001; // Разрешение двух каналов
// конвейера SEQ1
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Разрешение запуска SEQ1
// по импульсу SOCA от блока ШИМ
////////////////////////////////////////////////////////
/// Настройка GPIO на передачу сигнала от блока ШИМ-1
InitEPwm1Gpio();
////////////////////////////////////////////////////////
/// Настройка параметров блока ШИМ-1 (DSP280x_EPwm.c)
InitEPwm1Example();
EINT; // Разрешение глобального прерывания INTM
IER |= M_INT1; // Разрешение прерываний группы 1 (в том числе
// от таймера CPU-Timer 0)d
StartCpuTimer0(); // Запуск таймера
while(1);
// inout();
}
// Окончание функции main().
interrupt void timer0_isr(void)
////////////////////////////////////////////////////////
// CPU-Timer0
{
static int t = 0;
t ++;
if(t >= 1000) t = 0;
// Подтверждение прерывания группы 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
// Измерение напряжения на входе АЦП и расчет коэффициента заполнения
Y=((AdcRegs.ADCRESULT0 >> 4)*2*3.3)/4095; // Y=Y*коэффициент деления *Максимальное напряжения АЦП (3.3)/Максимальный уровень квантования(4095)
E=Y0-Y; // вычисление ошибки
U=U+(K1*Ts/100000)*E0+(K)*E;
E0=E;
G=(U*860/12);
if (G>2500) G=2500;
// Загрузка следующего отсчёта в ШИМ-1
EPwm1Regs.CMPA.half.CMPA = G;
Voltage1[t] = AdcRegs.ADCRESULT0 >> 4;
return;
////////////////////////////////////////////////////////
// Функция установки первоначальных настроек блока ШИМ-1
void InitEPwm1Example()
{
// Настройка тактовой синхронизации (TBCLK)
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Отмеряемый период
EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA; // Порог CMPA
EPwm1Regs.CMPB = EPWM1_MIN_CMPB; // Порог CMPB
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Начальная фаза равна нулю
EPwm1Regs.TBCTR = 0x0000; // Обнуление счётчика
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Счёт на увеличение
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Запрет загрузки
// по синхроимпульсу EPWMxSYNCI
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Делитель частоты SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
// Установка теневых регистров в нуль
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Выбор вариантов реакции на события
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // По НУЛЮ выход PWM1A = «1»
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // По ПЕРЕСЕЧЕНИЮ ПОРОГА A ВВЕРХ
// выход PWM1A = «0»
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // По НУЛЮ выход PWM1B = «1»
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // По ПЕРЕСЕЧЕНИЮ ПОРОГА B ВВЕРХ
// выход PWM1B = «0»
// Сигналы запуска АЦП
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Разрешение импульса SOC-A
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Привязка SOC к пересечению
// CPMA вверх
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Выработка импульса SOC
// по 1-му (каждому) событию
// Настройка прерываний в блоке ШИМ-1
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Прерывание
// по достижению НУЛЯ
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Прерывание по 1-му событию
EPwm1Regs.ETSEL.bit.INTEN = 1; // Разрешение прерывания
}
//======================================================
// Конец файла.
//======================================================
Найдем занимаемый программой объём памяти и время выполнения программы.
Время выполнения программы:
Для main (вызывалась 1 раз):
-
среднее время обработки
Для timer0_isr (вызывалась 16 раз):
-
среднее время обработки
5.Экспериментальная часть.
На макетной плате была собрана моделируемая схема из предложенных электронных компонентов. Напряжение питания микросхемы IR2110 составляло 12 В. Далее была подключена отладочная плата «eZdsp TMS320F2808», запрограммировав её, была проверена правильность работы собранной схемы в режиме без обратной связи.
Для незамкнутой системы найдем значение выходного напряжения в установившемся режиме и сравним ее с аналогичной величиной, найденной при моделировании в MATLAB:
3.9В – установившееся значение выходного напряжения схемы в режиме без обратной связи;
3.96В – установившееся значение выходного напряжения для незамкнутой системы при моделировании в MATLAB.
Оценим погрешности установки выходного напряжения для незамкнутой системы:
4,5 – 3,9 = 0,6 (В) – абсолютная погрешность установки выходного напряжения для незамкнутой системы.
(0,6/4,5)·100% = 13,3% – относительная погрешность установки выходного напряжения для незамкнутой системы.
После того, как была выполнена проверка работоспособности разомкнутой системы стабилизации, далее была замкнута обратная связь (было подано выходное напряжение через делитель на вход АЦП) и продемонстрирована работа замкнутой системы управления. Замкнутая система управления компенсировала отклонения выходного напряжения, вызванные уходом напряжения питания стабилизатора и другими погрешностями, присутствующими в любой реальной схеме.
4.52 В – установившееся значение выходного напряжения схемы в режиме с обратной связью.
4.5 В – установившееся значение выходного напряжения для системы с обратно связью при моделировании в MATLAB.
Оценим погрешности установки выходного напряжения для системы с обратной связью:
4,52 – 4,5 = 0,02 (В) – погрешность установки выходного напряжения для системы с обратной связью.
(0,02/4,5)·100% = 0,4% – относительная погрешность установки выходного напряжения для системы с обратной связью.
Результаты эксперимента: