Digital Avto Tuning - программа автоматической подстройки кода ____________________________________ Принцип действия прост: когда на 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 и SpinEdit1Lpt.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 //-- Если включен LOGRichEdit1.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); //-- читаем выходной регистр - 0Label2.Caption := 'Контр. кода : '+ IntToStr(b) ; //-- выводим прочитанный кодSpeedButton1.Enabled := not Pin10; //--зажигаем светодиод на лог. 0 входного Pin10SpeedButton2.Enabled := not Pin11; //--зажигаем светодиод на лог. 0 входного Pin11end; 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 тогда + 1SpinEdit1.Value := SpinEdit1.Value +1 else //-- иначе:if Pin10 = false then //-- если лог 0 на Pin10 тогда - 1SpinEdit1.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 тогда + 1SpinEdit1.Value := SpinEdit1.Value +1 else //-- иначе:if Pin10 = false then //-- если лог 0 на Pin10 тогда - 1SpinEdit1.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 - пример взаимодействия органов управления и сигналов
|