• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wykładnicze rozświetlanie LED
#11
Być może za bardzo to uprościłem, ale odwrotnością funkcji logarytmicznej jest funkcja wykładnicza, a przecież widać, że:

Kod:
float WW[256]; // wrażenia wzrokowe
for (int x = 1; x <= 256; x++){
WW[x-1] = LOG o podst 256 z x;}

jest funkcją logarytmiczną, więc tak, czepiasz się.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#12
Witam ponownie!

Zgodnie z planem rozszerzyłem rozdzielczość sygnału PWM z 255 do 65535 punktów by "upłynnić" rozświetlanie. 
Niestety jest kilka "ale"...

Kod:
#define wlacznik A2

unsigned long wypelnienie = 0;
boolean stanWlacznika = false;
unsigned long aktualnyCzas = 0;
unsigned long czasWypelnienia = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
unsigned long czasDoPelnegoRozswietlenia = 60000;  

void setup() {
 pinMode(wlacznik, INPUT_PULLUP);
 pinMode(9, OUTPUT);
 setupPWM16();
}

void loop() {
 aktualnyCzas = millis();
 roznicaCzasu = aktualnyCzas - zapamietanyCzas;
 czasWypelnienia = ((sqrt(wypelnienie)*czasDoPelnegoRozswietlenia)/256);
 if (digitalRead(wlacznik) == LOW) {
    delay(500);
    stanWlacznika = !stanWlacznika;
    zapamietanyCzas = aktualnyCzas;
  }
 if (stanWlacznika == true ) {
    
    if (roznicaCzasu >= czasWypelnienia) {
            if (wypelnienie < 65535) {
                wypelnienie = (wypelnienie + 1);
                if (wypelnienie == 255) {
                    wypelnienie = 256;
                 }
             }
             if (wypelnienie > 65535) {
                wypelnienie = 65535;
             }
            analogWrite(9, wypelnienie);
         }
  }
 if (stanWlacznika == false) {
      analogWrite(9, 0);
      wypelnienie = 0;
  }
}
void setupPWM16() {
  uint16_t icr = 0xffff;    // ffff - 65535
  DDRB  |= _BV(PB1) | _BV(PB2);       /* set pins as outputs */
  TCCR1A = _BV(COM1A1) | _BV(COM1B1)  /* non-inverting PWM */
        | _BV(WGM11);                 /* mode 14: fast PWM, TOP=ICR1 */
  TCCR1B = _BV(WGM13) | _BV(WGM12)
        | _BV(CS10);                  /* prescaler 1 */
  ICR1 = icr;                         /* TOP counter value (freeing OCR1A*/
}



Już wyjaśniam o co chodzi w tym bałaganie.
Musiałem wyeliminować wypełnienie = 255. Pomimo rozszerzenia rozdzielczości do 65535 w momencie kiedy wartość wypełnienia urośnie do 255  to program traktuje to jako pełne wypełnienie i dioda na chwilkę zapala się pełną jasnością [po przekroczeniu 255 program leci normalnie].

W chwili obecnej całość działa sprawnie i prawie zgodnie z założeniami. 
Niestety musiałem zrezygnować z tablic ponieważ musiał bym [za Waszą radą] ustalić wartości int na sztywno. nie jestem w stanie tego zrobić bo chcę regulować ostateczny czas rozświetlenia. 
Usunąłem również funkcję Serial.println() bo spowalniała program.
Kolejna rzecz z jaką się borykam to krótki "blink" na początku ponownego cyklu.

Jeśli ktoś by się pokusił o zmontowanie całości [Niebieski LED , rezystor 330R i przełącznik] to mogło by to więcej rozjaśnić. 

Kiedy wgram program lub po prostu zresetuję płytkę to dioda ładnie leci od zera. W momencie kiedy wyłączę ją przyciskiem i ponownie włączę [ważne - poprzedni cykl musiał dolecieć do końca] to na początku pojawia się krótki błysk [Długość błysku za każdym razem jest inna. Od 0,357 ms  do  3,116 ms]  i dalej leci już normalnie. O ten właśnie błysk mi chodzi. Macie może pomysły skąd się on bierze? Czy jest możliwe , że gdzieś zbiera się jakiś ładunek ?

Jeszcze raz dziękuję za podpowiedzi i pozdrawiam ! 

PS [LED w moim przypadku jest podłączony do pinu 9 Arduino UNO. ]
 
Odpowiedź
#13
Nie znam się na LED, a to co sobie wyobrażam -  może być tak, że przy niskim PWM jest za mało prądu na przebicie się przez warstwy półprzewodnika i LED zbiera sobie kilka impulsów by dać jeden błysk, stąd migotanie.  Np. przy sterowaniu silników też nie można sobie zejść do 0 sterowaniem falownikiem, jest spoko od 20-100% (dolna wartość jest różna). Może tranzystor pomoże przy LED.
Co do regulacji czasu z tablicą (znaleziona na Adafruit w temacie gamma-correction, może są lepsze), nie jest to jakiś problem używając tylko tego co oferuje Arduino w elementarzu:
Kod:
const uint8_t PROGMEM gamma8[] = {
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
   1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
   2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
   5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
 115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
 144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
 177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
 215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };

const int led1=6;

uint8_t sekundy, tryb;
uint32_t teraznow, kiedys;
uint8_t speedled=20;
void inline czas();
void setup() {
 // put your setup code here, to run once:

}

void loop() {

czas();  
pwmLed(speedled,led1,tryb);

}


void inline czas()
{
 teraznow=millis();
if(teraznow-kiedys>=1000UL)
{
 kiedys=teraznow;
 //minela sekunda, pomieszamy

 sekundy++;
 if(sekundy%10==0)
 {
 tryb++;
 tryb=tryb%3;
 }
 if(sekundy>=60)
 {
   sekundy=0;
   speedled+=20;
   if (speedled>100) speedled=20;
 }
}
}
void pwmLed(uint16_t wolnosc, int ledpin, uint8_t typ) //(jak szybko ma sciemniac, co ma sie sciemniac, jaki efekt)
{
static uint32_t ostatnio=0;
static uint8_t ledPWM=0;
static uint8_t ledUp=0;
uint32_t  teraz=micros();
if(teraz-ostatnio>=(uint32_t)wolnosc*100)
{
ostatnio=teraz;
switch(typ)  
{
 
case  0:
ledPWM--;
break;

case  1:
ledPWM++;
break;

default :
if(ledUp && ledPWM<255) ledPWM++;
else ledUp=0;
if(!ledUp && ledPWM>0) ledPWM--;
else ledUp=1;
break;
}
}
analogWrite(ledpin,pgm_read_byte(&gamma8[ledPWM]));  
}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#14
(18-05-2018, 03:45)kaczakat napisał(a): Nie znam się na LED, a to co sobie wyobrażam -  może być tak, że przy niskim PWM jest za mało prądu na przebicie się przez warstwy półprzewodnika i LED zbiera sobie kilka impulsów by dać jeden błysk, stąd migotanie.
Ciekawa teoria ale LED to nie neonówka. Migotanie wynika tylko i wyłącznie z błędu w programie.

(18-05-2018, 03:45)kaczakat napisał(a): Np. przy sterowaniu silników też nie można sobie zejść do 0 sterowaniem falownikiem, jest spoko od 20-100% (dolna wartość jest różna).
To prawda ale silnik to nie LED czy żarówka.

(18-05-2018, 03:45)kaczakat napisał(a): Może tranzystor pomoże przy LED.
Strzelasz kolega, strzelasz. Niestety obok tarczy.
 
Odpowiedź
#15
Panie ES2, ciągle potwierdza Pan moją tezę, że ludzie ze zbyt dużym doświadczeniem zapominają podstaw. Proszę sobie zmontować ten "skomplikowany" układ, użyć LED THT 5mm i rezystora R 500, przykład który wrzuciłem ściemnia i rozjaśnia, także układ LED+R można podłączyć zarówno do 5V jak i do GND. Proszę wyjaśnić jaki jest błąd w programie, skoro układ podłączony do PIN+GND daje rozbłysk przy rozjaśnianiu (czyli gdy jest przeskok z pełnego świecenia na brak, a potem rozjaśnianie), a brak go przy podłączeniu do 5V. Rezystor, co zapewne jest tu istotne jest podłączony do anody. A potem proszę zamienić pozycję rezystora i porównać.
@Hipesto - przy okazji masz rozwiązanie do sprawdzenia.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#16
(18-05-2018, 14:00)kaczakat napisał(a): Proszę sobie zmontować ten "skomplikowany" układ, użyć LED THT 5mm i rezystora R 500, przykład który wrzuciłem ściemnia i rozjaśnia, także układ LED+R można  podłączyć zarówno do 5V jak i do GND. Proszę wyjaśnić jaki jest błąd w programie

Za jakie wynagrodzenie?
 
Odpowiedź
#17
Nie rozumiem w takim razie dlaczego pierwsze włączenie jest bez błysku. Jakieś pomysły ? Podłączenie przez tranzystor nie przyniosło efektu. Będę jeszcze próbował podłączyć 5v - PIN , ale nie wiem jak ma wyglądać konfiguracja pinu 9 dla takiego podłączenia w ustawieniu 65535 punktów rozdzielczości PWM. Przyznaje też , że jeśli jest jakiś sposób na pozostawienie konfiguracji PIN - GND to wolałbym przy tym zostać. Problem raczej nie leży w programie bo jak już pisałem - "Długość błysku za każdym razem jest inna. Od 0,357 ms do 3,116 ms". Z mojego punktu widzenia - to nie program. Ale oczywiście nie mam pewności ponieważ to mój pierwszy kontakt z programowaniem oraz elektroniką cyfrową. Jest to tez mój pierwszy post na tym forum [klimat trochę jak na elektrodzie Tongue ].
Jeszcze raz - dziękuję za zaangażowanie Smile
 
Odpowiedź
#18
Przy odwrotnym podłączeniu LED zamiast rozjaśniać, będzie ściemniać. Wystarczy wpisać (65535 -wyliczone) i działa jak wcześniej -znowu rozjaśnia.
Panie ES2, mnie taka odpowiedź wystarcza Big Grin.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości