Чтение онлайн

ЖАНРЫ

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Пак Дэниэл Дж.

Шрифт:

 PWDTY0 = 171; /*установить начальный коэффициент заполнения */

/* на отсутствие движения */

}

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

Если в процессе выполнения программы обработки прерывания 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"); // Разрешить все маскируемые прерывания

 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));

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

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