Программное избавление от помех концевых выключателй
- Войдите на сайт для отправки комментариев
Всем доброго вечера. На установке имеется 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