Определение частоты звука
-
- Сообщения: 3
- Зарегистрирован: 25 фев 2015, 14:29
Определение частоты звука
Здравствуйте. Помогите, пожалуйста, решить одну проблему: необходимо с помощью ардуино определить частоту звука. Робот стоит в центре комнаты, есть 3 источника звука с разной частотой и в зависимости от частоты звука, робот должен делать те или иные действия(например, ехать к источнику). Очень нужно и как можно скорее, пожалуйста
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Определение частоты звука
Привет!
Аналогичную тему в разделе "Конструкторы FISCHERTECHNIK" удалил.
Если предположить, что источники звука будут работать не одновременно, то можно использовать следующий подход:
У микроконтроллера ATmega328P установленного на плате Arduino UNO имеется встроенный аппаратный 16-разрядный счетчик, который можно использовать для измерения времени между импульсами поступающими на вход контроллера. Это блок в документации называется "16-bit Timer/Counter1 with PWM". Нас будет интересовать только часть этого блока под названием "Input Capture Unit" - фиксатор событий.
Фиксатор событий сохранят в регистр ICR1 текущее значение счетчика TCNT1 при поступлении на вход блока стробирующего сигнала со входа ICP1 или от встроенного аналогового компаратора ACO. Одновременного с записью устанавливается в 1 флаг прерывания ICF1 и если есть разрешение (ICIE1 = 1), то генерируется прерывание от фиксатора событий (Input Capture interrupt).
Теперь нам надо на бумаге посчитать периоды для интересующих нас частот F1, F2, F3 и задать диапазоны, попадание в которые будет означать присутствие нужного сигнала на входе.
Считаем период для каждой частоты по формуле:
T = 1/F;
Диапазоны:
T1L-T1H // Для F1
T2L-T2H // Для F2
T3L-T3H // Для F3
Теперь усиленный сигнал от микрофона надо пропустить через компаратор и затем подать на вход фиксатора событий. При поступлении на вход периодического сигнала с частотой F фиксатор событий будет сохранять в регистр ICR1 длительность периода T между импульсами входного сигнала. По прерыванию ICF1 надо считывать значение из регистра ICR1 и сохранять во входной буфер, который затем использовать для статистической обработки сигнала. Например, если значение, полученное путем усреднения выборки из 10 измерений, попадает в диапазон T1L-T1H - это означает, что на входе сигнал частотой F1. Аналогичное сравнение надо проводить для остальных интересующих нас частот.
Источники информации:
ATmega328P datasheet.
Аналогичную тему в разделе "Конструкторы FISCHERTECHNIK" удалил.
Если предположить, что источники звука будут работать не одновременно, то можно использовать следующий подход:
У микроконтроллера ATmega328P установленного на плате Arduino UNO имеется встроенный аппаратный 16-разрядный счетчик, который можно использовать для измерения времени между импульсами поступающими на вход контроллера. Это блок в документации называется "16-bit Timer/Counter1 with PWM". Нас будет интересовать только часть этого блока под названием "Input Capture Unit" - фиксатор событий.
Фиксатор событий сохранят в регистр ICR1 текущее значение счетчика TCNT1 при поступлении на вход блока стробирующего сигнала со входа ICP1 или от встроенного аналогового компаратора ACO. Одновременного с записью устанавливается в 1 флаг прерывания ICF1 и если есть разрешение (ICIE1 = 1), то генерируется прерывание от фиксатора событий (Input Capture interrupt).
Теперь нам надо на бумаге посчитать периоды для интересующих нас частот F1, F2, F3 и задать диапазоны, попадание в которые будет означать присутствие нужного сигнала на входе.
Считаем период для каждой частоты по формуле:
T = 1/F;
Диапазоны:
T1L-T1H // Для F1
T2L-T2H // Для F2
T3L-T3H // Для F3
Теперь усиленный сигнал от микрофона надо пропустить через компаратор и затем подать на вход фиксатора событий. При поступлении на вход периодического сигнала с частотой F фиксатор событий будет сохранять в регистр ICR1 длительность периода T между импульсами входного сигнала. По прерыванию ICF1 надо считывать значение из регистра ICR1 и сохранять во входной буфер, который затем использовать для статистической обработки сигнала. Например, если значение, полученное путем усреднения выборки из 10 измерений, попадает в диапазон T1L-T1H - это означает, что на входе сигнал частотой F1. Аналогичное сравнение надо проводить для остальных интересующих нас частот.
Источники информации:
ATmega328P datasheet.
-
- Сообщения: 3
- Зарегистрирован: 25 фев 2015, 14:29
Re: Определение частоты звука
Спасибо, у меня как раз такая система, что подается только один из сигналов. А можно как то это сделать на Arduino Yun?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Определение частоты звука
На плате Arduino YUN в качестве периферийного контроллера используется ATmega32u4. В нём имеется несколько фиксаторов событий (Input Capture Unit), которые работают также как в ATmega328P. Посмотрите документацию на МК ATmega32u4 раздел 14.5 стр. 115. Проблем с решением вашей задачи на Arduino YUN быть не должно.
-
- Сообщения: 3
- Зарегистрирован: 25 фев 2015, 14:29
Re: Определение частоты звука
Спасибо!