Двутональный многочастотный (dtmf) генератор на avr

AVR314

Двутональный многочастотный (DTMF) генератор

Отличительные особенности:

  • Генерация синусоидальных сигналов с использованием широтно-импульсной модуляции (ШИМ)
  • Объединение различных синусоидальных сигналов в один DTMF-сигнал
  • Исходные коды на языках ассемблер и Си
  • Разработан для совместной работы с STK500
  • Размер кода программы 260 байт/размер таблицы констант 128 байт
  • Использование метода табличного преобразования

Данный документ описывает методику генерации DTMF-сигналов (двутональные многочастотные сигналы) с использованием любого AVR-микроконтроллера, содержащего блок широтно-импульсной модуляции (ШИМ) и статическое ОЗУ. Данные сигналы находят широкое применение в телефонии, где они воспроизводятся при нажатии на кнопки набора номера телефонного аппарата. Для правильной генерации DTMF-сигнала необходимо наложить две частоты вместе: низкую частоту (fb) и высокую частоту (fa). В таблице 1 показано как смешиваются различные частоты для получения DTMF-тонов при нажатии на различные клавиши.


Рисунок 1 – Схема генератора DTMF-сигнала

Таблица 1 – Матрица формирования тонального сигнала

fb/fa 1209 Гц 1336 Гц 1477 Гц 1633 Гц
697 Гц 1 2 3 A
770 Гц 4 5 6 B
852 Гц 7 8 9 C
941 Гц * # D

В строках таблицы 1 представлены значения низкой частоты, а в столбцах – значения высокой частоты. Например, в матрице показано, что при нажатии на кнопку «5» должны смешиваться частоты fb = 770 Гц и fa = 1336 Гц. В результате сложения двух синусоидальных сигналов разных частот образуется DTMF-сигнал

(1)

где отношение амплитуд K=Ab/Aa исходных сигналов должно отвечать условию

(2)

Помимо общих сведений об использовании широтно-импульсной модуляции далее будет показано как широтно-импульсная модуляция позволяет генерировать синусоидальные сигналы. В следующем параграфе описывается как, используя базовую частоту ШИМ получить различные частоты. После рассмотрения теоретических основ будет дано описание непосредственно генератора DTMF-сигнала. Генерация синусоидальных сигналов

В зависимости от соотношения длительности высокого VH и низкого VL уровней напряжения среднее значение на выходе ШИМ изменяется. Если соотношение между длительностями обоих уровней удерживать постоянным, то в результате будет генерироваться постоянный уровень напряжения VAV. Рисунок 2 показывает сигнал с широтно-импульсной модуляцией.


Рисунок 2 – Генерация уровня постоянного напряжения

Уровень напряжения определяется выражением:

(3)

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

Рисунок 3 также иллюстрирует зависимость между частотой основного синусоидального сигнала и количеством выборок. Чем выше число выборок (Nc) – тем выше точность моделирования результирующего сигнала:

(4)

где f – частота синусоидального сигнала (1/T)
f1 – частота ШИМ (fCK/510)
T – период основного синусоидального сигнала;
fCK – тактовая частота таймера;
NC – количество выборок (=12 на рис. 3)

Частота ШИМ зависит от разрешающей способности ШИМ. При 8-разрядном разрешении, конечное значение (вершина счета) таймера равно 0xFF (255). Т.к. таймер выполняет счет в прямом и обратном направлениях, то данное значение должно быть удвоено. Поэтому, частота ШИМ может быть вычислена путем деления тактовой частоты таймера fCK на 510. Таким образом, при частоте тактирования таймера 8 МГц результирующая частота ШИМ составит 15.6 кГц.


Рисунок 3 – Генерация синусоидального сигнала с использованием ШИМ

Изменение частоты синусоидального сигнала

Предположим, что синусоидальные выборки считываются из таблицы преобразования не последовательно, а через одну. В этом случае при той же частоте чтения выборок будет генерироваться сигнал с удвоенной частотой (см. рисунок 4).


Рисунок 4 – Удвоение результирующей частоты (XSW = 2)

По аналогии, если считывать не каждое второе значение, а каждое третье, четвертое, пятое (соответственно, ширина шага 3, 4, 5…) и т.д. можно генерировать Nc-частот в диапазоне [1/T Гц .. 0 Гц]. Обратите внимание, что для высоких частот результирующая форма сигнала не будет синусоидальной. Ширину шага по таблице преобразования обозначим как XSW, где

(5)

Вычисление текущей позиции в ТП для следующего периода ШИМ (при переполнении таймера) выполняется с помощью выражения (6). Новое значение в позиции XLUT зависит от его предыдущего состояния в позиции X’LUT с прибавлением ширины шага XSW

(6)

где XLUT — предыдущая позиция в таблице преобразования;
X’LUT — текущая позиция в таблице преобразования.

Сложение разных частот для получения DTMF-сигнала

DTMF-сигнал может быть сгенерирован с помощью выражений (1) и (2). Для простоты арифметических действий значение коэффициента К принимается равным 0.75, чтобы арифметическое действие заменить логическими сдвигами. С учетом выражения (6) текущее значение для управления ШИМ может быть вычислено по выражению:

(7)

(8)

В данном приложении рассматривается построение DTMF тонального генератора с использованием выхода 8-разрядной ШИМ (OC1A) и таблицы с 128 выборками значений синусоидальной функции (Nc), каждая из которых задается 7 битами (n). Следующие выражения показывают эту зависимость, а также показывают как вычислить элементы таблицы преобразования:

(9)

Преимуществом использования 7 бит является то, что сумма значений сигналов высокой и низкой частоты имеет размер одного байта. Для поддержки полного набора DTMF-тонов необходимо вычислить 8 значений для каждой DTMF-частоты из таблицы 1 и занести их в таблицу преобразования.

Для достижения более высокой точности выполнено следующее решение: значения, вычисленные по выражению 5 требуют всего 5 байт. Для использования всех 8 байт, что позволит уменьшить погрешность округления, это значение умножается на 8. Указатель на таблицу преобразования записывается таким же способом. Но в этом случае требуется два байта для запоминания 8-кратного значения. Это означает, что необходимо выполнить 3 правосторонних сдвига и операцию модуля по основанию Nc (логическое умножение на Nc-1) перед использованием этих байт как указателя на значения синусоиды в

(10)

где XLUTa,b — текущая позиция элемента в таблице преобразования (фактический формат);
XLUTa,bExt -предыдущая позиция элемента в таблице преобразования (расширенный формат);
ROUND – функция округления.


Рисунок 5 – Схема модуля для подключения к STK500

ШИМ-сигнал формируется на выводе OC1A (PD5). Дополнительный выходной фильтр будет способствовать большему соответствию синусоидальной форме сигнала. При уменьшении частоты ШИМ может возникнуть необходимость применения фильтра с более крутой АЧХ для получения хорошего результата.

Подключение клавиатуры показано на рисунке 1. Работа клавиатуры должна быть организована таким образом, чтобы была возможность определения нажатой клавиши. Это может быть выполнено по следующему алгоритму:

  1. Определение строки нажатой клавиши
    • настроить младшую тетраду порта В на выход и установить лог. «0»
    • настроить старшую тетраду порта В на вход с подключением подтягивающих резисторов
    • строка с нажатой кнопкой определяется как разряд старшей тетрады с лог. «0»
  2. Определение столбца нажатой клавиши
    • настроить старшую тетраду порта В на выход и установить лог. «0»
    • настроить младшую тетраду порта В на вход с подключением подтягивающих резисторов
    • столбец с нажатой кнопкой определяется как разряд младшей тетрады с лог. «0»

Прим.: В STK200 между выводами разъема PORTB и выводами микроконтроллера BP5, PB6 и PB7 включены последовательно резисторы (см. схему STK200). Это вызовет проблемы если клавиатура подключена к разъему PORTB.

Рисунок 6 иллюстрирует работу подпрограммы по определению нажатой клавиши. В зависимости от нажатой клавиши определяется длительность интервала. Процедура обработки прерывания использует это значение для вычисления установок ШИМ для двух синусоид DTM-тона. Процедура обработки прерывания показана на рисунках 7 и 8.

Эта процедура вычисляет значение для сравнения с выходом таймера на следующий период ШИМ. Процедура обработки прерываний сперва вычисляет позицию значения следующей выборки в таблице преобразования и считывает сохраненное там значение.

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

Окончательное значение, которое записывается в регистр сравнения таймера, определяется с использованием формулы (7), где учитываются значения выборок обеих DTMF-частот.


Рисунок 6 – Блок-схема основной программы


Рисунок 7 – Блок-схема процедуры обработки прерывания по переполнению таймера


Рисунок 8 – Блок-схема процедуры чтения выборки “GetSample”

Двутональный многочастотный (DTMF) генератор на AVR

  • Генерация синусоидальных сигналов с использованием широтно-импульсной модуляции (ШИМ)
  • Объединение различных синусоидальных сигналов в один DTMF-сигнал
  • Исходные коды на языках ассемблер и Си
  • Разработан для совместной работы с STK500
  • Размер кода программы 260 байт/размер таблицы констант 128 байт
  • Использование метода табличного преобразования

Данный документ описывает методику генерации DTMF-сигналов (двутональные многочастотные сигналы) с использованием любого AVR-микроконтроллера, содержащего блок широтно-импульсной модуляции (ШИМ) и статическое ОЗУ. Данные сигналы находят широкое применение в телефонии, где они воспроизводятся при нажатии на кнопки набора номера телефонного аппарата. Для правильной генерации DTMF-сигнала необходимо наложить две частоты вместе: низкую частоту (fb) и высокую частоту (fa). В таблице 1 показано как смешиваются различные частоты для получения DTMF-тонов при нажатии на различные клавиши.


Рисунок 1 – Схема генератора DTMF-сигнала

Таблица 1 – Матрица формирования тонального сигнала

fb/fa 1209 Гц 1336 Гц 1477 Гц 1633 Гц
697 Гц 1 2 3 A
770 Гц 4 5 6 B
852 Гц 7 8 9 C
941 Гц * # D

В строках таблицы 1 представлены значения низкой частоты, а в столбцах – значения высокой частоты. Например, в матрице показано, что при нажатии на кнопку «5» должны смешиваться частоты fb = 770 Гц и fa = 1336 Гц. В результате сложения двух синусоидальных сигналов разных частот образуется DTMF-сигнал

(1)

где отношение амплитуд K=Ab/Aa исходных сигналов должно отвечать условию

(2)

Помимо общих сведений об использовании широтно-импульсной модуляции далее будет показано как широтно-импульсная модуляция позволяет генерировать синусоидальные сигналы. В следующем параграфе описывается как, используя базовую частоту ШИМ получить различные частоты. После рассмотрения теоретических основ будет дано описание непосредственно генератора DTMF-сигнала. Генерация синусоидальных сигналов

В зависимости от соотношения длительности высокого VH и низкого VL уровней напряжения среднее значение на выходе ШИМ изменяется. Если соотношение между длительностями обоих уровней удерживать постоянным, то в результате будет генерироваться постоянный уровень напряжения VAV. Рисунок 2 показывает сигнал с широтно-импульсной модуляцией.


Рисунок 2 – Генерация уровня постоянного напряжения

Уровень напряжения определяется выражением:

(3)

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

Рисунок 3 также иллюстрирует зависимость между частотой основного синусоидального сигнала и количеством выборок. Чем выше число выборок (Nc) – тем выше точность моделирования результирующего сигнала:

(4)

где f – частота синусоидального сигнала (1/T)
f1 – частота ШИМ (fCK/510)
T – период основного синусоидального сигнала;
fCK – тактовая частота таймера;
NC – количество выборок (=12 на рис. 3)

Частота ШИМ зависит от разрешающей способности ШИМ. При 8-разрядном разрешении, конечное значение (вершина счета) таймера равно 0xFF (255). Т.к. таймер выполняет счет в прямом и обратном направлениях, то данное значение должно быть удвоено. Поэтому, частота ШИМ может быть вычислена путем деления тактовой частоты таймера fCK на 510. Таким образом, при частоте тактирования таймера 8 МГц результирующая частота ШИМ составит 15.6 кГц.


Рисунок 3 – Генерация синусоидального сигнала с использованием ШИМ

Изменение частоты синусоидального сигнала

Предположим, что синусоидальные выборки считываются из таблицы преобразования не последовательно, а через одну. В этом случае при той же частоте чтения выборок будет генерироваться сигнал с удвоенной частотой (см. рисунок 4).


Рисунок 4 – Удвоение результирующей частоты (XSW = 2)

По аналогии, если считывать не каждое второе значение, а каждое третье, четвертое, пятое (соответственно, ширина шага 3, 4, 5…) и т.д. можно генерировать Nc-частот в диапазоне [1/T Гц .. 0 Гц]. Обратите внимание, что для высоких частот результирующая форма сигнала не будет синусоидальной. Ширину шага по таблице преобразования обозначим как XSW, где

(5)

Вычисление текущей позиции в ТП для следующего периода ШИМ (при переполнении таймера) выполняется с помощью выражения (6). Новое значение в позиции XLUT зависит от его предыдущего состояния в позиции X’LUT с прибавлением ширины шага XSW

(6)

где XLUT — предыдущая позиция в таблице преобразования;
X’LUT — текущая позиция в таблице преобразования.

Сложение разных частот для получения DTMF-сигнала

DTMF-сигнал может быть сгенерирован с помощью выражений (1) и (2). Для простоты арифметических действий значение коэффициента К принимается равным 0.75, чтобы арифметическое действие заменить логическими сдвигами. С учетом выражения (6) текущее значение для управления ШИМ может быть вычислено по выражению:

(7)

(8)

В данном приложении рассматривается построение DTMF тонального генератора с использованием выхода 8-разрядной ШИМ (OC1A) и таблицы с 128 выборками значений синусоидальной функции (Nc), каждая из которых задается 7 битами (n). Следующие выражения показывают эту зависимость, а также показывают как вычислить элементы таблицы преобразования:

(9)

Преимуществом использования 7 бит является то, что сумма значений сигналов высокой и низкой частоты имеет размер одного байта. Для поддержки полного набора DTMF-тонов необходимо вычислить 8 значений для каждой DTMF-частоты из таблицы 1 и занести их в таблицу преобразования.

Для достижения более высокой точности выполнено следующее решение: значения, вычисленные по выражению 5 требуют всего 5 байт. Для использования всех 8 байт, что позволит уменьшить погрешность округления, это значение умножается на 8. Указатель на таблицу преобразования записывается таким же способом. Но в этом случае требуется два байта для запоминания 8-кратного значения. Это означает, что необходимо выполнить 3 правосторонних сдвига и операцию модуля по основанию Nc (логическое умножение на Nc-1) перед использованием этих байт как указателя на значения синусоиды в

(10)

где XLUTa,b — текущая позиция элемента в таблице преобразования (фактический формат);
XLUTa,bExt -предыдущая позиция элемента в таблице преобразования (расширенный формат);
ROUND – функция округления.


Рисунок 5 – Схема модуля для подключения к STK500

ШИМ-сигнал формируется на выводе OC1A (PD5). Дополнительный выходной фильтр будет способствовать большему соответствию синусоидальной форме сигнала. При уменьшении частоты ШИМ может возникнуть необходимость применения фильтра с более крутой АЧХ для получения хорошего результата.

Подключение клавиатуры показано на рисунке 1. Работа клавиатуры должна быть организована таким образом, чтобы была возможность определения нажатой клавиши. Это может быть выполнено по следующему алгоритму:

  1. Определение строки нажатой клавиши
    • настроить младшую тетраду порта В на выход и установить лог. «0»
    • настроить старшую тетраду порта В на вход с подключением подтягивающих резисторов
    • строка с нажатой кнопкой определяется как разряд старшей тетрады с лог. «0»
  2. Определение столбца нажатой клавиши
    • настроить старшую тетраду порта В на выход и установить лог. «0»
    • настроить младшую тетраду порта В на вход с подключением подтягивающих резисторов
    • столбец с нажатой кнопкой определяется как разряд младшей тетрады с лог. «0»

Прим.: В STK200 между выводами разъема PORTB и выводами микроконтроллера BP5, PB6 и PB7 включены последовательно резисторы (см. схему STK200). Это вызовет проблемы если клавиатура подключена к разъему PORTB.

Рисунок 6 иллюстрирует работу подпрограммы по определению нажатой клавиши. В зависимости от нажатой клавиши определяется длительность интервала. Процедура обработки прерывания использует это значение для вычисления установок ШИМ для двух синусоид DTM-тона. Процедура обработки прерывания показана на рисунках 7 и 8.

Эта процедура вычисляет значение для сравнения с выходом таймера на следующий период ШИМ. Процедура обработки прерываний сперва вычисляет позицию значения следующей выборки в таблице преобразования и считывает сохраненное там значение.

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

Окончательное значение, которое записывается в регистр сравнения таймера, определяется с использованием формулы (7), где учитываются значения выборок обеих DTMF-частот.


Рисунок 6 – Блок-схема основной программы


Рисунок 7 – Блок-схема процедуры обработки прерывания по переполнению таймера


Рисунок 8 – Блок-схема процедуры чтения выборки “GetSample”

107-Генератор DTMF сигнала на ATtiny2313

Продолжая с прошлой статьи тему несложных устройств, решил собрать генератор DTMF сигнала на все той же ATtiny2313. Кто не знает, DTMF (англ.Dual-Tone Multi-Frequency) – это двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера. Читать Википедию.

Решение собрать такое устройство продиктовано желанием попробовать реализовать сложные аналоговые сигналы при помощи микроконтроллера. Никакого практического применения для данного устройства не планировалось, но может кому пригодится такое устройство? Пользуйтесь!

Работа устройства.

Устройство формирует сложный двухкомпонентный сигнал по факту нажатия кнопки на матричной клавиатура 4х4, стандартно используемой для таких целей. Я отлаживал устройство при помощи вот такой мембранной клавиатуры.

Кроме формирования тона кнопки, устройство дублирует нажатие клавиш выдачей соответствующих символов по UART (цифры и большие буквы латиницы). Еще устройство формирует тональную последовательность согласно посланной в UART строчке символов. Например, сообщение «4563245». Если нужно сделать паузу в тоновом озвучивании, применяется символ «P». Например «8P097P111P22P33». Параметры UART — Baud Rate: 9600, 8 Data, 2 Stopbit, без контроля четности

Немного теории.

Тон, формируемый по нажатию клавиши, является суммой двух синусоидальных сигналов с частотами, соответственно, строки и столбца нажатой клавиши (на схеме выше указаны эти частоты). Алгоритм формирования смешанного сигнала, довольно интересен, но не оригинален и велосипед я по новой не изобретал. Кому интересно как это делается, можно почитать соответствующий документ Atmel

Прошивка микроконтроллера.

Микроконтроллер может работать:
— как от внутреннего задающего генератора 8МГц (отпадает необходимость в кварцевом резонаторе – ножки нужно оставить «висеть в воздухе», но меньше точность выходных частот и больше зависимость от внешних факторов),
— так и от внешнего задающего кварцевого генератора (кварц на 8МГц) для более точной работы.
При выборе варианта задающего генератора прошивка остается одна и та же, разные будут только фьюзы (фьюзы аналогичны предыдущей статье, откуда они и взяты).
keypad_dtmf_out.zip (Одна Загрузка)

106-fuse_8in.png (2360 Загрузок)
Фьюз-байты: Low=$E4, High=$DF, Ext=$FF
[ 106-fuse_ext.png (2324 Загрузки)
Фьюз-байты: Low=$FF, High=$DF, Ext=$FF
Напоминаю:Для Algorithm Builder и UniProf галочки ставятся как на картинке.
Для PonyProg, AVR Studio, SinaProg галочки ставятся инверсно.
Как программировать микроконтроллеры читаем в FAQ.

Теперь посмотрим, что у нас получилось.

Сигнал формируется при помощи ШИМ и для того чтобы придать ему нужную форму применяется RC-цепочка. В итоге, после RC-цепочки, получаем вот такой сигнал (нажата кнопка 6):

По всей кривой полезного сигнала мы наблюдаем гребенку высокой частоты (частота выше слышимой, так что шума она не будет создавать) – это работа RC-цепочки. Можно линию сделать более плавной, увеличив емкость конденсатора или сопротивление резистора, но в этом случае значительно уменьшиться размах полезного сигнала.

Смотрим спектр сигнала и убеждаемся в наличии двух отдельных частот (частота ШИМ ушла за пределы области отображения), значит все нормально – устройство работает как нужно.

Готовые решения

Для задач генерирования и декодирования DTMF-сигнала существуют готовые решения. Вот пару даташитов на эти микросхемы.

P.S. Жалко нет в ATtiny2313 АЦП — можно было еще и декодер DTMF забабахать! Но ничего, буду повторять на меге обязательно приделаю.

107-Генератор DTMF сигнала на ATtiny2313 : 16 комментариев

Очень полезная штука.Не всегда получается найти специализированную микросхему генератора или декодера.А если ВЫ напишите прошивку для генератора и декодера например для ATmega8 (Распростроненный и компактный микроконтроллер)то очень многие любители по паять будут Вам крайне признательны и благодарны. НЕ придется больше топтать базары и магазины в поисках. Поставил контроллер, залил прошивку и получил что тебе надо.

Если кто задумал реализовать декодер DTMF
akv — это уже сделал (на меге8)
http://www.forum.getchip.net/viewtopic.php?f=9&t=394&start=10

Добрый вечер Евгений.прошу вас к вашему генератору ДТМФ разработать -декодер DTMF.только полноценный.как на мт8870.если можно то реализовать на нем клавиатуру.то есть можно управлять как входным сигналом -так и с клавиатуры.наличие подтверждения опознания сигнала.не помешает юарт.очень прошу.в железе сразу испытаю .

Есть идея сделать «все в одном», но вот пока не знаю когда дойдет дело до реализации.

Добрый вечер GetChiper. Протестировал генератор DTMF в Proteuse. Выдает такую же форму, что и на рисунке (графике) выше. Но этот полученный сигнал никак не хочет определяться декодером DTMF. Сам декодер я тестировал на записанном реальном сигнале (от микрофона) и всегда он всегда выдавал правильный результат. Я не хочу сказать, что DTMF сгенерирован неправельно, просто помогите разобраться в чем тут дело. Может частота генерации смещена или как-то влияет гребенка на сигнале. Самое интересное, что если ШИМ без RC подать на декодер, то тот определяет DTMF, но неправильно…

Контроллер с кварцем? Возможен уход частоты если МК работает от внутреннего задающего генератора.
Есть возможность посмотреть спектр выдаваемого сигнала? Соответствуют ли 2 выдаваемые частоты нажатой кнопке?

Чтобы убрать гребенку можно увеличить резистор в RC цепочке (тот что 2к7). Но тогда уровень сигнала снизится значительно.

Кстати, а для декодера хватает уровня сигнала? Наводит на мысль ошибочная но все же сработка без RC цепочки, когда уровень сигнала максимальный

GetChiper, спасибо за советы. Проблема решена, DTMF определяется 100%. Все просто — неправильные фюзы :). Кстати сама идея формирования сигнала очень понравилась. Так можно любую форму сделать.
Если будет время объединю генератор и декодер, для этого все есть.

Спасибо за схему и программу, заработало все сразу.
Декодер DTMF у меня был собран раньше, тоже не ATtiny2313 с индикаторам 2х16. Все ОК. Правда на выходе я ставил дифференциальный трансформатор(т.к. сигнал передается через мультиплексор по НЧ каналам)и на обратном конце все декодируется нормально.

GetChiper, а можешь выложить библиотеку элементов для splan, больно красиво схемы получаются)

Библиотеки как таковой нет (все собираюсь собрать, да никак не выберусь этим заняться). Но все элементы можно взять в библиотеку из файлов проектов.

Полезная разработка!
Применяю способ управления с помощью DTMF удаленными объектами по выделенной телефонной линии.

GetChoper’y:
Как говорил товарищ Саахов: «Всё правильно, бумага написана верно….»
Только закралась ошибочка досадная.
Так называемая RC-цепочка перед выходным транзистором, которую в кругах специалистов называют Фильтром Нижних Частот Первого Порядка, рассчитана из-рук-вон-плохо.
Частота среза такого фильтра равна: Fср=1/2πRC, (Hz)
Подставляем в формулу 2700(Ом) и 0,0000001(Фарад) и получаем 589 Гц.
Меж тем как частоты DTMF сигнала лежат в области 697…1633 Гц, т.е. наш (вернее, ваш) фильтр подавляет даже частоты полезного сигнала. Поэтому-то отдельные граждане жалуются на нестабильность срабатывания DTMF-декодера.
Как быть?
Просто поставить фильтр с кошерной частотой среза и неплохо бы 2-го или 3-го порядка.
Короче говоря, даёте мне ваш e-mail и получите файл с картинками.

Проблема с фильтром первого порядка в том, что спад у него плавный, а частота ШИМ не так далеко удалена от частот DTMF сигнала, соответственно приходится идти на компромисс — посильней прижать частоты ШИМ и не очень уменьшить полезный сигнал.

По поводу фильтров N-го порядка — я с Вами согласен, было-бы лучше, но думаю это каждый сможет реализовать «под себя».

Оставил вариант Sidr с фильтром 3-го порядка на форуме http://www.forum.getchip.net/viewtopic.php?f=7&t=539

Кстати, для желающих иметь DTMF-декодер советую:
http://www.qrz.ru/schemes/contribute/constr/dtmf.shtml
И связь с компьютером есть, можно по Терминальной программе запоминать DTMF-посылки пока винчестер не забьётся.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Двутональный многочастотный (dtmf) генератор на avr

  • Усилители мощности
  • Светодиоды
  • Блоки питания
  • Начинающим
  • Радиопередатчики
  • Разное
  • Ремонт
  • Шокеры
  • Компьютер
  • Микроконтроллеры
  • Разработки
  • Обзоры и тесты
  • Обратная связь
  • Форум
    • Усилители мощности
    • Шокеры
    • Качеры, катушки Тэсла
    • Блоки питания
    • Светодиоды
    • Начинающим
    • Жучки
    • Микроконтроллеры
    • Устройства на ARDUINO
    • Программирование
    • Радиоприемники
    • Датчики и ИМ
    • Вопросы и ответы
  • Online расчёты
  • Умный дом
  • Видео
  • RSS
  • Приём статей
    • Усилители мощности
    • Светодиоды
    • Блоки питания
    • Начинающим
    • Радиопередатчики
    • Разное
    • Ремонт
    • Шокеры
    • Компьютер
    • Микроконтроллеры
    • Разработки
    • Обзоры и тесты
    • Обратная связь
  • Форум
    • Усилители мощности
    • Шокеры
    • Качеры, катушки Тэсла
    • Блоки питания
    • Светодиоды
    • Начинающим
    • Жучки
    • Микроконтроллеры
    • Устройства на ARDUINO
    • Программирование
    • Радиоприемники
    • Датчики и ИМ
    • Вопросы и ответы
  • Online расчёты
  • Умный дом
  • Видео
  • RSS
  • Приём статей
  • Говорящее дистанционное управление DTMF

    Нередко возникает необходимость в дистанционном управлении удалённым объектом, например управление отоплением, сигнализацией загородного дома и т.п. Традицтонные методы управления тут не помогут. В этом случае на помощь придёт сотовая связь. Но просто взяв сотовый телефон делу не поможет, требуется декодер DTMF кода, который при нажатии той или иной цифры на сотовом телефоне будет переключать тот или иной канал на декодере. Именно этот декодер и представлен вашему вниманию. Ранее разработанный мною декодер рассмотренный тут полностью выполняет свои функции, но в ходе эксплуатации был выявлен один недостаток. Недостаток заключается в звуковом подтвеждении событий. Иногда, при управлении, становиться неясно какой канал переключил, а так же нет функции опроса состояния. От этих недостатков лишина вторая версия дистанционного управления, которая оснащена речевым модулем, который все события подтверждает речевыми фразами.

    Основные параметры декодера:

    • имеет 10 независимых каналов управления;
    • звуковое подтверждение всех событий (тоном и фразами);
    • автоматическая запись состояния выходов, если включено;
    • автоматическая блокировка устройства, если включен доступ по паролю.

    Схема декодера довольно проста и не нуждается в наладке. Весь функционал реализован на микроконтроллере PIC16F883. От предыдущей версии схема практически не отличается.

    В качестве декодера DTMF сигнала применена специализированная микросхема марки MT8870. На выходе установлены буфферные каскады на ULN2003, что позволяет непоследственно подключать обмотки реле.

    Говорящий модуль выполнен на микроконтроллере ATTINY2313, фразы храняться на microSD flash. Схема модуля и прошивка позаимствована отсюда. Схема очень проста, состоит практически из микроконтроллера, флэшки и стабилизатора на 3,3В. Светодиоды с резисторами R3, R4, R5 можно не устанавливать.

    Устройство собрано на четырёх печатных платах. На первой плате собран декодер DTMF

    На второй плате собран речевой модуль

    На третьей и четвёртой платах собраны идентичные релийные модули

    Общий вид на платы

    В схеме предусмотрена установка трёх перемычек, их назначение:

    • S2 — Включение сохранения состояния выходов;
    • S3 — Сброс пароля;
    • S4 — Включение доступа по паролю.

    Алгоритм работы устройства очень прост:

    Звоним на телефон и нажимая кнопки на телефоне управляем устройством. Если установлена перемычка S4, перед переключением состояния выходов необходимо ввести пароль (по умолчанию 0000). Далее, для включения необходимого канала жмём номер канала и цифру 1. Для выключения — номер выбранного канала и цифру 0. Например включим и выключим канал номер 5. Нажимаем 51, а затем 50. Если требуется включить все каналы разом, жмём две звёздочки (**). Что бы выключить все каналы разом — две решётки (##).

    Для смены кода вводим такую комбинацию: *#*# и следом четыри цифры нового кода. Если вы забыли введённый код, его легко сбросить на стандартный 0000, установив кратковременно перемычку S3.

    Как правило, в загородных домах нередки случаи отключения электроэнергии, а так же возможны кратковременные пропадания во время сильных ветров. Для сохранения состояния выходов предусмотрена возможность записи состояния в энергонезависимую память микроконтроллера и при восстановлении электроснабжения восстановить это состояние. Для этого служит перемычка S2.

    Во второй версии устройства добавлена функция опроса состояния выходов, включается эта функция нажатием такой комбинации: #*

    При включении опроса состояния устройство проговорит состояние каждого канала. При остутствии речевого модуля, устройство выдаст информацию по выходам следующим образом: если канал включен, устройство выдаст один короткий сигнал, если выключено — два коротких сигнала. И так по каждому каналу по очереди.

    Хочу обратить особое внимание на распайку разъёма для подключения устройства к сотовому телефону. Разные производители по разному распаивают этот разъём в телефоне! Если устройство не реагирует, меняйте местами выводы, либо ищите распайку именно под ваш телефон. Функция автоподнятия есть практически в любом телефоне!

    Файловая система.

    В данном устройстве поддерживаются SD карты размером до 2 Гб, включительно, имеющие файловую систему FAT16. Все что выше – не поддерживается. Нет особых требований по форматированию карты – ее можно отформатировать в любом доступном устройстве. Стандартное форматирование Windows вполне подходит для этих целей.

    Конвертирование своих треков

    Треки нужно переконвертировать в формат который поддерживает устройство. Формат файла должен быть – несжатый WAV 32000Гц, 1 канал, 8 бит (WAV PCM 8U). Для конвертации в такой формат подойдет любой музыкальный редактор, или, если нужно просто преконвертировать трек без его правки – Weeny Free Audio Converter, он бесплатный, маленький и умеет конвертировать сразу пакет файлов.

    О модуле подробнее можно почитать тут.

    DTMF декодер
    Резисторы
    R1, R2 100k 2шт
    R3 300k 1шт
    R4 330 1шт
    R5, R6 1k 2шт
    Конденсаторы
    C1 47n 1шт
    C2, С4 18p 2шт
    C3 47uF 1шт
    C5, С9, С10 100n 3шт
    C6, С8 33p 2шт
    C7, С11 10uF 2шт
    Микросхемы
    IC1 MT8870 1шт
    IC2 PIC16F883 1шт
    IC3, IC4 ULN2003 2шт
    IC5 L7805 1шт
    Кварцевые резонаторы
    Z1 3,5796 MHz 1шт
    Z2 4 MHz 1шт
    Говорящий модуль
    Резисторы
    R1, R4, R5 1k 3шт
    R2 10k 1шт
    R3 300 1шт
    Конденсаторы
    С1, C3 10uF 2шт
    С2 100n 1шт
    Микросхемы
    IC1 ATTINY2313 1шт
    microSD card 1шт
    Micro SD card slot connectors 1шт

    Небольшой видеообзор по работе с устройством

    Робот на Arduino управляемый с помощью DTMF сигналов

    В настоящее время роботы играют возрастающую с каждым годом роль в жизни человечества, помогающие выполнять нам какие либо рутинные операции. В данной статье мы рассмотрим создание робота на Arduino Uno, управляемого с помощью DTMF сигналов. DTMF (сокр. от Dual-Tone Multi-Frequency) представляет собой двухтональный многочастотный набор [телефонного] номера.

    Смысл этой технологии заключается в том, что смешивая две или более частот можно сформировать DTMF сигнал (тон). Используемые данной технологией частоты представлены на следующем рисунке:

    На рисунке можно увидеть две группы различных частот. Когда одна из верхних и одна из нижних частот из представленных на рисунке смешиваются (т.е. передаются одновременно), то мы получаем сигнал двухтонального многочастотного набора [телефонного] номера (DTMF сигнал).

    Необходимые компоненты

    1. Плата Arduino Uno (купить на AliExpress).
    2. Двигатель постоянного тока (2 шт.).
    3. Декодер DTMF сигналов (купить на AliExpress).
    4. Драйвер двигателей L293D (купить на AliExpress).
    5. Мобильный телефон.
    6. Батарейка на 9 В.
    7. Соединитель батареи.
    8. Шасси робота (на колесах).
    9. Соединительные провода.

    Что такое декодер DTMF сигналов

    Декодер DTMF сигналов представляет собой микросхему MT8870, которая декодирует сигнал двухтонального многочастотного набора номера в цифровой сигнал который можно считать с помощью платы Arduino. Необходим вспомогательный провод (aux wire) чтобы соединить декодер DTMF сигналов с телефоном.

    На следующем рисунке представлена блоковая диаграмма, показывающая логику работы устройства.

    Модуль удаленной связи: главным компонентом этого модуля является декодер DTMF сигналов, который принимает сигнал от нашего сотового телефона по вспомогательному проводу. Декодер DTMF сигналов (микросхема MT8870) преобразует этот DTMF сигнал в 4-битный цифровой сигнал.

    Модуль управления: плата Arduino UNO используется для управления всем процессом функционирования робота. Arduino считывает команды, передаваемые ей декодером DTMF сигналов, сравнивает их с эталонами, хранящимися в своей памяти, и на основе этого сравнения формирует управляющие команды для робота.

    Модуль движения: состоит из драйвера мотора и двух двигателей постоянного тока. Драйвер мотора используется для управления двигателями поскольку плата Arduino не обеспечивает достаточные для этого значения напряжения и тока. Драйвер мотора принимает управляющие команды от Arduino и передает их двигателям.

    Работа схемы

    Схема робота, управляемого с помощью DTMF сигналов, представлена на следующем рисунке.

    Схема робота в значительной мере похожа на уже рассмотренные нами схемы роботов на основе платы Arduino:
    — робот, управляемый движениями рук;
    — робот, управляемый с компьютера;
    — робот, следующий вдоль линии.

    В представленной схеме входные контакты драйвера двигателей 2, 7, 10 и 15 подсоединены к цифровым контактам платы Arduino 6, 5, 4 и 3 соответственно. Один из двигателей постоянного тока подключен к выходным контактам драйвера мотора 3 и 6, а другой двигатель – к контактам 11 и 14. Батарейка на 9 В используется для подачи питания на драйвер мотора.

    Декодер DTMF сигналов подключен к мобильному телефону с помощью вспомогательного провода чтобы принимать от него DTMF сигналы. Декодер DTMF сигналов своими контактами D0-D3 подключен к контактам 19,18,17,16 Arduino. Как уже упоминалось, первая батарейка на 9 В используется для питания драйвера мотора и, соответственно, двигателей, а вторая батарейка 9 В используется для питания остальных элементов схемы.

    Принципы работы робота

    Рассматриваемый нами робот управляется с помощью команд, передаваемых с помощью мобильного телефона. Для передачи команд управления используются DTMF сигналы. Для демонстрации работы схемы мы используем два телефона, один из которых мы назовем «управляющим телефоном» – с него мы будем передавать команды управления, а другой будет подключен к схеме робота с помощью вспомогательного провода – его мы назовем «принимающим телефоном».

    Сначала мы осуществим звонок с управляющего телефона на принимающий телефон и после того как он примет вызов мы переведем его в ручной или автоматический режим ответа. И после этого у нас появится возможность управлять роботом с помощью DTMF сигналов.

    Когда мы будем нажимать ‘2’ на управляющем телефоне робот начнет двигаться вперед и будет двигаться в этом направлении до тех пор пока не получит следующую команду.

    Когда мы будем нажимать ‘8’ на управляющем телефоне робот начнет двигаться назад и будет двигаться в этом направлении до тех пор пока не получит следующую команду.

    Когда мы будем нажимать ‘4’ на управляющем телефоне робот будет поворачивать влево до поступления очередной команды.

    Когда мы будем нажимать ‘6’ на управляющем телефоне робот будет поворачивать вправо до поступления очередной команды.

    Для остановки робота необходимо будет нажать на управляющем телефоне ‘5’.

    Исходный код программы

    В программе первым делом необходимо инициализировать контакты, к которым будет подключаться декодер DTMF сигналов и драйвер мотора.

    #define m11 3
    #define m12 4
    #define m21 5
    #define m22 6

    #define D0 19
    #define D1 18
    #define D2 17
    #define D3 16

    Далее необходимо установить режим работы для инициализированных контактов: для тех, которые будут принимать данные от декодера DTMF сигналов – на ввод данных, для тех, которые будут подавать управляющие команды на драйвер мотора – на вывод данных.

    После этого мы в программе считываем значения с выходов декодера DTMF сигналов и сравниваем их с заранее определенными значениями с помощью оператора “if” и по результатам сравнения выполняем соответствующие операции.

    Пять условий, в соответствии с которыми осуществляется управление роботом, представлены в следующей таблице.

    Далее представлен полный текст программы.

    #define m11 3
    #define m12 4
    #define m21 5
    #define m22 6
    #define D0 19
    #define D1 18
    #define D2 17
    #define D3 16

    void forward() // движение вперед
    <
    digitalWrite(m11, HIGH);
    digitalWrite(m12, LOW);
    digitalWrite(m21, HIGH);
    digitalWrite(m22, LOW);
    >
    void backward() // движение назад
    <
    digitalWrite(m11, LOW);
    digitalWrite(m12, HIGH);
    digitalWrite(m21, LOW);
    digitalWrite(m22, HIGH);
    >
    void left() // поворот влево
    <
    digitalWrite(m11, HIGH);
    digitalWrite(m12, LOW);
    digitalWrite(m21, LOW);
    digitalWrite(m22, LOW);
    >
    void right() // поворот вправо
    <
    digitalWrite(m11, LOW);
    digitalWrite(m12, LOW);
    digitalWrite(m21, HIGH);
    digitalWrite(m22, LOW);
    >
    void Stop() // остановка робота
    <
    digitalWrite(m11, LOW);
    digitalWrite(m12, LOW);
    digitalWrite(m21, LOW);
    digitalWrite(m22, LOW);
    >
    void setup()
    <
    pinMode(D0, INPUT);
    pinMode(D1, INPUT);
    pinMode(D2, INPUT);
    pinMode(D3, INPUT);
    pinMode(m11, OUTPUT);
    pinMode(m12, OUTPUT);
    pinMode(m21, OUTPUT);
    pinMode(m22, OUTPUT);
    >
    void loop()
    <
    int temp1=digitalRead(D0);
    int temp2=digitalRead(D1);
    int temp3=digitalRead(D2);
    int temp4=digitalRead(D3);

    Видео, демонстрирующее работу схемы

    Двутональный многочастотный (dtmf) генератор на avr

    Устройство предназначено для генерирования сигналов различных форм и длительностей. Основные возможности: генерирование синуса, пилы, реверсивной пилы, меандра, треугольников, шума и экг в диапазоне частот 1. 65535 Гц. Наличие высокочастотного выхода 1-8 МГц для тактирования микроконтроллеров. Возможность регулировки амплитуды и смещения. Имеется две версии прошивки: одна позволяет получить 8 тактовых последовательностей смещённых на 45° друг относительно друга по фазе (тема моего диплома), вторая функциональный генератор. Схема построена так, что при изменении прошивок необходимо просто переключить устройство в режим генератора. Любую из прошивок легко можно модифицировать под свои нужды т.к. есть исходники.

    Схема генератора:

    На операционном усилителе LM358N реализована регулировка амплитуды и смещения.

    Схема блока питания:

    Для блока питания генератора я использовал трансформатор ТП-6014 от советского магнитофона маяк 233, у него большое количество вторичных обмоток, что впоследствии позволит добавить в устройство ещё и лабораторный блок питания.

    Блок питания и микроконтроллер я разместил на отдельных печатных платах.

    Печатная плата генератора:

    Печатная плата блока питания:

    Внутри корпуса:

    Проект в протеусе учитывает две версии прошивки dsw1 позволяет отключать резисторную r2r матрицу.

    Теперь подробнее о прошивках:
    1- функциональный генератор(частота 1-65535 Гц с шагом 1Гц, скважность 2, HS 1-8МГц)
    Меню генератора:

    2- формирователь импульсных последовательностей(частота 10-655350 Гц с шагом 10Гц, коэффициент заполнения 12,5%-87,5%, HS 1-8МГц)
    Меню формирователя:

    Фото готового прибора:

    Комплектующие:
    Atmega16 1шт;
    D44780-типа LCD-экран 2 ×16 1шт;
    Кнопки 6шт;
    ———————————————————————-
    операционный усилитель LM358N (отечественный аналог КР1040УД1) 1 шт;
    кварцевый резонатор на 16 МГц 1шт;
    конденсаторы 18пФ 2шт;
    конденсаторы 0,1мкФ 2шт;
    резистор 100 Ом 1шт;
    резистор 500 Ом 1шт;
    резистор 10 кОм 1шт;
    резистор 12 кОм 1шт;
    резистор 100 кОм 2шт;
    Потенциметр 1кОм 1 шт
    Потенциметр 10кОм (миниатюрный для подсветки LCD) 1 шт;
    Потенциметр 47кОм 1 шт;
    ———————————————————————-
    резисторы 20 кОм точные 9 шт;
    резисторы 10 кОм точные 8 шт;
    ———————————————————————-
    диодный мост 2 шт;
    Конденсатор 2000 мкф 2шт;
    Конденсатор 100 мкф 3шт;
    Конденсатор 0,1 мкф 3шт;
    стабилизатор 7812 1шт;
    стабилизатор 7912 1шт;
    стабилизатор 7805 1шт;

    Файлы проекта(печатные платы, исходники программ, проект в proteus)
    avrddsradioaktiv.zip [375,99 Kb] (cкачиваний: 3568)

    Отредактировал: Tonich — 15-01-2016, 15:22
    Причина: Исправлена печатная плата