![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программный код. В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения
В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения двигателя. Приводится полный код программы. Если бы мы привели этот код полностью в начале раздела, его сложность могла бы вас испугать. Использование же восходящей методики проектирования позволяет проще и удобнее разбираться с работой каждой функции кода и связью их между собой. //******************************************************************** //имя файла: 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 */ } /********************************************************************/
|