NJM11100 抵抗コンビ電卓
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# ----------------- | |
use strict; | |
use warnings; | |
use feature qw(say); | |
use Data::Dumper; | |
# NJM11100F1 | |
# NMD(JRC) https://www.nisshinbo-microdevices.co.jp/ja/products/ldo-linear-regulator/spec/?product=njm11100 | |
# 秋月電子 https://akizukidenshi.com/catalog/g/gI-06655/ | |
# ターゲット電圧 | |
my $targetVolt=10; | |
# 対象の抵抗値の定義 | |
# E24 | |
# 1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0 | |
# 3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1 | |
my @res=( | |
220, # 220 | |
300, # 300 | |
470, # 470 | |
10, # 10 | |
100, # 100 | |
1 * 1000, # 1K | |
47 * 1000, # 47K | |
10 * 1000, # 10K | |
100 * 1000, # 100K | |
1 * 1000 * 1000, # 1M | |
); | |
sub getVout { | |
my($r1,$r2)=@_; | |
# Vout = Vref x (R1 + R2) / R1 | |
my $vout = 1.25 * ($r1 + $r2) / $r1; | |
return {r1 => $r1, r2 => $r2, vout => $vout}; | |
} | |
sub getR2 { | |
my($vout,$r1)=@_; | |
# R2 = Vout * R1 / 1.25 - R1 | |
my $r2 = ($vout * $r1) / 1.25 - $r1; | |
return {r1 => $r1, r2 => $r2, vout => $vout}; | |
} | |
sub disp { | |
my $r=shift; | |
printf("R1: %d / R2: %d / vout: %f\n", $r->{r1}, $r->{r2}, $r->{vout}); | |
} | |
sub combi_res { | |
my @r=(); | |
foreach(@res) { | |
push @r,[$_,[$_],0]; # 単体 | |
} | |
foreach my $r1(@res) { | |
foreach my $r2(@res) { | |
push @r,[$r1+$r2,[$r1,$r2],1]; # 直列2連 | |
push @r,[($r1*$r2)/($r1+$r2),[$r1,$r2],2]; # 並列2連 | |
} | |
} | |
return @r; | |
} | |
sub offset { | |
my ($r1,$r2)=@_; | |
if($r1 == $r2) { | |
return 0; | |
} elsif ($r2 > $r1) { | |
return (1-($r1/$r2))*100; | |
} else { | |
return -(1-($r2/$r1))*100; | |
} | |
} | |
sub combi_text { | |
my $rc=shift; | |
my ($rcn,$rct); | |
if($rc->[2] == 0) { | |
$rct="単一"; | |
} elsif($rc->[2] == 1) { | |
$rct="直列"; | |
} elsif($rc->[2] == 2) { | |
$rct="並列"; | |
} | |
if($#{$rc->[1]} == 0) { | |
$rcn = "$rct: ".kmg($rc->[1]->[0]); | |
} else { | |
$rcn = "$rct: ".kmg($rc->[1]->[0]).' + '.kmg($rc->[1]->[1]); | |
} | |
return sprintf("%2.4f %s",$rc->[0],$rcn); | |
} | |
sub kmg { | |
my $num=shift; | |
if($num=~s/000000$//) { | |
$num.="M"; | |
} elsif($num=~s/000$//) { | |
$num.="K"; | |
} | |
return $num; | |
} | |
# -------------------------------------------- | |
my @rcb = combi_res(); | |
say "------------------------"; | |
say "NJM11100 組み合わせ電卓"; | |
say " 目標電圧: $targetVolt V"; | |
say "------------------------"; | |
my %datas=(); | |
foreach my $rc1(@rcb) { | |
# R1は1kΩ~120kΩ | |
next if($rc1->[0] < 1000); # 1k以上 | |
next if($rc1->[0] > 12000); # 120k未満 | |
my $rv=getR2($targetVolt,$rc1->[0]); | |
foreach my $rc2(@rcb) { | |
my $vo=getVout($rc1->[0],$rc2->[0])->{vout}; | |
my $ofs=offset($targetVolt,$vo); | |
$datas{abs($ofs)}=[$rv,$rc1,$rc2,$ofs,$vo]; | |
} | |
} | |
my $ct=0; | |
foreach my $ofs(sort keys %datas) { | |
$ct++; | |
my ($rv,$rc1,$rc2,$offset,$vo)=( | |
$datas{$ofs}->[0], | |
$datas{$ofs}->[1], | |
$datas{$ofs}->[2], | |
$datas{$ofs}->[3], | |
$datas{$ofs}->[4], | |
); | |
# printf("目標 Vout: %2.4f / R1: %2.4f / R2: %2.4f\n",$rv->{vout},$rv->{r1},$rv->{r2}); | |
printf("[%d] 誤差: %2.4f%%\n",$ct, $offset); | |
printf("結果 Vout: %2.4f / R1: %2.4f / R2: %2.4f\n",$vo,$rc1->[0],$rc2->[0]); | |
printf(" R1組み合わせ: %s\n",combi_text($rc1)); | |
printf(" R2組み合わせ: %s\n",combi_text($rc2)); | |
say "--------------------"; | |
last if($ct>5); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment