Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_rabota_mikroprotsessornaya_tekhnika (...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.51 Mб
Скачать

Настройки параметров блока шим-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% – относительная погрешность установки выходного напряжения для системы с обратной связью.

Результаты эксперимента:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]