Как посчитать количество импульсов на цифровом порту
- Войдите на сайт для отправки комментариев
Добрый день.
Делаю контроллер двигателя (дизельного) от рефрежератора. (на микрухе Atmega 328 boot уже залил в нее)
При включении стартера мне нужно как то проверить завелся ли двигатель чтобы отключить стартер.
Подскажите как организавать подсчет скорости вращения коленвала програмно???
Нужно написать функцию при вызове которой на цифровом порту считались бы импульсы (от датчика хола или геркона). которая бы возвращала 1- если двигатель уже завелся и 0 - если еще не завелся.
Т.е. если столько то импульсов в секунду значит двигатель работает и нужно выключать стартер - вернуть 1
а если меньше то возращаем 0 т.е. крутим стартером дальше.
Ребят помогите уже всю голову сломал. Я не программист великий поэтому не могу понять как это сделать.
Светодиодом там помигать с условиями поиграться не промлема но это не пойму как сделать.
Заранее благодарен,
Александр
Поиск по форуму, в правом верхнем углу, волшебные слова - "подсчёт количества оборотов".
Все что нашел это подсчет через прерывания. (не хочется их использовать)
Все что нашел это подсчет через прерывания. (не хочется их использовать)
Не используйте, раз не хочется. Хотя странно - почему вдруг не хочется, особенно если учесть, что это практически единственный расово верный подход? Впрочем, настаивать не буду, не хочется - не используйте.
Все что нашел это подсчет через прерывания. (не хочется их использовать)
Не используйте, раз не хочется. Хотя странно - почему вдруг не хочется, особенно если учесть, что это практически единственный расово верный подход? Впрочем, настаивать не буду, не хочется - не используйте.
Мне впринципе точно знать не нужно. Нужно просто посчитать импульсы и если они больше какого то значения выключить стартер.
Вот нашел что то не можите закоментить. а то не все понятно
01
const
int
tachPIN=2;
02
const
unsigned
long
sampleTime=1000;
03
const
int
maxRPM = 10200;
04
05
void
setup
()
06
{
07
pinMode(tachPIN, INPUT);
08
digitalWrite(tachPIN, HIGH);
//Turns on pullup resistor on pin.
09
Serial
.begin(9600);
10
}
11
12
void
loop
()
13
14
{
15
int
rpm=getRPM();
16
Serial
.print(
"RPM: "
);
17
Serial
.print(rpm);
18
Serial
.print(
"\n"
);
19
}
20
21
int
getRPM()
22
23
{
24
// sample for sampleTime in millisecs
25
int
kount=0;
26
boolean kflag=LOW;
27
unsigned
long
currentTime=0;
28
unsigned
long
startTime=millis();
29
while
(currentTime<=sampleTime)
30
{
31
32
if
(digitalRead(tachPINPin)==HIGH)
33
{
34
kflag=HIGH;
35
}
36
37
if
(digitalRead(tachPINPin)==LOW && kflag==HIGH)
38
{
39
kount++;
40
kflag=LOW;
41
}
42
43
currentTime=millis()-startTime;
44
}
45
46
int
kount2rpm =
int
(60000./
float
(sampleTime))*kount;
47
return
kount2rpm;
48
49
}
... особенно если учесть, что это практически единственный расово верный подход?
А кто-то или что-то запрещает использовть внутренний таймер в режиме "счета" с внешнего входа?
Обыденное дело для "частотомера".
Мне впринципе точно знать не нужно. Нужно просто посчитать импульсы и если они больше какого то значения выключить стартер.
10 (или 100) импульсов - это много или мало?
За год, месяц, день, час - разница как бы не слабая.
Так что само кол-во импульсов - ни чего не говорит.
А если импульсы за какое-то определенное время, то это уже тахометр. :-)
Вариантов - множество программых и меньше аппаратных реализаций "тахометра" на МК.
Мне впринципе точно знать не нужно. Нужно просто посчитать импульсы и если они больше какого то значения выключить стартер.
10 (или 100) импульсов - это много или мало?
За год, месяц, день, час - разница как бы не слабая.
Так что само кол-во импульсов - ни чего не говорит.
А если импульсы за какое-то определенное время, то это уже тахометр. :-)
Вариантов - множество программых и меньше аппаратных реализаций "тахометра" на МК.
За секунду.
Я там вроде нашел примерчик пока разбираюсь как он работает. (выкладывал выше)
Ну скорее всего вам надо, что бы при достижении нужного количества оборотов на одной ноге Uno появилась 1.
Так что в основом потоке идет подсчет оборотов вала. Скорее всего подсчет переходов от 0 в 1 . Разумеется с учетом дребезга на датчике. Второй вычислительный поток (Прерывание или millis()) просто сбрасывает счетчик оборотов при достижении какого-то периода времени. (1 секунда, 0.1 секунда). Если мотор набрал нужные обороты, счетчик импульсов досчитал до установленого числа, то на ногу выставляется 1.
Алгоритм готов. А дальше надо узнать с какой скоростью вращается завевшийся двигатель. На это Uno ответить не может.
Ну скорее всего вам надо, что бы при достижении нужного количества оборотов на одной ноге Uno появилась 1.
Так что в основом потоке идет подсчет оборотов вала. Скорее всего подсчет переходов от 0 в 1 . Разумеется с учетом дребезга на датчике. Второй вычислительный поток (Прерывание или millis()) просто сбрасывает счетчик оборотов при достижении какого-то периода времени. (1 секунда, 0.1 секунда). Если мотор набрал нужные обороты, счетчик импульсов досчитал до установленого числа, то на ногу выставляется 1.
Алгоритм готов. А дальше надо узнать с какой скоростью вращается завевшийся двигатель. На это Uno ответить не может.
Не совсем так. на ноге мне не нужна еденица.
Мне нужна функция проверки завелся ли двигатель. Она будет использована для выключения стартера и для определения нужно ли заводить двигатель если такая команда поступит от другого контроллера.
Считать нужно не постоянно а только при вызове функции из других участков кода. и она должна выдать 1 если двигатель работает (завелся) или 0 если не работает не завелся
Выложил бы схемму контроллера но не знаю как.
как картинку сделать больше не знаю
... особенно если учесть, что это практически единственный расово верный подход?
А кто-то или что-то запрещает использовть внутренний таймер в режиме "счета" с внешнего входа?
Обыденное дело для "частотомера".
Читаем внимательно, а не бросаемся сразу с голой ж. на ежа: я написал "практически единственный". Вы предлагаете ТС щас в таймеры сунуться, если он ни в зуб даже с той простейшей реализацией подсчёта по прерываниям, что так любезно вытащено наружу и выставлено, что та проститутка на Ленинградке? Если что - я про attachInterrupt.
Именно поэтому и написал "практически единственный". Да в любом случае, как ни крути - "практически единственный" != "единственный". Давайте не будем придираться к частностям.
Пытался через форум выложить он жмет картинку до 23кб
Вы не великий программист. А я к сожелению, или к счастью, не великий учитель невеликих программистов. Если вы хотите вычислять через функцию. То у вас уже три вычислительных потока наклевывается. Один - это ваша система. 2 счетчик оборотов, 3 сбос счетчика в нужное время. То что 2 и 3 потоки надо выключать этого не меняет. Так что вам то что вы намечтали не по зубам. А мне объяснить вам,что надо нанимать человека в месте где вы живете для решения ваших желаний.
пока скетч моего контроллера так выглядит
Мне нужна функция проверки завелся ли двигатель. Она будет использована для выключения стартера и для определения нужно ли заводить двигатель если такая команда поступит от другого контроллера.
Считать нужно не постоянно а только при вызове функции из других участков кода. и она должна выдать 1 если двигатель работает (завелся) или 0 если не работает не завелся
Вызываете функцию, получаете два импульса, меряете между ними время, вычисляете обороты.
Если же использовать прерывания, то время и обороты можно вычислять в самой функции прерывания, а в основном скетче полученные значения нужно будет лишь сравнить с нужными.
С какой частотой вращается двигатель?
С какой частотой вращается двигатель?
либо 900 если газ не нажат
либо 1300 если газ нажат.
в качестве газа электромагнит
но импульсы помоему по зубам маховика считаются.
завтра посмотрю
Надо сначало узнать с какой скоростью идут импульсы. А потом уже думать про реализацию.
Завтра постараюсь раздобыть осцилограф и померяю.
Я его другу просто отдал.
либо 900 если газ не нажат
либо 1300 если газ нажат.
Ели стартер от аккамулятора, то:
1. Еще нужно знать кол-во оборотов когда стартер крутит коленвал, а запуск двига не произошел.
2. Контролировать время "пуска". Что бы не насиловать акк непрерывным "Пуском".
3. Контролировать напряжение на батарейке. Перед "Пуском" (пускать или в акке фига-с-малой) и во время запуска (под нагрузкой), что бы не угробить акк в ноль.
4. Вопить "Алярмы" в случае неисправностей и прочего. ;-)
Из личного и горького опыта. :-)
Вот подключил осцилограф к датчику. Причем все провода от него отключены. Он (датчик) сам вырабатывает импульсы. Предполагаю, что он не зубъя считает а прохождение магнита.
фото с осцилографа ниже. Это двигатель работает на холостых оборотах.
Только я не пойму показания частоты. пока осцилограф не подключен показывает 0.000Hz а когда начинаю мерить сигнал, показывает 2.300 КС на холостых и 3.000КС на полных оборотах.
Не пойму что это за еденица измерения такая КС. (осцилограф DSO 203)
http://saveimg.ru/show-image.php?id=ee386bb858ad0fd5c96a8d8e65dca55e
http://saveimg.ru/show-image.php?id=e1a6d88623b7fbf129169f7cae554159
Сам датчик
http://saveimg.ru/show-image.php?id=57a82612cc4c4bdfbb389d302b135238
Видео замера
https://youtu.be/FkHMbOvFMlE аналоговый вход осцилографа
https://youtu.be/7fR62NfTmEA цифровой вход правда случайно делитель включил.
Когда провода от родного контролера были подключины сигнал показывал +-5Вольт
Ну и схемка будующего контроллера
http://saveimg.ru/show-image.php?id=047a0210610728640982892846341b85
все таки присматриваюсь к прерываниям.
ребят прокоментируйте картинки выше....
Ну вот, наверно , надо сделать тестовую программу. Ну у которой дисплей и на которые выводится частота импульсов с датчиков. А потом подсоединить к датчику и включить машину в режиме работы стартера и двигателя. Без этого ну ни как.
взаимные отношения величин довольно близки, т.е. похоже на правду
Мало похоже на магнит, а на зубья - похоже.
900 об/мин это 15 об/сек, а на осциле, по меньшей мере, видна цена клетки 500мкс и периеод синуса в нее, клетку, примерно укладывается. Т.е. 2.300КС похожи таки на килогерцы и 2300/15 дает 153 зуба на один оборот.
Дальше можно прикинуть диаметр маховика и получить вполне вменяемые значения .
все таки присматриваюсь к прерываниям.
ребят прокоментируйте картинки выше....
А зачем Вам вообще считать обороты двигателя? я так понимаю что системя автономная с собственным генератором. Если так, то должно быть все просто, на контрольном проводе подходящем к генератору при неработающем двигателе минус а при работающем плюс равный напряжению бортовой сети. Плюс появляется только тогда когда двигатель выйдет на устойчивые обороты.
Для контроля исправности генератора и работы двигателя использовать датчик давления масла.
[/quote]
А зачем Вам вообще считать обороты двигателя? я так понимаю что системя автономная с собственным генератором. Если так, то должно быть все просто, на контрольном проводе подходящем к генератору при неработающем двигателе минус а при работающем плюс равный напряжению бортовой сети. Плюс появляется только тогда когда двигатель выйдет на устойчивые обороты.
Для контроля исправности генератора и работы двигателя использовать датчик давления масла.
[/quote]
Пока двигатель выйдет на стабильные обороты стартер будет крутить. ( а это не есть хорошо)
по датчику давления то же
Все датчики (кроме давления масла) при нормально режиме работы замкнуты. При наступлении аварии размыкаются. Датчик масл наоборот замыкается. С написанием этого кода проблем не будет.
Ну вот, наверно , надо сделать тестовую программу. Ну у которой дисплей и на которые выводится частота импульсов с датчиков. А потом подсоединить к датчику и включить машину в режиме работы стартера и двигателя. Без этого ну ни как.
Я так и планирую сделать.
взаимные отношения величин довольно близки, т.е. похоже на правду
Мало похоже на магнит, а на зубья - похоже.
900 об/мин это 15 об/сек, а на осциле, по меньшей мере, видна цена клетки 500мкс и периеод синуса в нее, клетку, примерно укладывается. Т.е. 2.300КС похожи таки на килогерцы и 2300/15 дает 153 зуба на один оборот.
Дальше можно прикинуть диаметр маховика и получить вполне вменяемые значения .
Не согласен. Если датчик это катушка (предполагаю т.к. от него отключены все провода а он дает импульсы +-8Вольт) то либо весь венец маховика это магнит, либо есть несколько магнитов. Сегодня разберу посмотрю.
Диаметр впринципе не обязательно прикидывать. надо зубья посчитать и если счетчик насчитает 153 зуба то это 1 оборот.
Показывал картинки на других форумах все говорят что КС - это килоциклы что равно килогерцы
Я правельно понимаю.
Пока двигатель выйдет на стабильные обороты стартер будет крутить. ( а это не есть хорошо)
по датчику давления то же.
стабильные имеется ввмду что двигатель уже работает сам без стартера и это около 400 об/мин
а давление масла для контроля за двигателем (его всеравно надо использовать), т.е условия:
1) если после 5 сек после запуска непоявилось давление масла или пропало во время работы - двигатель заглушить,
2) если давление есть а на генераторе минус - стартер не включать, неисправен генератор или датчик давления масла.
ну и тп все равно обвязку защиты делать и гемор с подсчетом оборотов пропадает, по крайней мере так работают системы автозапуска если обороты движка не цеплять.
Не согласен. Если датчик это катушка (предполагаю т.к. от него отключены все провода а он дает импульсы +-8Вольт) то либо весь венец маховика это магнит, либо есть несколько магнитов. Сегодня разберу посмотрю.
Магнитные (индуктивного типа). Датчики коленвала этого типа не требуют для себя отдельного источника питания. Для сигнала ЭБУ напряжение индуцируется в тот момент, когда зуб синхронизации проходит сквозь магнитное поле, образованное вокруг датчика. Помимо контроля за оборотами коленвала, датчик коленвала используется и как датчик скорости.
те магнит на самом датчике и при прохождении зуба меняется магнитное датчика и соответственно индуцируется эдс
Магнитные (индуктивного типа). Датчики коленвала этого типа не требуют для себя отдельного источника питания. Для сигнала ЭБУ напряжение индуцируется в тот момент, когда зуб синхронизации проходит сквозь магнитное поле, образованное вокруг датчика. Помимо контроля за оборотами коленвала, датчик коленвала используется и как датчик скорости.
те магнит на самом датчике и при прохождении зуба меняется магнитное датчика и соответственно индуцируется эдс
Снял датчик. Действительно в самом датчике есть магнит (ключ к нему прилипает) и считает он действительно зубья коленвала.
Итак по результатам измерения имеем следующие данные:
1. Количество зубов на маховике 108 шт
2. Частота сигнала при вращении стартера (двигатель не заведен) 393 Гц
Это получается 393/108=3,63 об/сек (помоему это как то не реально)
3. Частота сигнала на холостых оборотах 2,3 кГц
это 2300/108=21,29 об/сек если умножить на 60 = 1277 об/мин (тоже крутовато для дизеля)
Может я чего не правельно считаю???
Может я чего не правельно считаю???
Я так понял что это стационарный двигатель, для них нормальное условие работать с постоянными оборотами, при увеличении нагрузки обороты не меняются. обзем дизеля то какой? на слабофорсировнных дизелях обычно рабочие обороты 1500-2000
ну если тока еще раз зубья маховика пересчитать
Я так понял что это стационарный двигатель, для них нормальное условие работать с постоянными оборотами, при увеличении нагрузки обороты не меняются. обзем дизеля то какой? на слабофорсировнных дизелях обычно рабочие обороты 1500-2000
[/quote]
Это дизель 2,2 литра объемом. Холодильная установка Thermoking SBIII.
Я просто уверен что стартер не может крутить двигатель со скоростью 3,6 об/сек. это видно невооружонным глазом
ну если тока еще раз зубья маховика пересчитать
Да я точно посчитал. Я напротив первого зуба поставил жирную риску и считал вращая вал отверткой через дырку датчика. Там больше одного зуба не зацепиш.
А не может датчик давать несколько импульсов на 1 зуб??
А не может датчик давать несколько импульсов на 1 зуб??
вот читайте http://diagramas.diagramasde.com/otros/Manual%20de%20Mantenimiento%20SB%20III%2030%20y%2050.pdf
1425-1475 низкие обороты(мин обороты)
2175-2225 высокие обороты(максимальные обороты)
А не может датчик давать несколько импульсов на 1 зуб??
вот читайте http://diagramas.diagramasde.com/otros/Manual%20de%20Mantenimiento%20SB%20III%2030%20y%2050.pdf
1425-1475 низкие обороты(мин обороты)
2175-2225 высокие обороты(максимальные обороты)
За книжку огромное спасибо.
У меня получается обороты примерно 1333 даже меньше чем положено. Значит датчик считает верно.
Тепер о программной реализации. Вот скетч счетчика оборотов по прерываниям. Правельно ли я закоментил каждую строку??? (если я его правельно понимаю то буду его как то изменять под свои нужды)
micros() раз в 70 минут
ну тут на случай неверного отсчета надо делать выборку из 10-20 значений из них отбрасывать 4 верхних и 4 нижних а по оставшимся делать усреднение.
также не помешает при переходе к функции прерывания отключать прерывание и потом включать прерывание по выходу из функции
micros() раз в 70 минут
ну тут на случай неверного отсчета надо делать выборку из 10-20 значений из них отбрасывать 4 верхних и 4 нижних а по оставшимся делать усреднение.
также не помешает при переходе к функции прерывания отключать прерывание и потом включать прерывание по выходу из функции
Чего то я совсем запутался.
Получается, что время работы моего контроллера будет ограничено 70-ю минутами после чего он сдохнет???
Мне впринципе точные значения не нужны.
Мне достаточно если частота импульсов выше 500Гц (у меня когда стартер крутит осцил показывает 383Гц) нужно сообщить программе 1 т.е. двигатель завелся. или 0 если не завелся.
Это нужно чтобы знать когда выключать стартер и нужно ли его включать если пришла команда с другого контроллера завести двигатель.
как-то так обороты определяются, а лучше всетаки снимать с контрольного провода генератора плюс и не мучать себе голову с считыванием оборотов
как-то так обороты определяются, а лучше всетаки снимать с контрольного провода генератора плюс и не мучать себе голову с считыванием оборотов
Спасибо. Чейчас попытаюсь разобраться что Вы написали.
вот оно же, но под другим соусом,тоже должно работать
вот вообще без прерываний измеряется длительность одного импульса и из этого высчитываются обороты
с выборкой 20 результатов и усреднением по ним
ну тут надо в живую смотреть и возможно поправки (+ или -) в pulseIn до расчетов вносить
Спасибо огромное evgta.
Сейчас лег в больницу на 3 дня для плановой операции. Как выпишусь буду пробовать.
О результатах отпишусь.
вот вообще без прерываний измеряется длительность одного импульса и из этого высчитываются обороты
с выборкой 20 результатов и усреднением по ним
ну тут надо в живую смотреть и возможно поправки (+ или -) в pulseIn до расчетов вносить
В 14 стороке помоему порт не тот указан??? Поидее 8-й порт будет.
А можно напрямую на порт ардуины сигнал от датчика оборотов +8Вольт??? Или лучще через оптопару
pc817 Завязать???
напрямую думаю лучше не стоит, я бы подсоединил последовательно керамический конденсатор и между конденсатором и ногой МК защитный диод 4,7в(односторонний) или стабилитрон одной ногой а другой к массе , и второй контакт датчика тоже посадил бы на массу.
Но это мои предположения, может кто и получше знает как делать