Итак, я программирую модуль камеры с линейным сканированием TSL1401R-LF , который считывает массив пикселей 1 X 128. У меня возникла проблема с точностью вывода. В основном камера становится менее точной по мере уменьшения времени задержки. Для отладки я подключил его к осциллографу и отслеживал импульсы SI и CLK, отправляемые на часы, а также исходящие от них аналоговые сигналы.
Вот почему я заметил, что продолжительность сигнала CLK составляет более 300 микросекунд. Это странно, потому что мой код устанавливает длительность 170 микросекунд. Поскольку это мой первый электрический проект, я не уверен, что с этим делать, поэтому я надеюсь, что кто-то может взглянуть на мой код и скриншот осциллографа и сообщить мне, естественно ли то, что я вижу, или нет. .
Вот код:
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);
}
}
Вот скриншот
Желтая линия — это импульс SI, светло-голубая — это импульс CLK, а фиолетовая — аналоговый выход.
Главная проблема
Похоже, что чип работает на более низкой тактовой частоте, чем должен быть. Если delayMicroseconds
предположить, что тактовая частота составляет 16 МГц, а чип фактически использует, например, внутренний генератор с частотой 8 МГц, длина импульсов удвоится. Вы можете проверить это:
Также
Функция Arduino delayMicroseconds
не является хорошим способом заставить что-то происходить каждые 85 мкс и digitalWrite
не помогает в вашем случае. Если вы углубитесь в определение двух функций (которые предоставлены проектом Arduino, а не компанией Atmel, создавшей реальный микропроцессор), вы увидите, что они на самом деле удивительно сложны. Теперь компилятор значительно упростит их, но даже тогда у вас останется много операций, и эти операции будут удлинять пульс.
Вы можете переписать код, чтобы ускорить процесс, но есть способ получше. Микросхема AVR, используемая в Arduino, имеет несколько таймеров. Они работают параллельно с процессором, который запускает ваш код, и они могут переключать контакты или запускать короткие фрагменты кода через очень точные интервалы. Недостатком является то, что, хотя таймеры являются основной функцией микросхем AVR, они редко используются в мире Arduino. Поэтому вам придется погрузиться в менее удобную для пользователя документацию, чтобы понять, как их использовать.
Тут
Смит
Каз
Каз
delayMicroseconds
отключена. Это динамически калибруется? Если это так, вы должны позвонить что-то, чтобы откалибровать его?Старожил
Старожил
Старожил
Сэм