Как измерить частоту.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Собрался делать металлодетектор на дуине.

Но даже не знаю с чего начать.

Вопрос : Как сгенерировать и принять частоту на одном МК.

Функции tone и pulseIn вместе не работают. 

step962
Offline
Зарегистрирован: 23.05.2011

nestandart пишет:

Собрался делать металлодетектор на дуине.

Но даже не знаю с чего начать.

Вопрос : Как сгенерировать и принять частоту на одном МК.

Функции tone и pulseIn вместе не работают. 

1) Скачать даташит на ATMega16/32 или книжку Евстифеева "Микроконтроллеры семейства AVR ...."

2) Узнать, что мокроконтроллеры ATMega16/32 имеют в своем составе три таймера

3)Почитать все, что можете  найти по Arduino и узнать оттуда, что в библиотеках Arduino используется только один таймер, а именно TMR0. Поэтому стандартные функции, использующие таймер (названные вами, также ШИМ и проч) могут использоваться только раздельно

4) Научиться управлять таймером TMR1 или TMR2 и на их основе запрограммировать необходимые функции

5) Получить удовольствие от одновременного выполнения двух функций - "генерации и приема частоты на одном МК"

 

Да, еще стоит

6) прочитать про прерывания - пригодится

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 Научиться управлять таймером TMR1 или TMR2 и на их основе запрограммировать необходимые функции

Вы хоть пример какой приведите.

step962
Offline
Зарегистрирован: 23.05.2011

 Идете в какой-нибудь поисковик, ну, хотя бы yandex.ru.

набираете что-нибудь типа "Arduino TMR1" (TMR2, CNTR1, CNTR2, ...), получаете что-то вроде yandex.ru/yandsearch

Среди полученных рещзультатов находите самые разные примеры, например

arduino.cc/forum/index.php

Читаете, пытаетесь применить к своей задаче. Ничего не получается. Наконец приходите к мысли, что надо все же прочитать этот fuckin manual.

Прочитав, узнаете, что таймеры в AVR - это очень гибкая вещь, позволяющая добиться очень многого.

И эта гибкая вещь имеет массу (слава богу - не безграничную) режимов и настроек. И в двух словах это не объяснишь. И "какой-нибудь пример" не поможет - volens-nolens придется чему-то научиться.

В чем и желаю вам успехов.

step962
Offline
Зарегистрирован: 23.05.2011

 Не хочется учиться - поищите библиотеки, поддерживающие таймеры/счетчики 1 и 2.

Наберите в Google "arduino timer library", получите что-то вроде www.google.ru/#hl=ru&cp=17&gs_id=1t&xhr=t&q=arduino+timer+library&pf=p&sclient=psy-ab&newwindow=1&source=hp&pbx=1&oq=%D1%84%D0%BA%D0%B2%D0%B3%D1%88%D1%82%D1%89+%D0%B5%D1%88%D1%8C%D1%83%D0%BA+%D0%B4%D1%88%D0%B8&aq=0I&aqi=g-I1&aql=&gs_sm=&gs_upl=&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=868d4025f214950&biw=1244&bih=626

И на первой же странице отловите ссылку:

code.google.com/p/arduino-timerone/

Вот вам и "какие-нибудь примеры"

В том же Google наберите "arduino timer2 library"

Среди множества ссылок на первой же странице увидите эту: "Arduino Forum - Timer2 library"

Скачивайте библиотеку - и наслаждайтесь

 

 

step962
Offline
Зарегистрирован: 23.05.2011

 Ну и уж совсем просто.

В уже упоминаемом Яндексе набираете "как измерить частоту AVR".

Получаете весьма интересные ссылки.

Или мне надо скопировать соответствующие куски кода оттуда?

В качестве "какого-нибудь примера"?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

С генерацией разберусь позже.

А как измерить частоту с внешнего генератора ? 

step962
Offline
Зарегистрирован: 23.05.2011

 Сильно зависит от генерируемой частоты и необходимой точности измерения этой частоты.

Какая частота? Герцы? Килогерцы? Мегагерцы?

Какова потребная точность? 5%? 1%? 0,00001%?

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 Частота от 1Гц до 100кГц.

Точность ... до1Гц.

icms
Offline
Зарегистрирован: 22.03.2011

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

seva100
Offline
Зарегистрирован: 21.11.2012

А тема так и не раскрыта. Тут вообще есть спецы способные толково объяснить нубу в схемотехнике, как измерить на моей arduino mega 2560 два сигнала с частотой от 0 до 200Гц? Хочу на вход ардуино подать сигнал датчика скорости и MAP датчика и получить на компьютер через ком порт значения частоты от датчиков в герцах.

Написал свою прогу осцилографа на делфях, а с ардуино и частотой совладать не могу. 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Здесь может и не раскрыта тема, но вам и не нужно одновременно генерить и мерить. Ищите, здесь на форуме не раз обсуждались датчики оборотов и скорости.

maksim
Offline
Зарегистрирован: 12.02.2012

И к сведению - MAP датчики чаще всего аналоговые, но бывают и с частотным выходом..

step962
Offline
Зарегистрирован: 23.05.2011

seva100 пишет:

А тема так и не раскрыта. Тут вообще есть спецы способные толково объяснить нубу в схемотехнике, как измерить на моей arduino mega 2560 два сигнала с частотой от 0 до 200Гц?

[...]

Написал свою прогу осцилографа на делфях, а с ардуино и частотой совладать не могу. 

Ну, если нуб в схемотехнике "прогу осциллографа на дельфях" наваял, то значит, ему не составит труда в получаемом эти осциллографом сигнале выделить фронты (усли сигнал скорее прямоугольный) или максимумы/минимумы (если сигнал скорее синусоидальный) и рассчитать период изменения сигнала. А там и до частоты недалеко.

Или вам все-же чего-то другого не хватает? Может быть, вы, как нуб в схемотехнике, сигнал с помощью Ардуины снять не можете?

В общем, объясните для начала, каким боком в чисто математическую задачу расчета частоты сигнала влезла схемотехника? И что вам надо "толково объяснять"?

seva100
Offline
Зарегистрирован: 21.11.2012

Поясняю. Итак, беру сигнал приходящий на мозг авто от датчика температуры. Амплитуда сигнала 5v. Подключаю его в порт A0 Ардуины. Кодом:









Serial.print( "{A0," ); 
Serial.print( analogRead(0)); 
Serial.println("}");

читаю значение с порта A0 и передаю в COM порт. В COM порт например летит: {A0,53}

На делфях читаю и разбираю пакеты приходящие по COM порту. Дальше, если в делфийной программе выставлен тип отображения "линейный", то по оси Y выставляется значение 53*5/1024 (ось X - время), т.е. ось Y - напряжение от 0 до 5 вольт. Если тип отображения "температура", то по функции зависимости напряжения от температуры вычисляется температура и ее значение отображается на оси Y. Например 50грд. Тут все понятно и сложностей нет. 

Теперь частота. Хочу завести сигнал с датчика. Допустим MAP. Получить в адруино частоту, например 110Гц и передать полученное значение в COM порт: {A1,110}.
Что бы рассчитать на стороне делфи программы частоту, нужно по ком порту передать не одно значение, а гораздо больше. Есть ли в этом необходимость? Неужели нельзя рассчитать частоту внутри ардуино и передать ее значение в COM порт?

Итог: Скорее всего хочу получить от Вас код для ардуино для чтения показаний с двух частотных датчиков и передачи значений в герцах в COM порт. 

 

maksim
Offline
Зарегистрирован: 12.02.2012

maksim пишет:

Ищите, здесь на форуме не раз обсуждались датчики оборотов и скорости.

Вы или не видите что вам пишут или успешно игнорите. Если нравится когда тыкают носом, то пожалуйста - тема о считывании оборотов и она не одна такая.

Чуть меняем расчет и получаем герцы

#define MAPpin 2 // датчик давления
unsigned long micros_prev = 0, Hz = 0;

void setup() { 
  Serial.begin(9600);
  digitalWrite(MAPpin, 1);
  attachInterrupt(0, MAP, FALLING);
}

void loop(){
  Serial.println(Hz, DEC); // об/мин
  delay(500);
}
void MAP (){
  Hz = (1000000.0/(micros() - micros_prev));
  micros_prev = micros();
}

заметьте здесь используются внешнее прерывание 0 и поэтому подключать нужно к 2 цифровому выводу (дуина УНО), раcчтет ведется не счетом импульсов в секунду, а вычислением времени между фронтами импульсов, поэтому данные поступают оперативно.

Но есть как раз и такой способ как подсчет импульсов за промежуток времени, тоже ни раз здесь обсуждалось.

Чтобы сделать второй канал нужно размножить данный код, но при этом использовать прерывание 1 (attachInterrupt(1, SPEED, FALLING);) на 3 выводе.

seva100
Offline
Зарегистрирован: 21.11.2012

Спасибо, maksim. Пошел изучать.

Спустя 60 минут: УРА! Получилось! Крепчайшего здоровья Вам, maksim и Вашему Интернету.