Программное избавление от помех концевых выключателй
- Войдите на сайт для отправки комментариев
Всем доброго вечера. На установке имеется 7 концевиков провода от которых проходят вблизи с силовыми кабелями, от чего получают наводки и выскакивают ложные срабатывания. Пытаюсь избавиться программным методом, для чего хочу использовать резервную плату Меги которая стоит рядом с управляющей Мегой. т.е. получать сигнал с датчика на промежуточную плату ( А1-А7 вх сигнал,А8-А14 выходной сигнал ), проверять через 20мс точно ли сработал датчик и тогда отправлять сигнал с другого выхода на вход управляющей платы, для этого попробывал на основе примеров написать вот такой код
int kn1 = 96;// Пин входного сигнала 1 int kn2 = 95; int kn3 = 94; int kn4 = 93;// Пин входного сигнала 4 int kn5 = 92; int kn6 = 91; int kn7 = 90; int dat1 = 89; // Пин выходного сигнала 1 int dat2 = 88; int dat3 = 87; int dat4 = 86; int dat5 = 85; int dat6= 84; int dat7 = 83; void setup() { pinMode(kn1, INPUT); pinMode(dat1, OUTPUT); pinMode(kn2, INPUT); pinMode(dat2, OUTPUT); pinMode(kn3, INPUT); pinMode(dat3, OUTPUT); pinMode(kn4, INPUT); pinMode(dat4, OUTPUT); pinMode(kn5, INPUT); pinMode(dat5, OUTPUT); pinMode(kn6, INPUT); pinMode(dat6, OUTPUT); pinMode(kn7, INPUT); pinMode(dat7, OUTPUT); } bool flag1 = LOW; bool lastButton1 = LOW; bool flag2 = LOW; bool lastButton2 = LOW; bool flag3 = LOW; bool lastButton3 = LOW; bool flag4 = LOW; bool lastButton4 = LOW; bool flag5 = LOW; bool lastButton5 = LOW; bool flag6 = LOW; bool lastButton6 = LOW; bool flag7 = LOW; bool lastButton7 = LOW; bool debounce1() { bool current1 = digitalRead(kn1); if (current1 != lastButton1) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current1 = digitalRead(kn1); // Считываем стабилизированное значение } return current1; } bool debounce2() { bool current2 = digitalRead(kn2); if (current2 != lastButton2) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current2 = digitalRead(kn2); // Считываем стабилизированное значение } return current2; } bool debounce3() { bool current3 = digitalRead(kn3); if (current3 != lastButton3) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current3 = digitalRead(kn3); // Считываем стабилизированное значение } return current3; } bool debounce4() { bool current4 = digitalRead(kn4); if (current4 != lastButton4) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current4 = digitalRead(kn4); // Считываем стабилизированное значение } return current4; } bool debounce5() { bool current5 = digitalRead(kn5); if (current5 != lastButton5) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current5 = digitalRead(kn5); // Считываем стабилизированное значение } return current5; } bool debounce6() { bool current6 = digitalRead(kn6); if (current6 != lastButton6) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current6 = digitalRead(kn6); // Считываем стабилизированное значение } return current6; } bool debounce7() { bool current7 = digitalRead(kn7); if (current7 != lastButton7) { // Старое значение отличается от полученного delay(20); // Ждем пока состояние стабилизируется - игнорируем дребезг current7 = digitalRead(kn7); // Считываем стабилизированное значение } return current7; } void loop() { int currentDat1 = debounce1(); // Получаем стабилизированное значение int currentDat2 = debounce2(); int currentDat3 = debounce3(); int currentDat4 = debounce4(); int currentDat5 = debounce5(); int currentDat6 = debounce6(); int currentDat7 = debounce7(); if (lastButton1 == LOW && currentDat1 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag1 = !flag1; // Меняем флаг статуса выходного сигнала 1 digitalWrite(dat1, flag1); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton2 == LOW && currentDat2 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag2 = !flag2; // Меняем флаг статуса выходного сигнала 2 digitalWrite(dat2, flag2); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton3 == LOW && currentDat3 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag3 = !flag3; // Меняем флаг статуса выходного сигнала 3 digitalWrite(dat3, flag3); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton4 == LOW && currentDat4 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag4 = !flag4; // Меняем флаг статуса выходного сигнала 4 digitalWrite(dat4, flag4); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton5 == LOW && currentDat1 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag5 = !flag5; // Меняем флаг статуса выходного сигнал5 digitalWrite(dat5, flag5); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton6 == LOW && currentDat6 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag6 = !flag6; // Меняем флаг статуса выходного сигнала 6 digitalWrite(dat6, flag6); // В зависимости от флага, подаем логическую единицу на выход 1 } if (lastButton7 == LOW && currentDat7 == HIGH) { // Если состояние кнопки "нажата" - HIGH, а предыдущее LOW - фиксируем событие нажатия кнопки flag7 = !flag7; // Меняем флаг статуса выходного сигнала 7 digitalWrite(dat7, flag7); // В зависимости от флага, подаем логическую единицу на выход 1 } lastButton1 = currentDat1; // Запоминаем последнее состояние входного сигнала 1 lastButton2 = currentDat2; lastButton3 = currentDat3; lastButton1 = currentDat4; lastButton1 = currentDat5; lastButton1 = currentDat6; lastButton1 = currentDat7; }
Но что то опять мои датчики как то плохо неправильно работают, можете подсказать это рабочий код? если не рабочий, можно указать/исправить ошибки? или может просто стоит время повторной проверки увеличить?
а попробовать использовать экранированные с заземлённым экраном провода слабо ?
а попробовать использовать экранированные с заземлённым экраном провода слабо ?
Может я не правильно обозначил входы /выходы, я имею ввиду 95-83 контакты? или может у кого то есть более простой код от дребезга?
код от дребез или от наводок? Самый простой код от наводок - резистор небольшого номинала на подтяжке установленный возле контролера. От дребезга простейший код - неТараПися, дай ему кончить дребезжать.
//земля только общесетевая
Непонял, с силовой чтоле общая 8)
Дребезг и наводки я тут объединил, так как обе проблемы присутствуют и предполагаю что программно можно очистить сигнал от ложных срабатываний выбрав нужное время повтороного опроса, но перед тем как опытным путем подбирать хотел понять рабочий у меня код или нет.
Да земля только силовая
Так дело не пойдет. Грип и смфилис по разному лечат. Начинают с диагноза. Наводки проявляются независимо от коммутации - дребез только кратковременно после замыкания контакта. Надо бы различать. Можна конечно фильтр забацать, аппаратный или програмный, но не всегда поможет и свои моменты вносит.
Общая земля сигнальных и силовых цепей недопустима. Конечно хороше бы знать что там за "сила". Одним и 10Вт сила, другим 100кВт - маломощное. Давайте больше информаци. Правильное решение - гальваноразвязка. Иногда допустимое - отдельно вести 2 земли и обеденять их в одной точку, часто возле БП.
Код выше - с намеком на борьбу с дребезгом, но пауза 20мсек не всегда достаточна. Архитектура кода кривая и не позволит существенно увеличить паузу. Начнется тормозня по другим кнопкам, устроит ли такое - незнаю.
Вообще если глядеть по ослиллограмме то это постоянная пила - соответственно основная моя проблема это наводки. По току : 7 шаговиков 48В до 5А и инф. кабель заходят в шкаф в общей пластиковой гофре, и другого места прокладке кабелей нет. Сигнальный кабель в "шубе" и перед платой ферритовый фильтр. До этого установка стояла в другом месте, уводил заземление на 12мм арматуру на 1,5 метра забитую в землю, но ситуацию это не изменило. В общем аппаратно решить эту проблему пробовал несколько раз не получилось, вот подумал что можно как то программо с помощью дополнительной платы избавится от помех
Смотрите, ток у Вас 7*5=35А по максимуму. Допустим сопротивление общего провода - 0,1Ом, тогда протекая по нему возникнет падение 3,5В. Если это падение окажется на входе - от этой помехи не избавится. Потому должны быть 2 раздельных физически общих провода. Тяжело без схемы вобщето. Если 2 провода есть и не помогает - подтянуть с того конца где коннтроллер небольшим резистором, до 100Ом. Дальше смотреть осцилографом, картинку можна сюда показать, вместе посмотрим. Возможно програмно еще чего можна сделать. Или аппаратно RC фильтр. Не поможет - гальваноразвязывать.
Всем доброго вечера. На установке имеется 7 концевиков провода от которых проходят вблизи с силовыми кабелями, от чего получают наводки и выскакивают ложные срабатывания. Пытаюсь избавиться программным методом, для чего хочу использовать резервную плату Меги которая стоит рядом с управляющей Мегой. т.е. получать сигнал с датчика на промежуточную плату ( А1-А7 вх сигнал,А8-А14 выходной сигнал ), проверять через 20мс точно ли сработал датчик и тогда отправлять сигнал с другого выхода на вход управляющей платы, для этого попробывал на основе примеров написать вот такой код
Пытался аппаратно, заказал вот такие микросхемы
http://www.alldatasheet.com/view.jsp?Searchword=Mc14490p%20datasheet&gclid=CjwKCAjw7O_pBRA3EiwA_lmtfihUxmeRSRdQpShylEwgQxDmdQ2yJhEleC9yB-UIysy1PbWjRtpagxoCViUQAvD_BwE
которые якобы лучше тригера шмидта так как не инвертируют сигнал и имеют свои подтягивающие резисторы, и позволяют подобрать конденсатор который бы регулировал время переходного процесса, но ничего с ними не получилось толи китайцы прислали лажу то ли я что то не понимаю, при подаче высокого напряжения на один из входов оно автоматически появляется на всех остальных входах, уже чуть не угробил установку т.к. НО датчики не отключались из-за постоянно высокого сигнала.
В общем сейчас уже последняя надежда на программное решение вопроса.
В общем сейчас уже последняя надежда на программное решение вопроса.
см. #5: "Общая земля сигнальных и силовых цепей недопустима" - это не каприз, а осонанная необходимость.
К каждому датчику от платы управления должны идти 2 своих провода, желательно свитые.
Ну и подтяжка + ФНЧ на входе.
Земля сейчас не общая, просто приборную землю пока никуда не подключал.
От датчиков у меня идет только один провод на котором либо логический ноль либо высокой уровень. Подтяжку и ФНЧ для 7ми концевиков это целую плату надо промежуточную ставить, а нормально разместить её даже негде.
Ну пока конечно действительно ничего путного не получается, приведенный код не работет, выходной сигнал меняет раз в секунду при неизменном входном...
Земля сейчас не общая, просто приборную землю пока никуда не подключал.
и как же оно вообще работает?
схему мы, конечно же, не увидим...
не подключал ни к чему экран от сигнального кабеля, а земля питания датчиков и платы подключена к клеме блока питания.
Мега дополнительная (она же резервная) изначальна была заложена в конструкцию и закреплена на подложке, подложка в шкафу, шкаф по периметру обварен для усиления, вобщем разобрать менять очень большая проблема, поэтому и стремлюсь к программному решения вопроса.
Поставьте оптроны, не мучайтесь.
А какие резисторы на подтяжке концевиков?
Подтяжка внутренняя.
Подтяжка внутренняя.
Так попробуйте наружную, ом эдак триста.
вторые концы резисторов можно спасять в один и повесить на землю?
Резисторы вместе и на +5 вольт. Можно посмотреть на наводку на проводе при использовании резисторов 330 Ом или 510 Ом или 1 кОм. Если есть наводка больше 0.5 вольта резистор надо уменьшать. Но ставить надо максимальный. Конденсатор параллельно контатактам концевика, такой чтобы при подобранным резисторе обеспечить постоянную времени RC цепи больше 1 милисекунды.
с концевика один провод информационный относительно земли, сответственно на землю кондесатор замыкать? а без конденсаторов есть смысл с резисторами возиться или они только от дребезга? Просто с конденсаторами схема уже гораздо сложнее получается и просто навесу оставить проблематично будет придется всетаки какуюто плату городить...
Подтяжка внутренняя.
Так попробуйте наружную, ом эдак триста.
300 Ом на землю а концевик через 1 кОм на +48 В. Место соединения резисторов 300 Ом и 1 кОм на ардуину через резистор 1 кОм и буит щастье!
с концевика один провод информационный относительно земли, сответственно на землю кондесатор замыкать? а без конденсаторов есть смысл с резисторами возиться или они только от дребезга? Просто с конденсаторами схема уже гораздо сложнее получается и просто навесу оставить проблематично будет придется всетаки какуюто плату городить...
Попробуйте сперва просто резистор, возможно будет достаточно и его. 50кОм (вроде так) и 1кОм, очень разные вещи.
Конденсаторы можно прямо на контакты концевиков под болтики закрепить. Или на одном попробовать и посмотреть что будет. Дребезга точно не будет.
Конденсаторы можно прямо на контакты концевиков под болтики закрепить. Или на одном попробовать и посмотреть что будет. Дребезга точно не будет.
Дребезга может быть и не будет, а наводки (особенно импульсные) при длине кабеля несколько метров-неизбежны. Для борьбы с ними и используются оптроны. Так в плазморезах (где концевик оси "Z" находится практически рядом с горелкой) используются промышленные оптроны от Broadcom c увеличенным до 15 мм оптическим каналом и практически нулевой проходной емкостью. И никаких наводок и ложных срабатываний. Правда RC фильтры по обеим сторонам оптрона никто не отменял. А в обычной силовой электронике, подойдет любой оптрон, главное развязать цепи питания контроллера и оптронов и использовать оптрон при максимально допустимых токов фотодиода.
Импульсные наводки конденсаторами режутся. Оптроны и полное разделение земель и питаний это конечно наилучшее решение, но и требующее многие телодвижения.
Теоретически рассуждать мы можем долго, а каковы реальные условия работы контроллера у ТС. Длинна кабелей, характер и мощность нагрузки? От этого многое зависит.
Мощности и прокладка озвучены. Длины нет. Но есть общие принципы уменьшения наводок. Даже в описанном ТС окружении можно добится вполне приличного результата. Главный принцип - переход к токам.
Да зачем оптопары? Если электричество экономить не надо, то можно обойтись элементарным преобразователем ток- напряжение на делителе.
Резисторы надо брать на пол ватта. При 12 вольтах ток будет 77мА. Наводки будут гаситься 56омным резистором.
Извиняюсь, не заметил семь достаточно серьезных шаговиков. А они являются достаточно мощными источниками импульсных помех. Да еще скорее всего, сигналы их управления ШИМятся, что дает помеху с очень широком спектром. Судя по всему это какой-то ЧПУ станок, а значит есть движущиеся части, а это уже статика. И вся эта куча проводов идет в одном кабель канале. Самый надежный вариант это опторазвязка, по габаритам места практически не займет, а надежность повысится безо всяких танцев с бубном.
Подвесник в лифте- это 50-70 метров плоского резинового никогда в жизни не экранированного кабеля
10-20 жил по 0.75 квадрата.
Все жилы просто параллельно в резине.
Обычно параллельно 2-3 таких сложено друг на друга.
Всё это двигается за кабиной постоянно изгибаясь
В нём и 24 постоянки и 220 и 380 идут.
Сигналы с герконов 24 Вольта напрямую в контроллер, 220 через оптроны
CAN-BUS к кнопкам отдельно идёт, а тот который на кабину- тот вместе со всеми.
Частотник наверху с ШИМом 10 килоГерц
и мотором 5-7 килоВатт, синхронным или асинхронным.
Контакторы хлопают с током 40-60 Ампер.
Никогда никаких помех!!!!!!!!!
Длинна кабелей примерно 3м, да шаговики управляются ШИМом
схема подключения моих щелевых оптических датчиков выглядит примерно так, питание +5В, земля и выходной сигнальный провод на котором при срабатывании +5В
Вот какая осциллограмма, сейчас переставил установку в другое место сигнал стал значительно чише, наводки не более +-0,5В
0,5В не могут ведь довать ложное срабатывание? значит проблема в контроллере обработчике?
Подсказка : запрещеные уровни.
Поменяйте обработчик кнопки #4
Спасибо, посмотрел Ваш пост по слылки, но подсказка не моего уровня. Пытал осмыслить код с тремя кнопками но так и не разобрался.
я правильно понял, что мне необходимо сигнальный провод подтянуть через резистор на +5В, и его же через конденсатор на землю? Под рукой сечас резостьры на 10к и 470 Ом, кондеры 0,07 и 0,1мкф. С резистором на 470 Ом и с конденсатором на 0,1 навекрное можно попробовать?
я правильно понял, что мне необходимо сигнальный провод подтянуть через резистор на +5В, и его же через конденсатор на землю? Под рукой сечас резостьры на 10к и 470 Ом, кондеры 0,07 и 0,1мкф. С резистором на 470 Ом и с конденсатором на 0,1 навекрное можно попробовать?
От этого резистора зависит чувствительность фотоприемника и он ограничивает ток через него. 470 Ом-это очень мало. И чувствительность упадет и есть риск спалить фототранзистор. Лучше не рисковать. Конденсатор что 0,07, что 0,1 - это практически одно и тоже и вреда от них не будет
Никогда никаких помех!!!!!!!!!
Можно с тобой поподробнее пообщаться по поводу автоматики лифтов?
"..От этого резистора зависит чувствительность фотоприемника и он ограничивает ток через него..."
попробовал через 10 кОм ситуацию не изменило, теже +-0,5В, только после выключения питания ещё небольшая задержка по шуму, наверное кондер разряжается...
Концевики какие? Механические или оптические?
ТС оптику рисует.((( Я когда резистор советовал, думал про механические, увы.((((
Отличный поворот сюжета )))
Никогда никаких помех!!!!!!!!!
Можно с тобой поподробнее пообщаться по поводу автоматики лифтов?
по скайпу можно написать.....
Ну вообще у меня 3 оптических и 4 индуктивных датчика, выше в #22 писал что выход у меня один информационный сигнал относительно земли, не думал что принцип измерения тут играет роль, т.к. все они хоть и разные а ведут себя одинаково ... плохо.
Ну вообще у меня 3 оптических и 4 индуктивных датчика, выше в #22 писал что выход у меня один информационный сигнал относительно земли, не думал что принцип измерения тут играет роль, т.к. все они хоть и разные а ведут себя одинаково ... плохо.
Это не датчики ведут себя плохо, а наводки на линии и по земле. Все ваши датчики имеют относительно высокое выходное сопротивление, поэтому для борьбы с наводками можно поставить прямо на датчиках эмиттерные повторители. Получится что-то типа совета из поста #30. Ну и земляные провода не объединять, как у Вас нарисовано на схеме, а вести отдельно прямо до контроллера желательно витой парой.
Что то не пойму как можно применить совет из #30 для моей схемы, ограничить питание датчиков 100Ом резистором а потом между информационным и землей (минусом) 56 Ом ?
Что то не пойму как можно применить совет из #30 для моей схемы, ограничить питание датчиков 100Ом резистором а потом между информационным и землей (минусом) 56 Ом ?
Не совсем, выход датчика подключить к базе транзистора, включенного по схеме эмиттерного повторителя. Тогда можно поставить в его эмиттере низкоомный резистор 56 Ом. Типа этого:
вот это код на 2 страницы для подавления дребезга! автор, arduino и так тяжело, пожалейте его. поставте железный подавитель. наприер как сделанно у платы MKS Robin Mini