Текст программы на языке С
#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 раз):
- среднее время обработки