Контроллер насоса. Прошу помощи!
Posted: 02 Mar 2019 20:08
Доброго времени суток всем!
Однажды мне уже помогли отзывчивые люди на этом форуме, вынужден снова обратиться с просьбой о помощи( Имеется простой контроллер работы насоса на участке, собранный мной на дискретной рассыпухе, но в силу его невысокой надежности, хотелось бы перенести его функционал на МК. На паре других форумов мою просьбу помочь проигнорили, либо написали что-то из серии "напиши сам", но к сожалению в программировании не силён. Чуть-чуть знаю только ассемблер для АВР "со словарём" и имею общее представление о архитектуре этих МК. Ниже постараюсь как можно подробнее и доступнее написать что мне хотелось бы увидеть. И да, готов сделать автору прошивки материальное пожертвование в разумных пределах, на халяву не рассчитываю)
Небольшая преамбула: что, почему и зачем. Если не интересно, этот абзац можно пропустить)
Имеется приусадебный участок на болотистой почве. Ранее воду для полива брали в протекающем по границе ручье, но пару лет назад его перекрыли выше по течению, и пришлось задумываться о бурении скважины. Так как в силу расположения, загнать на участок тяжёлую технику нереально, пришлось бурить скважину вручную, самостоятельно. Вдвоём с товарищем смогли забуриться всего на 5 метров, ниже идёт зыбун, который без обсадной трубы и спец. оборудования мы пробить не смогли. В итоге скважина получилась хорошо отдающей воду, но мелкой. Как следствие, опущенный в неё насос "выхлёбывает" воду до дна минут за 10, после чего необходимо подождать ещё 5-10 минут чтобы она вновь наполнилась. Для нормального водоснабжения участка, сварил и поставил ёмкость для воды на две тонны, из которой уже самотёком идёт питание всего участка. Но дёргать туда-сюда насос при каждом наливе бочки несколько напрягает, поэтому мной на рассыпухе был собран контроллер для управления насосом, который и обеспечивал необходимый режим работы с выдерживанием пауз и обратной связью для контроля налива. Сперва всё было замечательно, но спустя полтора сезона контроллер начал ерундить, а потом и вовсе вышел из строя. Расследование показало, что из-за колебаний температуры и влажности "плывут" параметры временнЫх пауз (они у меня реализованы на 555таймерах), кроме того, возникает коррозия на подвижных элементах, таких как контакты кнопок и потенциометры. Покрытие платы лаком не помогло решить проблему полностью. Если кнопки ещё можно сделать герметично, то движки переменных резисторов загерметизировать в бытовых условиях довольно сложно. Так возникла мысль перевести весь контроллер с рассыпухи на МК, по идее для алгоритма его работы какой-нибудь Меги8 должно хватить за глаза, плюс можно будет добавить несколько фишек, повышающих удобство пользования.
Собственно об устройстве и периферии.
Для управления и контроля используются следующие линии:
Сигнал от поплавкового датчика уровня воды. 1 - бак заполнен под завязку, 0 - можно лить ещё.
Сигнал от датчика потока воды. Меандр, с частотой, пропорциональной скорости потока жидкости в трубе. А ля компьютерный кулер с тремя проводами. Меандр есть - вода течёт. Меандра нет или он ниже некоего порогового значения - в трубе сухо.
Сигналы от кнопок "Старт/стоп", "Уст. времени", + и - для управления самим контроллером.
Выходы на два семисегментных индикатора для отображения времени паузы между запусками насоса в минутах, редактирования этой паузы и т. п.
Выход на реле, включающее насос. 1 - включаем мотор, 0 - выключаем
Выходы на индикаторные светодиоды "Работа", "Ошибка" и "Бак полон".
Алгоритм работы. Ниже приложу свое кривое творение в редакторе блок схем. Да, знаю что не по госту и выглядит страшно, но нарисовал как умел, просьба понять и простить) Плюс программа кривовата, прямо скажем. На рисунке забыл добавить одно условие для проверки, ниже об этом напишу. Сперва коротко и простыми словами. При попытке запустить насос проверяем, не заполнен ли бак, и если нет, то пробуем стартовать. Если после старта выясняется, что воды в скважине нет, пробуем ещё два раза через некоторое время, после чего прекращаем попытки и выдаём ошибку. Если вода есть, качаем её, пока она не закончится, затем делаем паузу, после паузы пытаемся качать снова и так по кругу до тех пор, пока либо бак не заполнится, либо вода в скважине не кончится совсем (или что-то сломается), либо юзер не отдаст принудительный приказ "Отставить!")
Теперь более развёрнуто и нудно) После подачи питания инициализируем периферию, обнуляем всё что нужно и уходим в бесконечный цикл. В цикле опрашиваем поплавковый датчик и кнопки "Старт/стоп" и "Уст. времени". Если от датчика приходит единица, зажигаем светодиод "Бак полон", если ноль - этот светодиод гасим.
Если была нажата кнопка "Уст. времени", переходим в режим задания продолжительности паузы между включениями насоса. Забираем из eeprom прошлое значение (если есть) и выводим на семисегментный индикатор в виде мигающего двухзначного числа. Пауза задается в целых числах минут от 5 до 30 с шагом в 1 минуту. При отсутствии нажатий кнопок в течение 5 секунд или повторном нажатии кнопки "Уст. времени", контроллер возвращается в режим ожидания, при этом новое значение паузы записывается в eeprom. Перейти в режим установки времени если насос уже запущен в автоматическом режиме нельзя.
Если была нажата кнопка "Старт/стоп", пытаемся перейти в режим автоматической работы. Проверяем условие заполненности бака, если он полон (с датчика приходит единица), то вылетаем обратно в режим ожидания, если не полон идём дальше. В алгоритме предусмотрена индикация ошибки работы контроллера при большом количестве неудачных запусков и прерывание его работы. Для этого вводится программный счётчик неудачных запусков, который обнуляется сразу после "запускающего" нажатия кнопки "Старт/стоп". Также здесь же обнуляется флаг "Ошибка". Перед включением насоса проверяем этот счётчик на переполнение больше трёх, и если таковое имеется, зажигаем светодиод "Ошибка" и вываливаемся в режим ожидания. Если же счётчик не переполнен, включаем насос одновременно зажигая светодиод "Работа", выдерживаем паузу около трех секунд для того, чтобы насос раскрутился и вода (если она есть) достигла турбинки датчика потока воды. Далее проверяем, имеется ли меандр на датчике потока воды. Если его нет или частота слишком низкая, значит либо в скважине нет воды, либо есть повреждение какого-то из узлов системы. *Тут надо отметить, что я пока не могу сказать какая именно частота импульсов появляется на выходе датчика при нормальной работе насоса, так как в старом контроллере я контролировал наличие потока аналоговым способом: ставил РЦ-цепочку на выход датчика, а с неё заводил получившийся аналоговый сигнал на вход компаратора с гистерезисом и регулировкой порога срабатывания, соответственно выставляя оптимальный порог на глаз. На выходе получался логический сигнал "есть вода - нет воды" Надо будет собрать стенд и измерить точную частоту осциллографом. Хотя не проблема прикрутить такую же схемку к обычному входу МК для упрощения программы* Эта ситуация определяется как неудачный запуск. Выключаем насос, одновременно погасив светодиод "Работа", инкрементируем счётчик неудачных запусков и выжидаем паузу, продолжительность которой мы выставили в разделе установки времени. При этом на сегментном индикаторе показываются убывающие цифры минут. По достижению нуля возвращаемся в точку перед проверкой счётчика неудачных запусков. Для наглядности см. картинку с алгоритмом.
Если же запуск прошёл удачно, т. е. на выходе датчика потока воды появляется меандр нужной частоты, начинаем крутиться в цикле, одновременно отслеживая три условия: 1) Не нажата ли кнопка "Старт/стоп", т. е. нет ли попытки остановить программу автоматического налива принудительно. Если да, то вырубаем насос и светодиод "Работа" и уходим в режим ожидания. 2) Не поступил ли сигнал единицы с датчика переполнения бака. Если поступил, также вырубаем насос и уходим в режим ожидания. 3) Не снизилась ли частота меандра с датчика потока воды ниже порогового значения, т. е не осушили ли мы скважину в процессе работы насоса. Если да, то вырубаем насос и выжидаем паузу, как это описано в предыдущем абзаце. Затем возвращаемся в точку программы перед проверкой счётчика неудачных запусков. Конечно в алгоритме не описаны разные мелочи вроде программного антидребезга кнопок и датчиков и т. п. На самом деле болтовни здесь больше, чем непосредственно алгоритма работы)
Вот такая "портянка" получилась) Прошу прощения за много букв. Буду очень благодарен, если кто-то из форумчан поможет мне с реализацией кода для МК. Думаю, данный контроллер насоса мог бы пригодиться не только мне, но и другим людям, оказавшимся в сходной ситуации. Спасибо, что прочитали)
Однажды мне уже помогли отзывчивые люди на этом форуме, вынужден снова обратиться с просьбой о помощи( Имеется простой контроллер работы насоса на участке, собранный мной на дискретной рассыпухе, но в силу его невысокой надежности, хотелось бы перенести его функционал на МК. На паре других форумов мою просьбу помочь проигнорили, либо написали что-то из серии "напиши сам", но к сожалению в программировании не силён. Чуть-чуть знаю только ассемблер для АВР "со словарём" и имею общее представление о архитектуре этих МК. Ниже постараюсь как можно подробнее и доступнее написать что мне хотелось бы увидеть. И да, готов сделать автору прошивки материальное пожертвование в разумных пределах, на халяву не рассчитываю)
Небольшая преамбула: что, почему и зачем. Если не интересно, этот абзац можно пропустить)
Имеется приусадебный участок на болотистой почве. Ранее воду для полива брали в протекающем по границе ручье, но пару лет назад его перекрыли выше по течению, и пришлось задумываться о бурении скважины. Так как в силу расположения, загнать на участок тяжёлую технику нереально, пришлось бурить скважину вручную, самостоятельно. Вдвоём с товарищем смогли забуриться всего на 5 метров, ниже идёт зыбун, который без обсадной трубы и спец. оборудования мы пробить не смогли. В итоге скважина получилась хорошо отдающей воду, но мелкой. Как следствие, опущенный в неё насос "выхлёбывает" воду до дна минут за 10, после чего необходимо подождать ещё 5-10 минут чтобы она вновь наполнилась. Для нормального водоснабжения участка, сварил и поставил ёмкость для воды на две тонны, из которой уже самотёком идёт питание всего участка. Но дёргать туда-сюда насос при каждом наливе бочки несколько напрягает, поэтому мной на рассыпухе был собран контроллер для управления насосом, который и обеспечивал необходимый режим работы с выдерживанием пауз и обратной связью для контроля налива. Сперва всё было замечательно, но спустя полтора сезона контроллер начал ерундить, а потом и вовсе вышел из строя. Расследование показало, что из-за колебаний температуры и влажности "плывут" параметры временнЫх пауз (они у меня реализованы на 555таймерах), кроме того, возникает коррозия на подвижных элементах, таких как контакты кнопок и потенциометры. Покрытие платы лаком не помогло решить проблему полностью. Если кнопки ещё можно сделать герметично, то движки переменных резисторов загерметизировать в бытовых условиях довольно сложно. Так возникла мысль перевести весь контроллер с рассыпухи на МК, по идее для алгоритма его работы какой-нибудь Меги8 должно хватить за глаза, плюс можно будет добавить несколько фишек, повышающих удобство пользования.
Собственно об устройстве и периферии.
Для управления и контроля используются следующие линии:
Сигнал от поплавкового датчика уровня воды. 1 - бак заполнен под завязку, 0 - можно лить ещё.
Сигнал от датчика потока воды. Меандр, с частотой, пропорциональной скорости потока жидкости в трубе. А ля компьютерный кулер с тремя проводами. Меандр есть - вода течёт. Меандра нет или он ниже некоего порогового значения - в трубе сухо.
Сигналы от кнопок "Старт/стоп", "Уст. времени", + и - для управления самим контроллером.
Выходы на два семисегментных индикатора для отображения времени паузы между запусками насоса в минутах, редактирования этой паузы и т. п.
Выход на реле, включающее насос. 1 - включаем мотор, 0 - выключаем
Выходы на индикаторные светодиоды "Работа", "Ошибка" и "Бак полон".
Алгоритм работы. Ниже приложу свое кривое творение в редакторе блок схем. Да, знаю что не по госту и выглядит страшно, но нарисовал как умел, просьба понять и простить) Плюс программа кривовата, прямо скажем. На рисунке забыл добавить одно условие для проверки, ниже об этом напишу. Сперва коротко и простыми словами. При попытке запустить насос проверяем, не заполнен ли бак, и если нет, то пробуем стартовать. Если после старта выясняется, что воды в скважине нет, пробуем ещё два раза через некоторое время, после чего прекращаем попытки и выдаём ошибку. Если вода есть, качаем её, пока она не закончится, затем делаем паузу, после паузы пытаемся качать снова и так по кругу до тех пор, пока либо бак не заполнится, либо вода в скважине не кончится совсем (или что-то сломается), либо юзер не отдаст принудительный приказ "Отставить!")
Теперь более развёрнуто и нудно) После подачи питания инициализируем периферию, обнуляем всё что нужно и уходим в бесконечный цикл. В цикле опрашиваем поплавковый датчик и кнопки "Старт/стоп" и "Уст. времени". Если от датчика приходит единица, зажигаем светодиод "Бак полон", если ноль - этот светодиод гасим.
Если была нажата кнопка "Уст. времени", переходим в режим задания продолжительности паузы между включениями насоса. Забираем из eeprom прошлое значение (если есть) и выводим на семисегментный индикатор в виде мигающего двухзначного числа. Пауза задается в целых числах минут от 5 до 30 с шагом в 1 минуту. При отсутствии нажатий кнопок в течение 5 секунд или повторном нажатии кнопки "Уст. времени", контроллер возвращается в режим ожидания, при этом новое значение паузы записывается в eeprom. Перейти в режим установки времени если насос уже запущен в автоматическом режиме нельзя.
Если была нажата кнопка "Старт/стоп", пытаемся перейти в режим автоматической работы. Проверяем условие заполненности бака, если он полон (с датчика приходит единица), то вылетаем обратно в режим ожидания, если не полон идём дальше. В алгоритме предусмотрена индикация ошибки работы контроллера при большом количестве неудачных запусков и прерывание его работы. Для этого вводится программный счётчик неудачных запусков, который обнуляется сразу после "запускающего" нажатия кнопки "Старт/стоп". Также здесь же обнуляется флаг "Ошибка". Перед включением насоса проверяем этот счётчик на переполнение больше трёх, и если таковое имеется, зажигаем светодиод "Ошибка" и вываливаемся в режим ожидания. Если же счётчик не переполнен, включаем насос одновременно зажигая светодиод "Работа", выдерживаем паузу около трех секунд для того, чтобы насос раскрутился и вода (если она есть) достигла турбинки датчика потока воды. Далее проверяем, имеется ли меандр на датчике потока воды. Если его нет или частота слишком низкая, значит либо в скважине нет воды, либо есть повреждение какого-то из узлов системы. *Тут надо отметить, что я пока не могу сказать какая именно частота импульсов появляется на выходе датчика при нормальной работе насоса, так как в старом контроллере я контролировал наличие потока аналоговым способом: ставил РЦ-цепочку на выход датчика, а с неё заводил получившийся аналоговый сигнал на вход компаратора с гистерезисом и регулировкой порога срабатывания, соответственно выставляя оптимальный порог на глаз. На выходе получался логический сигнал "есть вода - нет воды" Надо будет собрать стенд и измерить точную частоту осциллографом. Хотя не проблема прикрутить такую же схемку к обычному входу МК для упрощения программы* Эта ситуация определяется как неудачный запуск. Выключаем насос, одновременно погасив светодиод "Работа", инкрементируем счётчик неудачных запусков и выжидаем паузу, продолжительность которой мы выставили в разделе установки времени. При этом на сегментном индикаторе показываются убывающие цифры минут. По достижению нуля возвращаемся в точку перед проверкой счётчика неудачных запусков. Для наглядности см. картинку с алгоритмом.
Если же запуск прошёл удачно, т. е. на выходе датчика потока воды появляется меандр нужной частоты, начинаем крутиться в цикле, одновременно отслеживая три условия: 1) Не нажата ли кнопка "Старт/стоп", т. е. нет ли попытки остановить программу автоматического налива принудительно. Если да, то вырубаем насос и светодиод "Работа" и уходим в режим ожидания. 2) Не поступил ли сигнал единицы с датчика переполнения бака. Если поступил, также вырубаем насос и уходим в режим ожидания. 3) Не снизилась ли частота меандра с датчика потока воды ниже порогового значения, т. е не осушили ли мы скважину в процессе работы насоса. Если да, то вырубаем насос и выжидаем паузу, как это описано в предыдущем абзаце. Затем возвращаемся в точку программы перед проверкой счётчика неудачных запусков. Конечно в алгоритме не описаны разные мелочи вроде программного антидребезга кнопок и датчиков и т. п. На самом деле болтовни здесь больше, чем непосредственно алгоритма работы)
Вот такая "портянка" получилась) Прошу прощения за много букв. Буду очень благодарен, если кто-то из форумчан поможет мне с реализацией кода для МК. Думаю, данный контроллер насоса мог бы пригодиться не только мне, но и другим людям, оказавшимся в сходной ситуации. Спасибо, что прочитали)