Измерение частоты сигнала и генерирование нового

Тема в разделе "Arduino & Shields", создана пользователем white_light, 20 июл 2017.

  1. white_light

    white_light Нуб

    Всем добрый день! Есть сигнал, прямоугольный 5в, частота его меняется со временем, необходимо измерять частоту f в данный момент и генерировать новый прямоугольный сигнал F= f*N где N = 1..1.5

    Как считать нашел, но как сюда лучше всего прикрутить генерирование сигнала?
    Код (C++):

    unsigned long time = 0;        //Время срабатывания датчика
    unsigned long time_old = 0;        //Предыдущее время

    void setup() {
        attachInterrupt(0, impuls, FALLING);   //Прерывание по нарастающему фронту на D2
          Serial.begin(9200);
        Serial.println("start");

    }
         
    void loop(){
        Serial.println("time "+ String(time));
        delay(100);
    }
         
    void impuls(){
        time = (1000000.0/(micros()-time_old)); // измеряем частоту
        time_old = micros();
    }

     
     
  2. Radius

    Radius Гик

    Проще всего сделать с использованием таймеров.
     
  3. white_light

    white_light Нуб

    Генерацию?
     
  4. mcureenab

    mcureenab Гуру

    Всё. И измерение и генерацию. У вас f в каких пределах лежит? Какие требования к точности?
     
  5. mcureenab

    mcureenab Гуру

    Код (C++):
    volatile unsigned long time = 0;        //Время срабатывания датчика
    volatile unsigned long time_old = 0;        //Предыдущее время
     
     
  6. white_light

    white_light Нуб

    До 2кГц, точность до целых или даже до 10 (104 -> 100, 107 -> 110)
     
  7. mcureenab

    mcureenab Гуру

    Нижний предел частоты какой?
     
  8. white_light

    white_light Нуб

    да я так понял, что может от 0 даже (отсутсвие сигнала), и с шагом 5-6 импульсов в секунду
     
  9. white_light

    white_light Нуб

    так и не получилось у меня считывать и генерировать одновременно, как это сделать вместе то?
     
  10. Radius

    Radius Гик

    Для считывания частоты используйте прерывание (цифровой порт 2 или 3 для UNO), а для генерации - таймер.