Как измерить частоту.
- Войдите на сайт для отправки комментариев
Сб, 17/12/2011 - 18:57
Собрался делать металлодетектор на дуине.
Но даже не знаю с чего начать.
Вопрос : Как сгенерировать и принять частоту на одном МК.
Функции tone и pulseIn вместе не работают.
Собрался делать металлодетектор на дуине.
Но даже не знаю с чего начать.
Вопрос : Как сгенерировать и принять частоту на одном МК.
Функции tone и pulseIn вместе не работают.
1) Скачать даташит на ATMega16/32 или книжку Евстифеева "Микроконтроллеры семейства AVR ...."
2) Узнать, что мокроконтроллеры ATMega16/32 имеют в своем составе три таймера
3)Почитать все, что можете найти по Arduino и узнать оттуда, что в библиотеках Arduino используется только один таймер, а именно TMR0. Поэтому стандартные функции, использующие таймер (названные вами, также ШИМ и проч) могут использоваться только раздельно
4) Научиться управлять таймером TMR1 или TMR2 и на их основе запрограммировать необходимые функции
5) Получить удовольствие от одновременного выполнения двух функций - "генерации и приема частоты на одном МК"
Да, еще стоит
6) прочитать про прерывания - пригодится
Научиться управлять таймером TMR1 или TMR2 и на их основе запрограммировать необходимые функции
Вы хоть пример какой приведите.
Идете в какой-нибудь поисковик, ну, хотя бы yandex.ru.
набираете что-нибудь типа "Arduino TMR1" (TMR2, CNTR1, CNTR2, ...), получаете что-то вроде yandex.ru/yandsearch
Среди полученных рещзультатов находите самые разные примеры, например
arduino.cc/forum/index.php
Читаете, пытаетесь применить к своей задаче. Ничего не получается. Наконец приходите к мысли, что надо все же прочитать этот fuckin manual.
Прочитав, узнаете, что таймеры в AVR - это очень гибкая вещь, позволяющая добиться очень многого.
И эта гибкая вещь имеет массу (слава богу - не безграничную) режимов и настроек. И в двух словах это не объяснишь. И "какой-нибудь пример" не поможет - volens-nolens придется чему-то научиться.
В чем и желаю вам успехов.
Не хочется учиться - поищите библиотеки, поддерживающие таймеры/счетчики 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"
Скачивайте библиотеку - и наслаждайтесь
Ну и уж совсем просто.
В уже упоминаемом Яндексе набираете "как измерить частоту AVR".
Получаете весьма интересные ссылки.
Или мне надо скопировать соответствующие куски кода оттуда?
В качестве "какого-нибудь примера"?
С генерацией разберусь позже.
А как измерить частоту с внешнего генератора ?
Сильно зависит от генерируемой частоты и необходимой точности измерения этой частоты.
Какая частота? Герцы? Килогерцы? Мегагерцы?
Какова потребная точность? 5%? 1%? 0,00001%?
Частота от 1Гц до 100кГц.
Точность ... до1Гц.
Можно конечно и по таймеру увеличивать счётчик и обновлять, и по прерыванию, но думаю нужен внешний счётчик со своим стабильным генератором и отправкой частоты на ардуино. Вечером может подкину какие можно использовать варианты.
А тема так и не раскрыта. Тут вообще есть спецы способные толково объяснить нубу в схемотехнике, как измерить на моей arduino mega 2560 два сигнала с частотой от 0 до 200Гц? Хочу на вход ардуино подать сигнал датчика скорости и MAP датчика и получить на компьютер через ком порт значения частоты от датчиков в герцах.
Написал свою прогу осцилографа на делфях, а с ардуино и частотой совладать не могу.
Здесь может и не раскрыта тема, но вам и не нужно одновременно генерить и мерить. Ищите, здесь на форуме не раз обсуждались датчики оборотов и скорости.
И к сведению - MAP датчики чаще всего аналоговые, но бывают и с частотным выходом..
А тема так и не раскрыта. Тут вообще есть спецы способные толково объяснить нубу в схемотехнике, как измерить на моей arduino mega 2560 два сигнала с частотой от 0 до 200Гц?
[...]
Написал свою прогу осцилографа на делфях, а с ардуино и частотой совладать не могу.
Ну, если нуб в схемотехнике "прогу осциллографа на дельфях" наваял, то значит, ему не составит труда в получаемом эти осциллографом сигнале выделить фронты (усли сигнал скорее прямоугольный) или максимумы/минимумы (если сигнал скорее синусоидальный) и рассчитать период изменения сигнала. А там и до частоты недалеко.
Или вам все-же чего-то другого не хватает? Может быть, вы, как нуб в схемотехнике, сигнал с помощью Ардуины снять не можете?
В общем, объясните для начала, каким боком в чисто математическую задачу расчета частоты сигнала влезла схемотехника? И что вам надо "толково объяснять"?
Поясняю. Итак, беру сигнал приходящий на мозг авто от датчика температуры. Амплитуда сигнала 5v. Подключаю его в порт A0 Ардуины. Кодом:
читаю значение с порта A0 и передаю в COM порт. В COM порт например летит: {A0,53}
На делфях читаю и разбираю пакеты приходящие по COM порту. Дальше, если в делфийной программе выставлен тип отображения "линейный", то по оси Y выставляется значение 53*5/1024 (ось X - время), т.е. ось Y - напряжение от 0 до 5 вольт. Если тип отображения "температура", то по функции зависимости напряжения от температуры вычисляется температура и ее значение отображается на оси Y. Например 50грд. Тут все понятно и сложностей нет.
Теперь частота. Хочу завести сигнал с датчика. Допустим MAP. Получить в адруино частоту, например 110Гц и передать полученное значение в COM порт: {A1,110}.
Что бы рассчитать на стороне делфи программы частоту, нужно по ком порту передать не одно значение, а гораздо больше. Есть ли в этом необходимость? Неужели нельзя рассчитать частоту внутри ардуино и передать ее значение в COM порт?
Итог: Скорее всего хочу получить от Вас код для ардуино для чтения показаний с двух частотных датчиков и передачи значений в герцах в COM порт.
Ищите, здесь на форуме не раз обсуждались датчики оборотов и скорости.
Вы или не видите что вам пишут или успешно игнорите. Если нравится когда тыкают носом, то пожалуйста - тема о считывании оборотов и она не одна такая.
Чуть меняем расчет и получаем герцы
заметьте здесь используются внешнее прерывание 0 и поэтому подключать нужно к 2 цифровому выводу (дуина УНО), раcчтет ведется не счетом импульсов в секунду, а вычислением времени между фронтами импульсов, поэтому данные поступают оперативно.
Но есть как раз и такой способ как подсчет импульсов за промежуток времени, тоже ни раз здесь обсуждалось.
Чтобы сделать второй канал нужно размножить данный код, но при этом использовать прерывание 1 (attachInterrupt(1, SPEED, FALLING);) на 3 выводе.
Спасибо, maksim. Пошел изучать.
Спустя 60 минут: УРА! Получилось! Крепчайшего здоровья Вам, maksim и Вашему Интернету.