Плавное/ступенчатое изменение низкой частоты
- Войдите на сайт для отправки комментариев
Доброго времени суток, всем читающим эту тему.
Хочу сделать приблуду себе в гараж, которая сможет управлять дозирующим насосом, который плунжерного типа. Собственно написать "моргалку" не проблема.
if (millis() - timer >= 300) { // Задержка с которой тикает насос if (fpstate == LOW) //fp - fuel pump собственно насос fpstate = !fpstate; else fpstate = !fpstate; digitalWrite(fp, fpstate); do { timer += 300; if (timer < 300) break; } while (timer < millis() - 300); }
Но я столкнулся с тем, что мне надо временами изменять частоту насоса, по таймеру. При чем делать это несколько раз варьируя частоту от 2х до 6ти герц (по задержке в коде примерно выходит 250мс-70мс).
И так собственно вопрос стоит таким образом - как плавно (или на крайняк ступенчато) изменить частоту пульсов на выходе?
Я пробовал следующим образом, но:
а) Этим получилось только плавно затормозить
б) работает только один раз, если несколько раз вкинуть с разными счетчиками, то работает только один
в) в идеале хотел бы обойтись без delay, но это не принципиально
puls=constrain(puls,0,300); //puls это доп переменная, которой я и собирался урегулировать частоту пульсов puls=puls+1; delay(20); if (millis() - timer >= puls) { if (fpstate == HIGH) fpstate = !fpstate; else fpstate = !fpstate; digitalWrite(fp, fpstate); do { timer += puls; if (timer < puls) break; } while (timer < millis() - puls); }
Пожалуйста пните куда смотреть, я дальше сам разберусь))
У Вас все перепутано. Проверку в 1-й строке надо делать после изменения переменной (строка 2). Кроме того кто Вам мешает вместо puls=puls+1; поставить puls=puls-1;? (кстати в си обычно пишут puls++; или puls--;)
А, в принципе, очень сложно что-то советовать, когда Вы даете кусок программы, в котором, как Вам кажется. проблема. Скорее всего проблема в другом, но я этого не вижу.
Представьте полную программу, а не непонятный огрызок.
Программа сама по себе не дописана, ибо не могу вот расчехлить с изменением. Попробовал последовать вашему совету и о чудо - одна проблема ушла) но осталось следующее - если я попробую повторить этот же таймер только с другими параметрами, оба считают сразу и мешают друг другу получается.
Итак, спасибо за помощь, эту беду я поборол)) по крайней мере я так думаю. Но скетч выложу на всякий сейчас и когда допилю до адекватного состояния
Итак, спасибо за помощь, эту беду я поборол)) по крайней мере я так думаю. Но скетч выложу на всякий сейчас и когда допилю до адекватного состояния
Вот положа руку на сердце - бред бреднёвый. 68 и 82 строки - это что? delay() в замаскированной форме?
Может Вы сядете и нормальным языком опишите алгоритм, а затем потихонечку переведёте его на си++?
А то херня - с получается.
да и пофиг, главное работает)) я с ардуино знаком двое суток, мне не для комерции, а для души поделать всяко-разные вещи. Я вот что по видеоурокам успел ухватить, тем и орудую. Тут понимаете в чем дело то, да я думал использовать дилей, но вот где не читаю, все эту функцию хают на чем свет стоит. Ну и мне нужно будет еще "вписать" в это тело три-четыре дополнительные функции, которые могут не сочетаться с дилеем.
А вот по поводу, что я хочу сделать - у меня валяються три котла в гараже, вебасто у которых нет мозгов, но все остальное рабочее. Я хочу сделать автономку для гаража, жидкостную. Алгоритм в двух словах не описать, но я все же попробую:
1) Первая минута - включение водного насоса, продувка вентилятором на 20% от его мощности, с 30й секунды поджиг свечи накала на 100% с выдержкой 10с и затуханием за 20с до 70% (так и останеться вплоть до третей минуты)
2) С 60й секунды дозирующий насос работает на 6гц, 4с, после чего на 2гц, 10с. Также вентилятор вращаеться на 37-40% номинальной мощности. Примерно на 80й секунде будет стабильное горение топлива. Далее нарастает частота до 5.25гц вплоть до выхода на полную нагрузку (примерно 6я минута в зависимости от наружных условий). После 80й секунды вентилятор выходит на 90% мощности и держит ее в режиме полной нагрузки.
3) Переход на частичную нагрузку при достижении температуры 80-85С, при которой вентилятор 65%, насос 3,1гц
4) Защиты по температуре, уровню топлива, охлаждайки тоже должны входить в цикл.
Надеюсь мой текст вас не утомил)
Смело. Зная ардуино два дня :) Застрахуйте гараж и сами застрахуйтесь !
да и пофиг
Прочитал. Вот тут и проблема. Вы исходите из неправильных предпосылок. Что вам надо в итоге? - вот оттуда прыгайте, а не от "на 10-й секунде наступил конец этого мира и начался новый".
Например:
1) Включаем циркуляционный насос;
2) Включаем вытяжной вентилятор (нахера?);
3) Включаем свечу зажигания до загорания, которое контролируем???
4) достигаем установленной температуры теплоносителя, останавливаем горение.
Теперь понимаем, что предыдущая шняга - это только кусок программы. Ведь в итоге нам нужно получить в гараже конкретную температуру.
Так что:
в сетапе:
включаем циркуляционный насос
включаем вентилятор
в основной программе:
контролируем температуру в помещении и в соответствии с ней регулируем температуру теплоносителя (используя подпрограмму запуска и остановки котла).
В проектах я такую шнягу опубликовал. Чуть доработать под Вашу задачу - и все...
И вообще - Вам что больше нужно - температура в гараже или запуск котла?
Смело. Зная ардуино два дня :) Застрахуйте гараж и сами застрахуйтесь !
Да лыдыть - там на соляре. Это Вам не на газу.
Вентилятор не вытяжной, а нагнетающий, в котлах с нагнетанием всегда включается до рабочего цикла и после него, для насыщения кислородом камеры сгорания и выдува паров топлива, если таковые имеются.
Свеча не зажигания, а накала ибо топливо дизельное. Должна быть включена какое-то время на случай срыва пламени, чтобы не стартовать котел с нуля.
По достижению температуры, горение не нужно останавливать, его нужно снизить. Это делается для меньшего расхода топлива. Остановка будет более-менее эффективной только, если разброс между уставкой старта и стопа небольшой, но в таком случае будут перепады температуры из-за инертности запуска.
Вентилятор не должен постоянно работать на максимуме, только в режиме полной нагрузки.
А за проект, премного благодарен, правда. Я чуть подучусь и разберу что там и как, ибо с библиотеками я еще не разобрался, сложно))
Я потому все жестко по таймерам решил завязать, взяв за пример работу штатной вебасты, для того, чтобы в итоге понять что нужно подстраивать и как. Ведь автомобильная автономка гоняет меньше охлаждайки, чем если это будет отопление помещения.
Вентилятор не вытяжной, а нагнетающий, в котлах с нагнетанием всегда включается до рабочего цикла и после него, для насыщения кислородом камеры сгорания и выдува паров топлива, если таковые имеются.
Свеча не зажигания, а накала ибо топливо дизельное. Должна быть включена какое-то время на случай срыва пламени, чтобы не стартовать котел с нуля.
По достижению температуры, горение не нужно останавливать, его нужно снизить. Это делается для меньшего расхода топлива. Остановка будет более-менее эффективной только, если разброс между уставкой старта и стопа небольшой, но в таком случае будут перепады температуры из-за инертности запуска.
Вентилятор не должен постоянно работать на максимуме, только в режиме полной нагрузки.
А за проект, премного благодарен, правда. Я чуть подучусь и разберу что там и как, ибо с библиотеками я еще не разобрался, сложно))
Я потому все жестко по таймерам решил завязать, взяв за пример работу штатной вебасты, для того, чтобы в итоге понять что нужно подстраивать и как. Ведь автомобильная автономка гоняет меньше охлаждайки, чем если это будет отопление помещения.
Понимаете - скорее всего Вы не сможете всего этого реализовать. Но если у Вас достаточно большой объем помещения (3 тыщи кубов и более) и большой объем теплоносителя, то Вам не надо "ловить блох" - работайте на максимуме котла. Достигаете максимума - останавливаете - гистерезис - запускаете. Можно попытаться использовать подачу топлива в котел (с помощью AnalogWrite()), но не советую. Скорее всего не получится.
Итак, забил я на это дело и уехал на работу) но так вышло, что немного в другом месте пришлось делать что-то подобное и за походом я таки допилил код под свои условия.
Теперь только дописать условия защит и убрать лишнее, но в целом все реализовано как я и хотел.
в код особо не вникал, одно замечание.
Вот так вот считать интервалы нельзя,
потому что при переполнении счетчика времени условие развалится. Вместо этого все подобные скобки. коих у вас в коде десятка три. надо переписать вот так
большое спасибо за совет, обязательно поправлю!