Если в процессе выполнения программы обработки прерывания RTI скорость вращения превышает 1600 об/мин, коэффициент заполнения ШИМ уменьшается на 1. С другой стороны, если скорость вращения меньше, чем 1600 об/мин, коэффициент заполнения ШИМ увеличивается на 1. Каждое приращение или снижения коэффициента заполнения ШИМ приводит к изменению скорости на 8.5 об/мин. Попробуйте вычислить это изменение в качестве домашней работы (задание 19).
Код, позволяющий сравнить опорную скорость с действительной и скорректировать ее обеспечивается в программе обработки RTI прерывания (RTLISR). В этой распечатке кода, функции поддержки ЖКД были помещены в файл для включения LCD.H с их функциями-прототипами.
7.4.4. Структура программы и блок-схема алгоритма
На рис. 7.20 показаны блок-схема алгоритма и структура программы регулирования частоты вращения маломощного двигателя постоянного тока. В следующем параграфе приведен полный текст программы для этого проекта. Попробуйте разработать блок-схемы алгоритмов для каждой функции проекта в качестве домашней работы (задание 20).
а) Управление скоростью двигателя. Блок-схема алгоритма
б) Управление скоростью двигателя. Структура программы
Рис. 7.20. К программе управления скоростью двигателя
7.4.5. Программный код
В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения двигателя. Приводится полный код программы. Если бы мы привели этот код полностью в начале раздела, его сложность могла бы вас испугать. Использование же восходящей методики проектирования позволяет проще и удобнее разбираться с работой каждой функции кода и связью их между собой.
//********************************************************************
//имя файла: 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"); // Разрешить все маскируемые прерывания