Amplitude Modulator

18.1 Amplitude Modulator

Design steps from Handbook of Operatinal Amplifier Circuit Design, by David F. Stout and Milton Kaufman editor.

The modulator is based on four CD4016 switches that chop the waveform at the carrier frequency. The reference designators corespond to figure 18.1. The carrier frequency is applied to the Vc terminal. The modulation input is applied to Vm.

In [1]:
# use math library
from math import *

Step 1: Choose a comparitor, switches and op amps which will utilize the same supply voltages. The supply voltage must be at least 2 volts higher the the positive peak expected at Vo. In stead of using an LM339 to generate the complement of the carrier, a CD4069 will be used in the actual circuit. A CD4066 will be used in place of a CD4016. The op amp will be a LM324, which is a general purpose quad op amp.

Step 2: Choose R1 to be greater than or equal to the minimum allowed inut resistance at Vm. In the reference design, Rin = 10k

In [2]:
R1 = 10e3

Step 3: Choose a range of values for Vr which is slightly larger than the expected positive and negative peaks of Vm. Set Vp and Vn equal to the limits of this range.

In [3]:
Vp = 5
Vn = -5

Step 4: calculate R3 and R4

In [4]:
R3 = R1
R4 = R1
# display resistor values
print('R1 = {:.0f}'.format(R1))
print('R3 = {:.0f}'.format(R3))
print('R4 = {:.0f}'.format(R4))
R1 = 10000
R3 = 10000
R4 = 10000

Step 5: Calculate R2

In [5]:
Vr = 5  #reference voltage used to adjust modulation depth
vm = 2 #modulation input voltage
R2a = R1*(Vp-2)/abs(vm)
R2b = R3*(Vp-2)/abs(Vr)
# display resistor values
print('R2a = {:.0f}'.format(R2a))
print('R2b = {:.0f}'.format(R2b))
R2a = 15000
R2b = 6000
In [6]:
# set R2 to a value lower than R2a or R2b
R2 = 5e3
print('R2 = {:.0f}'.format(R2))
R2 = 5000

Step 6: Use CMOS switch specification to determine Ron and Roff. Then caluclate R6 through R11

In [7]:
Ron = 580
Roff = 4e8
R6 = sqrt(Ron*Roff)
R7 = R6
R8 = R6
R9 = R6
R10 = R6
R11 = R6
print('R6 = {:.0f}'.format(R6))
R6 = 481664

Step 7: Calculate R12

In [8]:
vo = 3   #circuit out put vaveform
R12 = (4*R6*R1*vo)/(3*R2*vm)
print('R12 = {:.0f}'.format(R12))
R12 = 1926655
In [9]:
#calculate the DC offset due to A4 bias current
Ib4 = 500e-9  #bias current on op amp A4
vo = Ib4*R12
print('vo = {:.3f}'.format(vo))
vo = 0.963

If the out put offset voltage is too high, adjust R12

In [10]:
R12 = R12/10.0
R6 = R6/10
R7 = R6
R8 = R6
R9 = R6
R10 = R6
R11 = R6
print('R6 = {:.0f}'.format(R6))
print('R12 = {:.0f}'.format(R12))
R6 = 48166
R12 = 192666
In [11]:
#use standard resistor values
R12 = 193e3
R6 = 48e3
R7 = R6
R8 = R6
R9 = R6
R10 = R6
R11 = R6
print('R6 = {:.0f}'.format(R6))
print('R12 = {:.0f}'.format(R12))
R6 = 48000
R12 = 193000

Step 8: recalculate vo with new resistor values

In [12]:
von = (-R2*R9*R12)/(R10*(R6+R8))*(vm/R1+vm/(2.0*R3))
vop = (R2*R12)/(R7+R11)*(vm/R1+vm/(2.0*R3))
print('vop = {:.3f}'.format(vop))
print('von = {:.3f}'.format(von))
vop = 3.016
von = -3.016

Step 9: peak to peak output voltage is calculated using switch resistance

In [13]:
voe = (R2*R12*Roff)/((R6+Ron)*(R6+Roff)+R6*Roff)*((vm/R1)+(vm/(2*R3)))
print('voe = {:.3f}'.format(voe))
voe = 2.997
In [ ]: