xader Opublikowano 27 Kwietnia 2012 Opublikowano 27 Kwietnia 2012 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) 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?
e-mir Opublikowano 27 Kwietnia 2012 Opublikowano 27 Kwietnia 2012 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.
xader Opublikowano 27 Kwietnia 2012 Autor Opublikowano 27 Kwietnia 2012 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).
GPiotr Opublikowano 2 Maja 2012 Opublikowano 2 Maja 2012 Można spokojnie wpakować 7805 - pobór prądu uC jest tak mały, że spokojnie wystarczy nawet wersja SMD 7805. ADC podpinasz do dzielnika zrobionego na lipolu i gotowe.
xader Opublikowano 6 Maja 2012 Autor Opublikowano 6 Maja 2012 Prototyp/wersja ostateczna gotowa: 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?
Rekomendowane odpowiedzi