Регулятор оборотов диз.двигателя.
- Войдите на сайт для отправки комментариев
Чт, 18/06/2020 - 22:42
Уважаемые мастера, добрый день.
Прошу проверить скетч для регулятора оборотов диз.двигателя (сам я новичок в этом деле, поэтому прошу помощи у более опытных спецов))).
Для контроля оборотов планируется датчик холла, который считывает обороты с зуб.колеса (фото)
За один оборот коленвала над датчиком пройдет 5 зубов.
Управление подачей топлива осуществляется моторчиком на ТНВД.
Моторчик будет управляться через релюшки, которыми будем управлять 8 и 9-м пинами.
Скетч:
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
void setup() {
Serial.begin(9600); //открыть порт
//-------Счетчик оборотов на датчике холла----------
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
void loop() {
display.setBrightness(2);
display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
if (RPM=8000){ //когда обороты уменьшатся до 1600 (1600*5=8000)
digitalWrite(8, LOW); //снять 5 вольт с 8 пина для откл мотора ТНВД на уменьшение оборотов;
}
if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
if (RPM=8000){ //когда обороты увеличатся до 1600 (1600*5=8000)
digitalWrite(9, LOW); //снять 5 вольт с 9 пина для откл мотора ТНВД на увеличение оборотов;
}
Serial.println(RPM); //вывод в порт
delay(1000); //задержка для стабильности
}
Код вставь, как положено.
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-dl...
По хорошему надо ПИД регулятор сюда, иначе обороты будут постоянно плавать в районе заданной величины.
По хорошему нужна сладкая парочка ШИМ+ПИД а не реле)))))))))))))))))))
Это старый советский генератор и скорость регулирования оборотами достаточно медленная (примерно 3-5% в сек.).
Если заплавает, можно не 10, а 20 поставит, хотя и этого хватит.
К тому же изменения оборотов в денном случае - маловероятное событие, т.к. запас мощности двигателя по отношению к мощности генератора двукратный(это же военка) и нагружать его (генератор) будут едва ли % на 60.
Регулятор - пожелание клиента, которому надоели участившиеся подгорания контактов 50-летних релюшек, а на заводской контроллер типа dkg-253 ему жалко тратить двадцатку. О надежности ардуинки и возможных последствиях он предупрежден и готов с ними мириться.
Нужно просто проверить полсотни строк кода, а дальше уж сами разберемся.
Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.
2. delay() желательно убрать. см. BlinkWithoutDelay
3. замени реле на выходах на транзисторные ключи. нежелательно часто чваркать контактами при индуктивной нагрузке.
Да, выходные пины сконфигурируй в setup.
[
Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.
[/quote]
Прошу простить дилетанта: мне нужно, чтобы питание с релюшек (вернее теперь с тр.ключей) снималось по достижении заданных оборотов.
Т.е. моторчик работает пока RPM не достигнет 8000, после чего остановится.
Как правильно написать команду?
1) если хотите нормально решить вопрос, лучше заказать код
2) для регулирования оборотов лучше использовать Н-мост т.к. крутить мотор требуется в обе стороны
3) никакого ШИМ вам не требуется ввиду большой инерционности системы и отсутствия требований к суперточности.
4) строка 31 лишняя в лупе,ее место в сетапе.
я это к тому, что Вы готовы убить очень много времени на решение вашего вопроса самостоятельно? Если честно, такой код хоть и не сложен, но повозиться есть с чем - новичку...
Так я ж он самый и есть новичок, и готов учиться.
А мост ни к чему, моторчик старый простейший коллекторный, к тому же на 27в, пара релюшек будет переключать обмотку возбуждения в разные стороны.
моторчик работает пока RPM не достигнет 8000, после чего остановится.
Как правильно написать команду?
вместо вот этого
пишите например так:
строки 26 и 33 на кой там такая точность с такими константами? там и millis достаточно и упростите константы.
Просто счетчик оборотов я списал с удачно получившегося тахометра, который на прошлой неделе сделал))))
пишите например так:
А не получится, что отключатся моторчик будет при 7951 и 8049?
если честно, b707, предложил правильную запись, но я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги. Попробуйте, это не сложно.
если честно, b707, предложил правильную запись, но я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги. Попробуйте, это не сложно.
А можно пример? (не расписать конкретно мой кривенький "шедевр", а чтонить похожее, чтобы я понял как это работает)
А можно пример? (не расписать конкретно мой кривенький "шедевр", а чтонить похожее, чтобы я понял как это работает)
логическое И где второй параметр и есть флаг. т.е. if выполняется если оба условия верны. Ну а по выполнении флаг скинуть.
я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги.
Да. поддерживаю. Это можно из без флагов сделать - просто последнее else в моем коде #10 заменить на else if (RPM > 7990 && RPM < 8010)
Так?
чет элементарная вещь, а бошка не варит... не могу в уме посчитать конечный автомат на 2 шага :)))))))))))))
в принципе пост 17 прост для понимания, но я не люблю оставлять области, в которых состояние системы не определено. В данном случае это не критично...
Так сработает?
в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось
очень правильное замечание, вот так будет надежнее:
в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось
очень правильное замечание, вот так будет надежнее:
Я еще планировал на релюшках блокировку размыкающими контактами сделать от одновременного включения.
в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось
очень правильное замечание, вот так будет надежнее:
Я еще планировал на релюшках блокировку размыкающими контактами сделать от одновременного включения.
А где я намусорил?)))
пост 21 строки 15 17 19 и иже с ними
Исправляю...
строчки 43-44 поменяйте местами. и 47-48 так же. Чтобы сначала LOW , а потом HIGH.
Я в своем коде поправил
Исправил...
Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.
Прошу простить дилетанта: мне нужно, чтобы питание с релюшек (вернее теперь с тр.ключей) снималось по достижении заданных оборотов.
Т.е. моторчик работает пока RPM не достигнет 8000, после чего остановится.
Как правильно написать команду?
ибо условие (RPM==8000) может никогда не совпасть с моментом проверки if.
Так?
else
if
(RPM > 7990 && RPM < 8010){
//когда обороты больше 7950 и меньше 8050
Так?
else
if
(RPM > 7990 && RPM < 8010){
//когда обороты больше 7950 и меньше 8050
как бы сказать, это и правильно и не правильно.... чисто теоретически, допустим, у вас произошел замер частоты 7990, а следующий показал 8010. в данном конкретном случае, событие маловероятное, НО.... Вы можете объяснить состояние системы при указанном событии? - это чисто для понимания.