Принцип программирования АЦП

Для получения значения исследуемого напряжения компьтер выдает на делитель различные значения, от 0 до 255 (в используемой модели АЦП используется только 8 разрядов), до тех пор пока АЦП не сработает (на выходе не появится "1"). Последнее выведенное значение соответствует значению исследуемого напряжения.

На самом деле алгоритм несколько сложнее, так как приведенный выше алгоритм работает с разной скоростью в зависимости от значения исследуемого напряжения. В программе применяется алгоритм деления отрезка пополам: на АЦП выводится значение, соответствующее середине текущего отрезка. Если АЦП не сработал, программа переходит к изучению нижней половины отрезка, а если сработал - верхней. Таким образом результат получается всегда за 7 циклов работы, и это не зависит от значения исследуемого напряжения.

Вот отрывок программы на Ассемблере, осуществляющий описанный выше алгоритм:

mov al, 80h ; initialize with 256/2=128
mov bl, al
mov cl, al
shr cl, 1
@acp@1:
mov dx, cs:[lpt1]
out dx, al
mov ah, al
mov al, byte ptr cs:[port_wait]
@acp@t: dec al
test al, al
jnz @acp@t
inc dx
in al, dx
xor al, 127
jnz short @acp@2
mov al, ah
xor al, bl
or al, cl
jmp short @acp@3
@acp@2:
mov al, ah
or al, cl
@acp@3:
test cl, cl
jz @acp@4
mov bl, cl
shr cl, 1
jmp short @acp@1
@acp@4:
; now al holds read value
ret ; return to caller

Где com_wait - выбираемая экспериментально задержка, связанная с тем, что АЦП срабатывает не мгновенно, а с некоторым запаздыванием. Точная причина этого запаздывания не выяснена, но оно ограничивает спектр частот сигналов, которые можно исследовать с помощью данного комплекса.

Lpt1 - номер порта для управления LPT (обычно 389h).

АЦП

Copyright 1999 Андрей Смирнов