Частотомер на Ардуино..

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Добрый день!
Суть такая, требуется собрать частотомер и желательно на ардуино, с присутствием сторонних АЦП..
Недавно наткнулся на пример в интернете с использованием библиотеки CyberLib и якобы дается возможность снимать частоту вплоть до 16000000/2.5 попробовал загрузить скетч в Мегу но при компиляции вылазят ошибки. ПРоблема в том что с программированием знаком слабо, Ардуино более менее но встроенные в Библиотеку прилады не смогу осилить.. Помогите с частотомером нужно до 3.5мгц, первично хватит и 2мгц. ПРимер скетча прикладываю и мои ошибки тоже.
С этой библиотекой удалось снять частоту 2.65мгц..
 

#include "CyberLib.h"
ulong l1;
volatile ulong l3;
void setup(){
  Serial.begin(115200);
  //external clock source to D5 (T1) (D4/T0)
  d5i;digitalWrite(5, HIGH);// включить подтяжку входа  
  cli();
  //int on ovfl
  TIMSK1=(1<<TOIE1);    
  TCCR1A=0;//(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);  
  TCCR1B=(0<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12);
  //external clock source on T1. Clock on rising edge
  TCCR1B|=(1<<CS12)|(1<<CS11)|(1<<CS10);
  TCCR1C=0;
  sei();
}
ISR(TIMER1_OVF_vect) {l3++;d13inv;}  
void loop(){ 
  //обнулили счетчики
  cli();l3=0;TCNT1=0;sei();
  dms(1000); //производим захват импульсов 1 секунду
  cli();l1=l3*65535+TCNT1;sei();
  
  Serial.print("f=");Serial.print(l1,DEC);Serial.println(" Hz");
  dms(1000);
}

sketch_jan24a:2: error: 'ulong' does not name a type
sketch_jan24a:3: error: 'ulong' does not name a type
sketch_jan24a.ino: In function 'void setup()':
sketch_jan24a:7: error: 'd5i' was not declared in this scope
sketch_jan24a.ino: In function 'void __vector_20()':
sketch_jan24a:18: error: 'l3' was not declared in this scope
sketch_jan24a:18: error: 'd13inv' was not declared in this scope
sketch_jan24a.ino: In function 'void loop()':
sketch_jan24a:21: error: 'l3' was not declared in this scope
sketch_jan24a:22: error: 'dms' was not declared in this scope
sketch_jan24a:23: error: 'l1' was not declared in this scope
 

 

std
Offline
Зарегистрирован: 05.01.2012

Нету либы. Нарыть, положить в каталог %arduino%\libraries, распаковать. И всё будет.

Она также известна под именем nanopins.

evgeny_zaryanov
Offline
Зарегистрирован: 23.06.2012

Библиотеку CyberLib имею в комплекте . С нее же запускал генератор на 2650кгц.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

evgeny_zaryano, значит версии не совпадают. Я бы просто взял готовую библиотеку частотомера..  http://www.pjrc.com/teensy/td_libs_FreqCount.html

keyfo
Offline
Зарегистрирован: 19.03.2015

dimax, подскажите пожалуйста, как для меги поправить в этой либе входной пин с 47 на другой, так как 47 у меня задействован под LCD дисплей для удобства (LCD Пины: 49, 47, 45, 35, 33, 31, 29). Я так понял нужно менять в декларации COUNTER_USE_TIMER однако я непойму к каким портам они привязаны, гдето что-то упустил...  Если Вас незатруднит, напишите пожалуста к каким пинам какой таймер превязан (в даной либе/вообще). Зарание благодарен за помощь.

п.с. было бы неплохо взять тот таймер что немешает и позволяет пользоваться функцией tone();

п.с.п.с. 47 пин не кретичен, для меня под дисплей, могу его заменить, и пользовать по назначению FreqCount на нем, но хотелось бы больше вкурить эту тему, так как я имею опыт программирования под винду... Однако пины микрухи, прерывания и другие подводные камни МК, для меня оказались дремучим лесом. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

keyfo, да, вы правильно поняли, меняется там. Но входы clock input других таймеров не плате не распаяны, правда кроме таймера0, он распаян -38 нога дуни, но его использовать не предлагают в библе. Так что перекидывайте свой lcd на другую ногу.

keyfo
Offline
Зарегистрирован: 19.03.2015

Да уже перекинул, частотомер работает. Однако теперь, компилятор ругается на функцию tone() выдает кучу ошыбок. Как Я понял, это потому что она привязана к томуже счетчику. Используя частотомер я немогу юзать ШИМ вообще или только штатную функцию tone() ? 

 Задача: Работающий частотомер и возможность выдавать (звуковой) сигнал 50-10000 Гц с помощью ШИМ для сигнализации собитий в реал тайме. Мысли: втулить приревание частотомера для подачи сигнала. 

В какую сторону копать решение этой проблемы?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

keyfo, нет,   tone на 2м таймере работает по умолчанию, не с чего ей на 5й таймер лезть.. Это не библы, смотрите свой скетч внимательно.   Вообще звук можно генерить любым таймером, в меге их навалом.

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Попробовал собрать частотомер и столкнулся с проблемой. Дисплей у меня LCD Shield 1602, он использует пин 5, вход частотомера тоже пин 5. Можно с этим что-нибудь поделать???

volatile unsigned int int_tic=0;
volatile unsigned long tic;
#include
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {

lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1< }
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1< delay(1000);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0;
lcd.setCursor(0, 0);
lcd.print(tic);
lcd.print(" Hz ");
}