Digital Avto Tuning - программа автоматической подстройки кода
____________________________________


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

И так, рассмотрим очень полезную программу - Digital Avto Tuning
Digital Avto Tuning - программа автоматической подстройки кода
Digital Avto Tuning - это программа автоматической подстройки выходного восьми битного кода. Управляется программа по двум входным битам LPT порта, это Pin 11 и Pin 10. Как она работает? Рассмотрим пример показанный на рисунке. В данном случае, программа используется для цифровой автоматической подстройки частоты трансивера или радиоприёмника, хотя с успехом может применяться в любых других системах, даже для управления аналоговой АПЧ через соответствующий ЦАП.

Принцип действия прост: когда на Pin11 приходит лог. ноль - программа начинает уменьшать величину выходного кода; если же сигнал управления поступает на Pin10 (+) - увеличивать. Включается режим переключателем "Авто". Например, с определённого разряда цифровой шкалы гетеродина поступает логический ноль на Pin11, если частота увеличилась. Тогда программа, согласно заданным настройкам, начнет уменьшать число на выходном регистре до тех пор, пока управляемый посредством ЦАП гетеродин не вернётся на нужную частоту, вследствие чего сигнал управления на Pin11 исчезнет. Аналогично очень удобно управлять двигателями, например насосами, с помощью двух датчиков - плюс и и минус. Это может быть: вперёд-назад, вправо-влево, вверх-вниз и т.д.


Программа имеет следующие возможности:

1. Максимальное число - 255 (8 бит : 1-2-4-8-16-32-64-128 ).
2. Величина регулировки +/- 100 % от установленного значения.
3. Управление регулировкой по одиночному импульсу и непрерывная регулировка до появления лог. 1 на соответствующих Pin 10 и Pin11.
4. Установка необходимой скорости (быстродействия) рерулирования.
5. Ведение LOGа .
6. Индикацию величины дрейфа в процентах.
7. Контроль ошибок (срабатывание обеих датчиков + и - одновременно, короткое замыкание).

Смотрим код::

______________________________________________________________

 


procedure TForm1.SpinEdit1Change(Sender: TObject); //-- На изменение SpinEdit1 начать:

begin

TrackBar1.Position := SpinEdit1.Value; //-- Синхронизируем TrackBar1 и SpinEdit1

Lpt.WritePort (GetCurrentPort,0,SpinEdit1.Value); //-- Пишем в порт уст. число

{Это специальная метка для работы счётчика дрейфа}

if SpinEdit1.Tag = 0 then

begin

Edit1.Text := IntToStr(SpinEdit1.Value); //-- Запоминаем число

SpinEdit1.Tag := 1;

end;

end;


procedure TForm1.TrackBar1Change(Sender: TObject);

begin

SpinEdit1.Value := TrackBar1.Position; //-- Синхронизируем

if CheckBox2.Checked = true then //-- Если включен LOG

RichEdit1.Lines.Add //-- Добавляем строку

( FormatDateTime('hh:mm:ss', time()) + ' код ' + IntToStr(SpinEdit1.Value)

+' '+ 'дрейф' + Edit2.Text ); //--время + код + дрейф

end;


procedure TForm1.Timer1Timer(Sender: TObject); //-- Таймер чтения порта

Var

b : byte;

begin

b:= Lpt.ReadPort (GetCurrentPort,0); //-- читаем выходной регистр - 0

Label2.Caption := 'Контр. кода : '+ IntToStr(b); //-- выводим прочитанный код

SpeedButton1.Enabled := not Pin10; //--зажигаем светодиод на лог. 0 входного Pin10

SpeedButton2.Enabled := not Pin11; //--зажигаем светодиод на лог. 0 входного Pin11

end;


procedure TForm1.Timer2Timer(Sender: TObject); //-- Таймер основной автоматики

begin

if CheckBox1.Checked = true then //-- Если включено "Авто" тогда:

begin {Режим готовности - горит зелёный св-д, тухнет при сраб. датчиков}

if (Pin11 = true) and (Pin10 = true) or //-- Если Pin11 = 5в и Pin10 = 5в или

(Pin11 = false) and (Pin10 = false) then //-- Если Pin11 не = 5в и Pin10 не = 5в тогда:

SpeedButton3.Enabled := true else //-- зажечь зедёный светодиод контроля

begin

if RadioButton2.Checked = true then //-- Если вкл. непрырывн. подстройка

begin {Начинаем автоподстройку кода [Все светодиоды вмонтированы в SpeedButton-ы] }

SpeedButton3.Enabled := false; //-- тушим зелёный светодиод

if Pin11 = false then //-- если лог 0 на Pin11 тогда + 1

SpinEdit1.Value := SpinEdit1.Value +1 else //-- иначе:

if Pin10 = false then //-- если лог 0 на Pin10 тогда - 1

SpinEdit1.Value := SpinEdit1.Value -1 ;

end;

end;

if RadioButton1.Checked = true then //-- Если вкл. одиночная подстройка

begin { Таймер автоподстр. по одиночному импульсу }

if (Pin11 = false) or (Pin10 = false) then //-- Если есть сигнал на 11 или 10 ножке

Timer3.Enabled := true else //-- тогда включаем этот таймер, иначе:

Timer3.Tag := 0; //-- Задаём готовность к приёму сигнала датчика для этого таймера

end;

{Если на 11 и 12 ножках одновр. низкий уровень [ошибка или короткое замык.] }

if (Pin11 = false) and (Pin10 = false) then //-- зажечь (показать) красный светодиод поверх зелёного

SpeedButton4.Visible := true else //-- иначе

SpeedButton4.Visible := false; //-- потушить (скрыть)

end;

end;


procedure TForm1.SpinEdit2Change(Sender: TObject);

begin

Timer2.Interval := SpinEdit2.Value; //-- Скорость (величина) автоматического регулирования

Timer3.Interval := SpinEdit2.Value; //-- Задержка (Длительность одиночню импульса) для сраб. таймера

end;


procedure TForm1.Timer3Timer(Sender: TObject); //-- Таймер авт. подстр. по одиночному импульсу

begin

if Timer3.Tag = 0 then //-- Если таймер готов к приёму следующего импульса

begin

SpeedButton3.Enabled := false; //-- тушим зелёный светодиод

if Pin11 = false then //-- если лог 0 на Pin11 тогда + 1

SpinEdit1.Value := SpinEdit1.Value +1 else //-- иначе:

if Pin10 = false then //-- если лог 0 на Pin10 тогда - 1

SpinEdit1.Value := SpinEdit1.Value -1 ;

Timer3.Tag := 1; //-- запрещаем дальнейший отсчёт, до следующего сигнала датчиков

end;

Timer3.Enabled := false; //-- Чтобы не тратить такты процессора отключаем таймер

end;


procedure TForm1.Timer4Timer(Sender: TObject); //-- Этот таймер вычисляет величину дрейфа

Var a,b,c : integer;

begin

if CheckBox1.Checked = true then //-- Если включен авто

begin

a := StrToInt(Edit1.Text); //-- Преобразуем

b := SpinEdit1.Value; //-- Присваиваем

c := 0; //-- Присваиваем любое число

Gauge1.MaxValue := a; //-- Устанавливаем максимальный дрейф в %

if SpinEdit1.Value < a then //-- Если меньше тогда:

begin

c := a-b; //-- Вычисляем разность

Edit2.Text := ' - ' + IntToStr(c); //-- Добавляем "-" и присваиваем

end;

if SpinEdit1.Value = a then

begin

c := a-b; //-- Вычисляем

Edit2.Text := ' ' + IntToStr(c); //-- Убираем - или +

end;

if SpinEdit1.Value > a then

begin

c := b-a; //-- Вычисляем

Edit2.Text := ' + ' + IntToStr(c); //-- Добавляем "+" и присваиваем

end;

Gauge1.Progress := c; //-- Показываем вел. дрейфа в процентах

end;

 

end;


procedure TForm1.CheckBox1Click(Sender: TObject);

begin

if CheckBox1.Checked = true then

SpinEdit1.Tag := 0; //-- Переустанавливаем код слежения

end;


procedure TForm1.FormActivate(Sender: TObject);

begin

Application.HintColor := cllime;

end;

 

 

end.

 

 

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

 

end;



Cкачайте этот пример - primer_xp05.zip(30 kb)

Cкачать готовую программу - Digital Avto Tuning : Dat.zip (207 kb)

Смотрите дальше: LPT SEND - пример взаимодействия органов управления и сигналов



******



Валерий Ковтун US4LEH
..

О сайте

Вернуться на Шаг4. LPT терминатор - программа дистанционного управления компьютером.

Вернуться на XP LPT

Вернуться на главную страницу

Чтобы открыть ссылку в новом окне - удерживайте клавишу Shift

Программа PortControl V3+
Программа PinRegistrator D1+


Гостевая книга
Обратная связь