Проблема с прерываниями.
- Войдите на сайт для отправки комментариев
Всем привет. В ходе познания основ программирования и робототехники столкнулся с следующей проблемой:
Имеется Ардуино Уно, драйвер моторов robocraft.ru/blog/arduino/657.html, тележка с двумя ведущими колесами, и оптический энкодер( колесико прокрутки из оптической мыши) установленное в центре тележки.
Идея: Робот передвигается вперед и одновременно считает колличество проиденного пути.
Одновременно выводит в Serial monitor пройденный путь. При выключенных двигателях, при прокрутке колеса в ручную все нормально работает, но стоит только включить питание на моторы, начинается самопроизвольное нарастание пройденного пути, даже если убрать вход с энкодера. Почему происходят ложные прерывания и как их устранить мне не понятно.
#include <Servo.h> #include <LMotorShield.h> LMotorShield lms; float encoder_left = 0; void setup() { { pinMode(2,INPUT);//вход 2 attachInterrupt(0, Encoder_L, RISING); Serial.begin(9600); lms.begin(LMS_SERVOS); } pinMode(3,OUTPUT); // Motor A скорость pinMode(7,OUTPUT); // Motor A направление pinMode(11,OUTPUT); // Motor B скорость pinMode(8,OUTPUT); // Motor B направление } void Forward() { // Подпрограмма движения робота вперед digitalWrite(3,HIGH); digitalWrite(7,LOW); digitalWrite(11,HIGH); digitalWrite(8,LOW); } void loop() { Forward(); } void Encoder_L(){ encoder_left += 0.1; Serial.println(encoder_left); }
Ловим помехи? Про потягивающий резиcтор не забыли. Либо внешний присобачить, либо внутренний подключить digitalWrite(2,HIGH);
Да скорее всего помехи, рядом стоит двигатель. Подтягивающий резистор ставил та фототранзисторе на выходе, пробовал отдельно подтянуть ПИН 2 к GND резистором на 5,1 кОм. Все равно идет самопроизвольный набег счетчика, потом вообще виснет. По вашемк совету попробовал сделать так
Не помогло. Может что то упустил?
Если энкодер не подключен, то без подтягивания ПИН2 на GND происходит произвольное срабатывание прерываний, если подтянуть, то все нормально. Если еще подцепить энкодер, то опять происходит произвольное прерывание
Ну во первых, подтяжку стоит достаточно включить один раз. там же где pinMode выставляете. А не каждый раз в цикле. Ни на что это не влиется, но просто в каждом цикле - одно лишние действие.
Во вторых. Нужно разобратся куда вы вообще пин хотите подтягивать. Внутреня - подтягиваеть умеет только к питанию.
То есть когда энкодер не трогаем - на пине стоит 1.
Так если вы внутренюю включили "к питанию", а внешнюю "к земле", то вы получили "кто кого перетянет" (не страшно, не опасно, просто "может не работать").
Но опять-таки нужно решить куда же вы тянуть хотите. Зависит от того что вы подключили на выход С энкодера (обычно средняя нога). Если туда вы подали землю, то "тянуть" нужно к питанию (+5v) (это обычная схема включения). Тянуть можно либо внутреней, либо внешней.
Если вы на C подали питание, то тянуть нужно "к земле" (тут уже только внешнюю использовать прийдется).
Если "подтяжки не помогли", то тут уже нужно смотреть что у вас происходит с питанием. Возможно оно прыгает (а зависы говорят в эту пользу). Может коротнули что-то, либо моторы слишком мощьные и просаживают питание.
У оптической мышки как я понял стоят фототранзистор сдвоенный, то есть центральная нога это сдвоенный коллектор, а по бокам два эмиттера (или наоборот, не помню) . Я подал на центральную ногу GND, а с крайней сделал вывод на ПИН2, подтянув крайнюю ногу к GND через резистор 5,1 кОм. На драйвере моторов стоит конденсатор на 100mF, должен убирать просадку в напряжении, моторы вот такие www.aliexpress.com/product-fm/505652927-2pcs-lot-High-quality-tyre-Reduction-motor-fasteners-TT-motor-intelligent-car-wheels-wholesalers.html
Сам чайник, поэтому не могу разобраться.
Попробую разобрать еще раз энкодер и проверить, может действительно КЗ
Не правильно написал. На центральную ногу подал +5 В. С крайней выход на ПИН и подтяжка к GND
Моя проблема так и не решена. Двигатели создают помеху на фототранзистор. Попробовал соединить контакты двигателя керамикой на 0,1 мкФ. И каждый вывод двигателя соединил с корпусом двигателя так же керамикой 0,1 мкФ. Не помогло. Подключил двигатель поменьше, с ним проблем нет, но он мне не подходит. Возможно ли еще как нибудь загосить помехи от электромотора.
Попробуйте уменьшить резистор подтяжки до 1 кОм
Попробуйте уменьшить резистор подтяжки до 1 кОм
Не помогло. Попробовал вообще убрать подтяжку. Фототранзистор на свет вообще перестал реагировать, а на двигатель осталось по прежнему.
Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?
Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?
Пока кроме замены двигателя на менее мощный ни чего не придумал. А как у вас реализовано решение энкодера, и какой ДД используете?
Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?
Пока кроме замены двигателя на менее мощный ни чего не придумал. А как у вас реализовано решение энкодера, и какой ДД используете?
Я использую готовый энкодер и платформу
http://www.dfrobot.com/index.php?route=product/product&filter_name=encod...
http://www.dfrobot.com/index.php?route=product/product&path=37_111&product_id=97#.UEy_W40aOSo
Пробывал ставить кондеры на двигатели и на питание, разделил питание контроллера и моторов, все бесполезно! даже когда один энкодер отключен, он все равно что то считате!
ximik666 Какой драйвер моторов используете на 1 А или на 2 А?
Вот такой http://robotshop.su/e-store/catalog/203/1176/ , на 1.2 ампера
Добрый день.
Проблема один в один. Вот только драйвер двигателя другой ( 4 А на канал):
http://www.electronshik.ru/card/drayver-kollektornogo-dvigatelya-4-kanal...
Шунтирующий кондер стоит на моторчике (1шт на каждом).
Вышеперечисленные способы не пробовал, но думаю смысла нет - т. к. повторюсь - набор тот же самый.
Так что тоже очень жду новых идей - что можно сделать :)
Со своей проблемой я разобрался. Может кому поможет информация.
Оказалось, что помехи возникают не на энкодере, а их содает драйвер двигателей. У меня по схеме датчик втыкается в драйвер, а из него уже идет провод на контроллер. По схеме должен был сигнал выходить такой же как и входить, но в жизни оказалось все иначе :) Как только я сигнальный провод от энкодера подключил напрямую к Ардуино, сразу стали идти нормальные импульсы.
Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?
Есть решение проблеммы: Устраняем помехи при прерываниях
Столкнулся с похожей проблеммой с внешним прерыванием INT0. Коммерческий проэкт, вешаю на пин 2 монетоприемник по прерыванию. В обработчике прерывания подсчитываю импульсы, прибавляю к сумме. Все работает, но...
Если отверткой или щупом тестера касаюсь земли или пин 2 - происходят хаотические прерывания.
Менял номиналы подтягивающих резисторов, а позже стягивающих. Паралельно входу ставил конденсаторы, диоды. Менял питание, ничего не помогало. Сделал по другому: пин 2 соединил с пином 4, который назначил на вход и в обработчике добавил условие что считать импульсы можно, если пин 4 в этот момент притянут к земле.
Причину хаотических прерываний я так и не понял, но ясно одно - она не связана с уровнем на пине 2
вот код:
а зачем отклчюаешь прерывание? есть вероятность что пока пин считываешь еще одно придет?
нельзя сразу с 4 пина на прерывание повесить? или при попадании монеты дается 2 сигнала? что монета есть и какая монета на 4 пине. так?
можно написать так
сразу подтяжка включится. не надо digitalWrite
в прерывании можно и не считывать пин. просто флаг менять. а в лупе по флагу считывать
Монетник это таже кнопка между пином и землей, скорость максимум 8 импульсов в секунду - еще одгодно не придет.
Так как идут хаотические прерывания когда прикасаешься железным предметом неважно на какой пин прерывания вешать, они все равно херачат (проверено)и набрасывают денег в платежную систему что недопустимо. Выявлено что появление ложных прерываний не связано с состоянием на пине прерывания, поэтому я обьеденил 2 пина вместе и тем самым не разрешаю дейстия обработчика при помехе (хотя можно и сосояние самого пина прерывания опрашивать в обработчике завтра попробую чтобы ноги экономить
По поводу pullup это я извращался по разному, рабочий вариант, на результат не повлиял
Если вход притянут к массе, это ещё не даёт гарантий помехозащищённости. Ибо помехи с удовольствием приходят и по общему проводу. Это, пожалуй основная проблема самодельщиков -неправильная разводка земли. При сильных источниках помех (электродвигатели и прочее) нужно ещё фильтры и экранирование применять.
К питанию притягивал и к земле притягивал, до доработки результат тот же. А как лучше фильтры и экранирование применять? И как лучше землю разводить? Расскажите поподробней. Думаю многим, и мне в том числе будет интересно
ssvs111, это слишком большая тема, и я не слишком большой специалист по ней :) Советую погуглить, там на тему зашиты от помех целые диссертации есть :) Основы "землеводства" доступным языком можно у ДиХалта почитать. Там-же в комментариях читателей так-же есть очень полезные ссылки.
Очень полезные статьи, спасибо
Столкнулся с аналогичной проблемой - совершенно непредсказуемая помеха по прерыванию. Ставил подтяжки, обвесил все фильтрами по питанию как гирляндой - ничего не меняется. Но у меня не монетоприемник, а 6-импульсный датчик скорости в машине. При чем глубоко пофиг - подключен выход датчика к дуине или из порта дуины просто провод торчит без подключения.
Вариант с двумя портами интересен, но тут возникает вопрос: какое время проходит с момента отработки attachinterrupt до последующего digitalRead? Хватит ли этого времени на считывание импульса датчика скорости?
И еще мысль бродит, но никак не могу ее оформить. Что, если использовать attachinterrupt не по RISING или FALLING, а по CHANGE? В этом случае можно четко отловить фронт-тыл сигнала на меандре, длительность импульса и т.д. И дальше смотреть по длительности импульса - если меньше какого-то значения, то помеха, если больше - полезный сигнал. Но нигде не могу найти длительность импульса для стандартного датчика скорости. И, опять же, непонятно - в датчике скорости с изменением скорости меняется только частота сигнала или скважность тоже?
Если есть помеха по прерыванию, то изменение режима прерывания ни к чему не приведет, потому что ( повторюсь) ложное прерывание происходит не потому что изменилось состояние пина прерывания, а по другой непонятной причине, и измерять длительность импульса в обработчике не к чему не приведет.. К тому же с изменением скорости будет меняться длительность входного импульса
Чтобы бороться с проблемой, нужно опрашивать порт прерывания в самом обработчике прерываний, чтобы отсеять ложное прерывание. Вот доведенный до ума код, который решет эту проблему стопроцентно
Я на внешних прерываниях так и не смог добиться стабильной работы энкодера без помех с кабелем 20 метров(ближе никак). Проблему решил опросом состояний пинов по прерыванию по таймеру и условие - несколько раз подряд считать одинаковое состояние пинов энкодера чтоб исключить помехи, и еще RC фильтр низких частот парралельно.
Я пришел к выводу, что помеха идет не по питанию, а является внешней электромагнитной. Если пин прерывания не подключен то все отлично, а вот если присоединить к нему небольшой длины провод то тут начинается свистопляска.
Я тоже пришел именно к такому решению. Но к сожалению оно всё-таки тоже не работает.
Вот калькулятором для расчета фильтра низких частот пользовался.
http://gyrator.ru/rc-filter
главное определиться с максимальной частотой полезного сигнала, чтоб резать все частоты выше полезной.
Подбирай резистор и конденсатор так чтоб на этой частоте Амплитуда выходного сигнала,
была ниже 2х вольт чтоб ноль читался на частотах выше максимальной
Я пришел к выводу, что помеха идет не по питанию, а является внешней электромагнитной. Если пин прерывания не подключен то все отлично, а вот если присоединить к нему небольшой длины провод то тут начинается свистопляска.
Друг, выложи код с опросом одинакового состояния пинов, ато ППЦ, та же хрень помехи, вращаю 2 двигателя, считаю обороты через оптопару по прерыванию. Помехи затрахали уже. Махаюсь с этим вопросом больше половины года.
Важный момент: недопустимо использовать внутренний подтягивающий резистор на пине прерывания, только внешний
Важный момент: недопустимо использовать внутренний подтягивающий резистор на пине прерывания, только внешний
Наверное стоит обосновать такое категоричное заявление?
Конечно стоит, но обосновать могу исходя только из своего опыта когда глюки работы ардуино при прерываниях с использованием внутреннего подтягивающего резистора возникали уже на макетке. Не могу сказать с чем это связано, то ли из-за большого номинала внутреннего резистора, то ли из-за того что я повесил два независимых устройства на одно прерывание с использованием диодов и двух дополнительных пинов, то ли еще почему. Теперь взял за правило использовать внутренний резистор только в редких случаях, например чтобы подтянуть кнопку, расположенную в непосредственной близости от контроллера.
ssvs111, думаю у вас проблема была в другом, но применив внешнюю подтяжку случайно удалось приглушить помеху. Особенно исходя из того, что вы пишите в #18. Всё это обход проблемы, а не решение. Скорее всего у вас что-то с разводкой питания. Где-то что-то отвалилось, может плюс, может питание, и МК начинает цеплять любые наводки, пришедшие даже через воздух. По крайней мере то, что вы писали про глюк при касании пальцем общего провода -это типичный признак отвалившейся земли. Необходима тотальная прозвонка всех линий питания микроомметром. Измерение тока потребления по плюсу и по минусу. МК, как любая кмоп-микросхема может работать вообще без питания, беря крохи с любого из своих подключенных входов, и создавая полную иллюзию работоспособности. Например та-же внешняя подтяжка может питать и сам МК, и облегчать ему работу при отсутствии основного питания.
Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?
Есть решение проблеммы: Устраняем помехи при прерываниях
Столкнулся с похожей проблеммой с внешним прерыванием INT0. Коммерческий проэкт, вешаю на пин 2 монетоприемник по прерыванию. В обработчике прерывания подсчитываю импульсы, прибавляю к сумме. Все работает, но...
Если отверткой или щупом тестера касаюсь земли или пин 2 - происходят хаотические прерывания.
Менял номиналы подтягивающих резисторов, а позже стягивающих. Паралельно входу ставил конденсаторы, диоды. Менял питание, ничего не помогало. Сделал по другому: пин 2 соединил с пином 4, который назначил на вход и в обработчике добавил условие что считать импульсы можно, если пин 4 в этот момент притянут к земле.
Причину хаотических прерываний я так и не понял, но ясно одно - она не связана с уровнем на пине 2
вот код:
Проект PRO Mini и монетоприемник. Все вышеописанные проблемы в наличии. Сделал как описано в цитате. Проблема решилась наполовину. Т.е. исчезли ложные прерывания при трогании отверткой любого провода. Причем именно отверткой, любой. При трогании голыми руками никаких ложных сработок небыло. Но остались ложные прерывания при трогании отверткой 2-го пина. Проблема решилась задержкой. Так как в обработчике прерывания не работает delay(), а минимальный импульс с монетоприемника 15ms, то до опроса состояния pin 2 ввел цикл до 1000 пустых опросов pin2 (начинал со 100 - уже работает). В Вашем коде это выглядело бы так:
Проблема та же, использую плату с STM32F103C8T6 из под Arduino. На 3х внешних прерываниях сидят кнопки и оптопары управления. + Одно внешнее прерывание используется в схеме без длинных цепей. Схемотехника простая - внешний подтягивающий к Vcc 3.3в коротится на землю кнопкой или транзистором оптопары 4n35. При касании земли, +питания, оптопар и еще чего угодно прерывания отрабатывают в случайном порядке или все сразу, т.е. совершенно хаотично и непредсказуемо. Совершенно не пойму схему действия помехи. Пробовал питание от АКБ, не помогает. На входах допаивал емкости, менял номиналы подтягивающих. Такое впечатление, что проблема сидит в разводке самих плат ардуино и прочих подобных.
AVPD, это разводка земли. Входящий сигнал на МК или исходящий из МК возвращается по "длинной земле" на входные порты, подключенные к прерываниям. Решение -требуется разводка земли по всем правилам науки.
Я столкнулся с аналогичной проблемой и тоже не разобрался в природе помех. В моем случае помехи возникали спорадически два раза в год ;) Пропадали после изменения схемы или просто так. решил проблему изменением кода на:
Что за бред все куда прозаичнее.
тоже столкнулся с такой же проблемой. аппаратно не удалось решить проблему помех. получилось только программно.