The Робот.
Часть 3. Герой сопротивления.
Свинтус решительно отказывается ездить. При включении у него "отказывает" левое колесо, и он, лихо вращая правым,
выписывает вокруг своей "левой толчковой" немыслимые кренделя. Причем настолько немыслимые, что пока этого гада
поймали, он умудрился: а) сломать "нюхалку" - свой датчик касания препятствия, б) оторвать провод от аккумулятора.
Пришлось мне взять таймаут на размышления - надо было прикинуть что к чему.
Но как ни крути, а выход напрашивался только один - раз одно колесо активно вертится, а второе стоит, значит надо
на них питание подавать по-разному - на один двигун меньше, на второй больше.
А как это можно сделать, если мы ими рулим с помощью ATMEL'овского микроконтроллера? Ну конечно только с помощью ШИМа!
Внимательно читаю статью с сайта DIHALT'a
AVR. Учебный курс. Использование ШИМ
, вроде все более-менее понятно, но сразу возникает вопрос, что раз уж мы беремся вертеть двигателями с
разной скоростью, то неплохо бы понимать, а насколько они по-разному у нас вертятся? Значит надо посчитать
обороты колеса А еще неплохо бы сделать датчики касания не просто тупо спереди, а разделить их на левый и правый
(а в иделе еще и на передний правый/левый и задний правый/левый, но это можно решить на программном уровне,
запараллелив датчики и отслеживать направление движения). А еще задолбался я каждый раз вытаскивать
атмелку из "кроватки" для перепрошивания, поэтому ноги SCK,MISO,MOSI лучше
не трогать. USART тоже задействовать жалко - вдруг пригодится? И в итоге пришел я к такой мысле, что ног у
тиньки2313 маловато будет :)
Посчитаем мои потребности в ногах: две ноги на левый и правый контакные датчики.
Две ноги на енкодеры для подсчета оборотов колеса. Две ноги на включение/выключение двигателей
(сигналы Enable1,Enable2) - их заводим через ШИМ, соответственно это ноги OC1A(PB3) и OC1B(PB4).
Еще четыре ноги надо для Input1,2,3,4/ СТОП!!! Зачем тут использовать четыре ноги, когда логика включения движков
как правило такая, что Input2=!Input1, а Input4=!Input3. Значит берем сигнал с одного вывода МК (например PB2),
заводим его на Input1 L293D, и его же, но через логический элемент НЕ, на Input2. Аналогично поступаем с Input3
и Input4.
В итоге получается примерно вот такая схема:

и вот такой несложный исходник на С (датчики касания и енкодеры еще не
задействованы).
Вроде все логично, в Протеусе все работает, значит можно травить плату и воплощать мысль в железе.
Ну и тут происходит как всегда - наши фантазии разбиваются о суровые реалии физики:
1. Двигатели не крутятся
2. Они еще и противно пищат. Я в шоке - я раньше и не подозревал, что можно делать спикеры из двигателей! :)
Над этой проблемой я бился два дня - камрады в чате сказали, что у меня частота ШИМа лежит в звуковом диапазоне,
соответственно движки и пищат, а чтобы это пофиксить, надо задрать частоту. А куда??? И так при 8МГц и при 8-ми
битном FastPWM частота составляет 31кГц, что уже за пределами восприятия человеским слухом.
Пришлось тащить
Свинтуса в "стационар" - исследовать его на осцилографе, где и выяснилось, что fuse-bit CKDIV8 у меня не был
сброшен, следовательно реальная частота МК составляла 1МГц, ну а частота ШИМ - 8.3кГц :)
Окрыленный я побежал домой, перешил фьюзы, поправил исходник.... Но эффект остался прежним - одно колесо стоит,
а второе бешенно вертится....
Что уже я только не делал - выставил одинаковые значения счетчика ШИМ на правый и левый двигатели,
мерял напругу (12.04V и 11.97V). Оторвал двигатели, вместо них взял новый и неюзанный, втыкал его в оба канала
поочереди... Результат один - на Out1,2 движок вертится еле-еле, а на Out3,4 (этот же самый движок!) -
крутится как очумелый.
Блин, восстание машин, ей-богу :)
Короче Свинтусу присвоено очередное звание - герой сопротивления :)
11/11/2009.
Продолжение следует.