Тахометр
- Войдите на сайт для отправки комментариев
Доброго времени суток дорогие форумчане !!!
Есть огромное желание сделать динамическую подсветку на приборку своего авто. Нашел провод идущий с компа на тахометр, осциллографом замерил частоту импульсов при разных оборотах, и остальные параметры импульса.
Приступил к программированию.Arduino UNO. Вопрос собственно возник при подсчете частоты импульсов,
.частоту решил находить через период. Подключаю генератор импусов на 1кГц ко входу int0 (2пин), в мониторе ком порта выдает непонятные результаты.Вот собственно мой код , прошуне судить строго:
int pin = 2;
unsigned long time_prev=0; //время предыдущее
unsigned long f ; //частота
int b=0;
void setup()
{
Serial.begin(9600);
pinMode(pin, INPUT);
attachInterrupt(0, taho, RISING );
pinMode(2, INPUT_PULLUP); //подтягивающий резистор
}
void loop()
{
}
void taho()
{
b++;
if(b==1)
{
cli(); //запрещаю прерывания
f= 1000000/(micros()-time_prev); // 1сек/период между импульсами
time_prev = micros();
Serial.println(long(f));
b=0;
sei(); //разрешаю прерывания
}
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
не нахожу как вообще отредактировать свое первое сообщение
Присоединяюсь к №1, ну и раскрыть тему "непонятных результатов" тоже было бы неплохо.
не нахожу как вообще отредактировать свое первое сообщение
Нулевое сообщение редактировать не получится. Но кто мешает правильно разместить код в последующих?
1 строки 31 и 37 не нужны (хоть и не мешают) это делается автоматически при входе/выходе из прерывания
2 Использовать
Serial
.println
в прерывании крайне не рекомендуется. Делайте это в loop()Какой диапазон частот приходит с датчика? Может стоит лучше считать импульсы вместо измерения периода?
1 строки 31 и 37 не нужны (хоть и не мешают) это делается автоматически при входе/выходе из прерывания
2 Использовать
Serial
.println
в прерывании крайне не рекомендуется. Делайте это в loop()Какой диапазон частот приходит с датчика? Может стоит лучше считать импульсы вместь измерения периода?
Спасибо за ответ, буду исправлять. Еще интересует такой момент, как подтягивающий резистор. Нужен ли он при при прерываниях по восходящему фронту импульса?
Спасибо за ответ, буду исправлять. Еще интересует такой момент, как подтягивающий резистор. Нужен ли он при при прерываниях по восходящему фронту импульса?
Зависит от датчика. Кстати, что там за напряжение на "проводе идущий с компа на тахометр" ?
Спасибо за ответ, буду исправлять. Еще интересует такой момент, как подтягивающий резистор. Нужен ли он при при прерываниях по восходящему фронту импульса?
Зависит от датчика. Кстати, что там за напряжение на "проводе идущий с компа на тахометр" ?
Я пока пробую с генератором импульсов, 1кГц, примерно 3,3В.
На авто с компа 12В, буду делать делитель напряжения, или какую нибудь опторазвязку.
Еще интересует такой момент, как подтягивающий резистор. Нужен ли он при при прерываниях по восходящему фронту импульса?
Без схемы этот вопрос лишен смысла. А схему Вы забыли опубликовать.
Валяется у меня в загашнике такой код
Правда, он для спидометра, но принцип тот же - на выходе имеем частоту следования импульсов
ЗЫ: код не мой, и я его нигде не применял ))
Фрагмент кода потенциально бажный.
Сильно не вникал, но для самообразования - где может быть затык?
http://arduino.ru/forum/programmirovanie/preryvaniyaserial-budet-li-konf...
Вот так?
Типа того. Только, полагаю, sz в данном случае можно вообще не вытаскивать в луп, сделав всё в обработчике прерывания. А атомик натравить только на sp, который, быть может, станет выводится в Serial в пределах loop();
Скорость не нужно считать в прерывании совсем. Считать в лупе по max(предыдущий интервал, время с последнего фронта).
sz - это обнулятор )) - уменьшается, если нет импульсов и при нуле скорость тоже приравнивается к нулю. Соответственно, если обрабатывать его только в прерываниях, то получить нулевую скорость не получится - нет импульсов, нет обнуления.
Скорость действительно можно вычислять в лупе, это не сильно принципиально, зависит от применения. Код, по утверждению автора, у него где-то работает, а себе я его сохранил чисто для коллекции, на всякий случай ))
ЗЫ: брал где-то на драйве
А если совсем хорошо, то вместо прерывания по каждому фронту, нужно использовать аппаратный счетчик.
Еще интересует такой момент, как подтягивающий резистор. Нужен ли он при при прерываниях по восходящему фронту импульса?
Без схемы этот вопрос лишен смысла. А схему Вы забыли опубликовать.
Непонятно, правда, зачем в прерывании вообще операции с плавающей точкой, не говоря уже о самой долгой операции - делении.
В схеме не указаны характеристики импульсов, поэтому нельзя сказать, рабочая она или нет. Но, в любом случае, делитель и подтягивающий резистор - вещи взаимоисключающие, поэтому в данной схеме последний не нужен.
В схеме не указаны характеристики импульсов
Почитайте внимательно выше, 12В, частота импульсов приблизительно от 47Гц (холостой ход), до 200Гц (отсечка). 12В от 50 до 200 Гц. Импульсы прямоугольные.
поэтому нельзя сказать, рабочая она или нет.
Пробую считать импульсы нижеприведенным кодом, считает правильно:
поэтому нельзя сказать, рабочая она или нет.
Пробую считать импульсы нижеприведенным кодом, считает правильно:
В данной схеме меня не устаривает Delay категорически, т.к.нужно будет выполнять другие операции, когда научусь считать правильно импульсы
В данной схеме меня не устаривает Delay категорически, т.к.нужно будет выполнять другие операции, когда научусь считать правильно импульсы
Ну так сделайте аналогично blink without delay.
Но для десятков-сотен Гц лучше, конечно, измерять период а не число импульсов.
Может считать не период, а частоту ?
Ну так сделайте аналогично blink without delay.
Но для десятков-сотен Гц лучше, конечно, измерять период а не число импульсов.
Уберу тогда с кода все лишнее, пока измерю пока период.
Считаю период, а он равен 1 миллисекунде ( 1кГц подаю), в монитор ком порта выводит непонятные значения:
Ниже код, с помощью которого я считаю период:
Прикольно ))
ну дак расскажите в чем прикольно
долго исполняется?
Просто прикольно. А чем оно лучше (sost < 2) ? Ну так, для общего развития ))
Ну можно и так, я сначала bool сделал, потом мне двух состояний не хватило) может поэтому так написал
Считаю период, а он равен 1 миллисекунде ( 1кГц подаю), в монитор ком порта выводит непонятные значения:
Вам же здесь уже говорили, что не нужно пользоваться сериалом в прерывании. Вообще в прерывании не должно быть ничего лишнего и долгого. А работа с сериалом - это очень, очень медленное дело
Вам же здесь уже говорили, что не нужно пользоваться сериалом в прерывании. Вообще в прерывании не должно быть ничего лишнего и долгого. А работа с сериалом - это очень, очень медленное дело
Это я усвоил, убрал я с обработчика.Немного переделал код:
В мониторе ком порта показывает нормальные значения, но эти значения через раз со знаком минус "-".
В мониторе ком порта показывает нормальные значения, но эти значения через раз со знаком минус "-".
Гонять камень в прерывание на каждый импульс ???
У таймеров есть счетный вход и система захвата значения...
Один таймер настроить дергать раз в секунду захват значения на другом таймере + проводок, а второй просто считает импульсы со счетного входа...
В прерывании по захвату второго таймера - обнулять счетчик и копировать значение из регистра захвата в переменную.
В авто достаточно диода между сигналом и ардуино плюс наверняка RC фильтр ибо полезут помехи...
Гонять камень в прерывание на каждый импульс ???
У таймеров есть счетный вход и система захвата значения...
Один таймер настроить дергать раз в секунду захват значения на другом таймере + проводок, а второй просто считает импульсы со счетного входа...
В прерывании по захвату второго таймера - обнулять счетчик и копировать значение из регистра захвата в переменную.
В авто достаточно диода между сигналом и ардуино плюс наверняка RC фильтр ибо полезут помехи...
можно какой-нибудь пример, любой, мне так легче понять будет, заранее спасибо
В мониторе ком порта показывает нормальные значения, но эти значения через раз со знаком минус "-".
Потому что тип должен быть не long, a unsigned long
ТС , а код #30 чем тебе не зашёл?
У таймеров есть счетный вход и система захвата значения...
Можно поинтересоваться, а чем это плохо, ведь в обработчике стоит условие (ну по крайней мере пост #30), и если оно не выполняется, обработчик заканчивается. Я так понимаю это микросекунды.
Я считаю что надо по максимуму использовать аппаратные средства МК.
Я считаю что надо по максимуму использовать аппаратные средства МК.
Зачем?
Я не запрещаю помигать диодом через delay ...
Один таймер настроить дергать раз в секунду захват значения на другом таймере + проводок, а второй просто считает импульсы со счетного входа...
В прерывании по захвату второго таймера - обнулять счетчик и копировать значение из регистра захвата в переменную.
зачем для этого два таймера? все отлично делается и на одном
Даже обе половинки сигнала ШИМ можно одним таймером померять и вывести не только частоту, но и заполнение. Обсуждали же...
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/chtenie-shim-5-kgts?page=1#comment-522823