Частотомер без прерываний

mrWang
Offline
Зарегистрирован: 19.03.2017

Доброго времени суток! Столкнулся с проблемой, нужно не используя прерывания получить частоту сигнала на пине ардуины (от 0 до 5000 Гц).  Может у кого есть кусочек кода))) что бы заново не изобретать велосипед...

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Ищите библу freqcounter
ЗЫ. Хотя прерывание таймера там всё равно используется...

mrWang
Offline
Зарегистрирован: 19.03.2017

По точности больше подходит FreqMeasure в нужном диапазоне

Однако "FreqMeasure requires the input frequency as a digital level signal on a specific pin" накладывает ограничение на исползуемые пины, что не есть хорошо в моем случае

таймер можно использовать, а прерывания нет

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Если проблема в получении цифрового уровня, то добавьте какой-нибудь простой усилитель-формирователь, на одном транзисторе...
Про точность вы ничего не указывали, равно как и про "пин"-ограничения...
Библы, кроме freqmeasure - freqcounter, freqcount

mrWang
Offline
Зарегистрирован: 19.03.2017

Вот перевод с http://forum.arduino.cc по поводу всех этих библиотек

"Это означает, что ни один из ШИМ-выводов на Uno не будет работать, пока вы измеряете частоту.
Если частота, которую вы хотите измерить, меньше, чем около 10 кГц, существуют другие способы измерения, которые принимают только один таймер или даже таймеры вообще".

Т.е. как раз почему я и не хочу. точнее не могу использовать прерывания.

Интересуют "другие способы измерения".

Проблем с уровнем сигнало нет.

mrWang
Offline
Зарегистрирован: 19.03.2017

вот нашел тут на форуме ветку http://arduino.ru/forum/programmirovanie/takhometr-1

а в ней код. но судя по всему не до конца рабочий

"версия кода действительно считает нажатия, проблема в том, что она не перестаёт считать их по прошествии одной секунды. Что можно исправить, подскажите?"

#define LED_PIN 3
#define GERK_PIN 7
#define TIME 1000 // время, в течение которого будет производится подсчёт оборотов - 1 секунда

boolean gerk = false;       //состояние геркона
boolean previous = false;   //предыдущее состояние геркона
unsigned long prev_time = 0; // время с момента прошлой проверки
unsigned long curr_time = 0; // текущее время

long rotation = 0; // счётчик срабатываний геркона
long RPS = 0; // количество оборотов в секунду

void setup() {
pinMode(LED_PIN,OUTPUT); // режим работы пина диода
pinMode(GERK_PIN,INPUT); // режим работы пина геркона
 Serial.begin(9600); // инициализация последовательного порта
}

void loop() {
prev_time = millis(); // считываем значение текущего времени
do
    { //подсчёт оборотов
    boolean current = digitalRead(GERK_PIN); //проверка геркона
   if(current && !previous)    //если текущее состояние - 1 и прошлое - 0, то    
      {
        prev_time = curr_time; // сохранить время последнего переключения
        gerk = !gerk; // переключить геркон в противоположное состояние
        rotation==rotation++; // увеличение счётчика оборотов на 1
      }
    previous = current; // записать в ячейку прошлого состояния текущее 
    curr_time = millis(); // считываем значение времени, прошедшего с прошлого измерения  
    }
while (curr_time - prev_time < TIME); //проверяем, прошла ли секунда 
    
// и если прошла, передаём количество оборотов по последовательному порту
    

Serial.println(rotation); 
rotation=0; //обнуляем счётчик оборотов

}