Pomiarowa lampa "solid-state"

Układy półprzewodnikowe pełniące ważne funkcje pomocnicze w układach lampowych.

Moderatorzy: gsmok, Romekd, tszczesn, OTLamp, Einherjer

Awatar użytkownika
Tomasz Gumny
2500...3124 posty
2500...3124 posty
Posty: 2525
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań

Re: Pomiarowa lampa "solid-state"

Post autor: Tomasz Gumny »

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
625...1249 postów
Posty: 883
Rejestracja: śr, 28 listopada 2007, 17:31

Re: Pomiarowa lampa "solid-state"

Post autor: atom1477 »

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:
Ok, już wiem o co chodzi.
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
atom1477
625...1249 postów
625...1249 postów
Posty: 883
Rejestracja: śr, 28 listopada 2007, 17:31

Re: Pomiarowa lampa "solid-state"

Post autor: atom1477 »

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).
Odbiornik TV na 2 tranzystorach/lampach: Prima II/Prima III:
viewtopic.php?f=16&t=29213
Awatar użytkownika
Tomasz Gumny
2500...3124 posty
2500...3124 posty
Posty: 2525
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań

Re: Pomiarowa lampa "solid-state"

Post autor: Tomasz Gumny »

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.
Tomek
atom1477
625...1249 postów
625...1249 postów
Posty: 883
Rejestracja: śr, 28 listopada 2007, 17:31

Re: Pomiarowa lampa "solid-state"

Post autor: atom1477 »

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
Awatar użytkownika
Tomasz Gumny
2500...3124 posty
2500...3124 posty
Posty: 2525
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań

Re: Pomiarowa lampa "solid-state"

Post autor: Tomasz Gumny »

Nie ma jeszcze tablic. Dopiero dzisiaj pojawiła się koncepcja jak mają wyglądać. Ja sprawdzałem na funkcjach y=x.
Tomek
Awatar użytkownika
TooL46_2
1875...2499 postów
1875...2499 postów
Posty: 2221
Rejestracja: ndz, 20 lipca 2008, 12:06
Lokalizacja: Seattle, WA

Re: Pomiarowa lampa "solid-state"

Post autor: TooL46_2 »

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
Awatar użytkownika
TooL46_2
1875...2499 postów
1875...2499 postów
Posty: 2221
Rejestracja: ndz, 20 lipca 2008, 12:06
Lokalizacja: Seattle, WA

Re: Pomiarowa lampa "solid-state"

Post autor: TooL46_2 »

Posiedzialem i wykoncypowalem taki kod...

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;
}
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...
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