¿Por qué el Osciloscopio muestra un período de tiempo más largo que el que establece mi código?

1

Así que estoy programando un TSL1401R-LF módulo de cámara de exploración de línea que se lee en una matriz de píxeles de 1 x 128. Me he encontrado con un problema con la precisión de la salida. Básicamente, la cámara se vuelve menos precisa a medida que disminuyen los tiempos de retardo. Para la depuración, lo conecté a un osciloscopio y monitoreé los pulsos SI y CLK enviados al reloj, así como las señales analógicas que provenían de él.

Por eso me di cuenta de que la duración de la señal CLK parecía ser de más de 300 microsegundos. Esto es extraño porque mi código establece la duración en 170 microsegundos. Dado que este es mi primer proyecto eléctrico, no estoy seguro de qué hacer con esto, así que espero que alguien pueda ver mi código y una captura de pantalla del osciloscopio y avisarme si lo que estoy viendo es natural o no. .

Aquí está el código:

int delayTime = 170;

void timming()
{

  //The timing for the impluses was found through direct experimentation.
  //(Meaing that I played around with different delayTimes until the code worked)

  digitalWriteFast(SI, HIGH);
  delayMicroseconds(delayTime/2);
  digitalWriteFast(CLK, HIGH);
  delayMicroseconds(delayTime/2);
  digitalWriteFast(SI, LOW);
  delayMicroseconds(delayTime/2);
  digitalWriteFast(CLK, LOW);
  delayMicroseconds(delayTime);

  for(int i = 0; i < 129; i++)
  {
    digitalWriteFast(CLK, HIGH);
    delayMicroseconds(delayTime);
    digitalWriteFast(CLK, LOW);
    delayMicroseconds(delayTime);
  }

}

Aquí está la captura de pantalla

La línea amarilla es el pulso SI, la luz azul es el pulso CLK y la púrpura es la salida analógica.

    
pregunta Crystal Pritzker

1 respuesta

2

El problema principal

Parece que el chip se está ejecutando a una velocidad de reloj más lenta de lo que debería ser. Si delayMicroseconds asume un reloj de 16MHz y el chip realmente está utilizando su oscilador interno de 8MHz, por ejemplo, los pulsos se duplicarían en longitud. Podrías comprobar que:

  • El oscilador de cristal se está ejecutando y con la frecuencia correcta
  • Los bits de fusible de la atmega están configurados para usar el oscilador externo
  • No hay un conjunto preescalador

También

La función Arduino delayMicroseconds no es una buena manera de hacer que suceda algo cada 85 uS, y digitalWrite tampoco está ayudando en su caso. Si profundiza en la definición de las dos funciones (que son proporcionadas por el proyecto Arduino, no por Atmel, quien crea el microprocesador real), verá que son realmente muy complicadas. Ahora, el compilador los simplificará bastante, pero incluso así te quedarán muchas operaciones y esas operaciones alargarán el pulso.

Podrías reescribir el código para acelerar las cosas, pero hay una mejor manera. El chip AVR utilizado en el Arduino tiene varios temporizadores. Se ejecutan en paralelo con la CPU que ejecuta su código, y pueden alternar los pines o ejecutar fragmentos cortos de código a intervalos muy precisos. El inconveniente es que, aunque los temporizadores son una característica fundamental de los chips AVR, rara vez se usan en el mundo Arduino. Por lo tanto, tendrás que sumergirte en una documentación menos fácil de usar para descubrir cómo usarlos.

    
respondido por el Jack B

Lea otras preguntas en las etiquetas