#include "DSP280x_PieVect.h" // Стандартная таблица векторов PIE
#include "DSP280x_Device.h" // Основной заголовочный файл DSP280x
#include "DSP280x_Examples.h" // Файл стандартных определений и настроек
#include <math.h> // Файл математических функций
#include <string.h>
// Объявления функций, описанных ниже
// Константы для начальной настройки блока EPWM1
#define EPWM1_TIMER_TBPRD 4999 // Период следования импульсов = 1999 + 1
#define EPWM1_MIN_CMPA 1000 // MIN_CMPA (основной уровень)
#define EPWM1_MIN_CMPB 1000 // MIN_CMPB
// Глобальные переменные
float Y0=4.5, // напряжение на выходе
K1=90, //интегральный коэффициент усиления
K=0.001,
Ts=1,
U=0, // начальное значение напряжения
G1;
char X;
char X1[4];
float G=0; // начальное значение гамма
float E0=0; // величина ошибки отстающая на такт
float Y,E;
int i,r1,r2,r3,r4;
Uint16 Voltage1[1000];
// Прототипы (объявления) функций и процедур обработки
// прерываний.
void InitEPwm1Example(void);
interrupt void timer0_isr(void);
void SCI_init(void);
void Gpio_select(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(); // Запуск таймера
Gpio_select();
SCI_init();
while(1)
{
while (SciaRegs.SCIFFRX.bit.RXFFST == 0);
X = SciaRegs.SCIRXBUF.bit.RXDT;
if (X=='q')
{
r1=U/1000;
r2=(U-r1*1000)/100;
r3=(U-r1*1000-r2*100)/10;
r4=(U-r1*1000-r2*100-r3*10);
X1[0]=r1+0x30;
X1[1]=r2+0x30;
X1[2]=r3+0x30;
X1[3]=r4+0x30;
for (i = 0; i < 4; i ++)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF = X1[i];
}
}
}
// 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)*1.75*3.3)/4095; // Y=Y*коэффициент деления *Максимальное напряжения АЦП (3.3)/Максимальный уровень квантования(4095)
E=Y0-Y; // вычисление ошибки
U=U+(K1*Ts/1000000)*E0;
E0=E;
G=((U*4.5*5000)/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; // Разрешение прерывания
}
void SCI_init(void)
{
SciaRegs.SCICCR.all =0x0007; // Формат сообщения
SciaRegs.SCICTL1.all =0x0023; // Регистры управления
SciaRegs.SCICTL2.all =0x0003; //
SciaRegs.SCIHBAUD =0x006E; // Делитель тактовой
SciaRegs.SCILBAUD =0x00CB; // частоты => 110 бит/с
// Настройка входного и выходного буферов
SciaRegs.SCIFFTX.all =0xE040;
SciaRegs.SCIFFRX.all =0x204f;
SciaRegs.SCIFFCT.all =0x0;
// Переключение GPIO28 и GPIO29
// в режим альтернативной функции
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
EDIS;
}
// Функция первоначальной настройки портов GPIO
void Gpio_select(void)
{
EALLOW;
// GpioCtrlRegs.GPAMUX1.all = 0x0; // Конфигурация всех
GpioCtrlRegs.GPAMUX2.all = 0x0; // GPIO как портов
// GpioCtrlRegs.GPBMUX1.all = 0x0; // ввода-вывода
// Направление передачи: 0 - вход, 1 - выход
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;
GpioCtrlRegs.GPBDIR.all = 0x4;
GpioCtrlRegs.GPAQSEL1.all = 0x0;
GpioCtrlRegs.GPAQSEL2.all = 0x0;
GpioCtrlRegs.GPBQSEL1.all = 0x0;
GpioCtrlRegs.GPBQSEL2.all = 0x0;
EDIS;
}
//======================================================
// Конец файла.
//======================================================