Стробоскоп на Tiny. Эксперименты.
15/09/2009 - 21:00
Pavel Bobkov
На самом деле я не являюсь поклонником компьютерного моддинга, но, впервые увидев вентилятор со стробоскопом, загорелся его сделать. Уж больно красивая вещь. Однако, как это обычно бывает, руки постоянно не доходили до задумки. Года полтора, наверное, вентилятор со светодиодами валялся у меня в ящике. И, наконец, настал его звездный час.
Для начала я отрисовал в Eagle схемку. Микроконтроллер tiny15, стабилизатор 7805, резисторы для светодиодов, фильтр для тахосигнала и разъем для программирования. Микрухи в корпусах soic8, резисторы и конденсаторы – 1206. Плату решил сделать круглой формы, чтобы можно было закрепить ее с обратной стороны вентилятора. Схему не привожу по причинам описанным ниже.
Всех деталей под рукой не оказалось, а ждать, когда придет заказ, не было терпения. Поэтому, вытравив плату, я спаял ее с резисторами 0805 и без стабилизатора. Благо источник питания у меня двухканальный, можно отдельно подать 5 вольт для микроконтроллера и 12 для вентилятора.
Когда все было готово, я напоролся на первый косяк. Разъем для программирования оторвался вместе с дорожками после первого же подключения программатора. Пришлось подпаиваться проводами к ножкам микроконтроллера.
С тиньками я имел дело всего пару раз, да и то давно. Поэтому было довольно непривычно программить - ОЗУ нет, частота внутреннего генератора низкая, всего 2 восьмиразрядных таймера.
Сначала я решил попробовать сделать одну вспышку на оборот вентилятора. Что может быть проще - по сигналу внешнего прерывания моргаем светодиодом. Ага.. не тут то было. Внешнее прерывание наотрез отказалось работать. Все перепробовал, залез даже в старые проекты – не работает и все тут. Позднее я выяснил в чем дело – я просто не на ту ножку завел тахосигнал. А все потому, что в книге Евстифеева “Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel” на 18-ой странице на рисунке 14 опечатка. Внешнее прерывание на PB2, а не на PB1. Самое смешное, что я уже натыкался на эти грабли год или два назад. В книге, которая у меня была тогда на руках, я исправил опечатку, а сейчас я пользуюсь другим экземпляром, поэтому и облажался.
Сначала я решил попробовать сделать одну вспышку на оборот вентилятора. Что может быть проще - по сигналу внешнего прерывания моргаем светодиодом. Ага.. не тут то было. Внешнее прерывание наотрез отказалось работать. Все перепробовал, залез даже в старые проекты – не работает и все тут. Позднее я выяснил в чем дело – я просто не на ту ножку завел тахосигнал. А все потому, что в книге Евстифеева “Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel” на 18-ой странице на рисунке 14 опечатка. Внешнее прерывание на PB2, а не на PB1. Самое смешное, что я уже натыкался на эти грабли год или два назад. В книге, которая у меня была тогда на руках, я исправил опечатку, а сейчас я пользуюсь другим экземпляром, поэтому и облажался.
Ладно. Сделал опрос вывода микроконтроллера в основном цикле программы. На каждый перепад тахосигнала моргал светодиодами. Оказалось, что тахосигнал за один оборот вентилятора дает два импульса, а не один, как я раньше думал, и если на каждый импульс давать вспышку картинка получается не красивой, потому что частота вспышек при этом будет не кратна 7-ми. Это тоже поборол. Заработало. Светодиоды вспыхивали один раз за оборот и вентилятор, вращающийся с большой скоростью, казался неподвижными. Однако картинка была довольно тусклой. Ну, это и понятно – вспышка то короткая. А длиннее сделать нельзя – картинка размывается. Выход один – увеличить количество вспышек за оборот.
Немного подумав, начал кодить такой алгоритм. С помощью таймера Т0 измеряю время одного оборота крыльчатки вентилятора. По первому перепаду тахосигнала считываю значение счетного регистра TCNT0 и перезапускаю таймер Т0. Значение счетного регистра делю на 7 и получаемое число записываю в таймер T1. В прерывании таймера Т1 моргаю светодиодами.
Некоторое время ничего не получалось. Прога вела себя, как бог на душу положит. Потом я понял, в чем дело. В прерывании я не сохранял регистр SREG и, наверное, иногда происходило затирание флагов. В итоге я добился своего, и светодиоды начали вспыхивать семь раз за оборот.
Неплохо. Картинка стала намного ярче. Вентилятор как будто бы стоял на месте. Но опять косяк. Поиграв с напряжением питания, я выяснил, что на некоторых частотах вращения картинка получается размытой. Поразмыслив немного над этой темой, я пришел к выводу, что дело в делении. Деление целочисленное и из-за этого возникает ошибка – расхождение между требуемой частотой и реальной.
Как это разрулить? Нужно увеличить разрешение по частоте. То есть более точно измерять период вращения крыльчатки вентилятора. Вообщем я запустил таймер Т0 на более высокой частоте и с помощью дополнительной переменной сделал его типа шестнадцатиразрядным. По перепаду фронта тахосигнала считывал значение таймера T0 и переменной и делил на 7. Процедуру деления пришлось переписать, потому что теперь нужно было делить 2-ух байтное число. Частоты подобрал так, чтобы при делении получалось число, укладывающееся в один байт.
Результат стал намного лучше. Добавил еще усреднение - среднее арифметическое между старым значением таймера Т1 и только что вычисленным. Это дополнительно добавило стабильности картинке. Потом еще долгое время игрался с процедурой обкатки фронтов тахосигнала, но особых результатов это не дало.
Да, еще частоту внутреннего генератора поднял на максимум, записав в регистр OSCCAL число 255.
Comments
+
RSS feed for comments to this post