русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Настройки параметров блока ШИМ-1


Дата добавления: 2015-08-14; просмотров: 1202; Нарушение авторских прав


Текст программы на языке С

#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 раз):

- среднее время обработки

 

 



<== предыдущая лекция | следующая лекция ==>
Напряжения для незамкнутой системы. | Экспериментальная часть.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.