Частотомер на Ардуино..
- Войдите на сайт для отправки комментариев
Сб, 24/01/2015 - 15:51
Добрый день!
Суть такая, требуется собрать частотомер и желательно на ардуино, с присутствием сторонних АЦП..
Недавно наткнулся на пример в интернете с использованием библиотеки 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
Нету либы. Нарыть, положить в каталог %arduino%\libraries, распаковать. И всё будет.
Она также известна под именем nanopins.
Библиотеку CyberLib имею в комплекте . С нее же запускал генератор на 2650кгц.
evgeny_zaryano, значит версии не совпадают. Я бы просто взял готовую библиотеку частотомера.. http://www.pjrc.com/teensy/td_libs_FreqCount.html
dimax, подскажите пожалуйста, как для меги поправить в этой либе входной пин с 47 на другой, так как 47 у меня задействован под LCD дисплей для удобства (LCD Пины: 49, 47, 45, 35, 33, 31, 29). Я так понял нужно менять в декларации COUNTER_USE_TIMER однако я непойму к каким портам они привязаны, гдето что-то упустил... Если Вас незатруднит, напишите пожалуста к каким пинам какой таймер превязан (в даной либе/вообще). Зарание благодарен за помощь.
п.с. было бы неплохо взять тот таймер что немешает и позволяет пользоваться функцией tone();
п.с.п.с. 47 пин не кретичен, для меня под дисплей, могу его заменить, и пользовать по назначению FreqCount на нем, но хотелось бы больше вкурить эту тему, так как я имею опыт программирования под винду... Однако пины микрухи, прерывания и другие подводные камни МК, для меня оказались дремучим лесом.
keyfo, да, вы правильно поняли, меняется там. Но входы clock input других таймеров не плате не распаяны, правда кроме таймера0, он распаян -38 нога дуни, но его использовать не предлагают в библе. Так что перекидывайте свой lcd на другую ногу.
Да уже перекинул, частотомер работает. Однако теперь, компилятор ругается на функцию tone() выдает кучу ошыбок. Как Я понял, это потому что она привязана к томуже счетчику. Используя частотомер я немогу юзать ШИМ вообще или только штатную функцию tone() ?
Задача: Работающий частотомер и возможность выдавать (звуковой) сигнал 50-10000 Гц с помощью ШИМ для сигнализации собитий в реал тайме. Мысли: втулить приревание частотомера для подачи сигнала.
В какую сторону копать решение этой проблемы?
keyfo, нет, tone на 2м таймере работает по умолчанию, не с чего ей на 5й таймер лезть.. Это не библы, смотрите свой скетч внимательно. Вообще звук можно генерить любым таймером, в меге их навалом.
Попробовал собрать частотомер и столкнулся с проблемой. Дисплей у меня 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 ");
}