Skip to content

Instantly share code, notes, and snippets.

@mamemomonga
Last active December 8, 2022 01:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mamemomonga/5c360f38532168e891b0b2343e53215d to your computer and use it in GitHub Desktop.
Save mamemomonga/5c360f38532168e891b0b2343e53215d to your computer and use it in GitHub Desktop.
NJM11100 抵抗コンビ電卓
#!/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