You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.7 KiB
105 lines
2.7 KiB
7 years ago
|
#!/usr/bin/env python
|
||
|
# coding: utf8
|
||
|
|
||
|
NOMINALS = [
|
||
|
1000000.0,
|
||
|
750000.0,
|
||
|
470000.0,
|
||
|
220000.0,
|
||
|
75000.0,
|
||
|
47000.0,
|
||
|
22000.0,
|
||
|
10000.0,
|
||
|
6800.0,
|
||
|
2200.0,
|
||
|
1000.0,
|
||
|
750.0,
|
||
|
470.0,
|
||
|
220.0,
|
||
|
100.0,
|
||
|
47.0,
|
||
|
22.0,
|
||
|
10.0
|
||
|
]
|
||
|
|
||
|
|
||
|
def format_value(value, suffix=''):
|
||
|
order_suffix = ''
|
||
|
divider = 1.0
|
||
|
|
||
|
orders = [
|
||
|
[1000000000.0, 'G'],
|
||
|
[1000000.0, 'M'],
|
||
|
[1000.0, 'k'],
|
||
|
[1.0, ''],
|
||
|
[0.001, 'm'],
|
||
|
[0.000001, u'\u00b5'],
|
||
|
[0.000000001, u'n'],
|
||
|
[0.000000000001, u'p'],
|
||
|
]
|
||
|
|
||
|
for suggested_divider, suggested_order_suffix in orders:
|
||
|
if value >= suggested_divider:
|
||
|
divider = suggested_divider
|
||
|
order_suffix = suggested_order_suffix
|
||
|
break
|
||
|
|
||
|
mag_value = value / divider
|
||
|
mag_value = int(mag_value * 1000)
|
||
|
mod = mag_value % 1000
|
||
|
if mod == 0:
|
||
|
return "%i%s%s" % (mag_value / 1000.0, order_suffix, suffix)
|
||
|
elif mod % 100 == 0:
|
||
|
return "%.1f%s%s" % (mag_value / 1000.0, order_suffix, suffix)
|
||
|
elif mod % 10 == 0:
|
||
|
return "%.2f%s%s" % (mag_value / 1000.0, order_suffix, suffix)
|
||
|
return "%.3f%s%s" % (mag_value / 1000.0, order_suffix, suffix)
|
||
|
|
||
|
def choose_resistors(v_in, v_out, limits='both'):
|
||
|
if v_in <= v_out:
|
||
|
raise Exception("Vin should be greater than Vout")
|
||
|
v_in = float(v_in)
|
||
|
v_out = float(v_out)
|
||
|
best_r1 = None
|
||
|
best_r2 = None
|
||
|
best_v_out = None
|
||
|
|
||
|
for r1 in NOMINALS:
|
||
|
for r2 in NOMINALS:
|
||
|
tmp_v_out = float(v_in * r2) / (r1 + r2)
|
||
|
choose_this_pair = best_v_out is None
|
||
|
|
||
|
if limits == 'both':
|
||
|
choose_this_pair = choose_this_pair or abs(tmp_v_out - v_out) < abs(best_v_out - v_out)
|
||
|
elif limits == 'upper':
|
||
|
choose_this_pair = choose_this_pair or v_out <= tmp_v_out < best_v_out or best_v_out < v_out
|
||
|
elif limits == 'lower':
|
||
|
choose_this_pair = choose_this_pair or best_v_out < tmp_v_out <= v_out or best_v_out > v_out
|
||
|
|
||
|
if choose_this_pair:
|
||
|
best_r1 = r1
|
||
|
best_r2 = r2
|
||
|
best_v_out = tmp_v_out
|
||
|
|
||
|
print u"R1 %s\nR2 %s\nVout %s\nDissipation %s\nFactor %f" % (
|
||
|
format_value(best_r1, u'Ω'),
|
||
|
format_value(best_r2, u'Ω'),
|
||
|
format_value(best_v_out, 'V'),
|
||
|
format_value(v_in * v_in / best_r1, 'W'),
|
||
|
best_r2 / (best_r1 + best_r2)
|
||
|
)
|
||
|
|
||
|
|
||
|
def main():
|
||
|
print "\nPower supply UVLO divider"
|
||
|
choose_resistors(30, 1.3, 'upper')
|
||
|
|
||
|
print "\nPower supply feedback divider"
|
||
|
choose_resistors(5, 1.225, 'lower')
|
||
|
|
||
|
print "\nUnidirectional sensor"
|
||
|
choose_resistors(5.1, 3.3, 'lower')
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|