Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
На рынке имеются сканирующие X–Y системы, которые используют для оптического сканирования в плоскости X–Y два зеркала, и два отдельных гальванометра.
Зеркала помещены перпендикулярно друг к другу. Лазерный луч следует по пути, показанному на рис. 7.10. Управляющие сигналы для X- и Y-гальванометров формируются отдельными драйверами, и позволяют проецировать лазерное излучение в любую точку плоскости X–Y. Путем последовательного вывода ряда точек могут быть созданы различные образы.
Рис. 7.10. Сканирующая XY система
7.2.4. Аппаратные средства
Рис. 7.11. Внешний аппаратный интерфейс для 68HC12
Функциональная схема управление лазерным проектором приведена на рис. 7.11. На первый взгляд эта схема может показаться сложной. Однако, Вы уже знакомы с каждой из ее подсистем, что облегчает понимание общего устройства системы. Линейка из восьми противодребезговых переключателей, подключенных к порту PORTA микроконтроллера 68HC12, используется для выбора образа, которое го пилообразного сигнала. При этом начинает светиться светодиод, связанный с PORTB[4].
Линейка из восьми противодребезговых переключателей, подключенных к порту PORTA микроконтроллера 68HC12, используется для выбора образа, которое должно быть воспроизведено лазером. Когда образ выбран, подсвечивается соответствующий ему светодиод на PORTB. Например, если мы нажимаем переключатель, связанный с выводом PORTA[4], должно выводиться изображение правого пилообразного сигнала. При этом начинает светиться светодиод, связанный с PORTB[4].
Чтобы показать, какое из изображений было выбрано, используется линейка светодиодных индикаторов. Когда изображение выбрано, соответствующие двоичные значения появляются на выходе порта PORTS[7:0] для X-гальванометра и порта PORTT[7:0] для Y-гальванометра. Они подаются на ЦАП для X-канала и ЦАП для Y-канала, соответственно. ЦАП преобразует каждое из двоичных значений в аналоговый сигнал, способный управлять усилителями гальванометров.
Сигнал управления, открывающий и закрывающий створки затвора, выводится на порт PORTP[0]. Логическая «1» открывает створки, а логический «0» закрывает их. Как и для гальванометров, для створок необходимо преобразовать логический сигнал контроллера 68HC12 в аналоговый сигнал, достаточный для того, чтобы открыть или закрыть створки. Контроллер принимает ТТЛ-совместимый входной сигнал, и преобразует его в сигнал, способный управлять приводом створок.
Завершив на этом обсуждение аппаратных средств, мы подробно рассмотрим в следующем разделе программное обеспечение для управления данной системой.
7.2.5. Структура программы и блок-схема алгоритма
Структура программы и блок-схема алгоритма для системы управления лазерным проектором представлены на рис. 7.12. Обе диаграммы довольно очевидны. Диаграмма интерфейса приводится, чтобы показать преобразование двоичного кода, поступающего от микроконтроллера 68HC12, в аналоговый сигнал ±1 В, необходимый для усилителей гальванометра.
Рис. 7.12. К программе управления лазерным проектором: блок-схема алгоритма (слева), структура программы (вверху справа), шестнадцатеричные значения к диаграмме ЦАП (внизу справа)
Система сначала инициализируется, устанавливая порты в необходимый режим (вход или выход) и закрывая лазерный затвор. Затем программа считывает информацию из порта PORTA, чтобы определить, нажат ли переключатель. Если он нажат, используется команда переключателя, позволяющая определить выбранное изображение. Код, необходимый для создания данного изображения обеспечивается выбором переключателя. Чтобы создать изображение, лазер сначала перемещается в требуемую исходную позицию для заданной траектории. Затем открывается лазерный затвор, и соответствующая траектория обеспечивается последовательностью положений лазерного луча в различные моменты времени. Мы приводим несколько примеров, и затем предлагаем вам самостоятельно, сформировать оставшиеся варианты в качестве домашней работы (задание 14).
7.2.6. Программный код
//********************************************************************
//имя файла: laser.с
//функции: программа для управления лазерным проектором
//контроллер: отладочная плата 68HC12B32 фирмы Motorola
//Выводы отладочной платы микроконтроллера 68HC12B32 фирмы Motorola:
//Port A: Конфигурирован как входной порт, активируемый нажатием
// бездребезговых переключателей на каждом входе
//Port B: Конфигурирован как выходной порт для управления светодиодным
// индикатором
//Port S: Конфигурирован как выходной порт, создающий двоичный код
// на канале X ЦАП
//Port T: Конфигурирован как выходной порт, создающий двоичный код
// на канале Y ЦАП
//Port P[0]: Конфигурирован как выходной порт, создающий TTL совместимый
// сигнал для управления затвором
//авторы: Steve Barrett and Daniel Pack
//создан: февраль 20, 2003
//последняя редакция: март 3, 2004
//********************************************************************
//включенные файлы
//********************************************************************
#include <912b32.h>
//функции прототипов
void initialize_ports(void); //инициализация портов
void shutter(int); //открытие/закрытие створок
void position_laser(unsigned char, unsigned char); // положение лазера
void delay(void);
#define open 1
#define close 0
//main program*************************************************************
//global variables
unsigned char new_PORTA, old_PORTA = 0xFF;
int i;
int go;
void main(void) {
//инициализировать вектор reset B32
asm(".area vectors(abs)n"
".org 0xFFF8n"
".word 0x8000, 0x8000, 0x8000, 0x8000n"
".text");
go = 1; //начало цикла while
initialize_ports(); //инициализировать порты
shutter(close); //закрыть створки
position_laser(0x80,0x80); //расположить луч в центре
while(go) { //продолжать, пока не нажмут кнопку Stop
new_PORTA = PORTA; //read PORTA input switches
if (new_PORTA != old_PORTA) switch(new_PORTA){ //формировать образ по значению
//нажатой клавиши
case 0x7F: //PA7 - Точка в центре экрана
PORTB = 0x80;// подсвечивает светодиод порта PORTE
position_laser(0x80,0x80);
shutter(open);
delay();
shutter(close);
PORTB=0x00; //включает красные светодиоды индикатора
break;
case 0xBF: //PA6- горизонтальная линия
position_laser(0x00,0x80);
shutter(open);
for{i=0; i<=255; i++) {
i = (unsigned char)(i);
position_laser(i, 0x80);
delay();
}
shutter(close);
PORTB=0x00; //включает красные светодиоды индикатора
break;
case 0xDF: //PA5 - Вертикальная линия
PORTB = 0x20; // подсвечивает светодиод порта PORTB
position_laser(0x80,0x00);
shutter(open);
for(i=0; i<=255;i++) {
i=(unsigned char)(i);
position_laser(0x80,i);
delay();
}
shutter(close);
PORTB=0x00; //включает красные светодиоды индикатора
break;
case 0xFF: //PA4 - Правая пила под углом 45 градусов
// с Юго-Запада на СВ
PORTB = 0x10; // подсвечивает светодиод порта PORTB
position_laser(0x00,0x00);
shutter(open);
for(i=0; i<=255; i++) {
i = (unsigned char)(i);
position_laser(i, i);
delay();
}
shutter(close);
PORTB=0x00; //включает красные светодиоды индикатора
break;
case 0xF7: //PA3 - Левая пила под углом 45 градусов
//с ЮВ на СЗ
PORTB = 0x08; // подсвечивает светодиод порта PORTB
delay();
PORTB=0x00; // включает красные светодиоды индикатора
break;
case 0xFB: //PA2 Окружность
PORTB = 0x04; // подсвечивает светодиод порта PORTB
delay();
PORTB=0x00; //включает красные светодиоды индикатора
break;
case 0xFD: //PA1 Синусоида
PORTB = 0x02; // подсвечивает светодиод порта PORTB
delay();
PORTB=0x00; // включает красные светодиоды индикатора
break;
case 0xFE: //PA0 Остановка
PORTB = 0x01; // подсвечивает светодиод порта PORTB