da
alex79 » 5 giu 2012, 11:59
Ciao,
devo implementare un algoritmo che simuli l'effetto candela elettronica.
Ho 3 led che si accendono/spengono contemporaneamente.
Ho preso spunto dal tuo interessante algoritmo e l'ho modificato un po' (vedi di seguito).
Ho usato solo il led G. Ho modificato P_SPETTRO e la funzione set_spettro, ho giocato un po' con la variabile pos_pwm (faccio si che non superi la soglia di 85).
L'effetto è molto buono (ho un micro che viaggia a 16Mhz) però la candela resta spenta per troppo tempo. Mi spiego, la candela passa molto dolcemente da accesa a spenta.
Io vorrei creare un effetto di leggere dissolvenza senza che l'occhio veda mai la candela spenta del tutto e velocizzare un po' il movimento di dissolvenza.
Non so dove modificare il tuo algoritmo per rendere questo effetto. Mi puoi dare qualche dritta?
Grazie
Alex
- Codice: Seleziona tutto
//#define P_SPETTRO 767
#define P_SPETTRO 255
unsigned char pos_pwm;
unsigned char liv_G; // livelli da 0 a 255 dei tre colori
unsigned short pos_spettro; // posizione da 0 a 767 nello spettro
char base_tempi; // bit attivato al completamento di un' onda
/******************************************************************************/
/* set_spettro */
/* calcola la configurazione dei tre colori in base alla posizione nello */
/* spettro */
/******************************************************************************/
void set_spettro(void)
{
short p;
p = pos_spettro;
if (p < /*256*/ 128)
{
liv_G = p;
}
else if (p < /*512*/ 256)
{
p &= 0xff;
liv_G = 255 - p;
//p &= 0x7f;
//liv_G = 127 - p;
}
else
{
p &= 0xff;
liv_G = 0;
}
}
/******************************************************************************/
/* inc_spettro */
/* incrementa la posizione dello spettro in modo circolare */
/******************************************************************************/
void inc_spettro(void)
{
if (pos_spettro != P_SPETTRO) pos_spettro++; else pos_spettro = 0;
}
/******************************************************************************/
/* inc_spettro */
/* decrementa la posizione dello spettro in modo circolare */
/******************************************************************************/
void dec_spettro(void)
{
if (pos_spettro) pos_spettro--; else pos_spettro = P_SPETTRO;
}
#endif
/**
* @brief Main program.
* @param None
* @retval None
*/
void main(void)
{
uint32_t i,dato;
// SetUp Clock from external quartz that must be 16MHz
CLK_DeInit();
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); /* Configure the Fcpu to DIV1*/
gpioSetup();
/* Enable Interrupts */
enableInterrupts();
#ifdef TEST_LED_PWM
// prova
liv_G = 255;
base_tempi = 0;
pos_spettro = 0;
#endif
while(1)
{
#ifdef TEST_LED_PWM
// gestione forme d' onda PWM
if (pos_pwm < liv_G)
dato = 0x80000000;
else
dato = 0;
lumen_PWM_test(dato);
pos_pwm++;
if (pos_pwm > 85)
pos_pwm = 0;
if (!pos_pwm)
{
// accensione impulso di base tempi al completamento dell' onda
base_tempi = 1;
}
// programma di dissolvenza incrociata
if (base_tempi)
{
base_tempi = 0;
inc_spettro();
set_spettro();
}
#endif
}
}