• Ten serwis używa "ciasteczek" (cookies). Korzystając z niego, wyrażasz zgodę na użycie plików cookies. Learn more.
  • Szanowny Użytkowniku, serwisy w domenie modelarstwo.info wykorzystują pliki cookie by ułatwić korzystanie z naszych serwisów. Jeśli nie chcesz, by pliki cookies były zapisywane na Twoim dysku zmień ustawienia swojej przeglądarki.

Układ do "płynnego" migania LED

Kylogram

Znany użytkownik
Reakcje
1.501 33 3
#1
Czy istnieje jakiś gotowiec (soft na mikrokontroler) lub wręcz kit do kupienia (dziwne, ale no jakoś w necie nie mogę nic znaleźć, szukam po PWM, miganie itp , równiez nie po polsku) do płynnego gaszenia LEDa; chodzi mi o sygnał zastępczy semafora. LED imitująca żarówkę powinna się płynnie zapalać i gasnąć (w zasadzie, to zapalać szybciej, gasnąć wolniej).
Nie chce mi się wyważać otwartych drzwi... Dzięki za pomoc.
 

Marqus

Moderator Poznańskiego Klubu Modelarzy Kolejowych
PKMK
Reakcje
434 8 0
#2
W prosty sposób można zrobić generator na 555 dodając kondensator elektrolityczny na wyjściu.
Nie jest to PWM, ale uzyska się efekt płynnego gaszenia. Jedynie zaświecać będzie się od razu.
 
OP
OP
K

Kylogram

Znany użytkownik
Reakcje
1.501 33 3
#3
555 dodając kondensator elektrolityczny na wyjściu.
Dokładnie o tym myślałem i tak zrobię jako rozwiązanie tymczasowe, ponieważ - tak jak napisałem - nie chce mi się pisać programu etc. jeśli jest dostępny gotowiec. Przydałby się on zapewne wielu osobom, również do "mrygania" sygnalizacji przejazdowej...

Swoją drogą, żarówka i tak zapala się szybciej niż gaśnie, więc takie rozwiązanie może już u mnie pozostać na zawsze, bo zawsze będzie za mało czasu zająć się takim duperelem. Ale gdyby ktoś znalazł układzik, to fajnie byłoby tutaj (czy gdziekolwiek na forum) wkleić projekt/link. Wszyscy mogliby skorzystać w razie potrzeby.

W sumie jest to do zrobienia również w analogu, na wejściu przebieg trójkątny, no cholera zbocze w górę musiałoby iść szybciej żeby było jak trzeba, potem wygładzenie gałęzi coby łuczki powstały, ścięcie piku do plateau i mamy "profil zapalania-świecenia-gaszenia żarówki" :) Chętni nie pchać się, po kolei ;)
 
OP
OP
K

Kylogram

Znany użytkownik
Reakcje
1.501 33 3
#6
Ło Jezusiczku, zasilanie symetryczne? A gdzie "zero"? ;)
+5V i masa i wystarczy :)
W "znalazł układzik" nie chodziło mi o układ na 555, bo jest trywialny i przykładów w necie na pęczki i kopy, tylko o PWM na jakimś procku.
W każdym razie dzięki, komuś się to może przydać. Ja zapodam gotowy schemat pulpitu sterującego z tymże układem na 555, ale to w moim wątku.
 

Marqus

Moderator Poznańskiego Klubu Modelarzy Kolejowych
PKMK
Reakcje
434 8 0
#7
zasilanie symetryczne? A gdzie "zero"?
Normalne, +12V. Mogłem zamiast "-12V" napisać "0". ;)
Może być i 5V. Jednak 12V jest częściej stosowanym napięciem zasilającym. Mniejsze też straty mocy przy stosowaniu 16VAC, jako napięcie stosowane do zasilania akcesoriów.
"Masa" jakby nie było to jest właśnie "minus" zasilania. Stąd te "-12V". ;)
tylko o PWM na jakimś procku.
Schemat też może być trywialny. Np. Attiny13 i dwa rezystory nie licząc zasilania. Pozostaje kwestia wsadu do procka. ;)
 

r-mik

Pan Chlewik
Reakcje
145 30 0
#9
Prawie rok to nie tak dużo czasu. Rozwiązanie programowe na przerwaniu 1ms
Code:
    //----- LED RUN
    uint8_t static cnt, pwm = 8, dir=1;
    if( ++cnt >= 32 ) {
        cnt=0;
        HAL_GPIO_WritePin( LED_RUN_GPIO_Port, LED_RUN_Pin, GPIO_PIN_SET);
        if( dir ){
            if( ++pwm >= 32-1 ) dir = 0;
        }
        else{
            if( --pwm <= 1 ) dir = 1;
        }
    }
    else if ( cnt == pwm ) HAL_GPIO_WritePin( LED_RUN_GPIO_Port, LED_RUN_Pin, GPIO_PIN_RESET);
Naturalnie lepiej sprzętowo i korekta coś jak Gamma.
 

r-mik

Pan Chlewik
Reakcje
145 30 0
#10
Program dla sprzętowego PWM 12-bit, z korektą "Gamma" pochodzący z oprogramowania semafora świetlnego http://forum.modelarstwo.info/threa...5-komór-z-pasem-i-tarczy-ostrzegawczej.50384/ i dekodera DCC http://forum.modelarstwo.info/threads/budowa-tanich-dekoderów-trakcji-dźwięku-funkcyjnych.50313/:
Code:
const uint16_t gamma8_12[256] = {
        0,1,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,18,20,22,25,27,
        30,33,36,39,42,45,49,52,56,60,64,68,72,77,81,86,90,95,
        100,105,111,116,121,127,133,139,145,151,157,163,170,176,
        183,190,197,204,211,219,226,234,242,249,257,266,274,282,
        291,299,308,317,326,335,344,354,363,373,383,393,403,413,
        423,433,444,455,465,476,487,498,510,521,533,544,556,568,
        580,592,604,617,629,642,655,668,681,694,707,721,734,748,
        762,775,789,804,818,832,847,862,876,891,906,922,937,952,
        968,983,999,1015,1031,1047,1064,1080,1097,1113,1130,1147,
        1164,1181,1199,1216,1234,1252,1269,1287,1305,1324,1342,1360,
        1379,1398,1416,1435,1454,1474,1493,1512,1532,1552,1572,1592,
        1612,1632,1652,1673,1693,1714,1735,1756,1777,1798,1820,1841,
        1863,1884,1906,1928,1950,1972,1995,2017,2040,2063,2086,2108,
        2132,2155,2178,2202,2225,2249,2273,2297,2321,2345,2370,2394,
        2419,2444,2468,2493,2519,2544,2569,2595,2620,2646,2672,2698,
        2724,2750,2777,2803,2830,2857,2884,2911,2938,2965,2992,3020,
        3048,3075,3103,3131,3159,3188,3216,3245,3273,3302,3331,3360,
        3389,3418,3448,3477,3507,3537,3567,3597,3627,3657,3688,3718,
        3749,3780,3811,3842,3873,3904,3935,3967,3999,4031,4062,4095
};

void writeGreen( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 4095-gamma8_12[pwm & 255] );
}

void writeOrange( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 4095-gamma8_12[pwm  & 255] );
}

void writeRed( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 4095-gamma8_12[pwm & 255] );
}

void writeOrange2( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 4095-gamma8_12[pwm & 255] );
}

void writeWhite( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 4095-gamma8_12[pwm & 255] );
}

void writeBarGreen( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 4095-gamma8_12[pwm & 255] );        // INFO: to samoo co pomarańczowy
}

void writeBarOrange( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 4095-gamma8_12[pwm & 255] );        // INFO: to samoo co zielony
}

void writeTarczaGreen( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 4095-gamma8_12[pwm & 255] );
}

void writeTarczaOrange( uint16_t pwm ){
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 4095-gamma8_12[pwm & 255] );
}

void irq1ms(){
    int16_t static p[PWM_END];
    uint8_t static b[PWM_END];


    extern void DccIrq1ms(void);
    DccIrq1ms();


    if( timTest ) timTest--;
    if( timSetS1 ) timSetS1--;
    if( timSetS1 == 1 ) setS1();


    for(uint8_t x=0; x<PWM_END; x++){
        if( ! blink[x] ){    // Gdy nie ma blinka
            if( p[x] < pwmS[x] << KROK_ROL ){
                if( p[x] + krokUPcv < pwmS[x] << KROK_ROL ) p[x] += krokUPcv;
                else p[x] = pwmS[x] << KROK_ROL;
            }
            if( p[x] > pwmS[x] << KROK_ROL ){
                if( p[x] - krokDOWNcv > pwmS[x] << KROK_ROL ) p[x] -= krokDOWNcv;
                else p[x] = pwmS[x] << KROK_ROL;
            }
            b[x] = 0;    // Wyzeruj wirtualny PWM
        }
        else{
            uint16_t static tim[PWM_END];
            if( tim[x] ) tim[x]--;
            else {
                tim[x] = Fmigania << 3;        // czestotliwość migania todo: z CV
                b[x] ^= 1;
            }
            TRAP;
            if( b[x] ){
                TRAP;
                if( p[x] < pwmS[x] << KROK_ROL ){
                    if( p[x] + krokUPcv < pwmS[x] << KROK_ROL ) p[x] += krokUPcv;
                    else p[x] = pwmS[x] << KROK_ROL;
                }
            }
            else{
                TRAP;
                if( p[x] > 0 ){
                    if( p[x] - krokDOWNcv > 0 ) p[x] -= krokDOWNcv;
                    else p[x] = 0;
                }
            }
        }
    }


    if( fl_PwmOn ){
        writeGreen( p[PWM_GREEN] >> KROK_ROL );
        writeOrange( p[PWM_ORANGE] >> KROK_ROL );
        writeRed( p[PWM_RED] >> KROK_ROL );
        writeOrange2( p[PWM_ORANGE2] >> KROK_ROL );
        writeWhite( p[PWM_WHITE] >> KROK_ROL );
        writeBarGreen( p[PWM_BAR_G] >> KROK_ROL );
        writeBarOrange( p[PWM_BAR_O] >> KROK_ROL );

        writeTarczaGreen( p[PWM_tGREEN] >> KROK_ROL );
        writeTarczaOrange( p[PWM_tORANGE] >> KROK_ROL );
    }
}
 
Autor wątku Podobne wątki Forum Odpowiedzi Data
Elektryka 47
Elektryka 25
Elektryka 2

Podobne wątki