NGSPICE.js - аналоговые интегратор и дифференциатор

Продолжаем осваивать NGSPICE вообще и ОУ в частности.

Интегратор - устройство, уровень выходного сигнала которого пропорционален интегралу (суммы для бесконечного числа бесконечно малых слагаемых), обычно по времени, от входного сигнала. В свою очередь дифференциатор выполняет обратную функцию - уровень выходного сигнала пропорционален скорости изменения сигнала на входе. Аналоговые интегратор и дифференциатор в простейшем случае могут быть реализованы на RC цепочке, т.е. при последовательном включении конденсатора и резистора, но обо всём по порядку. Кстати почему в предыдущем примере RC цепочки фазы входного и выходного сигнала сдвинуты на 90° ? Чему равен интеграл от sin(x) по x ? Чему равна производная от sin(x) ?

~$ echo '
    set term png truecolor size 1280,720
    set xrange [0:2*pi]
    set xtics (0, "π/2" pi/2, "π" pi, "π3/2" 3*pi/2, "2π" 2*pi)
    set grid ytics xtics
    plot sin(x), -cos(x)
    ' | gnuplot > rc.sin.cos.png

Рисовать графики удобно с помощью GnuPlot. Важнейшая особенность синусоидальных сигналов в том, что при дифференцировании/интегрировании форма сигнала не меняется - может измениться только фаза:

screenshot

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

screenshot

Где Uout - напряжение на резисторе в Вольтах, С - ёмкость конденсатора в Фарадах, R - сопротивление резистора в Омах, dUin/dt и dUout/dt - производные входного и выходного напряжений по времени. Какой физический смысл у данного уравнения ?

Самый простой случай - на входе постоянное напряжение, тогда производная dUin/dt равна нулю и формула приводится к виду dUout/Uout = -dt/RC. Проинтегрировав левую и правую часть имеем ∫dUout/Uout = ∫-dt/RC, где ∫dUout/Uout = ln|Uout| + const это табличный интеграл и его умные люди уже давно рассчитали, а ∫-dt/RC = (-t/RC) + const. Окончательно получаем Uout = exp(-t/RC) * const. Порисуем:

~$ echo '
    set term png truecolor size 1280,720
    R=42e3
    C=1e-6
    V=12
    τ=R*C
    set xrange [0:6*τ]
    set xtics ("τ(f)" τ, "2τ" 2*τ, "3τ(%g)" 3*τ, "4τ" 4*τ, "5τ" 5*τ, "6τ" 6*τ)
    set xlabel "Time(second)"
    set ylabel "Voltage(Volt)"
    set grid ytics xtics
    set key center
    plot V*(1-exp(-x/τ)), V*exp(-x/τ)
    ' | gnuplot > rc.tau.png

Если измерять время величинами RC, то график будет всегда одинаков для любой RC цепи. Поэтому величину τ = R*C принято называть постоянной времени. Теоретически напряжение на конденсаторе никогда не достигнет напряжения питания, но на практике считается что времени 5τ и более уже достаточно:

screenshot

В противоположность к предыдущему случаю предположим, что входное напряжение изменилось с 0 до U за время много меньшее постоянной времени dt << τ. Тогда Uout = τ*dUin/dt - τ*(Uout-0)/dt или Uout = τ*dUin/dt - τ*Uout/dt, а учитывая Uout << τ*Uout/dt можно приблизительно приравнять dUin/dt ≈ dUout/dt, т.е. всё напряжение на входе RC цепочки оседает на резисторе т.к. напряжение на конденсаторе не может измениться мгновенно.

А если входное напряжение изменилось с 0 до U за время много большее постоянной времени dt >> τ ? Тогда Uout >> τ*Uout/dt и можно приблизительно приравнять Uout ≈ τ*dUin/dt, т.е. математически такая RC цепочка выполняет операцию дифференцирования - напряжение на резисторе является производной от функции входного напряжения по времени с коэффициентом τ:

screenshot

Если теперь выходное напряжение снимать не с резистора, а с емкости, т.е. Uout = Uc, то дифференциальное уравнение примет вид Uout + τ*dUout/dt = Uin. В случае dt >> τ напряжение на конденсаторе повторяет напряжение на входе - по истечении большого промежутка времени Uout ≈ Uin. В случае dt << τ имеем Uin ≈ τ*dUout/dt, такая RC цепочка выполняет операцию интегрирования от функции входного напряжения c коэффициентом 1/τ:

screenshot

С учётом вышесказанного реальный аналоговый интегратор/дифференциатор должен побороть следующие недостатки простой RC цепочки:

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

  • дифференциальные уравнения не учитывают внутреннего сопротивления источника напряжения ровно как и влияния сопротивления нагрузки

С этими обязанностями прекрасно справляется операционный усилитель. В следующих схемах использовалась SPICE модель операционного усилителя LT1007:

~$ wget http://cds.linear.com/docs/en/software-and-simulation/LT1007CS.txt

инвертирующий интегратор на ОУ | netlist | ngspice.js

screenshot

ngspice 1 -> source integrator.net
ngspice 2 -> tran 10u 100m 94m
ngspice 3 -> plot v(out) v(in)

Конденсатор Сf, кроме заряда входным током заряжается различными токами утечки и смещения ОУ и для борьбы с этим явлением ставится шунтирующий резистор Rf, где Rf >> Rg. Рассчитаем поведение интегратора исходя из входного сигнала прямоугольной формы амплитудой 3В и частотой 500Гц при Сf = 0.1мкФ и Rg = 5кОм. Проинтегрировав Uout = -1/RC∫(Uin)dt = -Ut/RC или если человеческим языком, то изменение выходного напряжения во времени представляет собой наклонную прямую с полярностью, противоположной полярности входного сигнала. Интегрированием в пределах от 0 до 1/(2*500Гц)=1мс получим значение Uout = -3*10^-3/(10^-7*5*10^3) = -6 Вольт.

screenshot

Если на предыдущей схеме всего-навсего поменять резистор и конденсатор местами получим дифференциатор. Для предотвращения самовозбуждения дифференциатора на высоких частотах дополнительно вводятся резистор Rg и конденсатор Cf обычно при соотношении Rg*Cg = Rf*Cf:

инвертирующий дифференциатор на ОУ | netlist | ngspice.js

screenshot

ngspice 1 -> source differentiator.net
ngspice 2 -> tran 0.25m 0.25
ngspice 3 -> plot v(out) v(in)

К недостаткам дифференциаторов прежде всего относится очень большая чувствительность к шумам и помехам у входного сигнала. При резком изменении входного сигнала производная очень большая и ОУ входит в режим насыщения. Получаем такой вот кактус (шутка):

screenshot

Классическим примером практического применения интегратора и дифференциатора является пропорционально-интегрально-дифференцирующий (ПИД) регулятор.

Далее широтно-импульсная модуляция (ШИМ) и управление коэффициентом заполнения.

links

social