Pomiarowa lampa "solid-state"
Moderatorzy: gsmok, Romekd, tszczesn, OTLamp, Einherjer
-
Tomasz Gumny
- 2500...3124 posty

- Posty: 2526
- Rejestracja: pn, 1 stycznia 2007, 23:18
- Lokalizacja: Trzcianka/Poznań
Re: Pomiarowa lampa "solid-state"
Jeśli uda się uzyskać sensowne wyniki na tym co jest, to może spróbuje przepiąć PWMy na Timer1, który może być taktowany z 64MHz i mógłby pracować z 10-bitową rozdzielczoscia (a nawet więcej kosztem zmniejszenia częstotliwości). ADC też mogłyby pracować wolniej na pełnych 10 bitach, a nawet z nadpróbkowaniem. Wtedy możemy pobawić się w rozbudowaną matematykę godząc się, że to będzie model niemal statyczny.
Tomek
-
atom1477
- 625...1249 postów

- Posty: 883
- Rejestracja: śr, 28 listopada 2007, 17:31
Re: Pomiarowa lampa "solid-state"
Ok, już wiem o co chodzi.Tomasz Gumny pisze: pn, 4 maja 2026, 20:59 Ja mam funkcję 3 argumentów IA=f(UA,US2,US1), to już 16 megabajtów.
Ale jeśli wezmę starsze 4 bity każdego argumentu, to tablica będzie miała akceptowalny rozmiar 16x16x16=4096 bajtów.
Na przykład dla IA[16,32,0] będę miał wartość IA wprost z tablicy.
Dla wartości pośrednich np. IA[10,20,30] wstępnie umyśliłem coś takiego: pobieram i sumuję z tablicy wartości IA dla najbliższych argumentów mniejszych (0,16,16) i większych (16,32,32) z odpowiednimi wagami:
No to Twoja metoda co do zasady wygląda na poprawną. Tylko nie sprawdzałem dokładnie czy prawidłowo wyliczasz i używasz wagi.
Tu jest dobry materiał o dwuwymiarowej interpolacji:
https://pages.hmc.edu/ruye/MachineLearn ... node7.html
Jak Twoja metoda w przypadku 2D da zgodne wyniki z tym materiałem, to będzie można uznać że i Twoja metoda 3D jest prawidłowa.
Odbiornik TV na 2 tranzystorach/lampach: Prima II/Prima III:
viewtopic.php?f=16&t=29213
viewtopic.php?f=16&t=29213
-
atom1477
- 625...1249 postów

- Posty: 883
- Rejestracja: śr, 28 listopada 2007, 17:31
Re: Pomiarowa lampa "solid-state"
Jeszcze znalazłem dla 3D:
https://en.wikipedia.org/wiki/Trilinear_interpolation
W sumie nie wiem czy mi by się chciało bawić przy tak skomplikowanym wzorze, i bym w tym przypadku dał zewnętrzną pamięć FLASH.
No chyba że chcesz na bieżąco modyfikować charakterystyki (jeżeli to ma symulować wiele rodzajów lamp), no to wtedy trzeba by pamięć RAM, albo jechać na wzorach (wyliczać na bieżąco ze wzoru, bez interpolowania z tablicy).
https://en.wikipedia.org/wiki/Trilinear_interpolation
W sumie nie wiem czy mi by się chciało bawić przy tak skomplikowanym wzorze, i bym w tym przypadku dał zewnętrzną pamięć FLASH.
No chyba że chcesz na bieżąco modyfikować charakterystyki (jeżeli to ma symulować wiele rodzajów lamp), no to wtedy trzeba by pamięć RAM, albo jechać na wzorach (wyliczać na bieżąco ze wzoru, bez interpolowania z tablicy).
Odbiornik TV na 2 tranzystorach/lampach: Prima II/Prima III:
viewtopic.php?f=16&t=29213
viewtopic.php?f=16&t=29213
-
Tomasz Gumny
- 2500...3124 posty

- Posty: 2526
- Rejestracja: pn, 1 stycznia 2007, 23:18
- Lokalizacja: Trzcianka/Poznań
Re: Pomiarowa lampa "solid-state"
Podoba mi się ta metoda sprowadzania trzech wymiarów do dwóch, potem do jednego i do punktu.
Też bym teraz się zastanowił nad zewnętrzną pamięcią. 128Mbit (256x256x256x8bit) kosztuje ~30,- i jest dostępna w „normalnych” obudowach.
Dobra rozmarzyłem się. Na razie moim hobby będzie interpolowanie.
Też bym teraz się zastanowił nad zewnętrzną pamięcią. 128Mbit (256x256x256x8bit) kosztuje ~30,- i jest dostępna w „normalnych” obudowach.
Dobra rozmarzyłem się. Na razie moim hobby będzie interpolowanie.
Tomek
-
atom1477
- 625...1249 postów

- Posty: 883
- Rejestracja: śr, 28 listopada 2007, 17:31
Re: Pomiarowa lampa "solid-state"
Jak podeślesz jakąś przykładową zawartość tablicy to sprawdzę jakie wyniki dają te wzory.
Odbiornik TV na 2 tranzystorach/lampach: Prima II/Prima III:
viewtopic.php?f=16&t=29213
viewtopic.php?f=16&t=29213
-
Tomasz Gumny
- 2500...3124 posty

- Posty: 2526
- Rejestracja: pn, 1 stycznia 2007, 23:18
- Lokalizacja: Trzcianka/Poznań
Re: Pomiarowa lampa "solid-state"
Nie ma jeszcze tablic. Dopiero dzisiaj pojawiła się koncepcja jak mają wyglądać. Ja sprawdzałem na funkcjach y=x.
Tomek
-
TooL46_2
- 1875...2499 postów

- Posty: 2221
- Rejestracja: ndz, 20 lipca 2008, 12:06
- Lokalizacja: Seattle, WA
Re: Pomiarowa lampa "solid-state"
Troche ‘pomarudze’: interpolacja liniowa dla Ua to jeszcze tak… Ale napiecie na siatce drugiej jest nieliniowe jesli chodzi o wplyw na wartosc pradu Ia… Juz predzej funkcja sklejana (cubic spline) ale to juz serio chyba prosciej z panem Koren…
Pozdr,
-Tomek Drabas
________
"One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one's greatest efforts."
—Albert Einstein
tomdrabas.com
-Tomek Drabas
________
"One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one's greatest efforts."
—Albert Einstein
tomdrabas.com
-
TooL46_2
- 1875...2499 postów

- Posty: 2221
- Rejestracja: ndz, 20 lipca 2008, 12:06
- Lokalizacja: Seattle, WA
Re: Pomiarowa lampa "solid-state"
Posiedzialem i wykoncypowalem taki kod...
Mam dwa ale...
1. Czy naprawde nie prosciej byloby z funkcjami parametrycznymi?
2. Sciaganie charakterystyk dla roznych Ug2 to bedzie niemaly problem bo w notach katalogowych rzadko mozna spotkac nawet Ug2 dla dwoch wartosci...
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#define UA_DIV 16.0
#define UG_DIV 10.24
#define GRID 16
#define UG_STEP (UG_DIV / (GRID - 1))
double table[256] = {
0.3053,0.7320,0.7913,1.1387,1.3456,1.5596,1.9422,2.0080,2.4147,2.6607,2.9138,3.3615,3.4379,3.9060,4.1864,4.4728, // ug = 0
0.0622,0.2444,0.2809,0.5284,0.6907,0.8663,1.1905,1.2473,1.6039,1.8227,2.0503,2.4566,2.5263,2.9563,3.2154,3.4814, // ug = 0.68
0.0000,0.0039,0.0087,0.0987,0.1944,0.3163,0.5631,0.6085,0.9022,1.0879,1.2848,1.6423,1.7043,2.0903,2.3252,2.5680, // ug = 1.37...
0.0000,0.0000,0.0000,0.0011,0.0074,0.0334,0.1395,0.1652,0.3589,0.4962,0.6508,0.9440,0.9962,1.3274,1.5329,1.7481,
0.0000,0.0000,0.0000,0.0000,0.0001,0.0007,0.0101,0.0144,0.0704,0.1315,0.2185,0.4133,0.4510,0.7043,0.8698,1.0487,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0004,0.0006,0.0062,0.0166,0.0397,0.1160,0.1342,0.2784,0.3869,0.5147,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0004,0.0014,0.0045,0.0203,0.0252,0.0750,0.1229,0.1899,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0001,0.0004,0.0028,0.0036,0.0148,0.0284,0.0519,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0003,0.0005,0.0025,0.0055,0.0116,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0001,0.0004,0.0010,0.0024,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0001,0.0002,0.0005,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,
0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000
};
inline double lookup(int ua_i, int ug_i) {
return table[ug_i * GRID + ua_i];
}
double ia_triode(double ua, double ug) {
// Normalize into grid space
double u = ua / UA_DIV;
double g = ug / UG_STEP;
int ua_i = (int)u;
int ug_i = (int)g;
// Clamp to valid range (important near edges)
if (ua_i >= GRID - 1) ua_i = GRID - 2;
if (ug_i >= GRID - 1) ug_i = GRID - 2;
if (ua_i < 0) ua_i = 0;
if (ug_i < 0) ug_i = 0;
// Fractional parts
double fu = u - ua_i;
double fg = g - ug_i;
// Fetch 4 corners
double v00 = lookup(ua_i, ug_i);
double v01 = lookup(ua_i, ug_i + 1);
double v10 = lookup(ua_i + 1, ug_i);
double v11 = lookup(ua_i + 1, ug_i + 1);
// Bilinear interpolation (compact form)
return (1 - fu) * (1 - fg) * v00 +
(1 - fu) * fg * v01 +
fu * (1 - fg) * v10 +
fu * fg * v11;
}
int main() {
double ua = 220.0;
double ug = UG_STEP * 2.1;
double ia_plate = ia_triode(ua, ug);
printf("Plate current for point(%fV, -%fV) is: %f", ua, ug, ia_plate);
return 0;
}
1. Czy naprawde nie prosciej byloby z funkcjami parametrycznymi?
2. Sciaganie charakterystyk dla roznych Ug2 to bedzie niemaly problem bo w notach katalogowych rzadko mozna spotkac nawet Ug2 dla dwoch wartosci...
Pozdr,
-Tomek Drabas
________
"One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one's greatest efforts."
—Albert Einstein
tomdrabas.com
-Tomek Drabas
________
"One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one's greatest efforts."
—Albert Einstein
tomdrabas.com
-
Tomasz Gumny
- 2500...3124 posty

- Posty: 2526
- Rejestracja: pn, 1 stycznia 2007, 23:18
- Lokalizacja: Trzcianka/Poznań
Re: Pomiarowa lampa "solid-state"
Będziemy interpolować liniowo prądy IA i IS2 tylko pomiędzy węzłami tablicy. Zakładam, że w punktach wartości będą poprawne, wzięte z modelu Korena albo charakterystyk. Nie wiem jak wygląda rzeczywisty wpływ US2 na IA, ale dla pentod podawany jest parametr μg2g1, który wskazuje ile razy US2 słabiej wpływa na IA niż US1. I to podobno jest wartość stała, związana z konstrukcją danej lampy.TooL46_2 pisze: wt, 5 maja 2026, 03:57 Troche ‘pomarudze’: interpolacja liniowa dla Ua to jeszcze tak… Ale napiecie na siatce drugiej jest nieliniowe jesli chodzi o wplyw na wartosc pradu Ia…
Z tego odnośnika: "The term spline comes from the flexible spline devices used by shipbuilders and draftsmen to draw smooth shapes." Aż mi się przypomniało pierwsze praktyczne doświadczenie z interpolacją. Za młodu kupiliśmy z kumplami dokumentację deski z żaglem. Przekroje kadłuba były co pół metra, a najdłuższe krzywiki miały 30cm. Więc zmierzyłem przekroje, napisałem w Fortranie program do interpolacji Newtona, odebrałem wydruki (to były czasy Odry, Georga3, kart perforowanych i drukarek wierszowych). Po przeniesieniu wyników na papier wyszły pięknie pofalowane zarysy kadłuba.TooL46_2 pisze: wt, 5 maja 2026, 03:57Juz predzej funkcja sklejana (cubic spline) ale to juz serio chyba prosciej z panem Koren…
Fajnie, tylko ja nadal nie mam matematyki zmiennoprzecinkowej.
W zasadzie ze wszystkim się zgadzam, tylko pamiętaj, że zaczynaliśmy od triody na 2 wzmacniaczach operacyjnych. Myślałem, że pentoda to taka przerośnięta trioda...TooL46_2 pisze: wt, 5 maja 2026, 03:57Mam dwa ale...
1. Czy naprawde nie prosciej byloby z funkcjami parametrycznymi?
2. Sciaganie charakterystyk dla roznych Ug2 to bedzie niemaly problem bo w notach katalogowych rzadko mozna spotkac nawet Ug2 dla dwoch wartosci...
Tomek