Sida 1 av 1

Efterlikna logaritmisk pot

Postat: 4 maj 2018, 10:28:08
av Wedge
Karaktäristiken för en logaritmisk potentiometer verkar inte vara speciellt logaritmisk. Det verkar snarare som om det är mer vanligt med styckvis linjära segment.
Och det fungerar ju för de flesta antar jag, så jag gissar att den exakta kurvan inte är så extremt viktig. Ganska plan i början, och brant i slutet räcker?
Jag tänkte ta en linjär pot, A/D-omvandla, normera och transformera värdet till en skalfaktor för digital mixning av ljudsamples.
0-FSR -> 0.0-1.0 -> f(x)
Om transformeringsfunktionen är x^3 blir koden blixtsnabb (FPU), och x^3 är hyfsat likt många potentiometerkurvor man kan googla fram. 12.5% utsignal vid potentiometerns mittläge.

Rätt tänkt, eller knas?

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 10:40:46
av guckrum
Vad är anledningen till att det måste gå snabbt att generera en skalfaktor, snurras det väldigt snabbt på potten? Att implementera en funktion som approximerar en viss kurva via kod eller tabell känns rättframt. Testa att plotta ditt förslag x^3 mot ett logaritmiskt för att se om det ser rimligt ut. Annars är det ju en fördel med mjukvara att du kan ändra funktionen närsomhelst om du inte är nöjd. Eller missar jag något?

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 11:00:32
av Wedge
Det måste inte gå jättefort, men som alltid är det en fördel. Det var mera att transformeringstiden då skulle bli försumbar, till skillnad mot "riktiga" log- eller exp-funktioner. Det kommer nog att bli fler än en pot också.
Men helt rätt, man snurrar inte tokfort på potarna :) Blir nog en lågt prioriterad task i FreeRTOS som får omvandla potvärden när det finns tid över.

Jag har gjort en del plottar, och jag tycker det ser bra ut. Snyggare än styckvis linjärt. Frågan är bara vad man ska jämföra x^3 mot... svårt att hitta något bra facit för hur logaritmiska potentiometrar ska bete sig.

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 11:33:54
av guckrum
Om du har en åttabitars AD och lite minne över kan du implementera funktionen med en 256-bytes tabell och få en snabb och flexibel lösning. Jag kan inte detta så bra, men någonstans såg jag att 20% vid mittinställning är vanligt, och då kanske (e^2.773x-1) / (e^2.773-1) är en bra kurva antaget att upplevd volym är perfekt logaritmisk vid de aktuella volymnivåerna :) Men x^3 är av "liknande" karaktär, och mixning handlar väl lite om fingertoppskänsla, så det är kanske inte så viktigt att hitta den bästa funktionsapproximationen här.

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 12:13:52
av Wedge
Mellan 10% och 20% för mittläget har jag sett, spelar nog ingen större roll precis som du säger. Man vrider tills man blir nöjd.

Uppslagstabell är jag nog lite tveksam till. Det finns stor risk att det tar mer tid än att utföra ett par multiplikationer, eftersom man troligtvis får onödiga cachemissar.
Jag får testa lite och se :) Tack för din input!

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 12:26:29
av Bjaellerud
Det vanliga och billigare sättet att skapa en log pot är att utgå från en linjär med c:a 10 ggr högre resistans.
Sen lägga ett fast motstånd från löparen till jord på c:a 1/10 del av resistansen.

Dvs behöver man en log pot på 10 k så använd en linjär på 47 - 100 k, och ett motstånd på 10 k

Men varför göra saker enkelt när det går att krångla till. Och visst, behöver man precision och ändå har strömförsörjning etc så är förstås elektronikversionen bäst.

Roy

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 12:39:51
av BJ
Jag vet inte vilken processor eller dator du använder,
men med pic-processorer kan man göra tabeller
i programminnet i assembler, som bara tar några
intruktioner att slå upp i.
Det jobbiga är att t.ex. skapa 256 tabell-rader.

http://ww1.microchip.com/downloads/en/A ... 00556e.pdf
http://www.piclist.com/techref/microchip/tables.htm

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 13:40:19
av guckrum
En tabell

Kod: Markera allt

0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07,
0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x11,
0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x14, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, 0x16, 0x17, 0x17,
0x18, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f,
0x1f, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28,
0x29, 0x29, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x2d, 0x2e, 0x2f, 0x2f, 0x30, 0x31, 0x31, 0x32, 0x33,
0x34, 0x34, 0x35, 0x36, 0x37, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40,
0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5e, 0x5f, 0x60, 0x61,
0x62, 0x64, 0x65, 0x66, 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x70, 0x71, 0x73, 0x74, 0x75, 0x77,
0x78, 0x7a, 0x7b, 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8f, 0x91,
0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9d, 0x9f, 0xa1, 0xa3, 0xa5, 0xa7, 0xa9, 0xab, 0xad, 0xaf,
0xb1, 0xb3, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc1, 0xc3, 0xc5, 0xc8, 0xca, 0xcc, 0xcf, 0xd1, 0xd4,
0xd6, 0xd9, 0xdb, 0xde, 0xe0, 0xe3, 0xe6, 0xe8, 0xeb, 0xee, 0xf1, 0xf3, 0xf6, 0xf9, 0xfc, 0xff,
gjord med följande "läsbara" Python-kod

Kod: Markera allt

from math import exp

N = 256

def f(x):
    return (N-1)*(exp(2.773*x/N)-1)/(exp(2.773*(N-1)/N)-1)

s=""
for x in range(0, N):
    s += "0x%02x," % (round(f(x)),)
    if x % 16 == 15:
        s += "\n"
    else:
        s += " "
print(s)

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 13:52:36
av BJ
Ja, då blir det ju lättare. :)

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 17:29:16
av HUGGBÄVERN

Re: Efterlikna logaritmisk pot

Postat: 4 maj 2018, 18:05:37
av hawkan
Seriutveckla log(1+x) = x - x^2/2 + x^3/3 - x^4/4 + osv
Ta med så många termer du vill.

Re: Efterlikna logaritmisk pot

Postat: 5 maj 2018, 16:04:04
av MadModder
Bjaellerud skrev:Det vanliga och billigare sättet att skapa en log pot är att utgå från en linjär med c:a 10 ggr högre resistans.
Sen lägga ett fast motstånd från löparen till jord på c:a 1/10 del av resistansen.

Dvs behöver man en log pot på 10 k så använd en linjär på 47 - 100 k, och ett motstånd på 10 k
Jo det funkar väl som en nödlösning. Fast 10x blir en lite väl tvär kurva.
Men man kan aldrig få till det ordentligt nere mellan ungefär 0-5% av utslaget. Från noll börjar det precis lika brant som en linjär för att börja svänga av först lite efter.

Re: Efterlikna logaritmisk pot

Postat: 6 maj 2018, 07:19:31
av persika

Re: Efterlikna logaritmisk pot

Postat: 6 maj 2018, 09:10:34
av HUGGBÄVERN
MadModder skrev: Jo det funkar väl som en nödlösning. Fast 10x blir en lite väl tvär kurva.
Men man kan aldrig få till det ordentligt nere mellan ungefär 0-5% av utslaget. Från noll börjar det precis lika brant som en linjär för att börja svänga av först lite efter.
Från Elliot Sound Products:

Bild
Take a 100k linear pot (VOL), and connect a loading resistor (R = 10k - 15k, 12k used to produce Figure 2) as shown above to achieve the curve shown. It should be a straight line, but is actually still far more logarithmic than a standard log pot. For stereo, use a dual-gang pot and treat both sections the same way. Use of a 1% resistor for R is recommended. Different values can be used for the pot, but keep the ratio between 6:1 to 10:1 between the value of VOL and R respectively. While 8.33:1 (as shown) is close to a real log curve, it may still allow excessive sensitivity at low levels. Higher ratios than 10:1 can be used, but will cause excessive loading of the driving stage, or necessitate the use of a pot whose resistance is too high.
Bild