There's more than one way to do things PerlMonks

### Digitally Adjustable Multi-Stage Op-Amp Gain Calculator - It's the Simple Things in Perl you Appreciate

by perldigious (Curate)
 on Jun 12, 2017 at 15:10 UTC ( #1192602=CUFP: print w/replies, xml ) Need Help??

This isn't a complicated, glamorous, or earth-shattering bit of Perl code. Quite the opposite really, it's an overly simple problem to solve for Perl, but that's sort of the point. It's more or less an example of one of the little things I'm apt to use Perl for everyday. I had a relatively simple Electrical Engineering problem I had to solve that became tedious to resolve anytime I'd fiddle with my exact component choices. This is the type of thing I used to do with Mathcad when I actually had a license for the full version, but usually a combination of Perl and Excel can make up 90% or more of the same functionality with a bit of clever manipulation.

```use utf8;
use 5.022;
use strict;
use warnings;

my \$excitation_voltage = 5;          # excitation voltage for load cel
+l (volts)
+d cell full scale sensitivity (volts/volt)
my \$pot_taps1 = 128;                 # number of tap settings allowed
+by diff amp gain pots
my \$pot_taps2 = 128;                 # number of tap settings allowed
+by non-inverting amp gain pot
my \$desired_max_output = 4.8;        # maximum final output voltage de
+sired at full scale (volts), usually a limitation of the selected op
my \$allowed_output_deviation = 0.01; # how much deviation from \$desire
+d_max_output due to the limited number of pot settings is acceptable
+(e.g. 0.01 would be 1%)

my \$printf_format = "%8s%15s%12s%15s%15s%14s";
printf "\n\$printf_format\n\$printf_format\n\n", "Diff Amp", "Non-Inv Am
+p", "Diff Amp", "Non-Inv Amp", "Total", "Max Output", "Pot Set", "Pot
+ Set", "Gain", "Gain", "Gain", "Voltage";

my \$possible = 0;
foreach my \$gain1 (map { (\$pot_taps1-\$_)/\$_ } (1..\$pot_taps1/2))     #
+ for diff amp, only half of pot taps usable since gains less than 1 a
+re not allowed
{
foreach my \$gain2 (map { (\$pot_taps2-\$_)/\$_+1 } (1..\$pot_taps2)) #
+ for non-inverting amp
{
if ( abs(\$desired_max_output-\$gain1*\$gain2*\$excitation_voltage
+tion )
{
printf "\$printf_format\n", sprintf("%.0f", \$pot_taps1/(\$ga
+in1+1)),
sprintf("%.0f", \$pot_taps2/\$gai
+n2),
sprintf("%.3f", \$gain1),
sprintf("%.3f", \$gain2),
sprintf("%.3f", \$gain1*\$gain2),
sprintf("%.6f", \$excitation_vol
\$possible = 1;
}
}
}
say "\nNo combination of potentiometer settings meets your criteria.\n
+Try allowing for more \\$allowed_output_deviation\nand/or adjusting yo
+ur \\$desired_max_output." if (!\$possible);

Plus, doing these sorts of things in Perl keeps my coding ability from going completely stagnant during long dry spells of an actual Perl project of any complexity. :-)

Just another Perl hooker - Yep, I've definitely seen more than my share of d*cks in the world, that's for sure.
• Comment on Digitally Adjustable Multi-Stage Op-Amp Gain Calculator - It's the Simple Things in Perl you Appreciate

Create A New User
Node Status?
node history
Node Type: CUFP [id://1192602]
Front-paged by Discipulus
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (4)
As of 2018-07-22 18:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
It has been suggested to rename Perl 6 in order to boost its marketing potential. Which name would you prefer?

Results (455 votes). Check out past polls.

Notices?