Первая идея - это эта схема, но вам нужно некоторое «управление» обратной связью из-за неизвестных «смещений» напряжения и «центральной точки».
Сделано с микрокап 12 .
Идея поиска «центральной точки» заключается в следующем.
Интегрируйте прямоугольную форму волны.
В конце попробуйте напряжение рампы.
Возьмем полуточечное напряжение.
Это «центральная точка» следующего цикла для использования с компаратором… который заменил SQUARE2.
Это еще одна обновленная версия с "1 циклом задержки"...
Добавил другие "волны"...
D:\__Utiles\mc12cd\DATA\opamp integrator v013.cir Transient Analysis
* Converted From Micro Cap Source file to PSPICE
*
.FUNC DPWR(D) {I(D)*V(D)}
.FUNC BPWR(Q) {IC(Q)*VCE(Q)+IB(Q)*VBE(Q)}
.FUNC FPWR(M) {ID(M)*VDS(M)}
.FUNC HOTD(D,MAX) {IF((V(D)*I(D)>MAX),1,0)}
.FUNC HOTB(Q,MAX) {IF((VCE(Q)*IC(Q)+IB(Q)*VBE(Q)>MAX),1,0)}
.FUNC HOTF(M,MAX) {IF((VDS(M)*ID(M)>MAX),1,0)}
.PARAM LOW3MIN={IMPORT(LOW3MIN.OUT,LOW3THRES)}
.PARAM HIGH3MAX={IMPORT(HIGH3MAX.OUT,HIGH3THRES)}
.PARAM LOWLVDS={IMPORT(LOWLVDS.OUT,LOWLIMIT)}
.PARAM HILVDS={IMPORT(HILVDS.OUT,HILIMIT)}
.PARAM LIMTLVDS={IMPORT(LIMTLVDS.OUT,LVDSLIMITS)}
.FUNC SKINAC(DCRES,RESISTIVITY,RELPERM,RADIUS) {((PI*RADIUS*RADIUS)/((PI*RADIUS*RADIUS)-PI*(RADIUS-SKINDEPTHAC(RESISTIVITY,RELPERM))**2))*DCRES}
.FUNC SKINDEPTHAC(RESISTIVITY,RELPERM) {503.3*(SQRT(RESISTIVITY/(RELPERM*F)))}
.FUNC SKINTR(DCRES,RESISTIVITY,RELPERM,RADIUS,FREQ) {((PI*RADIUS*RADIUS)/((PI*RADIUS*RADIUS)-PI*(RADIUS-SKINDEPTHTR(RESISTIVITY,RELPERM,FREQ))**2))*DCRES}
.FUNC SKINDEPTHTR(RESISTIVITY,RELPERM,FREQ) {503.3*(SQRT(RESISTIVITY/(RELPERM*FREQ)))}
C1 3 Vo 1u
C2 11 Vo1 1u
C3 Vg Prst 1n
C4 0 Vo2 100u
R3 Vd 3 10k
R19 6 Vg 50
R20 3 Vo 10Meg
R21 Vg 9 10k
R22 9 Vd 10k
R23 Vg 8 10k
R24 13 11 10k
R25 11 Vo1 10Meg
R26 Prst 0 10k
R27 Vo2 Vo3 10k
R28 Vo3 0 10k
S1 8 0 Voc 0 SW1
S2 Vo1 11 Prst 0 SW2
S3 17 Vo2 Prst 0 SW3
S4 Vo 3 Start 0 SW4
V1 VC 0 DC 5
V2 VE 0 DC -5
V3 6 0 DC 0 PULSE (0 5 0 5e-009 5e-009 0.005 0.01)
V5 Start 0 DC 0 PULSE (0 3 0 1e-008 1e-008 0.00999999 1)
X2 0 3 VE Vo VC OP_27
X3 8 9 VE Vd VC OP_27
X4 0 11 VE Vo1 VC OP_27
X5 Vg 13 AMP PARAMS: GAIN=-1
X6 Vo1 17 AMP PARAMS: GAIN=1
X7 Vo3 Vo1 Voc COMP PARAMS: VOH=5 VOL=0 GAIN=1000
*
.MODEL SW1 VSWITCH (ROFF=10MEG)
.MODEL SW2 VSWITCH (ROFF=10MEG)
.MODEL SW3 VSWITCH (ROFF=10MEG RON=0.01 VON=-4)
.MODEL SW4 VSWITCH (ROFF=10MEG)
*
*** From file D:\__Utiles\mc12cd\library\AMP.MAC
.SUBCKT AMP PinA PinB PARAMS: GAIN=1
E1 PINB 0 PINA 0 {GAIN}
RE1 PINA 0 1G;added by E1
.ENDS AMP
*
*** From file D:\__Utiles\mc12cd\library\COMP.MAC
.SUBCKT COMP Inp Inm Out PARAMS: VOH=15 VOL=-15 GAIN=1000
.PARAM VA={(VOH-VOL)/2}
.PARAM DC={(VOH+VOL)/2}
E1 Out 0 VALUE = {DC+VA*TANH(GAIN*(V(INP,INM)))}
R1 Inp 0 1e9
R2 Inm 0 1e9
.ENDS COMP
*
* OPAMP
* PINS: 1=NC+ 2=NC- 3=VEE 4=VO 5=VCC
.SUBCKT OP_27 1 2 3 4 5
IEE 10 3 8.401999999999999e-005
VS1 11 0 0
VC 5 16 1.800000000000001
VE 17 3 1.800000000000001
VLP 19 0 20
VLN 0 20 20
VS2 13 15 0
F1 13 14 POLY(5) VS1 VC VE VLP VLN 0 47746482.92756861 -47746482.92756861
+ 47746482.92756861 47746482.92756861 -47746482.92756861
E1 14 0 POLY(2) 5 0 3 0 0 0.5 0.5
H1 18 0 VS2 1000
GCM 0 12 10 0 7.557734198666343e-010
GA 12 0 6 7 0.001507964473723101
C1 6 7 8.660254037844386e-012
CE 10 14 1e-019
C2 12 13 3e-011
RC1 5 6 663.1455962162306
RC2 5 7 663.1455962162306
RE1 8 10 47.32264900962777
RE2 9 10 47.32264900962777
RE 10 14 2380385.622470841
RP 5 3 40036.65578262764
R2 12 11 100000
RO2 13 14 25
ROUTAC 15 4 50
D5 3 5 D
D3 4 16 D
D4 17 4 D
D1 18 19 D
D2 20 18 D
Q1 6 2 8 QINN
Q2 7 1 9 QINP
*
.MODEL D D ()
.MODEL QINN NPN (BF=2896.551724137931)
.MODEL QINP NPN (BF=7636.363636363636 IS=1e-016)
.ENDS OP_27
*
.OPTIONS ACCT LIST OPTS ABSTOL=1pA CHGTOL=.01pC DEFL=100u DEFW=100u DEFNRD=0
+ DEFNRS=0 DEFPD=0 DEFPS=0 DIGDRVF=2 DIGDRVZ=20K DIGERRDEFAULT=20 DIGERRLIMIT=0
+ DIGFREQ=10GHz DIGINITSTATE=0 DIGIOLVL=2 DIGMNTYMX=2 DIGMNTYSCALE=0.4 DIGOVRDRV=3
+ DIGTYMXSCALE=1.6 GMIN=1p ITL1=100 ITL2=50 ITL4=10 PIVREL=1m PIVTOL=.1p RELTOL=1m
+ TNOM=27 TRTOL=7 VNTOL=1u WIDTH=80
*
.LIB "D:\__Utiles\mc12cd\library\NOM.LIB"
*
.TEMP 27
*
.TRAN 0.00025 50m 0 10u UIC
.PLOT TRAN v([VG]) v([START]) -0.75,6.75
.PLOT TRAN v([VD]) -4,6
.PLOT TRAN v([VO]) -0.4,1.6
.PLOT TRAN v([PRST]) -5,7.5
.PLOT TRAN v([VO1]) v([VO3]) -1,4
.PLOT TRAN v([VOC]) -2,8
*
.PROBE
.END
Если частота и рабочий цикл известны, то да, это возможно путем реализации фиксированной постоянной времени для интегрирования, равной половине рабочего цикла, и триггера для изменения знака при достижении средней точки.
Если скважность не известна, то неважно, известна частота или нет, сделать это невозможно, так как это подразумевает заранее знать, когда менять знак интегрирования. Вам нужно будет определить среднюю точку, прежде чем даже узнать, каково полное значение рабочего цикла.
Если, OTOH, вы можете позволить себе задержку в один цикл, то вы можете сделать это, если у вас есть блок памяти: запуск по времени нарастания, запуск по времени спада, определение рабочего цикла, а затем использование этой информации для следующего треугольника.
И, если вы можете решить проблему, вы можете сначала создать треугольник, а затем вывести из него прямоугольную волну. Это даст вам то, что вы хотите, но я не знаю, применимо ли это к вашему делу.
Я бы подошел к этому как к PLL. Назовем прямоугольную волну и треугольная волна . Из этого будет сгенерирована окончательная «треугольная волна-пень».
Вы знаете, что правильный сдвиг для когда интеграл по абсолютному произведению этих двух становится минимальным:
Теперь, зная, что является периодическим, назовем период мы можем поместить «триггер» на нарастающий фронт, назвать это время 0 и просто интегрировать за один период. Мы просто останавливаем интегрирование на падающем периоде выборки:
Таким образом, построить это довольно просто: поскольку только включено или выключено, нет необходимости в множителе:
Минимум достигается, когда он равен 0, поэтому мы можем точно так же
Большой! Это означает, что нам нужно построить интегратор из операционного усилителя и конденсатора (доступны тысячи примеров схем) и подать нашу треугольную волну. Мы вводим это в схему выборки и удержания (тысячи цепей), запускаемую по заднему фронту сигнала. .
Если значение положительное, вы замедляете генератор генератора треугольных волн. Если он отрицательный, вы ускоряете его.
Треугольную волну можно сгенерировать многими способами, но проще всего (поскольку вам нужно что-то, что является ГУН) иметь гармонический, управляемый напряжением осциллятор, поданный в компаратор для создания прямоугольной волны с переменной частотой, а затем построить интегратор, чтобы преобразовать его в треугольную волну.
Отлично, теперь у вас есть синхронная треугольная волна, которая находится «в центре» вашей прямоугольной волны. периоды. Чтобы преобразовать его в свой пень треугольной волны, вам просто нужен однополупериодный выпрямитель (тысячи цепей).
Некоторые детали до сих пор не ясны, но похоже, что весь первый каскад операционного усилителя в исходной схеме может быть заменен формирователем импульсов с 1 или 2 затворами, что-то с небольшим гистерезисом. Отрегулируйте ширину импульса так, чтобы она равнялась 1/2 входного положительного полупериода прямоугольной волны, и вы получите 1/4 периода повышения и понижения на выходе интегратора.
ИЛИ
Вместо формирователя импульсов используйте контур фазовой автоподстройки частоты, работающий на удвоенной входной частоте. Генератор управляет каскадом интегратора, и теперь схема будет автоматически отслеживать изменения входной частоты. CMOS CD4046 может это сделать. Автоматическое отслеживание имеет свою цену — амплитуда треугольной волны меняется при изменении входной частоты (но пик треугольной формы остается в центре).
Антонио51
Тестирование Су
Антонио51
Тестирование Су
Антонио51