Atmega328P + H-bridge

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем hotis, 26 авг 2017.

  1. hotis

    hotis Нуб

    Здравствуйте друзья!
    Требуется помощь в настройке работы Н-моста с микроконтроллером.

    Что делаю:
    1. Разрабатываю отдельно плату управления мотором на базе Atmega328P, в будущем планирую микроконтроллером управлять по средствам блютус.
    2. Программу управления разрабатываю в Arduino IDE, далее через Arduino Uno загружаю в микроконтроллер.
    3. Схема разрабатываемого устройства
    [​IMG]
    4. Код управления
    Код (C++):
    int LED_PIN = 9;

    int FORW_PIN = 2;
    int BACK_PIN = 4;

    void setup() {
      pinMode(LED_PIN, OUTPUT);

      pinMode(FORW_PIN, OUTPUT);
      pinMode(BACK_PIN, OUTPUT);
      digitalWrite(FORW_PIN, LOW);
      digitalWrite(BACK_PIN, LOW);
    }

    void loop() {
      forward();
      delay(3000);
      backward();
      delay(3000);
    }

    void forward(){
      digitalWrite(FORW_PIN, HIGH);
      digitalWrite(BACK_PIN, LOW);
      blinkk();
    }

    void backward(){
      digitalWrite(FORW_PIN, LOW);
      digitalWrite(BACK_PIN, HIGH);
      blinkk();
    }

    void blinkk() {
      digitalWrite(LED_PIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(3000);                       // wait for a second
      digitalWrite(LED_PIN, LOW);    // turn the LED off by making the voltage LOW
    }

    Вопрос вот в чём, когда подаю питание светодиод работает как стробоскоп, слышу что дергается двигатель и ничего не происходит. Как только соединяю(в ручную, пинцетом) один из управляющих пинов с питанием микроконтроллера (вывод VCC) мотор начинает вращаться как и положено, что как я понимаю говорит лишь о том, что н-мост исправен. Тогда что не так?

    P.S. Если кому интересно расчёт н-моста производил вот по этой схеме
    [​IMG]
     
    Последнее редактирование: 30 авг 2017
  2. rkit

    rkit Гуру

    А что с фьюзами и настройками иде? Без кварца код собранный для уно работать не будет.
    Еще reset не рекомендуется оставлять висеть в воздухе. но проблема тут вряд ли в нем.
     
    Последнее редактирование: 27 авг 2017
  3. hotis

    hotis Нуб

    С фьюзами всё норм, настроено на 16 Мгц, кварц имеется в схему не включил, забыл :) простая программа на блинк диода (пин15(D9)) загружается и работает верно.
    Вот конфиг (board.txt) для платы:
    Код (C++):
    ATmega328my.name=ATmega328(5V, 16 MHz) wo/ bootloader

    ATmega328my.upload.protocol=stk500
    ATmega328my.upload.maximum_size=32768
    ATmega328my.upload.speed=115200
    ATmega328my.upload.using=arduino:arduinoisp
    ATmega328my.upload.tool=avrdude


    ATmega328my.bootloader.low_fuses=0xFF
    ATmega328my.bootloader.high_fuses=0xDE
    ATmega328my.bootloader.extended_fuses=0x05
    ATmega328my.bootloader.unlock_bits=0x3F
    ATmega328my.bootloader.lock_bits=0x0F

    ATmega328my.build.mcu=atmega328p
    ATmega328my.build.f_cpu=16000000L
    ATmega328my.build.core=arduino
    ATmega328my.build.variant=standard

    Что сделать с reset'ом? Может из-за этого такой эффект микрик просто уходит в ребут? Впаял керамический конденсатор на выводы мотора, не помогло :(
     
    Последнее редактирование: 27 авг 2017
  4. sslobodyan

    sslobodyan Гик

    Мотор то какой? Не подсаживает питание с пересбросом контроллера? По схеме и программе если мост не подключать вообще, то должен периодически переключаться светодиод. Он переключается? Если нет - то не запускается контроллер, до моста еще рано.
     
  5. hotis

    hotis Нуб

    Мотор самый обыкновенный от китайской машинки (Uпит=6,25, Imax=1А)
    Провел эксперимент отпаял контакт 4 пина, светодиод моргает нормально(правильно), припаял обратно; отпаял контакт 6 пина, и тут появилась таже картина, что и в первом посте (светодиод работает как стробоскоп, слышу что дергается двигатель). Искал КЗ, мало ли при спайке начудил, не нашёл :(, визуально и на прозвон мультиметром проблем не выявил. Какие есть мысли?
     
  6. sslobodyan

    sslobodyan Гик

    Чудеса бывают, но очень редко :) Пока до скетча еще рано. Ваша схема не имеет аппаратной защиты от сквозного тока, только программная. Поэтому с висящей базой (отпаянный конец не цеплялся на землю а висел ведь в воздухе?) очень даже реально получить высокий потенциал на обоих входах, что откроет обе диагонали моста. И тогда либо питание просядет до перезагрузки схемы, либо какой-то из транзисторов прервет эти судороги ценой собственной жизни. Поэтому вначале отпаиваем оба конца (4 и 6). Один из них садим на землю. Второй на питание. Моторчик должен крутится в одном направлении. Затем меняем концы местами - с земли на питание и наоборот. Моторчик крутится в другую сторону. Проверяем в это время питание - просадки нет, блок питания держит. И только после разбираемся со скетчами.
     
  7. hotis

    hotis Нуб

    И так:
    1. Отпаял оба пина 4 и 6, прицепил по очерёдно на землю, питание на другой пин припаивать не стал, лишь дотрагивался до 7 пина где у меня +5V. Результат такой - мотор крутит и вперёд, и назад. Т.е. Н-мост исправен, правильно?
    2. Проверить просадки питания не смог(не совсем понял где на источнике или на питании контроллера). Питание у меня от 5хАА.
    3. Во время тестирования заметил вот что, при подаче питания на ногу (пин 4 или 6), светодиод перестаёт моргать и не горит вообще, либо просто слабо(еле-еле) часто(как страбоскоп) помаргивает, моторчик при этом крутит бодро.

    Это что получается не хватает питания для микро, все 100 мА с 78L05, снимает первое же открытие КТ315? Хотя как я понимаю он открывается от тока в 2 мА, правильно?
    Кстати вот расчёт моих токов, по выше указанной схеме:
    Uпит 6,25 В
    Iдв 2,3 А
    Uупр 4,7 В
    h21Э 25 КТ816Г
    IуT1T4 0,09 A
    R1 41,84782609 Ом меньшее 38,3 Ом
    Iупр 0,10 A
    WR1 138 мВТ

    h21ЭКТ315 50
    IуT5 0,002 A
    R2 1989,61039 Ом меньшее 2090 Ом
    IуT5 0,002 A
    WR2 0,01 мВТ
     
  8. AlexU

    AlexU Гуру

    RESET обязательно подтягивать к питанию микроконтроллера. Иначе МК будет перезагружаться когда вздумается.
     
  9. sslobodyan

    sslobodyan Гик

    Простите, слабо понял ваши выкладки. Это базовый ток Т1? 90мА? Если да, то надо на порядок меньше. И резет обязательно.

    PS посмотрел расчет. Таки да, вкралась ошибка на порядок. Даже в примере базовые резисторы 300 ом, а у вас 38. Так и порты могут погореть, о перезагрузке уже молчу.
     
  10. hotis

    hotis Нуб

    После своего глупого вопроса, тут же кинул 10к резистор между 1(Reset) и 7(VCC) пином. Спасибо rkit за ссылку в соседней теме http://zelectro.cc/atmega_main. Все результаты тестов, о которых писал ранее получены уже вместе с этим резистором.

    Прошу прощение, если мои выкладки не понятны. Попробую объяснить. Там где у меня 38,3 Ом в типовом расчёте 24, там где у меня 2.09кОм в типовом расчёте 315 Ом.

    Аааа... ясно, прошу меня простить:oops: В схеме в первом посте (моя схема), номиналы резисторов перепутаны, должно быть наоборот, но спаяно всё верно :) Мотор крутится :)

    теперь по расчётам - ток базы КТ315г (Т1, здесь и далее обозначение на моей схеме) 2мА, ток коллектор-эмиттер ~100 мА, практически предельный для данного транзистора (КТ315г), он же ток базы КТ816 (Т2) и КТ817 (T5). А на мотор согласно расчётов может идти ток до 2,3А. Скажете много и будете правы, но из расчёта на 1,5А, моторчик не справлялся даже с небольшим сопротивлением, что странно, много думать по этому поводу не стал. Замеры при застопореном моторчике, показали максимальный ток потребления 0,96А через текущий Н-мост, хотя при питании напрямую (без Н-моста) от батареек выдало 1.06А, видимо это связано с падением напряжения на транзисторах.
     
  11. sslobodyan

    sslobodyan Гик

    Стоп, теперь у меня полная путаница.
    1. Если первая картинка со схемой не правильная - то или поправьте или ниже выложите правильную. Путает.
    2. Пока интересует базовый реальный ток 315. Точно не более 10 мА?
    3. В типовом расчете 24 ома резистор в базе ключевого транзистора, а не управляющего. Что-то я сильно сомневаюсь в вашей электронике :) То, что моторчик крутится - еще не показатель правильной работы схемы.
     
  12. hotis

    hotis Нуб

    схему в первом посте скорректировал

    точнее не бывает, замер мультиметром по шкале 20 мА, показал 0,65 в свободном состоянии двигателя и 0,03 в застопореном (как я понимаю единицы измерения миллиамперы, то есть ток управления(базы) КТ315 меньше 1 мА). Получается ток не дотягивает даже до расчётных 2 мА.

    Ещё раз - там где в типовом расчёте 24 у меня стоит 38.3 Ом, это точно измеренное значение. В чём именно Вы сомневаетесь? замерил ток идущий на мотор по шкале 10А, в свободном вращении 0,3; в застопореном 0,65 (как я понимаю единицы измерения амперы).

    При экспериментах микроконтроллер оставался в цепи (подавалось питание) однако светодиод моргал только тогда, когда питание на резисторы R1 и R3 (один в этом момент был припаян к земле) не подавалось. Как только я подключал питание и начинал работать мотор, светодиод переставал мигать. Мне данный факт не понятен :( Куда ушёл весть ток с выпрямителя (78L05), если управляющий ток менее 1мА.
     
  13. sslobodyan

    sslobodyan Гик

    Теперь ни в чем не сомневаюсь. Теперь схема абсолютно адекватная.
    Предлагаю немного поменять в коде местами строки с включением диагоналей. Попробуйте в каждой из команд вначале переводить нужный пин в низкий уровень, и только потом (а лучше с задержкой в пару миллисекунд) переводить другой пин в высокий уровень. Сейчас получается, что вначале выставляется высокий уровень, а так как на другом плече моста также еще высокий уровень, то идет сквозняк. Подсаживается напряжение питания и контроллер пересбрасывается.
    PS могу ошибаться - тапками не кидать
     
  14. hotis

    hotis Нуб

    вот что я поменял в скетче
    Код (C++):
    void forward(){
      digitalWrite(FORW_PIN, LOW);
      digitalWrite(BACK_PIN, LOW);
      delay(100);
      digitalWrite(FORW_PIN, HIGH);
      delay(100);
      digitalWrite(BACK_PIN, LOW);
      blinkk();
    }

    void backward(){
      digitalWrite(FORW_PIN, LOW);
      digitalWrite(BACK_PIN, LOW);
      delay(100);
      digitalWrite(FORW_PIN, LOW);
      delay(100);
      digitalWrite(BACK_PIN, HIGH);
      blinkk();
    }

    к сожалению это ничего не решило, всё что изменилось, пропало мерцание светодиода, моторчик продолжает цокотать, но не крутиться. Всё так же к вращению приводит замыкание одного из пинов управления и питания микроконтроллера.
     
  15. sslobodyan

    sslobodyan Гик

    Код (C++):
    int LED_PIN = 9;

    int FORW_PIN = 2;
    int BACK_PIN = 4;

    void setup() {

      pinMode(FORW_PIN, OUTPUT);
      pinMode(BACK_PIN, OUTPUT);

      digitalWrite(BACK_PIN, LOW);
      digitalWrite(FORW_PIN, HIGH);

      pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);
    }

    void loop() {

    }
     
    И на всякий случай вместо использованных ранее пинов 2 и 4 поставьте другие - может там порты уже повыгорали.
     
  16. hotis

    hotis Нуб

    Не знаю что не так, но пока нужного результата нет :(
    Залил ваш код, результат такой же как и в начале темы (слышится подергивание двигателя, светодиод моргает как стробоскоп), заменил ноги на 2 и 3 пины (D0 и D1), без изменений, тоже самое поведение.
    Когда я заливаю прошивку на макетке, то всегда её проверяю на светодиодах, они то светятся как положено, кроме того микроконтроллер ни разу не нагрелся хоть на чуть чуть, так что думаю со всеми ногами всё в порядке. А вот с чем не порядок не понятно :(.

    Да кстати, когда поменял пины (в последнем тесте) снова попробовал замкнуть одни из них на VCC, двигатель крутиться, аналогично замкнул другой - двигатель крутится(в обратном направлении), Светодиод при этом не горит, словно на микрик вовсе не поступает питание, да и по идеи программа то выдаёт положительное напряжение на одну из ног, тогда почему мотор всё равно крутился, ведь по идеи во время теста появляется ситуация одновременной подачи питания на оба управляющих пина.
     
  17. sslobodyan

    sslobodyan Гик

    Это я не понял. То есть вы на включенном устройстве отдельным проводком просто подаете питание на ногу микроконтроллера?
     
  18. hotis

    hotis Нуб

    можно сказать, и так. Только вместо провода у меня пинцет. Я как бы "обнимаю" им пин №7(VCC) и управляющий пин №2 (или №3), и пока так держу мотор крутиться в одну или в другую сторону.
     
  19. sslobodyan

    sslobodyan Гик

    Сильно надеялся, что таки нет. А оно таки так :)
    А вы понимаете, как в это время порту контроллера, который пытается выставить ногу 0 а вы ему питание в морду лица? Дернется разок - и привет порту. Порт переживает 10 мА, а не ток короткого замыкания.
    Я ж высылал самый примитивный скетч. Там выставилось напряжение в одну сторону - и все. Вот на нем и надо отлаживать мост. Хотите вращения в другую сторону - отключаете питание, перепаиваете проводки либо меняете уровни в прошивке и перепрошиваетесь. Затем только питание включаем и смотрим на реакцию. И ни каких пинцетов на подлете! Попалите все ноги. Потому и тухнет светодиод, что КЗ в порту.
     
  20. hotis

    hotis Нуб

    допустим КЗ на порту. Однако, что до экспериментов с пинцетом, что после, моторчик от управляющего сигнала не крутится. Более того, если поставить микрик на макетку, с вашей или моей прошивкой, подключить на управляющие ноги светодиод (через резистор, естественно), то скетч отрабатывает на ура.

    Но и это не самое интересное... Вот ещё какой любопытный факт. Если снять микрик и провести опыт с пинцетом, то моторчик крутится. Как так? Если я правильно понимаю, то управляющая нога висит в воздухе и моторчик работать не должен, ан нет. Вот как так?