понедельник, 31 декабря 2012 г.

Maihe, MCU, how-to

Немного теории по контроллерам, поехали...
Так как все равно надо техзадание на follow me оформить на бумаге - лучше я в блоге все и опишу.
Итак, задача. Есть машинка на р/у. Управление дискретное, то есть полный вперед, полный назад, полное влево, полное вправо. Итого четыре канала по принципу вкл / выкл. В этом плане производитель меня расстроил конечно, но дело делать надо. В конечном изделии необходимо обеспечить плавный вперед, плавный назад, резкий вперед, резкий назад, плавное влево, плавное вправо, режим торможения, включение и выключение световых приборов.
Ясен перец нужна модернизация - мой выбор добавить контроллер к уже имеющейся аппаратуре и завязать все функции через него. Но это все теория, надо знать что конкретно делать. И еще все это надо запитать от батарейки LiPo (2S). Ну с питанием все более менее понятно и уже опробовано. Идем дальше. Световые схемы на изделии будут потреблять прилично, поэтому надо использовать не прямое включение, а через транзистор. Ну и последнее - для движка нужен Н-мост. Итого:

  1. Питание через некий трансформатор
  2. Включение дополнительного оборудования через транзистор
  3. Н-мост для двигателей (две штуки)
Пункт один уже проработан.
Пункт два - есть готовое решение - микросхема ULN2803 (сборка Дарлингтона), в описании написано "8 ключей до 500 мА каждый до 50 вольт". Взял в корпусе dip18. Остается только проводки от ножек микросхемы провести и усе.











Пункт три сначала сломал мне голову, но решение оказалось тоже простейшее - микросхема L293D. На один движок надо три ноги от микросхемы (одна с шим), питание можно подать прямо от батареи. Все просто, тоже корпус dip16.











Итого, управляющая штуковина - это три маленьких микросхемки в dip корпусах на маленькой платке + кучка разъемов. Что-то типа такого. Они реально мелкие, то что надо.







Теперь про р/у с машинки. Методом научного тыка определил контакты, на которых появляется напряжение при нажатии соответствующих кнопок на пульте.
Они желтым цветом выделены, то есть нажимаем на пульте вперед и на первом контакте вольтметр показывает 3.3В. При назад на втором контакте 3.3В, лево право так же определяется. Вот эти 3.3 можно использовать как логическую единицу на вход микросхемы. По даташиту atmega8 напряжение для отнесения к единице должно быть не менее 60% от напряжения питания. В нашем случае это 5В, т.е. все что больше 60% от 5В - это гарантировано один. Ну и славненько.

Теперь все более менее укладывается в такую схему. Здесь два питания используется - одно для микросхем, второе для диодов. Но это еще вопрос для обсуждения.







Перейдем к списку требований к машинке.

Плавный набор скорости

Реализуем с помощью шим и двух ножек. Вкратце про шим на картинке.
В atmega8 три ножки могут выдавать шим сигнал, нам двух будет достаточно. Еще две ножки нужны чтобы перестановкой на них уровня управлять направлением вращения.







Все это дело должно быть подключено к L293D таким образом. Питание от батарейки плюсом к VS (8), минусом к GND. Движок (ходовой) к выходам OUT1 и OUT2 (3,6). Две ноги (направление вращения) от atmega ко входам IN1, IN2 (2,7). Нога с шим подключается ко входу EN1 (1). Напряжение между OUT1 и OUT2 регулируется скважностью сигнала на EN1.



Резюмируем, нажимаем "вперед" - на входы 2 и 7 подаются 0 и 1 (ну или наоборот, сейчас не важно), на вход 1 подается шим сигнал, меняющийся во времени, скажем линейно за секунду от 20 до, скажем, 90%. На 100% нам нельзя, так как батарея на 7.4В, родные движки на 4.5В. В результате машинка плавно набирает ход. Все просто

Торможение

На пульте держали "вперед", затем отпустили и кратковременно нажали "назад". И наоборот.
Здесь принцип простой - вводим некую переменную isMoving со значениями 0 (нет), 1 (вперед), 2 (назад). Если isMoving <> 0, то включаем кратковременно на полный газ в обратную сторону, или используем режим электродинамического тормоза - есть такая фича в L293D. Что на испытаниях окажется эффективнее, то и заюзаем.
Плюс к этому на то же время можно подать 1 на цепочку стопсигналов.

Полный газ

Здесь надо будет использовать такой принцип - два быстрых нажатия "вперед" или "назад" - сразу полный газ (шим на полную). Т.е. при первом нажатии зафиксировать время нажатия (через какую-то переменную) и,
IF текущий номер цикла - время нажатия <= краткосрочный период
THEN шим на полную.

Влево / вправо

Опять через шим. Можно или сразу выдавать максимально допустимый уровень, или по какой-нибудь формуле его доводить до максимального. Опять же ничего сложного.

Включение / выключение оборудования

Здесь используем рулевое управление и две переменные - isTurning и lightingOn. Два быстрых нажатия "влево" включают оборудование, два быстрых "вправо" вырубают. То есть, нажали влево, пошла обычная процедура поворота, на ножках появились где надо 0,1 и шим, isTurning теперь не 0, а 1 или 2 (в зависимости от направления), зафиксировали время нажатия. Пришло второе нажатие в ту же сторону - проверили сторону, если сторона совпадает и время меньше или равно краткосрочному периоду, то отменяем процедуру поворота, isTurning = 0, включаем глобальную переменную lightingOn

Во второй части начнем писать программу,
С Наступающим!