15th
JUL

LPT порт. Компьютер в роли контроллера. Часть 2

Posted by Chas under Журнал, Статьи





Здравствуйте, уважаемые читатели. Сегодня мы с вами рассмотрим варианты схемотехники подключения LPT порта для ввода и вывода данных, а также некоторые нюансы по формированию импульсного сигнала для управления такими нагрузками как шаговый двигатель (ШД). dekot

Продолжение. Начало цикла смотрите в третьем выпуске журнала…

Владимир Дегтярь
by DeKot degvv@mail.ru

Подключаем внешние устройства

Уровни напряжения на выводах регистров могут принимать значения + 5В (логическая “1″) или 0В (логический “0″), тогда как для управления внешними устройствами бывает, необходимы совсем другие уровни напряжения. В таких случаях используются схемы согласования входов/выходов компьютера со схемами включения внешних устройств. Входы регистров приема информации имеют уровень + 5В. Для подачи входного сигнала на такие входы достаточно подключить через токоограничивающий резистор
(100…470 Ом) общий провод, что соответствует подачи “0″ на вход (см. рисунок 1):


рисунок 1

Vcc – напряжение питания внешних устройств GND – общий провод, попросту “земля”
Рис. 1. Согласование входных цепей

При подключении внешних устройств к выходам порта LPT следует также применять согласующие устройства с целью предотвращения выхода из строя порта. В простейшем случае возможно использование транзисторных ключей. Однако более надежно применение транзисторных или симисторных оптопар, обеспечивающих полную
гальваническую развязку цепей (см. рисунок 2, 3). Имеющейся комбинации входов и выходов: 5 входов “status” и 12 выходов “data” и “control” или
же 13 входов “data” и “status” и 4 выхода “control” может оказаться недостаточно для подключения всех необходимых устройств. В таком случае расширить количество подключаемых устройств


рисунок 2

Рис. 2. Согласование и развязка выходных цепей

можно применением последовательно-параллельного метода включения внешних устройств. Так 5-битный входной регистр “status” может принимать 32 различных состояния. Подавая на этот вход поочередно коды состояний подключенных устройств, получим возможность одновременного подключения до 31 устройства. В качестве управляющих адресов используется 4-х битный регистр “control” (см. рисунок 4):

рисунок 3

Рис. 3. Согласование и развязка выходных цепей. Управление мощной нагрузкой


рисунок 4

Рис. 4. Вариант расширения. Ввод

Программно это организуется в таймере:

код

var
// управляющая последовательность
// см. таблицу 1 из предыдущей статьи [1]

  mas_cntrl : array [0 .. 15] of byte = ( 11, 10, 9, 8, 15, 14,
    13, 12, 3, 2, 1, 0, 7, 6, 5, 4);
// массив кодов подключенных устройств
  mas_ cod_in : array [0 .. 15] of byte;

procedure TForm1.Timer1Timer(Sender: Tobject);
var i : byte;
begin
  for i := 0 to 15 do begin
// передаем через “contrl” адреса (0 .. 15) считывания
    Out32 ($37A, mas_cntrl[ i ] );
// запоминаем в массиве коды включенных устройств,
// если устройство не включено – код = 0

    mas_cod_in [ i ] := Inp32 ($379);
{ обработка полученных кодов }
  end;
end;

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


рисунок 5

Рис. 5. Вариант расширения количества
подключаемых устройств. Вывод

Управление записью выходных кодов организуется по такой же схеме через регистр “cоntrol”, а результат обработки программой сигналов включения / выключения внешних устройств предварительно преобразуется в массив кодов и затем последовательно параллельным кодом передается на внешние триггеры управления:

код

var
// массив кодов включения / выключения устройств
  mas_ upravl : array [0 .. 15] of byte;
procedure TForm1.Timer2Timer(Sender: Tobject);
var i : byte;
begin
  for i := 0 to 15 do begin
    Out32 ($37A, mas_cntrl[ i ]);
    Out32 ($378, mas_upravl[ i ])
  end
end;

Еще один, довольно “экзотический” способ расширения количества входов связан с использованием порта клавиатуры, вернее имитации нажатия кнопок клавиатуры. Если
разобрать современную клавиатуру (речь идет о простых китайских клавиатурах самой низкой стоимости), то мы увидим, что она состоит из двух пленок, на которых нанесены контактные площадки под клавишами и соединяющих дорожек. Все это выводится на плату с управляющим контроллером с помощью 26 контактов (количество контактов на разных моделях может отличаться, но это несущественно). Принцип работы клавиатуры
заключается в том, что, нажимая какую либо клавишу, мы тем самым замыкаем определенную пару из этих 26 контактов. Для каждой клавиши комбинация такой пары контактов своя. Далее контроллер клавиатуры обрабатывает этот сигнал и передает в компьютер код нажатой клавиши. Поэтому есть возможность подсоединить к этим 26
контактам свою комбинацию входных сигналов и обрабатывать их уже программно по кодам нажатых клавиш. Особенностью здесь является то, что не должно быть одновременно подаваемых нескольких сигналов таким способом.

Практические приемы программирования в среде IDE Delphi

Для управления состоянием регистров порта LPT мною разработан модуль управления
. В основу модуля положена все та же библиотека . Модуль включает в себя уже знакомые нам функции Inp32(PortAdr) и Out32(PortAdr, data). Кроме этого в модуль входят функции преобразования десятичного числа в двоичное Dec_Bin(N_dec):
TMas (функция возвращает массив битов, соответствующий десятичному числу), функция
обратного преобразования двоичного числа в десятичное Bin_Dec(mas_bit): byte и функция установки указанного бита регистра порта LPT в заданное состояние (0 или 1) ChangBit(PortAdr, _bit, data): byte. Сам модуль
приведен в ресурсах к статье [1]. Для применения модуля в папку с проектом скопируйте
, и в модуле Unit проекта в разделе uses подключите CtrlBitLPT. Далее очень просто использовать вызовы функций из модуля:


  • чтение десятичного числа из регистра порта LPT (просто используем функцию из
    ) N_dec := Inp32(PortAdr)

  • чтение значения бита из регистра порта LPT (считываем сначала состояние регистра
    (PortAdr) в виде десятичного числа, далее преобразовываем его в массив битов (двоичное
    число) и берем i-й элемент массива) Bit_Val (i) := Dec_Bin(Inp32(PortAdr)) [ i ]

  • запись в регистр порта десятичного значения (снова используем функцию из
    Out32())

  • управление отдельными битами регистров порта LPT (ChangBit())

Алгоритм работы функции ChangBit() здесь следующий (выполняется в модуле при вызове функции ChangBit()):

  • считываем значение регистра Inp32 (PortAdr) преобразовываем в двоичное число Dec_Bin (N_dec) в виде массива битов (mas_bit)
  • устанавливаем необходимый бит в нужное значение (0 или 1) Dec_Bin(Inp32(PortAdr)) [_bit ] := data или же mas_bit [ _bit ] := data

  • обратно преобразовываем измененный массив битов в десятичное число N_dec_new: =
    Bin_Dec(mas_bit)

  • запись новоо значения в регистр порта Out32()

Импульсный сигнал на выходах LPT-порта

Для получения последовательности импульсов на выходах LPT-порта можно применить два метода:

1. Применение таймера

Когда в каждом его цикле можно последовательно производить переключение выходных импульсов. Однако, здесь следует учитывать, что при использовании таймера из палитры стандартных компонентов (вкладка System) или системного таймера Windows, минимальный интервал времени этих таймеров находится в пределах 55 – 64 мсек (т.е. практически максимальная частота импульсов до 150 Гц). Кроме того, значение
минимального интервала зависит от особенностей “железа” ПК и нагрузки процессора.

Более стабильные результаты даст применение мультимедийного таймера MMTimer* (модуль MMSystem). Однако и здесь есть ограничение – минимальный интервал такого таймера 1 мсек, но с большей стабильностью и точностью. Таким образом, максимальная частота при применении мультимедийного таймера MMTimer равна 500 Гц (при скважности импульсов 2 , наименьшая длительность импульсов = 1 мсек, период
следования импульсов = 2 мсек, частота = 500 Гц). Рассмотрим применение мультимедийного таймера MMTimer. Подключаем в раздел Uses модули (управление портом LPT) и :

код

var mmTimer : integer; // идентификатор таймера
  T : integer; // интервал таймера
  on_off : Boolean; // флаг вкл-выкл импульсов
// процедура работы таймера
procedure mmTimerProc(TimerID,Msg : Uint ; dwUser, dw1, dw2 :
DWORD ); pascal; // код процедуры формирования импульсов на
begin // контакте 2 LPT (регистр “data” = $378)
  if on_off = true then Out32($378, 1) // включение импульса
  else Out32($378, 0); // выключение импульса
  on_off : = not on_off
end;
// управление таймером — включение
mmTimer:= TimerSetEvent(T, 0, @mmTimerProc, 0, TIME_PERIODIC );
// выключение
TimerKillEvent(mmTimer);

Пример проекта с использованием мультимедийного таймера
приведен в ресурсах к статье. Внешний вид тестовой утилиты представлен на рисунке 6:


рисунок 6

Рис. 6. Утилита формирования импульсов с помощью мультимедийного таймера

2. Использование циклической процедуры формирования импульсов

Этот метод позволяет получить последовательность импульсов с частотой до 60
кГц. При этом цикл управления выходом импульсов должен быть максимально малым.
Смысл такого метода в том, что вся основная часть программы (формирование импульсов, обработка управляющих сигналов, расчеты, графика и т. п.) организована в едином цикле. Но длительность такого цикла зависит от системных свойств компьютера и от загруженности ОС. Поэтому при таком методе следует разработать основные
процедуры программы, определить время выполнения одного цикла программы и затем уже определяться с параметрами формирования импульсов. Принцип получения импульсного сигнала в цикле показан на следующей диаграмме и блок-схеме процедуры (см. рисунок 7):


рисунок 7



рисунок 7

Рис. 7. Диаграмма и блок-схема получения импульсного сигнала

Цикличность выполнения процедуры формирования импульсов определяется величиной
. (временем выполнения процессором команд и операторов программы). Величина . во многом зависит от аппаратных свойств компьютера (быстродействие, величина свободной памяти) и загруженности ОС системными процессами, а также от величины кода самой программы. При этом значение . не является постоянной величиной и меняется процессе выполнения программы. Поэтому при высоких требованиях к параметрам импульсов применение ПК в качестве управляющего контроллера бывает невозможно. Задачу следует решать аппаратными методами. Но в большинстве случаев нестабильность частоты в пределах 3-5 % является вполне приемлемой. Рассмотрим управление шаговым двигателем…

Управление шаговым двигателем

Что такое шаговый двигатель и зачем он нужен? Шаговый двигатель – это электромеханическое устройство, которое преобразует электрические импульсы в дискретные механические перемещения. Наверное, каждый видел, как выглядит шаговый двигатель внешне: он практически ничем не отличается от двигателей других типов. Чаще всего это: круглый корпус, вал, несколько выводов (см. рисунок 8):

рисунок 8

Рис. 8. ШД типа ДШИ-200

Однако шаговые двигатели обладают некоторыми уникальными свойствами, что делает порой их исключительно удобными для применения или даже незаменимыми. Чем же хорош шаговый двигатель? Приведем основные положительные моменты*:

  • угол поворота ротора определяется числом импульсов, которые поданы на двигатель
  • двигатель обеспечивает полный момент в режиме остановки (если обмотки запитаны)
  • прецизионное позиционирование и повторяемость (хорошие шаговые двигатели
    имеют точность 3-5% от величины шага. Эта ошибка не накапливается от шага к шагу)

  • возможность быстрого старта-остановки-реверса
  • высокая надежность, связанная с отсутствием щеток, срок службы шагового двигателя
    фактически определяется сроком службы подшипников

  • однозначная зависимость положения от входных импульсов обеспечивает позиционирование без обратной связи
  • возможность получения очень низких скоростей вращения для нагрузки,
    присоединенной непосредственно к валу двигателя без промежуточного редуктора

  • может быть перекрыт довольно большой диапазон скоростей, скорость пропорциональна частоте входных импульсов

Одним из главных преимуществ шаговых двигателей является возможность осуществлять
точное позиционирование и регулировку скорости без датчика обратной связи. Это очень важно, так как такие датчики могут стоить намного больше самого двигателя. Однако это подходит только для систем, которые работают при малом ускорении и с относительно постоянной нагрузкой. В то же время системы с обратной связью способны работать с большими ускорениями и даже при переменном характере нагрузки. Если нагрузка
шагового двигателя превысит его момент, то информация о положении ротора теряется и
система требует базирования с помощью, например, концевого выключателя или другого
датчика. Системы с обратной связью не имеют подобного недостатка.

При проектировании конкретных систем приходится делать выбор между сервомотором и
шаговым двигателем. Когда требуется прецизионное позиционирование и точное управление скоростью, а требуемый момент и скорость не выходят за допустимые пределы, то шаговый двигатель является наиболее экономичным решением. Как и для обычных двигателей, для повышения момента может быть использован понижающий редуктор. Однако для шаговых двигателей редуктор не всегда подходит. В отличие от коллекторных двигателей, у которых момент растет с увеличением скорости, шаговый
двигатель имеет больший момент на низких скоростях. К тому же, шаговые двигатели имеют гораздо меньшую максимальную скорость по сравнению с коллекторными двигателями, что ограничивает максимальное передаточное число и, соответственно, увеличение момента с помощью редуктора. Готовые шаговые двигатели с редукторами хотя и существуют, однако являются экзотикой. Еще одним фактом, ограничивающим
применение редуктора, является присущий ему люфт. Возможность получения низкой частоты вращения часто является причиной того, что разработчики, будучи не в состоянии спроектировать редуктор, применяют шаговые двигатели неоправданно часто.

* Комментарий редакции.

  • шаговым двигателем присуще явление резонанса
  • возможна потеря контроля положения ввиду работы без обратной связи
  • потребление энергии не уменьшается даже без нагрузки
  • затруднена работа на высоких скоростях
  • невысокая удельная мощность
  • относительно сложная схема управления

Виды шаговых двигателей**

Существуют три основных типа шаговых двигателей:

  • двигатели с переменным магнитнымсопротивлением
  • двигатели с постоянными магнитами
  • гибридные двигатели

В шаговом двигателе вращающий момент создается магнитными потоками статора и ротора, которые соответствующим образом ориентированы друг относительно друга. Статор изготовлен из материала с высокой магнитной проницаемостью и имеет несколько полюсов. Полюс можно определить как некоторую область намагниченного тела, где магнитное поле сконцентрировано. Полюса имеют как статор, так и ротор. Для уменьшения потерь на вихревые токи магнитопроводы собраны из отдельных пластин,
подобно сердечнику трансформатора. Вращающий момент пропорционален величине магнитного поля, которая пропорциональна току в обмотке и количеству витков. Таким образом, момент зависит от параметров обмоток. Если хотя бы одна обмотка шагового двигателя запитана, ротор принимает определенное положение. Он будет находится в этом положении до тех пор, пока внешний приложенный момент не превысит некоторого значения, называемого моментом удержания. После этого ротор повернется и будет
стараться принять одно из следующих положений равновесия.

** Комментарий редакции.

Определить тип двигателя можно даже на ощупь: при вращении вала обесточенного двигателя с постоянными магнитами (или гибридного) чувствуется переменное сопротивление вращению, двигатель вращается как бы щелчками. В то же время вал
обесточенного двигателя с переменным магнитным сопротивлением вращается свободно. Гибридные двигатели являются дальнейшим усовершенствованием двигателей с постоянными магнитами и по способу управления ничем от них не отличаются. Определить тип
двигателя можно также по конфигурации обмоток. Двигатели с переменным магнитным сопротивлением обычно имеют три (реже четыре) обмотки с одним общим выводом. Двигатели с постоянными магнитами чаще всего имеют две независимые обмотки. Эти
обмотки могут иметь отводы от середины. Иногда двигатели с постоянными магнитами имеют 4 раздельных обмотки.

Способы управления ШД и практическая
реализация

Существует несколько способов управления фазами шагового двигателя. Первый способ
обеспечивается попеременной коммутацией фаз, при этом они не перекрываются, в один момент времени включена только одна фаза. Этот способ называют “one phase on” full step или wave drive mode. Точки равновесия ротора для каждого шага совпадают с “естественными” точками равновесия ротора у незапитанного двигателя. Недостатком
этого способа управления является то, что для биполярного двигателя в один и тот же момент времени иcпользуется 50% обмоток, а для униполярного – только 25%. Это означает, что в таком режиме не может быть получен полный момент (см. рисунок 9):


рисунок 9

Рис. 9. Различные способы управления фазами шагового двигателя.

Второй способ – управление фазами с перекрытием: две фазы включены в одно и то же
время. Его называют “two-phase-on” full step или просто full step mode. При этом способе
управления ротор фиксируется в промежуточных позициях между полюсами статора и
обеспечивается примерно на 40% больший момент, чем в случае одной включенной фазы.
Этот способ управления обеспечивает такой же угол шага, как и первый способ, но положение точек равновесия ротора смещено на пол-шага.

Третий способ является комбинацией первых двух и называется полушаговым режимом, “one and two-phase-on” half step или просто half step mode, когда двигатель делает шаг в половину основного. Этот метод управления достаточно распространен, так как двигатель с меньшим шагом стоит дороже
и очень заманчиво получить от 100-шагового двигателя 200 шагов на оборот. На каждый второй шаг запитана лишь одна фаза, а в остальных случаях запитаны две. В результате угловое перемещение ротора составляет половину угла шага для первых двух способов управления. Полушаговый режим обычно не позволяет получить полный момент, хотя наиболее совершенные драйверы реализуют модифицированный полушаговый режим, в
котором двигатель обеспечивает практически полный момент, при этом рассеиваемая мощность не превышает номинальной.

Еще один способ управления называется микрошаговым режимом или micro stepping mode. При этом способе управления ток в фазах нужно менять небольшими шагами, обеспечивая таким образом дробление половинного шага на еще меньшие микрошаги. Когда одновременно включены две фазы, но их токи не равны, то положение равновесия ротора будет лежать не в середине шага, а в другом месте, определяемом соотношением токов фаз. Меняя это соотношение, можно обеспечить некоторое количество микрошагов внутри одного шага.

Рассмотрим управление ШД при следующей схеме подключения (см. рисунок 10):

рисунок 10

рисунок 10

Рис. 10. Диаграмма управляющих сигналов и схема подключения

Программа формирования импульсов для ШД с использованием цикла будет следующая:

{ используемые переменные }

код

var flag_pusk : boolean; // флаг запуска импульсов
  flag_on_off : boolean; // флаг переключений импульс-пауза
  count_CPU : integer; // кол-во циклов для одного импульса-паузы
  count : integer; // счетчик циклов

// процедура формирования импульсов
procedure Impuls();
begin
  while flag_pusk do begin
    ApplicationProcessMessages;
    if flag_on_off then Out32($378, 1) // импульс
    else Out32($378, 0); // пауза
    Inc ( count ) ;
    if count < count_CPU then CONTINUE; // повтор цикла
    flag_on_off : = not flag_on_off
  end
end ;

// старт формироования импульсов
procedure TForm1.Button1Click( Sender : TObject);
begin
  flag_pusk : = true;
  Impuls ()
end;

// стоп формирования импульсов
procedure TForm1.Button2Click(Sender : TObject);
begin
  flag_pusk : = false
end;

В ресурсах к статье приведен пример проекта программы с использованием цикла – управление 4-х фазным шаговым двигателем (см. рисунок 11).


рисунок 11

Рис. 11. Утилита управления ШД

Подведем итоги***

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

В большинстве современных устройств, как промышленных, так и бытовых, применяются
специально разработанные для таких целей микроконтроллеры (PIC – контроллеры от
MicroChip, ATMEL и др.). Несмотря на их низкую стоимость, разработка управляющих устройств на их основе требует специальных навыков, в любом случае необходима разработка и изготовление интерфейсных согласующих устройств, устройств
ввода и отображения информации. Кроме этого, требуется специальный программатор для ввода рабочей программы и т.п. Также широко применяются программируемые промышленные контроллеры – устройства, имеющие микропроцессорный блок управления, расширяющие устройства ввода и вывода сигналов. Однако стоимость таких устройств сопоставимо со стоимостью обычного компьютера, а зачастую и намного превышает ее. В то же время сейчас как на предприятиях, так и дома уже накопилось достаточное количество устаревших компьютеров (PII, PIII), 14-и 15-и дюймовых
мониторов, которые вполне можно приспособить для решения указанных задач.

*** Важное замечание.
В данной статье использованы следующие модули и проекты:

  • Библиотека функций для работы с LPT портом в Windows
  • Модуль для работы с LPT портом в Дельфи
  • Установка состояний регистров LPT и мониторинг LPT
  • Демо-версия монитора модернизированного ТПА “KUASY 170″
  • Проект формирования импульсов с MMTimer
  • Проект формирования импульсов с использованием цикла

Все они приведены в виде ресурсов на в разделе “Журнал клуба программистов. Четвертый выпуск” или непосредственно в архиве с журналом.

Кроме всего этого, несомненным достоинством персонального компьютера является большая гибкость при разработке программного обеспечения, создание на мониторе удобного интерфейса для пользователей (пример такого монитора найдете в ресурсах к статье), возможность быстрого оперативного изменения параметров и настроек, сохранения всевозможных данных, создание отчетов и многое другое.

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

Ресурсы

  • В. Дегтярь. Работа с LPT портом в Дельфи или компьютер в роли управляющего контроллера. Часть 1. ПРОграммист. – Клуб ПРОграммистов,
    2010, №3 http://programmersclub.ru/pro/pro3.zip

  • Модули и проекты, использованные в статье http://programmersclub.ru/pro/pro4.zip

Статья из четвертого выпуска журнала “ПРОграммист”.
Скачать этот номер можно по ссылке.
Ознакомиться со всеми номерами журнала.