User Tools

Site Tools


volumecontrol

Table of Contents

Regulacja głośności

Do regulowania głośności zwykle używa się potencjometru logarytmicznego, ale wg. strony http://sound.westhost.com/project01.htm potencjometry logarytmiczne składają się tak naprawdę z dwóch różnych obszarów liniowych. Ta sama strona proponuje użycie potencjometru liniowego z bocznikiem między masą a ślizgaczem. Chciałem sprawdzić jak inne wartości bocznika będą wpływały na charakterystykę tłumienia i napisałem do tego prosty skrypt w pythonie. Schemat regulacji głośności jest poniżej.

Schemat zastępczy zbocznikowanego potencjometru

Wyniki

Tłumienie w funkcji pozycji ślizgacza opisuje równanie: $f(w) = \frac{R_b w}{R_b - R_p w^{2} + R_p w}$. Gdzie $R_b$ to rezystancja bocznika, a $R_p$ rezystancja potencjometru. w to pozycja ślizgacza i 0 oznacza położenie maksymalnie w lewo, a 1 maksymalnie w prawo.

Wykres poniżej prezentuje tłumienie z różnymi wartościami $R_b$.

Tłumienie w funkcji pozycji ślizgacza dla różnych testowanych wartości bocznika

Kod

volumecontrol.py
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
 
# Rp - rezystancja potencjometru, Rb - rezystancja bocznika,
# w - pozycja ślizgacza
Rp, Rb, w = sp.symbols('Rp, Rb, w')
 
# Rezystor Rb jest bocznikiem pomiędzy masą a ślizgaczem
# potencjometru. Napięcie wejściowe doprowadzane jest między końcami
# potencjometru, a napięcie wyjściowe to napięcie na boczniku.
 
R1 = Rp * (1 - w)
R2 = Rp * w * Rb / (Rp * w + Rb)          # (Rp * w) równolegle z Rb
 
# Uin przyjmuje jako 1 więc równanie napięcia wyjściowego to po prostu
# równanie dzielnika napięcia.
Uout = R2 / (R1 + R2)
print(sp.latex(sp.simplify(Uout)))
 
# testowane wartości bocznika
shunts = [(4.7e3, 'y--'), (6.8e3, 'k--'), (10e3, 'r'),
          (15e3, 'b'), (22e3, 'g'), (33e3, 'c')]
 
ww = np.linspace(0, 1, 100)
plot = []
for b in shunts:
    f = sp.lambdify(w, Uout.subs({Rp: 100e3, Rb: b[0]}))
    plot += [ww, f(ww), b[1]]
 
plot += [ww, ww, 'm']     # bez bocznika
 
plt.semilogy(*plot)
y = np.arange(0, -40, -3)
yticks = 10 ** (y / 20)
plt.yticks(yticks, y)
plt.xticks(np.arange(0, 1.1, 0.1))
plt.ylim(yticks[-1])
plt.grid(True)
legend = ["Rb = {:.1f}k".format(x[0] / 1e3) for x in  shunts] + ['bez bocznika']
plt.legend(legend, loc='best')
plt.title('Tłumienie sygnału przez potencjometr z bocznikiem')
plt.xlabel('Pozycja ślizgacza [-]')
plt.ylabel('Tłumienie [db]')
plt.show()
volumecontrol.txt · Last modified: 2016/03/10 21:21 by dominik