Efecto de respiración LED

0

Por favor considere el siguiente código:

for(;;)
{
 int i=0;  
 TPM1C2VL  =~ (i<<1); // Channel Value(Lower)Register.
 TPM1C2VH +=TPM1C2VL; 
}

CÓDIGO ALTERADO

unsigned long duty[420] = {<from zero to 65535>}

for(i = 0; i != 420; i++ )
   {
  TPM1C2VL =~ duty[i];
  TPM1C2VH += TPM1C2VL;
}
for( ; i != 0; i-- )
{
  TPM1C2VL =~ duty[i];
  TPM1C2VH += TPM1C2VL;
} 

También después de la modificación, no hay ningún cambio efectivo, ya que ahora el LED parpadea de forma aleatoria

Sólo quería aplicar un efecto de respiración en un LED. Solo para probar, escribí el código con la intuición básica de cómo se supone que funciona, no esperaba que funcionara de una sola vez, pero sí.

Ahora mi pregunta es, ¿CÓMO REVERSAR ESTE EFECTO? es decir, lentamente el LED se apaga a cero. No soy capaz de inducir una inversión de este efecto. Estoy usando PWM de MC9S08DZ60 . He realizado los siguientes ajustes: Prescaler = 1.

Módulo contador = 65535.

Periodo = 4.096ms.

Borde alineado.

En el canal 1.

PWM: Establecer OUtput en comparar.

Canal de servicio = 4.095ms.

    
pregunta sheetansh

2 respuestas

1

Aquí hay un código de ejemplo que debería comenzar. Podría implementar el 0 completo - > 65535 - > 0 recuento de 16 bits, pero como su código solo cuenta por 256 y parece ser la mitad de la rampa que está buscando, he hecho lo mismo.

Puede ser divertido escribir otro experimento que seleccione el registro u otros valores de una tabla para ver cómo cambia la apariencia, pero si todo lo que quieres es una simple rampa hacia arriba y hacia abajo, algo como esto debería hacerlo.

TPM1C2VL = 0;       // not modifying the ...VL register, just zero it
for(;;){
   int i;

   // Up counter
   for(i = 0; i != 256; ++i ){
  TPM1C2VH = i;
  ;  // maybe some delay here
   }

   // Down counter
   for( ; i != 0; --i ){
  TPM1C2VH = i;
  ;  // maybe some delay here
   }
}
    
respondido por el JRobert
3

Necesitas hacer dos cosas: la primera es hacer que desaparezca. El brillo del LED está determinado por el valor en el registro TPM1C2VH. cambiando TPM1C2VH está cambiando el brillo. Para disminuir el brillo, debes cambiar la dirección para contar en la dirección opuesta.

El segundo bit que debe hacer es detectar cuándo aumenta y cuándo disminuye. Necesitas algo como una declaración if, como así:

if (TPM1C2VH >= max_threshold)
  // decrease TPM1C2VH
else if (TPM1C2VH <= min_threshold)
  // increase TPM1C2VH

Combina estos dos y tendrás tu LED de respiración.

    
respondido por el stanri

Lea otras preguntas en las etiquetas