Así que estoy programando un módulo de cámara de escaneo de línea TSL1401R-LF que 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.
Es por eso que noté 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 decirme si lo que veo 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 azul claro es el pulso CLK y la violeta es la salida analógica.
El problema principal
Parece que el chip está funcionando a una velocidad de reloj más lenta de lo que debería ser. Si delayMicroseconds
asume un reloj de 16 MHz y el chip en realidad está usando su oscilador interno de 8 MHz, por ejemplo, los pulsos se duplicarían en longitud. Podrías comprobar que:
También
La delayMicroseconds
función Arduino 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, que fabrica el microprocesador real), verá que en realidad son notablemente complicadas. Ahora, el compilador los simplificará bastante, pero incluso entonces 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 Arduino tiene varios temporizadores. Estos se ejecutan en paralelo con la CPU que ejecuta su código, y pueden alternar pines o ejecutar fragmentos cortos de código a intervalos muy precisos. La desventaja es que, aunque los temporizadores son una característica central de los chips AVR, rara vez se usan en el mundo de Arduino. Por lo tanto, tendrá que sumergirse en una documentación menos fácil de usar para descubrir cómo usarlos.
Gesto de desaprobación
Herrero
Kaz
Kaz
delayMicroseconds
está desactivada. ¿Está calibrado dinámicamente? Si es así, ¿se supone que debes llamar a algo para calibrarlo?viejo contador de tiempo
viejo contador de tiempo
viejo contador de tiempo
Sam