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

В этом разделе, мы описываем разработку и построение встроенной системы управления для лазерного проектора. Вы вероятно видели такую систему, на концерте или в планетарии. Аналогичный подход может быть использован при разработке точного лазера для медицинских целей или для технологических установок, например, чтобы управлять лазером для точной гравировки.

7.2.1. Описание проекта

Система имеет семь образцов изображений, которые проектируются лазером на стену или киноэкран. Мы выбираем один из них для проекции, нажав соответствующую кнопку. Как только изображение выбрано, подсвечивается светодиод, соответствующий выбранному варианту. Затем система управления открывает лазерный затвор, позволяя лазерному лучу пройти на пару гальванометрических зеркал. Микроконтроллер 68HC12 генерирует сигналы управления, позволяющие изменять угол поворота зеркал, чтобы создать предварительно записанное в памяти изображение с помощью внешних по отношению к МК цифро-аналоговых преобразователей (ЦАП). Выбранное изображение выводится однократно при каждом нажатии кнопки. Конструкция системы приведена на рис. 7.8.

Рис.7.8. Встроенная система управления лазерным проектором

7.2.2. Подсистемы 68HC12 используемые в проекте

Основываясь на кратком описании проекта, мы можем определить периферийные модули МК 68HC12 необходимо использовать и внешние устройства которые которые будут использоваться для решения нашей задачи:

• Восемь двухпозиционных переключателей с аппаратной противодребезговой защитой, подключены к порту ввода МК;

• Восемь светодиодных индикаторов для логических выходов с тремя состояниями, подключены к порту вывода МК;

• Двухканальный ЦАП, связанный с МК по последовательному интерфейсу SPI, или два порта МК 68HC12, конфигурированных как выходные;

• Лазерный источник;

• Затвор и драйвер затвора;

• Два гальванометрических зеркала.

7.2.3. Описание некоторых компонентов системы

Как и прежде, рассмотрим доступные инструментальные средства из нашего инструментального ящика, позволяющие выполнить все требуемые функции. 

В нашем сундучке инструментов уже имеются следующие компоненты: 

• Противодребезговые переключатели;

• Восемь светодиодных индикаторов с тремя состояниями;

• ЦАП;

Однако мы еще не рассматривали лазеры, лазерные зеркала, лазерные затворы и гальванометрические зеркала. Рассмотрим эти устройства. Мы рассмотрим также более подробно технологию ЦАП.

Рис. 7.9. Типичная схема подключения ЦАП MC1408P8 фирмы Motorola


Однако мы еще не рассматривали лазеры, лазерные зеркала, лазерные затворы и гальванометрические зеркала. Рассмотрим эти устройства. Мы рассмотрим также более подробно технологию ЦАП.

Цифро-аналоговые преобразователи (ЦАП). В главе 6 мы обсуждали основы цифро-аналоговых преобразователей (ЦАП). Поскольку МК 68HC12 не имеют в своем составе модуля ЦАП, необходимо воспользоваться внешними ИС ЦАП. Для данного проекта нам нужны фактически два отдельных канала ЦАП, чтобы управлять X и Y каналами гальванометров. Существует много различных ИС ЦАП, совместимых с 68HC12 и удовлетворяющих требованиям данного проекта. Их можно разделить на две категориии: ЦАП с последовательными или с параллельными входами. ЦАП с последовательными входами обычно подключается к МК с помощью интерфейса SPI. Читатель, интересующийся более подробным описанием этого типа интерфейса может обратиться книге Pack and Barrett [2002, гл. 10]. В этом примере, мы используем два 8-разрядных ЦАП с параллельными входами. Имеется широкое разнообразие таких ЦАП. В этом проекте мы используем ИС MC1408P8 фирмы Motorola. Типовая схема подключения ЦАП MC1408P8 к порту вывода МК показана на рис. 7.9. Выходное напряжение ЦАП определяется величиной опорного напряжения Vref, коэффициентом обратной связи операционного усилителя (определяется R14 и Ro) и цифровым кодом на входах A8…A1. Зависимость напряжения на выходе ЦАП в функции перечисленных параметров приведена на рис. 7.9. Величина опорного напряжения и номиналы резисторов определяются схемой подключения и не могут быть изменены в процессе эксплуатации. А вот кодовая комбинация на входах A8…A1 постоянно изменяется в процессе управления. И в соответствии с передаточной характеристикой ЦАП изменяется напряжение на выходе V0. Электрические характеристики цифровых входов ЦАП (A8…A1) позволяют выполнить их прямое подключение к выводам порта МК 68HC12. В соответствие с техническими условиями необходимо, чтобы напряжение V0 изменялось в диапазоне ±1 В при изменении кода на входах A8…A1 от $FF. Данное требование может быть выполнено при следующих номиналах резисторов схемы и опорного напряжения ЦАП:

• Vref = 5,0 В

• R14=R15= 1 кОм

• Ro = (2/5) R14 = 400 Ом

• RB = 2 (R14) = 2 кОм

Эти значения получены из решения уравнения для выходного напряжения, приведенного на рис. 7.9 для двух различных случаев: (1), когда выходное напряжение равно +1 В, и (2), когда выходное напряжение составляет 0 В; опорное напряжение Vref удобно выбрать равным 5 В. Эти значения составляющих обеспечивают выходное напряжение –1,0 В для двоичного кода $00 и выходное напряжения 0,992 В для двоичного кода $FF. Двоичные коды, заключенные между этими крайними значениями кода, обеспечивают 256 значений аналогового выходного напряжения линейно изменяющегося от –1,0 до 0.992 В.

Лазеры. Лазер (слово получено из сокращения light amplification by stimulated  emission of radiation — усилитель света на базе вынужденного излучения) представляет собой источник света с рядом специфических свойств и характеристик. Он, как считают, является монохроматическим (одна длина волны или очень узкий диапазон длин волн), когерентным (фронты волн находятся в фазе друг с другом), и нерасходящимся. Что же это означает? В основном, лазер обеспечивает одноцветный источник света с узким, подобным карандашу, лучом. Лазер с самого начала нашел применение фактически во всех областях промышленности и медицины [12]. Читателя, интересующегося более подробным знакомством с этой увлекательной темой, мы отсылаем к разделу «Что еще прочитать» в конце данной главы. Для рассматриваемого устройства, мы используем маломощный (менее 3 мВт) лазер в видимом диапазоне излучения. Лазеры этого типа доступны в нескольких различных исполнениях. Имеется ряд гелий-неоновых (HeNe) лазеров различных цветов. Однако газоразрядные трубки таких лазеров обычно имеют длину 25 см и диаметр 5 см. Более новая технология — твердотельный лазер с диодной накачкой (DPSS), маломощный лазер, для нескольких частот в видимой области. Его длина составляет приблизительно 5 см и диаметр 1,5 см, он питается от маленького выпрямителя [3]. Мы используем этот тип лазера для данного проекта. Эти лазеры достаточно просты в обращении. Вы подключаете их к сети, и сразу появляется луч.

При работе с лазерами применяется стандарт безопасности ANSI Z136. 1 «Безопасность при применении лазеров» [1], касающийся безопасной работы с приборами на базе лазеров. Если вы планируете реализовать подобный проект, мы советуем вам получить копию этого документа и подробно ознакомиться с ним. Стандарт делит лазеры на различные категории (классы от 1 до 4), основываясь на степени их опасности для пользователя. Чем выше номер класса, тем больше опасность. Лазер, который мы используем в этом приложении, принадлежит к классу 3a, обеспечивая мощность излучения 1…5 мВт в видимом диапазоне. Это тот же класс лазеров, к которому принадлежит лазерная указка. Хотя эта мощность относительно мала, обращаться с лазерами необходимо с особой осторожностью. Необходимо также предпринимать особые меры предосторожности при юстировке оптики, связанной с лазерной системой, чтобы предотвратить поражение глаз лазерным излучением. Ни в коем случае нельзя смотреть непосредственно в лазерный источник. Стандарт ANSI касается также других требований безопасности при использовании этого класса лазеров, включая предупредительные знаки, безопасное размещение лазера, обучение безопасному обращению с лазерами и ограничение доступа к ним.

Зеркала. Имеются оптические зеркала самых различных форм, размеров, и толщины, рассчитанные на различный диапазон частот излучения. Для этого применения, мы используем зеркала с нанесением покрытия на переднюю поверхность. Это означает, что зеркало имеет отражающее покрытие на наружной поверхности стекла. Такая технология предотвращает появление многократных отражений между передней и задней поверхностями зеркала. Кроме того, находящееся на передней поверхности отражающее покрытие должно быть рассчитано на соответствующую длину волны. То есть оно должно правильно отражать свет в интересующем нас диапазоне частот. Для этого приложения, мы используем лазер в видимом диапазоне (с длиной волны от 400 до 700 нм). Различные изготовители и поставщики обеспечивают широкий диапазон зеркал с различными покрытиями [3]. Оптические зеркала устанавливаются на вращающихся гальванометрических подвесках при помощи легких держателей.

Лазерные затворы. Лазерный затвор — это просто апертура для лазера, перекрывающая лазерный луч. В закрытом состоянии затвор обычно перекрывается створками. На створки наносится теплостойкое покрытие, способное выдерживать высокую плотность энергии лазера. Створки управляются драйвером лазерного затвора, имеющим логический вход, совместимый с транзисторно-транзисторной логикой (ТТЛ) и генерирующим выходной сигнал, согласованный с характеристиками затворов ряда изготовителей. Они имеют широкий диапазон диаметров апертуры: от 2 до 45 мм [13].

Гальванометры. В гальванометрах, называемых также оптическими сканерами, применяется эффективный метод перемещения лазерного луча. Гальванометры обеспечивают угол поворота зеркала точно соответствующий заданному значению входного напряжения. В идеале, должна быть обеспечена линейная связь между входным напряжением и углом поворота. Кроме того, гальванометры характеризуются максимальным и минимальным углами поворота. Легко приобрести гальванометры для углов до ±30 [4]. Гальванометры управляются внешними усилителями. Обычно это твердотельные усилители с переменным выходным сопротивлением. На их вход подается напряжение ±1,0 В, при этом ток управляющий поворотом зеркала гальванометра пропорционален входному напряжению. Как правило, обеспечивается регулировка нулевого смещения и коэффициента усиления драйверов гальванометров.

На рынке имеются сканирующие 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 0xFFF8\n"

  ".word 0x8000, 0x8000, 0x8000, 0x8000\n"

  ".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

    position_laser(0x00,0x00);

    shutter(close);

    delay();

    PORTB=0x00; // включает красные светодиоды индикатора

    go = 0;

    break;

   case 0xFF:

    break;

   default:

    ; //все остальные случаи

   }//конец switch(new_PORTA)

   old_PORTA = new_PORTA;

  }//конец if(new_PORTA ! = old_PORTA)

 }//конец while(go)

}//конец main


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

// initialize_ports: производится конфигурация портов в качестве

//входных/выходных

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

void initialize_ports(void)

{

DDRA=0x00; //установить PORTA в качестве входного порта

DDRB=0xFF; //установить PORTB в качестве выходного порта

PORTB=0x00; //включить красные светодиоды индикатора

DDRS=0xFF; //установить PORTT в качестве выходного порта

DDRP=0xFF; //установить PORTP в качестве выходного порта

}

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

/// /shutter(int action) : открытие и закрытие затвора

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

void shutter(int action) {

 if (action == open) PORTP = 0x01;

 if (action == close) PORTP = 0x00;

}


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

//position_laser(unsigned char x_pos, unsigned char y_pos): посылает

//сигнал управления для каналов X и Y гальванометра из портов PORTS

//и PORTT соответственно.

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

void position_laser(char x_pos,char y_pos) {

 PORTS = x_pos;

 PORTT = y_pos;

}


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

//delay(void): создает задержку

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

void delay(void) {

 int j;

 for(j=0x0000; j<0x1000; j=j+0x01) {

  asm("nop");

 }

}

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

7.2.7. Испытания устройства

До подсоединения компонентов системы к МК 68HC12, мы должны полностью проверить схему. В главе 5 мы рассматривали методики проверки, позволяющие моделировать входы системы переключателями, а выходы светодиодами. Наше устройство уже содержит переключатели и светодиоды для такой проверки. Однако, как мы проверим аналоговые сигналы? Имеется два метода, позволяющих легко проверить связь друг с другом сигналов на каналах X и Y:

1) использование перьевого X-Y графопостроителя,

2) использование классической контрольно-измерительной методики, связанной с получением так называемых фигур Лиссажу.

При первой методике, выходной аналоговый сигнал, формируемый X-каналом ЦАП, переключается с X-канала гальванометра на X-канал перьевого X-Y графопостроителя, а сигнал с Y-канала гальванометра на Y-канал на графопостроителя. Сигнал управления затвором может быть подан на драйвер пера графопостроителя, смещающийся вверх и вниз. Необходим плоттер со специальными характеристиками, чтобы определить, требуется ли схема интерфейса между ТТЛ совместимым сигналом для управления затвором от 68HC12 и управления движением пера вверх и вниз. После подключения микроконтроллера 68HC12 к графопостроителю, каждое из изображений может быть полностью проверено.

Вторая методика испытаний использует классический метод фигур Лиссажу. Чтобы получить фигуры Лиссажу, выходные сигналы с X-канала и Y-канала ЦАП подаются на соответствующие каналы осциллографа.

После подключения 68HC12 к осциллографу, каждое из изображений также может быть полностью проверено. Дополнительную информация о фигурах Лиссажу можно найти в [2].

7.2.8. Заключительные испытания системы управления

После полной проверки программного обеспечения, оно может быть испытано совместно с устройством управления лазером. Реальные устройства описываются в литературе, выпускаемой изготовителями оптических устройств и в учебниках, посвященных оптическим блокам [3, 8].

7.3. Цифровой вольтметр