Efterlikna logaritmisk pot
Efterlikna logaritmisk pot
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?
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
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
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.
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
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
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!
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!
-
- Inlägg: 1432
- Blev medlem: 28 februari 2016, 16:01:33
Re: Efterlikna logaritmisk pot
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
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
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
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
En tabell
gjord med följande "läsbara" Python-kod
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,
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)
- HUGGBÄVERN
- Tidigare soundbrigade
- Inlägg: 32628
- Blev medlem: 23 augusti 2006, 22:44:11
- Ort: Lilla Paris
- Kontakt:
Re: Efterlikna logaritmisk pot
Seriutveckla log(1+x) = x - x^2/2 + x^3/3 - x^4/4 + osv
Ta med så många termer du vill.
Ta med så många termer du vill.
- MadModder
- Co Admin
- Inlägg: 29905
- Blev medlem: 6 september 2003, 13:32:07
- Ort: MadLand (Enköping)
- Kontakt:
Re: Efterlikna logaritmisk pot
Jo det funkar väl som en nödlösning. Fast 10x blir en lite väl tvär kurva.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
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
Kolla även denna tråd:
http://elektronikforumet.com/forum/view ... =8&t=63629
http://elektronikforumet.com/forum/view ... =8&t=63629
- HUGGBÄVERN
- Tidigare soundbrigade
- Inlägg: 32628
- Blev medlem: 23 augusti 2006, 22:44:11
- Ort: Lilla Paris
- Kontakt:
Re: Efterlikna logaritmisk pot
Från Elliot Sound Products: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.
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.