OpAmp Oscillator Design with the HP67 Programmable Calculator
November 26, 2008
This is my second HP67 program, which I wrote to help me with the design of a project that is currently (Nov. 2008) in the planning stages. This program selects component values for an opamp based relaxation oscillator, given the desired frequency and output wave form peak voltages. It can also solve the inverse problem, finding the frequency and voltages resulting from given component values. The following is the schematic for such an oscillator:
R_{1} and R_{2} form a voltage divider, with an additional input from the opamp output through R_{3}. When the opamp output is at a highlevel, the voltage at the noninverting input of the opamp is higher than when the opamp output is at a low level. When the output is high, capacitor C_{1} also charges through R_{4} until the voltage across it (which is applied to the opamp’s inverting input) reaches the voltage at the noninverting input. At that time, the opamp output goes low, and the capacitor begins to discharge through R_{4} until the voltage once again reaches the (now lower) voltage at the noninverting input.
If one were to monitor the opamp output, it would alternate between a high level (V_{OH}, generally close to positive supply voltage, V_{POS}) and a low level (V_{OL}, generally close to negative supply voltage, V_{NEG}). The duty cycle of this square wave depends on the relative time it takes to charge and discharge C_{1} through R_{4}, which in turn depends on the low (V_{PL}) and high (V_{PH}) peak voltages that C_{1} cycles between (which in turn depend on R_{1}, R_{2}, and R_{3}). Monitoring the voltage across C_{1} shows a triangle wave.
With this program, you can select components for such an oscillator to achieve a desired frequency, and if it matters to your design, desired low and high triangle peaks (V_{PL} and V_{PH}). After the program computes the required component values, you can modify these values to match those actually available in the real world. The program will then compute what effect these changes have on the frequency and triangle peak voltages.
The following equations describe the operation of the oscillator:
You will first need to choose values for C_{1} and R_{1} arbitrarily, since for any desired frequency and given C_{1} and R_{1}, it will be possible to find (possibly impractical) values for R_{2}, R_{3}, and R_{4}. A good choice for R_{1} is generally somewhere around 10kΩ to 100kΩ. The choice of C_{1} depends on the frequency, and a readily available value near (50/f) μF is usually suitable.
Using the Program
First type in the program and save it, or read it from a previously recorded magnetic card. The card should be labelled as follows:
OPAMP OSCILLATOR DESIGN  

V_{NEG},V_{POS}  V_{OL},V_{OH}  C_{1}  R_{1}  V_{PL},V_{PH} 
f  →%DC  →R_{2}→  →R_{3}→  →R_{4}→ 
Forward Solution: Finding R_{2}, R_{3}, and R_{4}
Consider the following example: It is desired to find values for R_{2}, R_{3}, and R_{4} to produce an oscillator of about 2500Hz, with a triangle waveform that oscillates between 1.2V and 1.4V. The opamp is to operate from a single 5V supply, and the opamp’s output is capable of a low of 0.3V and a high of 5V. Use a 0.022μF capacitor for C_{1}, and a 22kΩ resistor for R_{1}.
Follow these steps to solve the problem:
Description  Keystrokes  Display 

Select engineering notation  h ENG DSP 2 
0.00 00 
Enter power supply voltages  0 ENTER 5 f a 
0.00 00 
Enter low and high level output voltages  0.3 ENTER 5 f b 
300. 03 
Enter C_{1} (Farads)  0.022 EEx CHS 6 f c 
22.0 09 
Enter R_{1} (Ohms)  22 EEx 3 f d 
22.0 03 
Enter desired triangle lower and upper voltage peaks  1.2 ENTER 1.4 f e 
1.20 00 
Enter desired frequency (Hz)  2500 A 
2.50 03 
Compute square wave duty cycle  B  788. 03 
Compute value of R_{2} (Ohms)  C  7.26 03 
Compute value of R_{3} (Ohms)  D  123. 03 
Compute value of R_{4} (Ohms)  E  71.4 03 
Notes
Specifying V_{OL} and V_{OH} is optional. If this step is omitted, the program will assume the opamp output can span the entire negative and positive supply voltage range.
If the triangle wave form peak voltages don’t matter to your design (because you’re only using the square wave output), you don’t need to specify them. The program will assume peak voltages ranging from V_{OL}+(V_{OH}–V_{OL})/3 to V_{OH}(V_{OH}–V_{OL})/3, which is the middle third of the opamp output voltage range. This also happens to result in a 50% duty cycle.
To achive a low duty cycle square wave, choose V_{PL} and V_{PH} close to the bottom of the opamp output range (V_{OL}). Likewise for a high duty cycle, choose V_{PL} and V_{PH} close to the top of the range (V_{OH}).
For the most stable oscillation frequency, choose V_{PL} and V_{PH} far away from the opamp output voltage limits, V_{OL} and V_{OH} (to keep the triangle edges steep), and far away from each other (to keep any variations a small percentage of the overall voltage swing). Since these two goals are at odds with one another, a good compromise is to select V_{PL} and V_{PH} to span the middle of the V_{OL} to V_{OH} range (which is the default if V_{PL} and V_{PH} aren’t specified).
Reverse Solution: Finding V_{PL}, V_{PH}, Frequency, and Duty Cycle
After finding the above ideal solution, we’ll want to use realworld component values to build the physical circuit. The closest E24 resistor values to those computed are: R_{2} = 7.5kΩ, R_{3} = 120kΩ, and R_{4} = 68kΩ. What effect will using these values have on the frequency, V_{PL}, and V_{PH}?
These are the steps to find out:
Description  Keystrokes  Display 

Enter new value for R_{2}  7.5 EEx 3 C 
7.50 03 
Enter new value for R_{3}  120 EEx 3 D 
120. 03 
Enter new value for R_{4}  68 EEx 3 E 
68.0 03 
Compute resulting value for V_{PL}  f e  1.23 00 
Compute resulting value for V_{PH}  R/S  1.44 00 
Compute resulting frequency  A  2.57 03 
Other Uses for this Program
The oscillator design facilitated by this program consists of two parts, a comparator with hysteresis, and a capacitor being charged and discharged by the comparator output through a resistor. The equations describing the comparator aspect of the circuit are not affected by those describing the behaviour of the resistorcapacitor network, so the program can be used to design such comparators for other applications.
Here is a brief example of using this program to design a comparator: Assume we want to design a comparator operating from a +/12V supply, whose output goes low when the voltage exceeds +2V, and goes high when the voltage subsequently drops below 3V. Assume the op amp used has an output that can swing to within 0.7V of the voltage limits. Use a 10kΩ resistor for R_{1}. Follow these steps to solve the problem:
Description  Keystrokes  Display 

Enter power supply voltages  12 CHS ENTER 12 f a 
12.0 00 
Enter low and high level output voltages  11.3 CHS ENTER 11.3 f b 
11.3 00 
Enter R_{1}  10 EEx 3 f d 
10.0 03 
Enter desired lower and upper switching points  3 CHS ENTER 2 f e 
3.00 00 
Compute value of R_{2}  C  8.98 03 
Compute value of R_{3}  D  16.7 03 
Now select the closest realworld resistor values for R_{2} and R_{3} and determine how that affects the switching points:
Description  Keystrokes  Display 

Enter new value for R_{2}  9.1 EEx 3 C 
9.10 03 
Enter new value for R_{3}  16 EEx 3 D 
16.0 03 
Compute resulting lower switching point  f e  3.03 00 
Compute resulting upper switching point  R/S  2.16 00 
Additional RealWorld Considerations
The mathematical model used as the basis of this program assumes that V_{OL} and V_{OH} are constant, regardless of load. For sufficiently low current, this is close enough to true to be ignored. Thus it is important to use fairly high resistor values for R_{3} and R_{4} (10kΩ or bigger to be on the safe side). If the value of R_{3} computed by the program is too low, start with a higher value for R_{1}. Similarly, if the value computed for R_{4} is too low, use a lower value for C_{1}.
Some opamps have an opencollector output. This means that when the output is low, it is pulled low through an output transistor, but when the output is high, it is simply floating. Thus, a pullup resistor is needed to pull the output high. The chosen pullup resistor must meet two requirements:

It must have a highenough resistance that the output transistor can overcome the pullup current when the output is low.

It must have a lowenough resistance that it is not so large a percentage of the resistance of R_{3} or R_{4} that it throws off the solution.
For the LM339 comparator that I often use in my designs, I’ve found that a 1kΩ resistor works well, together with R_{3} and R_{4} values about 100 times as much. As described above, use a higher value for R_{1} to achieve a higher value for R_{3}, and use a lower value for C_{1} to achieve a higher R_{4}.
Program Listing
Line  Instruction  Comments 

001♦  LBL a  Store V_{NEG} and V_{POS} 
002  STO 6  V_{POS} 
003  x↔y  
004  STO 5  V_{NEG} 
005  x↔y  Fall through and initialize V_{OL} and V_{OH} to V_{NEG} and V_{POS} 
006♦  LBL b  Store V_{OL} and V_{OH} 
007  CF 3  
008  STO 8  V_{OH} 
009  x↔y  
010  STO 7  V_{OL} 
011  −  Initialize V_{PL} and V_{PH} 
012  3  
013  ÷  (V_{OH}–V_{OL})/3 
014  RCL 7  
015  x↔y  
016  +  
017  STO A  Set V_{PL} = V_{OL} + (V_{OH}–V_{OL})/3 
018  RCL 8  
019  LSTx  
020  −  
021  STO B  Set V_{PH} = V_{OH} – (V_{OH}–V_{OL})/3 
022  CF 1  
023  RCL 8  Leave V_{OL} and V_{PH} on stack as feedback to user 
024  RCL 7  
025  RTN  
026♦  LBL c  Store C_{1} 
027  CF 3  
028  STO C  
029  RTN  
030♦  LBL d  Store R_{1} 
031  CF 3  
032  STO 1  
033  RTN  
034♦  LBL e  Store or compute (if necessary) V_{PL} and V_{PH} 
035  F? 3  If data entered, store new V_{PL} and V_{PH} 
036  GTO 9  
037♦  LBL 1  Otherwise, compute V_{PL} and V_{PH} if necessary 
038  F? 1  Need to compute V_{PL} and V_{PH}? 
039  GTO 8  
040  RCL B  Recall alreadyuptodate V_{PL} and V_{PH} 
041  RCL A  
042  RTN  
043  RCL B  If user presses R/S after seeing V_{PL}, display V_{PH} 
044  RTN  
045♦  LBL 8  Recompute V_{PL} and V_{PH} 
046  RCL 1  
047  RCL 3  
048  ×  
049  STO D  
050  RCL 2  
051  RCL 3  
052  ×  
053  ST I  
054  +  
055  RCL 2  
056  RCL 1  
057  ×  
058  STO 9  
059  +  
060  1/x  
061  STO E  
062  RCL 5  
063  ×  
064  RCL D  
065  ×  
066  RCL E  
067  RCL 6  
068  ×  
069  RC I  
070  ×  
071  +  
072  STO D  Partial result common to V_{PL} and V_{PH} 
073  RCL E  
074  RCL 9  
075  ×  
076  STO E  End of computation common to V_{PL} and V_{PH} 
077  RCL 7  Compute V_{PL} 
078  ×  
079  +  End of computation of V_{PL} 
080  RCL E  Compute V_{PH} 
081  RCL 8  
082  ×  
083  RCL D  
084  +  End of computation of V_{PH}; V_{PL} is in Yregister 
085♦  LBL 9  Store entered or computed V_{PH} and V_{PL} 
086  STO B  Store V_{PH} 
087  x↔y  
088  STO A  Store V_{PL} 
089  CF 1  V_{PL} and V_{PH} are now up to date 
090  RTN  
091  RCL B  If user presses R/S after seeing V_{PL}, display V_{PH} 
092  RTN  
093♦  LBL B  Compute duty cycle 
094  CF 3  
095  GSB 7  Get numerator and denominator (also used for computing R_{4} or f) 
096  LSTx  Numerator 
097  x↔y  
098  ÷  
099  RTN  
100♦  LBL 7  Compute denominator of duty cycle, leaving numerator in LSTx 
101  GSB 1  Recompute V_{PL} and V_{PH} if necessary; leaves V_{PH} in X, V_{PL} in Y 
102  RCL 8  Compute first half of denominator 
103  −  
104  RCL B  
105  RCL 8  
106  −  
107  ÷  
108  LN  
109  RCL B  Compute second half of denominator (which is also the numerator) 
110  RCL 7  
111  −  
112  RCL A  
113  RCL 7  
114  −  
115  ÷  
116  LN  
117  +  Combine two halves, leaving numerator in LSTx 
118  RTN  
119♦  LBL A  Store or compute f 
120  F? 3  
121  GTO 0  
122  GSB 7  Get denominator (also used for computing R_{4} and duty cycle) 
123  RCL 4  Multiply by R_{4} and C_{1} 
124  ×  
125  RCL C  
126  ×  
127  1/x  
128♦  LBL 0  Store entered or computed f 
129  STO 0  
130  RTN  
131♦  LBL C  Store or compute R_{2} 
132  F? 3  
133  GTO 2  
134  GSB 5  Compute numerator of R_{2} 
135  RCL 6  Compute denominator of R_{2} 
136  GSB 6  
137  ÷  
138  STO 2  Store computed R_{2} 
139  RTN  
140♦  LBL 2  Store R_{2} and invalidate V_{PL} and V_{PH} 
141  STO 2  
142  SF 1  Must recompute V_{PL} and V_{PH} for userdefined R_{2} 
143  RTN  
144♦  LBL D  Store or compute R_{3} 
145  F? 3  
146  GTO 3  
147  GSB 5  Compute numerator of R_{3} (same as R_{2}) 
148  RCL 6  Compute denominator of R_{3} 
149  RCL 5  
150  −  
151  ÷  
152  RCL A  
153  RCL B  
154  −  
155  ÷  
156  STO 3  Store computed R_{3} 
157  RTN  
158♦  LBL 3  Store R_{3} and invalidate V_{PL}h and V_{PH} 
159  STO 3  
160  SF 1  Must recompute V_{PL} and V_{PH} for userdefined R_{3} 
161  RTN  
162♦  LBL E  Store or compute R_{4} 
163  F? 3  
164  GTO 4  
165  GSB 7  Get denominator (also used for computing f or duty cycle) 
166  RCL 0  
167  ×  
168  RCL C  
169  ×  
170  1/x  
171♦  LBL 4  Store entered or computed R_{4} 
172  STO 4  
173  RTN  
174♦  LBL 5  Compute numerator common to R_{2} and R_{3} 
175  GSB 1  Recompute V_{PL} and V_{PH} if necessary 
176  RCL 5  
177  GSB 6  
178  RCL 1  
179  ×  
180  CHS  
181  RTN  
182♦  LBL 6  Compute (V_{OL} – V_{PL} – V_{OH} + V_{PH}) * X + V_{OH} * V_{PL} – V_{PH} * V_{OL} 
183  RCL 7  
184  RCL A  
185  −  
186  RCL 8  
187  −  
188  RCL B  
189  +  
190  ×  Multiply (V_{OL} – V_{PL} – V_{OH} + V_{PH}) by V_{POS} or V_{NEG} (now in Y) 
191  RCL 8  
192  RCL A  
193  ×  
194  +  
195  RCL B  
196  RCL 7  
197  ×  
198  −  
199  RTN 
Registers and Flags
Register  Use 

0  Frequency (Hz) 
1,2,3,4  Resistors R_{1}, R_{2}, R_{3}, and R_{4} (Ohms) 
5,6  V_{NEG} and V_{POS} (Volts) 
7,8  V_{OL} and V_{OH} (Volts) 
A,B  V_{PL} and V_{PH} (Volts) 
C  Capacitor C_{1} (Farads) 
9,D,E,I  Temporary registers 
Flag  Meaning 

1  V_{PL} and V_{PH} need to be recomputed 
3  User supplied input 
Revision History
2008Nov26 — Initial release.
2009May25 — Fixed a bug that caused an error if one did not specify V_{PL} and V_{PH}. Changing R_{1} no longer forces V_{PL} and V_{PH} to be recomputed.
2009Jun11 — Fixed a bug where the data entry flag sometimes wasn’t cleared even though there had been no data entry.
2015Jun23 — Fixed a bug in the subroutine for computing the denominator of the duty cycle, wherein V_{PL} and V_{PH} were accidentally interchanged. Bug was in website listing only, not in original program.
Related Articles
If you've found this article useful, you may also be interested in:
 OpAmp Gain and Offset Design with the HP41C Programmable Calculator
 OpAmp Oscillator Design with the HP41C Programmable Calculator
 LowSensitivity SallenKey Filter Design with the HP41C Programmable Calculator
 LowSensitivity SallenKey Filter Design with the HP67 Programmable Calculator
 OpAmp Gain and Offset Design with the HP67 Programmable Calculator
 Resistor Network Solver for the HP67 Programmable Calculator
 A Matrix MultiTool for the HP 35s Programmable Calculator
 Curve Fitting for the HP 35s Programmable Calculator
Buy Stefan a coffee! If you've found this article
useful, consider
leaving a donation to help support
stefanv.com
Disclaimer: Although every effort has been made to ensure accuracy and reliability, the information on this web page is presented without warranty of any kind, and Stefan Vorkoetter assumes no liability for direct or consequential damages caused by its use. It is up to you, the reader, to determine the suitability of, and assume responsibility for, the use of this information. Links to Amazon.com merchandise are provided in association with Amazon.com. Links to eBay searches are provided in association with the eBay partner network.
Copyright: All materials on this web site, including the text, images, and markup, are Copyright © 2023 by Stefan Vorkoetter unless otherwise noted. All rights reserved. Unauthorized duplication prohibited. You may link to this site or pages within it, but you may not link directly to images on this site, and you may not copy any material from this site to another web site or other publication without express written permission. You may make copies for your own personal use.
Willy Kunz
May 16, 2013
The program as shown in the listing gives wrong answers for duty cycle and resistor R4. To fix it:
Step 109: change RCL A to RCL B
Step 112: change RCL B to RCL A
Step 116: insert x↔y after LN
With these changes, the duty cycle is shown as 212.03 which is equivalent to 788.03 (=10.212).