Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
/*init_PWM(): инициализация модуля ШИМ контроллера 68HC12 */
/********************************************************************/
void init_PWM() {
PWTST = 0x00; /*Установить порт ШИМ в нормальный режим */
PWCTL = 0x00; /*установить режим фронтовой ШИМ */
PWCLK = 0x28; /*без объединения каналов, ECLK/128*/
PWPOL = 0x01; /*активный уровень 1 */
DDRP = 0xFF; /*Порт P конфигурировать как выходной */
PWEN = 0x01; /*установить выход ШИМ */
PWPER0 = 255; /*установить для ШИМ период, соответствующий 976 Гц */
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 0xFFF0n" // Инициализировать вектор прерывания RTI
".word _RTI_isrn"
".org 0xFFF8n"
".word 0x8000, 0x8000, 0x8000, 0x8000n"
".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 */
}
/********************************************************************/
7.4.6. Испытания
Установка для испытания системы стабилизации скорости вращения была показана на рис. 7.18. Это — очень сложная система, содержащая целый ряд компонентов и микроконтроллерную систему 68HC12. Чтобы гарантировать успешную работу системы, настоятельно рекомендуется применять обсужденный в главе 2 метод измерений. Собрав и запустив всю систему, можно включить двигатель на умеренную нагрузку, и убедиться, что система стабилизирует скорость вращения на уровне в 1600 об/мин.