Trūksta tik papraščiausio dalyko!

Tai štai, po kurio laiko, kuomet atsirado laisvesnio laiko, nusprendžiau grįžti atgal prie WS212 Led šviesos diodų. Optimizavau programą, bei patobūlinau įgūdžius lituojant 0402 standarto varžytes ir kondensatorius.

20180708_194045
Sulituota bandomoji plokštė
ws212_schema
Scema

Viskas gavosi gana neblogai,   kas susiję su mikrovaldikliu veikia nepriekaištingai, tačiau šiesos diodams buvo pasirinktas per „slabnas“ maitinimo stabilizatorius.  Nors pagal jo  aprašymą, šį keitiklį galima apkrauti iki 3A srove, tačiau, jo generuojamoje įtampoje trikdžiai atsiranda jau ir prie 250mA apkrovos. Tuo metu apytiksli trikdžių amplitudė siekia iki maždaug 900mV , ko pasekoje į tai reaguoja tiek mirovaldiklis tiek ir patys šviesos diodai.

Na, o kas svarbiausia, tai, jog schema buvo išbandyta ir ji veikia. Ateitčiai šį mp1584 led draiverį mėginsiu pakeisti į  tps40200.

Kelių sekundžių video (programos kodo nėra)

Ir pabaigai šiek tiek optimizuota programa, tačiau ji tai pat tstinė. Kitaip, tariant čia sau pačiam špargalkė.

Išskleisti

/*
* begantys posukiai.c
*
* Created: 2018.07.07 18:30:48
* Author : Saulius Stasys
*/

#define F_CPU 16000000
#define slide 15 // laiko intervalas šliaužimui

#include <util/delay.h>
#include <avr/io.h>

void on (void)
{
//ON
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,7uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“); //apie 0,6uS
}

void off (void)
{
//OFF
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,35uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“); //apie 0,8uS
}

void rgb (uint8_t r, uint8_t z, uint8_t m)
{
// 8 bitų spalvų kodų generavimui, kiekvienai spalvai
for (uint8_t j=0;j<3;j++) //3 k. kartojimas zaliai raudonai ir melynai
{
uint8_t a=0, d=128,t=1;
if (j==0) a=z;
if (j==1) a=r;
if (j==2) a=m;

for(uint8_t i=0;i<8;i++) // 8 bitų skaidymas
{
if (a-(d/t)>=0) // konkrečios reikšmės vertimas į dvejetainį kodą
{
a-=(d/t); // jei 1 tai platus signalas
on();
}
else off(); // jei ne siauras
t=t*2; // kintamasis matiekai
}
}

}

void simple (uint8_t r, uint8_t z, uint8_t m, uint8_t sk)
{
//paprastas ledu uzdegimas
for (uint8_t i=0; i<sk; i++)rgb(r,z,m);
_delay_us(50);
}

void snake(uint8_t r,uint8_t z, uint8_t m, uint8_t sk)
{
for (uint8_t i=0;i<sk+1;i++)
{
//gyvate
for (uint8_t o=0;o<i;o++)rgb(r,z,m); _delay_ms(slide);

}
}

int main(void)
{

DDRB=1<<DDB1|0<<DDB2;

while(1)

{
//testas
if(PINB&(1<<DDB2))snake(25,9,0,24); // spalva ir kiek ledų
else simple(5,5,5,24);
}

}


Leave a Reply

avatar
  Prenumeruoti  
Pranešti apie