Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Программный код. В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения






 

В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения двигателя. Приводится полный код программы. Если бы мы привели этот код полностью в начале раздела, его сложность могла бы вас испугать. Использование же восходящей методики проектирования позволяет проще и удобнее разбираться с работой каждой функции кода и связью их между собой.

//********************************************************************

//имя файла: motor.с

//авторы: Стив Барретт и Даниэль Пак

//дата создания: 10 марта 2003

//последняя редакция: 2 марта 2004

//********************************************************************

//включенные файлы

#include < 912b32.h>

#include < LCD.h> //Функции поддержки ЖКИ

#pragma interrupt_handler RTI_isr//Объявляет подпрограмму обработки

// прерывания по запросу (RTI)

 

//используемые подпрограммы

void initialize_ports(void); // Инициализация портов

void RTI_isr(void); //программа обработки прерывания по RTI

void initialize_RTI(void); // Инициализация модуля RTI

void initialize_PA(void); // Инициализация модуля счетчика событий PA

void initialize_PWM(void); // Инициализация модуля ШИМ

 

//глобальные переменные

unsigned int old_count; // последнее содержимое PA

int RTI_int_count = 0; // Используется для подсчета числа

// прерывания RTI

unsigned char PWM_duty_cycle=172; // Начальный коэффициент заполнения ШИМ

unsigned int desired_motor_RPM = 1600; //эталон скорости двигателя

 

//********************************************************************

void main(void) {

asm(".area vectors(abs)\n" // команда встроенного ассемблерного кода

".org 0xFFF0\n" // Инициализировать вектор прерывания RTI

".word _RTI_isr\n"

".org 0xFFF8\n"

".word 0x8000, 0x8000, 0x8000, 0x8000\n"

".text");

initialize_ports(); // Инициализация портов

initialize_LCD(); // Инициализация ЖКИ

initialize_RTI(); // Инициализация модуля RTI

initialize_PA(); // Инициализация модуля PA

initialize_PWM(); //Инициализация модуля ШИМ

asm(" cli"); // Разрешить все маскируемые прерывания

while(1) // Непрерывный цикл в ожидании прерывания

{

;

}

}

 

//********************************************************************

//initialize_ports: обеспечивает начальную конфигурацию портов

//ввода - вывода

//********************************************************************

void initialize_ports(void) {

DDRP = 0xFF; // Установить PORTP как выходной для ШИМ

DDRT = 0x00; //Установить PORTT как входной, а вывод PORTT[7]

// как вход аккумулятора PA

DDRB = 0xFF; //PORTB на вывод - двунаправленная

//магистраль данных для ЖКИ

DDRDLC = 0xFF; //порт PORT DLC на вывод - линии управления ЖКИ

}

 

//********************************************************************

//RTI_isr: Программа обработки прерывания по меткам реального времени

//********************************************************************

void RTI_isr(void) {

unsigned int new_count;

unsigned int pulse_count;

unsigned int current_RPM;

float max_count = 65535.0;

new_count = PACNT; // Получить текущее число импульсов в аккумуляторе

if (new_count > old_count) // Определить текущее число импульсов

pulse_count = new_count - old_count;

else pulse_count = (unsigned int)(max_count-(float)(old_count+new_count));

// Преобразовать число импульсов кодера в об/мин

current_RPM = (unsigned int)(pulse_count/0.032768);

// Изменить число прерываний RTI в счетчике

RTI_int_count = RTI_int_count + 1;

if (RTI_int_count == 10) // Изменить на ЖКИ значение после 10 прерываний RTI

{

display_count_LCD(current_RPM); // Изменить показания ЖКИ

RTI_int_count=0; // Сбросить счетчик прерываний RTI

}

// Изменить значение скорости двигателя

if (current_RPM < desired_motor_RPM) PWM_duty_cycle = PWM_duty_cycle + 1; // Ускорить двигатель

else PWM_duty_cycle = PWM_duty_cycle - 1; // Замедлить двигатель

// Изменить скорость двигателя с помощью ШИМ

PWDTY0 = PWM_duty_cycle; //коэффициент заполнения

old_count = new_count;

RTIFLG = 0x80; //сбросить флаг прерывания RTI

}

 

//********************************************************************

// Initialize_RTI: конфигурирует регистры связанные с RTI

//- Регистр управления RTI (RTICTL):

// - разрешение RTI, флаг RTIE

// - установка периода RTI на 32.768 мс

// - сброс RTI, бит RTIF регистре Флагов RTI (RTIFLG)

//********************************************************************

void initialize_RTI(void) {

RTICTL = 0x86; // Установить период RTI 32.768 мс

RTIFLG = 0x80; // сброс RTI

}

 

//********************************************************************

// Initialize_RTI_PA: инициализация 68HC12 аккумулятора импульсов PA

//********************************************************************

void initialize_PA(void) {

TIOS = 0x00; // конфигурировать канал 7 для работы в качестве счетчика

TCTL1 = 0x00; // импульсов оптического кодера

OC7M = 0x00; // Включить бит разрешения таймера

TSCR = 0x80; // Установить разрешение для аккумулятора по фронту

//импульса,

PACTL = 0x50; // Режим счета событий

}

 

/********************************************************************/

//initialize_PWM: генерировать сигнал ШИМ 976 Гц с */

// коэффициентом заполнения 67.2% */

/********************************************************************/

void initialize_PWM(void) {

PWTST =0x00; /*установить ШИМ в режим нормальной работы */

PWCTL =0x00; /*установить выравнивание по левой границ */

PWCLK = 0x28; /*без конкатенации, разделить clk на 32 */

PWPOL = 0x01; /*состояние: высокое затем переход к низкому */

DDRP = 0xFF; /*установить порт PORTP как выходной */

PWEN = 0x01; /*разрешение на ШИМ для канала 0 */

PWPER0= 0xFF; /* установить период равным 256 */

PWDTY0= PWM duty_cycle; /* установить коэффициент заполнения равным 172 */

}

/********************************************************************/

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал