LED szalag RGBW PWM
-
- Újonc
- Hozzászólások: 12
- Csatlakozott: 2018. február 19. hétfő, 17:15
LED szalag RGBW PWM
Egy megbízás alapján ismerősnek led szalagokat üzemeltem be lakásának díszítésére. Ezek többsége RGB és RGBW szalagok voltak.
Vezérlésükhöz az MI-Light termékeit használtam (távirányító és csoport vezérlők [FUT038]. Volt olyan szakasz ahol vonal erősítőt használtam volna, [FC-AMF-RGBW] de sehogy se sikerült. Ez a vonal erősítő csatornánként vagyis színenként optocsatoló és egy (szerintem) mosfetből áll. és a megfelelő ellenállásokból nomeg polaritásvédő diódából. Tehát az optó vezérli a mosfeteket és azok meg az újabb tápról a következő led szalag szakaszt így lesz belőle jelismétlő, erősítő. A gond az volt hogy szinte mindig fehér akart maradni az utána lévő (erősített) led szalag, azaz minden szín mindig világítani akart. Csak akkor nem ha jelentős különbség volt a pwm jelek kitöltésében azaz ami már alig kellett szín, az nagy nehezen lehalványodott. Én ezt annak tudtam be hogy 1,5-es MBCU kábelekkel voltak a ledek betáplálásai és a sok kábel hossz miatt annyi kapacitás adódott hogy a vonalerősítő mosfetjei már alig alig zártak le mivel az optók még nyitottak annyira. Megoldást a vonalerősítők helyett csoport vezérlőkkel oldottam meg amelyeket ugyanarra a távirányítóra és ugyanarra a csoportra programoztam. Viszont így lett nekem egy pár vonalerősítőm amit megkaptam ismerősömtől.
Ez volt az előzmény a fő témához.
Saját magamnál ugyanezen vonalerősítőt egy ARDUINO UNO-val szerettem volna vezérelni. pontosabban "analóg" azaz PWM jelével. Egyenlőre egy csatornával próbálkozva.
A gond az volt hogy a 0-255 ig érték elég aránytalanul befolyásolta a fényerőt a led szalagon. 0-10 ig nagyon begyorsult a fényerő változás.
az 1.es értéknél nem volt fényerő 2. érték meg már sokkal több volt mint valami derengés, aztán megint sokkal fényesebb. stb... aztán 12-től sokáig észrevehetetlen a fényváltozás.
Ezért második megoldásként gondoltam csinálok én PWM jelet a delay és a delayMicroseconds utasításokkal kísérleteztem.
void loop() {
digitalWrite(led,HIGH); // bekapcsolva
delay(20);
digitalWrite(led,LOW); // kikapcsolva
delayMicroseconds(20);
}
Nos ennél az értéknél tudtam a legkisebb fényerőt elérni de itt már egy kicsit vibrált. (50Hz körül vagyunk.
Lejjebb nem tudok menni mert delayMicroseconds(18); ig tud az uno
Sőt még látszólag véletlenszerűen pulzáltan felerősödtek a ledek fénye amit tán a többi futó megszakításnak tudható be gondolom.
De kíváncsi vagyok a véleményetekre hogy van ez.
Harmadik lehetőségként merült fel bennem a Adafruit 24-Channel 12-bit PWM LED Driver - SPI Interface - TLC5947
Megoldása de ott meg attól félek hogy a PWM 4MHz frekije túl magas lesz a sok vezetéken. Mer mindez nálam is a lakás díszvilágítása lenne sok méterben.
Tehát egyrészt ötleteket szeretnék egy olcsó megoldásra amivel egy arduino tudna LED szalagok fényerejét színét vezérelni. A derengő fényerőtől egyenletesen a teljes fényerőig. A végső cél pedig több csatornával színeket keverjek a lehető legfinomabban. A már meglévő vonalerősítők felhasználásával.
(Mert hogy sok méter led szalag sok teljesítmény)
Másrészt érdekelne a felmerülő furcsaságok tényleges okai.
Sajnos oszcilloszkópom nincs de még egy frekvenciamérőm se.
De ha kölcsön ad valaki akkor.....
(Minden típus amit írtam gyorsan megtalálható a googléval)
Vezérlésükhöz az MI-Light termékeit használtam (távirányító és csoport vezérlők [FUT038]. Volt olyan szakasz ahol vonal erősítőt használtam volna, [FC-AMF-RGBW] de sehogy se sikerült. Ez a vonal erősítő csatornánként vagyis színenként optocsatoló és egy (szerintem) mosfetből áll. és a megfelelő ellenállásokból nomeg polaritásvédő diódából. Tehát az optó vezérli a mosfeteket és azok meg az újabb tápról a következő led szalag szakaszt így lesz belőle jelismétlő, erősítő. A gond az volt hogy szinte mindig fehér akart maradni az utána lévő (erősített) led szalag, azaz minden szín mindig világítani akart. Csak akkor nem ha jelentős különbség volt a pwm jelek kitöltésében azaz ami már alig kellett szín, az nagy nehezen lehalványodott. Én ezt annak tudtam be hogy 1,5-es MBCU kábelekkel voltak a ledek betáplálásai és a sok kábel hossz miatt annyi kapacitás adódott hogy a vonalerősítő mosfetjei már alig alig zártak le mivel az optók még nyitottak annyira. Megoldást a vonalerősítők helyett csoport vezérlőkkel oldottam meg amelyeket ugyanarra a távirányítóra és ugyanarra a csoportra programoztam. Viszont így lett nekem egy pár vonalerősítőm amit megkaptam ismerősömtől.
Ez volt az előzmény a fő témához.
Saját magamnál ugyanezen vonalerősítőt egy ARDUINO UNO-val szerettem volna vezérelni. pontosabban "analóg" azaz PWM jelével. Egyenlőre egy csatornával próbálkozva.
A gond az volt hogy a 0-255 ig érték elég aránytalanul befolyásolta a fényerőt a led szalagon. 0-10 ig nagyon begyorsult a fényerő változás.
az 1.es értéknél nem volt fényerő 2. érték meg már sokkal több volt mint valami derengés, aztán megint sokkal fényesebb. stb... aztán 12-től sokáig észrevehetetlen a fényváltozás.
Ezért második megoldásként gondoltam csinálok én PWM jelet a delay és a delayMicroseconds utasításokkal kísérleteztem.
void loop() {
digitalWrite(led,HIGH); // bekapcsolva
delay(20);
digitalWrite(led,LOW); // kikapcsolva
delayMicroseconds(20);
}
Nos ennél az értéknél tudtam a legkisebb fényerőt elérni de itt már egy kicsit vibrált. (50Hz körül vagyunk.
Lejjebb nem tudok menni mert delayMicroseconds(18); ig tud az uno
Sőt még látszólag véletlenszerűen pulzáltan felerősödtek a ledek fénye amit tán a többi futó megszakításnak tudható be gondolom.
De kíváncsi vagyok a véleményetekre hogy van ez.
Harmadik lehetőségként merült fel bennem a Adafruit 24-Channel 12-bit PWM LED Driver - SPI Interface - TLC5947
Megoldása de ott meg attól félek hogy a PWM 4MHz frekije túl magas lesz a sok vezetéken. Mer mindez nálam is a lakás díszvilágítása lenne sok méterben.
Tehát egyrészt ötleteket szeretnék egy olcsó megoldásra amivel egy arduino tudna LED szalagok fényerejét színét vezérelni. A derengő fényerőtől egyenletesen a teljes fényerőig. A végső cél pedig több csatornával színeket keverjek a lehető legfinomabban. A már meglévő vonalerősítők felhasználásával.
(Mert hogy sok méter led szalag sok teljesítmény)
Másrészt érdekelne a felmerülő furcsaságok tényleges okai.
Sajnos oszcilloszkópom nincs de még egy frekvenciamérőm se.
De ha kölcsön ad valaki akkor.....
(Minden típus amit írtam gyorsan megtalálható a googléval)
Re: LED szalag RGBW PWM
Szoftveres PWM-et SOHA!
Bármilyen INT vagy egyéb beesik - azonnal széthullik.
Az SPI-s vezérlő jó, mert HWből adja a PWM-t. De van ilyen IIC buszosban is (Szervi/PWM vezérlőként)
Ezek az Arduino 0...255 helyett 0...4096-ig mennek.
Fontos!
Arduino alatt a TIMER1-re épülő PWM az lehet 8, 9 vagy 10 bites felbontású is!
Oszcilloszkópod van:
- hangkártya
- poor man's oscilloscope (8 bites)
Bármilyen INT vagy egyéb beesik - azonnal széthullik.
Az SPI-s vezérlő jó, mert HWből adja a PWM-t. De van ilyen IIC buszosban is (Szervi/PWM vezérlőként)
Ezek az Arduino 0...255 helyett 0...4096-ig mennek.
Fontos!
Arduino alatt a TIMER1-re épülő PWM az lehet 8, 9 vagy 10 bites felbontású is!
Oszcilloszkópod van:
- hangkártya
- poor man's oscilloscope (8 bites)
http://www.tavir.hu - a gazda
Re: LED szalag RGBW PWM
A Timer1 16 bites.
A különálló PWM vezérlő praktikus. Egy halom csatornán tartja a buszon (SPI/I2C) egyszer megadott kitöltési tényezőt. Általában konfigurálható a frekvencia is.
A különálló PWM vezérlő praktikus. Egy halom csatornán tartja a buszon (SPI/I2C) egyszer megadott kitöltési tényezőt. Általában konfigurálható a frekvencia is.
-
- Újonc
- Hozzászólások: 12
- Csatlakozott: 2018. február 19. hétfő, 17:15
Re: LED szalag RGBW PWM
Köszönöm az eddigi hozzászólásokat
Re: LED szalag RGBW PWM
A 9 vagy 10 bites felbontás már regiszterszinten piszkálja a chipet (azaz nem a kezdő szint:) ):
https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
Pl.
https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
Pl.
Kód: Egész kijelölése
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS22);
OCR2A = 180;
OCR2B = 50;
http://www.tavir.hu - a gazda
Re: LED szalag RGBW PWM
Szerintem ez másokat is érdekelhet.Azt írtad "A Timer1 16 bites."
Azt hogy kell elérni hogy a pwm ne csak 0-255 tehát 8 bites legyen?
60 nap alatt Arduino ban csak ezt találtam:
A mikrokontrollerek egy részében belső hardware alapú egység segítségével is előállítható az impulzusszélesség-moduláció. Ekkor a moduláció szintén 0-255 érték közt állítható.
Datasheet 111. oldal:
http://ww1.microchip.com/downloads/en/D ... asheet.pdf
16-bit Timer/Counter1 with PWM
Ennek alapján itt egy megvalósítás:
Kód: Egész kijelölése
/* Configure digital pins 9 and 10 as 16-bit PWM outputs. */
void setupPWM16() {
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); /* no prescaling */
ICR1 = 0xffff; /* TOP counter value */
}
/* 16-bit version of analogWrite(). Works only on pins 9 and 10. */
void analogWrite16(uint8_t pin, uint16_t val)
{
switch (pin) {
case 9: OCR1A = val; break;
case 10: OCR1B = val; break;
}
}
https://arduino.stackexchange.com/quest ... resolution
16 MHz órajelnél maximum 244 Hz lehet így a PWM frekvencia. A felbontás csökkentésével lehet növelni a frekvenciát.
Re: LED szalag RGBW PWM
Eddigi tapasztalatok alapján az ilyen távoli PWM vezérléseknél:
- Kell a stabil, gyors felfutású vezérlőjel (lesarkított, már-már majdnem szinusz nem jó)
- 8 biten is lehet "derengőtől-100%-ig" jelet csinálni alig észrevehető ugrásokkal, (sajnos
2 timer kell hozzá, és össze kell szorozni a jeleket az alsó tartományban), de
jobb megoldás a 10-12-bites felbontás (inkább 12). Ha optocsatolós jelerősítőt használsz, akkor nem árt szkóp és kimérni a minimális kapcsolási időt. Amiket én láttam, abban egy opto hajtotta (jobb esetben egy tranzisztorral) a kapcsoló FET-et, ami aztán alacsony kitöltésnél be is állt szinte analóg nyitásra. Szóval vannak turpisságok ebben a témában is.
- Kell a stabil, gyors felfutású vezérlőjel (lesarkított, már-már majdnem szinusz nem jó)
- 8 biten is lehet "derengőtől-100%-ig" jelet csinálni alig észrevehető ugrásokkal, (sajnos
2 timer kell hozzá, és össze kell szorozni a jeleket az alsó tartományban), de
jobb megoldás a 10-12-bites felbontás (inkább 12). Ha optocsatolós jelerősítőt használsz, akkor nem árt szkóp és kimérni a minimális kapcsolási időt. Amiket én láttam, abban egy opto hajtotta (jobb esetben egy tranzisztorral) a kapcsoló FET-et, ami aztán alacsony kitöltésnél be is állt szinte analóg nyitásra. Szóval vannak turpisságok ebben a témában is.