вторник, 14 мая 2013 г.

Arduino хронограф (часть 3)

Эта статья о программе для хронографа оказывающей минимальное влияние на измерение скорости пули. Об устройстве хронографа можно прочитать в первой части. Там же находится самая простая, но и наименее точная программа. Более точная программа описана во второй части.


Первый вариант программы не мог позволить получить точные результаты, так как стандартные функции Arduino предназначенные для работы с временем имеют ограничения. В следствии этого измерение времени возможно с точностью плюс/минус 4 микросекунды. Помимо этого работа этих функций невозможна без периодического вызова обработчика прерываний по переполнению таймера/счетчика 0. А это может привести к задержкам в вызове обработчика прерываний по внешнему сигналу от фототранзисторов. И наконец минимальную погрешность может вносить компилятор, так как в результате преобразования программного кода в машинные коды время обработки прерывания по внешнему сигналу от первого фототранзистора может отличатся от времени обработки прерывания по внешнему сигналу от второго фототранзистора. На практике эта разница составляет несколько тактов.

Следующая версия программы позволяет получить более точные данные. Это достигается за счет непосредственной работы с таймером/счетчиком 1. Он считает время между сигналами получаемыми от фототранзисторов с точностью до такта. Еще остановлен таймер/счетчик 0 и запрещены все его прерывания. Это сделано для того, чтобы ничего не мешало обработчикам прерываний по внешнему сигналу от фототранзисторов. Остался последний источник вносящий неточность. Это компилятор.

Поэтому я решил написать программу на ассемблере. Этот язык предоставляет полный контроль над микроконтроллером. Ошибка вносимая программой составляет плюс/минус один такт. При тактовой частоте в 16 МГц это будет плюс/минус 0.0625 микросекунд. Большей точности от прибора программными средствами не получить.

Принцип работы программы не изменился. Два прерывания по внешнему сигналу (INT0, INT1) настраиваются на вызов обработчика по спадающему фронту. В обработчике прерывания по внешнему сигналу от первого фототранзистора запускается таймер/счетчик 1. В обработчике прерывания по внешнему сигналу от второго фототранзистора таймер/счетчик 1 останавливается. Затем производятся вычисления и результат передается через UART. Скорость и формат посылки такие же как и в предыдущих программах (9600 bps, 8 data, 1 stop bit).

Программа рассчитана на роботу с сенсором в котором фототранзисторы расположены на расстоянии шести сантиметров.

По приведенной ниже ссылке можно скачать архив с проектом AVR Studio (исходный код, прошивка).

http://yadi.sk/d/2D5__m9O4qgxP

Эта программа написана для ATmega168A.

В отличии от первых двух программ, компилируемых и загружаемых средствами Arduino IDE, чтобы записать последнюю прошивку в микроконтроллер ардуино, нужен программатор и специальная программа. Например, USBasp и avrdude. Но об этом как нибудь в другой раз.