цифровая электроника
вычислительная техника
встраиваемые системы

 

Частотомер на Arduino своими руками

Автор: Mike(admin) от 15-09-2017, 21:15

В некоторых случаях необходимо знать частоту измеряемого сигнала. Для этого можно купить специальное устройство под названием частотомер или же сделать такой счетчик частоты самостоятельно на основе популярной платы Arduino.


Частотомер на Arduino своими руками

Данный пример представляет собой небольшой проект, который подойдет для новичков. В этом проекте Arduino считывает напряжение, определяет его частоту и отправляет данные через USB по последовательному порту в компьютер, на котором должна быть установлена программа считывания и визуализации данных с Arduino.


Arduino генерирует точную 1-секундную временную основу для счетчика с помощью каскадирования таймеров timer0 и timer2. Связь между цифровыми входами 3 и 4 соединяет выход таймера 2 (250 Гц) со входом таймера 0. Программа ожидает, когда выход таймера 0 станет положительным, чтобы начать отсчет частоты входного сигнала таймером 1. Timer1 – это 16-разрядный таймер, он переполняется при достижении 2 в степени 16, что, в свою очередь, изменяет значение регистра переполнения overF. В конце 1 секунды записывается 16-разрядный регистр. Затем Arduino отправляет на ПК через USB и последовательный порт 6 байтов данных. Схема подключения очень проста, и ее можно проиллюстрировать с помощью рисунка, приведенного ниже.


Частотомер на Arduino своими руками

Сначала Arduino необходимо подключить к ПК, а затем запустить приложение на основе Visual Basc 6. Приложение ищет Com-порт, отправляя байты и ожидая их обратное принятие. Это занимает несколько секунд. Приложение должно быть отключено, когда Arduino IDE программирует Arduino Uno. Частотный вход представляет собой уровни сигнала TTL, при слабом сигнале должен быть добавлен усилитель. Архив с программой на Visual Basc 6 можно скачать по ссылке http://www.moty22.co.uk/vf_meter.zip. Ниже приведен код (скетч) для создания частотомера на Arduino своими руками.



  byte inByte=0, overF=0;
  unsigned int freq=0;

void setup() {
        // инициализация последовательного порта
    Serial.begin(9600);
    
          // таймер 1 Гц
    OCR0A = 249;
    TCCR0A = _BV(WGM00) | _BV(WGM01) | _BV(COM0A0);
    TCCR0B = _BV(WGM02) | _BV(CS02) | _BV(CS01);  //  режим ШИМ, вход T0 линия D4
    pinMode(6, OUTPUT);
    
      // таймер 2 250 Гц
    OCR2A =249;
    OCR2B = 125;  
    TCCR2A = _BV(COM2B1) | _BV(COM2B0) | _BV(WGM21) | _BV(WGM20);  //выход B в фазе, режим скоростного ШИМ
    TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS21); // установка предделителя в 256 и запуск таймра
    pinMode(3, OUTPUT);
    
        //  вход T1 линия D5
    OCR1A = 32767;   // 32768 отсчетов
    TCCR1A = _BV(WGM10) | _BV(WGM11) | _BV(COM1A0);
    TCCR1B =_BV(WGM12) | _BV(WGM13) | _BV(CS12) | _BV(CS11); // входная линия D5
    pinMode(9, OUTPUT);
    
        // ждем связи с ПК
    while(Serial.available() == 0) {}
    if(Serial.read() == 255){Serial.write(255);}     // если пришло 255 байт, отправляем 255.
      
}

  
  // бесконечный цикл
void loop() {

   if (Serial.available() > 0) {
          // считываем входящий байт
      inByte = Serial.read();
      if(inByte == 255){Serial.write(255);}
 
   }
      // счетчик 

    while(digitalRead(6)){}
    while(!digitalRead(6)){}
 
    TIFR1 = _BV(OCF1A);
    OCR1A = 32767; 
    TCNT1=0;
    overF=0;
    while(digitalRead(6)){
    if(TIFR1 & (1<<OCF1A)) {++overF; TIFR1 = _BV(OCF1A);}   // переполнение
    }
    freq = TCNT1 ; 
    
    Serial.write(highByte(analogRead(A1)));  // отправка младшего байта от 10 битов в analogRead
    Serial.write(lowByte(analogRead(A1))); // отправка старшего байта от 10 битов в analogRead
    
    Serial.write(0);
    Serial.write(overF);
    Serial.write(highByte(freq));
    Serial.write(lowByte(freq));
 
}



© digitrode.ru


Теги: Arduino




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий