Skocz do zawartości

Oswietlenie, attiny i pwm


xader

Rekomendowane odpowiedzi

Witam,

 

Postanowiłem oświetlić swoją deltę coby można wieczorem polatać.

Zakupiłem 2 pasy 1m ledów 5050 (mocne) - każda pobiera 20ma przy 12V.

http://www.sunsky-on...bject.id=223641

http://www.sunsky-on...bject.id=223644

Mam obecnie 36 diod po obwodzie i po 18 na każdą ze stron - 1.2A przy 12.6V.

 

Chce stworzyć kontroler coby można oszczędzić trochę prądu i je trochę ściemnić + kilka innych funkcji - zrezygnowałem obecnie z 3 kanałów na rzecz jednego (trudno osiągalne małe tanie mosfety w szczecinie, na bipolarnych tranzystorach duze straty + potrzeba użycia par darlingtona, cena ULN2064 za duża, 3 mosfety - za duża płytka by wyszła).

 

Zakupiłem IRF634 (najtanszy łatwy do lutowania :))

 

Spice mówi ze wszystko będzie w porządku (przy vgs = 5v i vds =12v - przejdzie 1.8A - w zupełności wystarczające)

Dołączona grafika

 

Pozostaje parę kwestii otwartych dla mnie:

Chce użyć Attiny13 zasilane bezpośrednio z odbiornika

1. Potrzebuje filtrować zasilanie pochodzące z BEC'a czy mogę przyjąć że jest już odpowiednie?

2. Attiny13 nie posiada zegara za pomocą którego można zliczać dokladnie mikrosekundy - (9.6MHz, 4.8MHz, 128khz)

Domyślnie przy użyciu zegara 9.6MHz i prescaler = 8 jest 1200 cykli na milisekunde - dobrze rozumiem że będę w stanie zmierzyć sygnał pwm z rozdzielczością 1200 kroków?

Odnośnik do komentarza
Udostępnij na innych stronach

Przy takich ustawieniach Timer jest zwiększany co 0,8333us a przerwanie jest wywołane co 0,2133ms, czyli żeby zmierzyć impuls 2ms to Timer "przekręci się" 9 razy i to trzeba uwzględniać w obliczeniach. Przy sterowaniu Ledów nie trzeba aż takiej dokładności więc może wystarczy jak ustawisz zegar na 4,8MHz z wewnętrznym podziałem przez 8 i dodatkowo preskaler=8, to uzyskasz rozdzielczość 13us i przerwanie co 3,4ms. Wtedy pomiar zamyka się w jednym cyklu Timera. Rozumiem, ze chcesz w zależności od wychylenia drążka sterować wypełnieniem sygnału PWM a tym samym jasnością Ledów. Do tego chyba potrzeba dwóch Timerów -jeden jako timer a drugi jako generator PWM a nie wiem teraz czy Attiny13 posiada dwa Timery. Zasilanie musisz dodatkowo filtrować kondensatorami 100nF (jak najbliżej nóżek zasilania) i np. 22uF.

Odnośnik do komentarza
Udostępnij na innych stronach

Jest dostępny tylko 1 8 bitowy counter - przy założeniu migania ~ 1khz - odpada jego współdzielenie z analiza pwm odbiornika.

Chciałbym na jednym sygnale mieć trochę więcej niż 77 kroków (0-100% stale, 0-100% migające, może coś jeszcze :)) - będę musiał dodać sztuczna TCNT0_H i to obsłużyć.

Po głowie chodzi mi jeszcze jeden pomysł - skorzystanie z lm7805 do zasilenia attiny - przy obciążeniu lipola poprzez silnik - czy ceramiczne 0.33uF i 0.01uF wystarczy dla stabilnego działania attiny? (Chciałbym także skorzystać z ADC i wprowadzić inne działanie w przypadku niskiego napięcia lipol'a).

Odnośnik do komentarza
Udostępnij na innych stronach

Prototyp/wersja ostateczna gotowa:

Dołączona grafikaDołączona grafika

 

Niestety mam problem z podstawowa funkcjonalnoscia - interpretacja przychodzacego PWM - zdecydowanie skacze pomimo malej rozdzielczosci (1ms = 75 krokow), dodalem nawet pseudo filtrowanie ale roznica pomiedzy zahardcodowanym PWM a prawdziwym na LED'ach jest ogromna.

Obecnie system clock prescaler = 2, Counter prescaler = 64.

mhz ticks/ms tick[us]
cpu 4800000 4800 0,208333333
timer [8bit] 75000 75 13,33333333

 

 

ISR(PCINT0_vect)
{
cli();
//rising
if ((PINB & SRV_ENA) > 0)
{
  TCNT0 = 0;
}
//falling
else
{
  uint8_t temp = TCNT0;
  if (temp > 150)temp=150;
  if (temp < 75)temp=75;
  PWM_val = temp - 75;
}
sei();
}

int main(void)
{
//system clock prescaler = 2 -> 4.8MHz
CLKPR = 0b10000000;
CLKPR = 0b00000001;
TCNT0H = 0;
//setup PINS
DDRB = 1 << DDB3;
//setup ISR
PCMSK = SRV_ENA; //enable PCI on first pin
GIMSK = 0b00100000; // enable PCIE
		//64 counter prescaler
TCCR0B |=  (1 << CS01) | (1 << CS00);

		uint8_t dim = PWM_val;
for (;
{

  if (dim > PWM_val)
   dim-=1;
  else if (dim < PWM_val)
   dim+=1;
  {
   ENABLE_LED;
   for (unsigned short i = 0; i < (dim);i++)
	_delay_us(1000/75);
   DISABLE_LED;
   for (unsigned short i = 0; i < 75 - dim;i++)
	_delay_us(1000/75);
  }
}
//loop
  //go with led action
}

 

Robie jakis fundamentalny blad?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.