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. Контроль ошибок (срабатывание обеих датчиков + и – одновременно, короткое замыкание).
Смотрим код::
[pas]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;[/pas]
Cкачайте этот пример – primer_xp05.zip(30 kb)
Cкачать готовую программу – Digital Avto Tuning : Dat.zip (207 kb)
Смотрите дальше: LPT SEND – пример взаимодействия органов управления и сигналов