В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MSP430
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Генерация и распознавание DTMF-сигналов

1 Введение

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

2 Спецификация сигналов DTMF

Аббревиатура DTMF означает “Dual Tone Multi Frequency” (двухтональная мультичастотная посылка) и представляет собой метод представления цифр различными частотами с целью передачи их по аналоговым линиям связи, например, по телефонной линии. При разработке стандарта было учтено условие – все частоты должны находиться в «голосовом» диапазоне, что позволило снизить требования к каналу передачи. В телефонных сетях сигналы DTMF используются для набора номера и передачи другой информации. Несмотря на то, что до сих пор широко используется импульсный способ набора номера, который является стандартом, например, в Германии, время набора при этом значительно увеличивается, приводя к непроизводительной загрузке линий связи. Кроме этого, многие дополнительные услуги связи возможны только с использованием тонального набора. При кодировании методом DTMF, цифры 0-9 и буквы A-D, */E and #/F представлены комбинаций двух частот:

Частота 1209Гц 1336Гц 1477Гц 1633Гц
697Гц 1 2 3 A
770Гц 4 5 6 B
852Гц 7 8 9 C
941Гц */E 0 #/F D

В этой системе столбец представляет частоту из «верхней» частотной группы (Hi-Group: 1209-1633 Hz), а строка - частоту из «нижней» частотной группы (Lo-Group: 697-941 Hz). Тональные частоты выбраны таким образом, чтобы исключить влияние гармоник. Частоты не кратны друг другу и ни одна из частот DTMF не может быть получена суммированием или вычитанием других частот. Для формирования набора номера в сети Deutsche Telekom требуется выполнение нижеследующих спецификаций (взято из Zulassungsvorschrift des Bundesamtes fur Post und Telekommunikation, BAPT 223 ZV 5 [1] (Официальная спецификация федерального министерства почты и связи):

  • Отклонение частоты от номинальной - не более 1.8% в процессе набора номера
  • Огибающая сигнала набора номера должна соответствовать осциллограмме, приведенной на рис.1:

  • Напряжения должны соответствовать следующим уровням:

      Длительность символа Пауза между символами Мин. уровень в дБ (950мВ) Макс. уровень в дБ (950мВ)
    fu fo fu fo
    Автоматический набор или ручной набор с автоматическим ограничением длительности 65мс<t<100мс 80мс<t<6500мс -16 -14 -10.5 -8.5
    Ручной набор без ограничения длительности t>65мс t>80мс -16 -14 -13 -11
  • Номинальный уровень напряжения верхней из 2-х частот должен быть выше как минимум на 0.5 дБ, но не более чем на 3.5 дБ, чем номинальный уровень напряжения нижней из 2-х частот с целью компенсации потерь в длинных линиях
  • В диапазоне частот 250..4600 Гц, суммарный уровень всех частот, кроме тех, которые формируют набор номера, должен быть как минимум на 23 дБ ниже суммарного уровня частот, формирующих набор номера и как минимум на 20 дБ ниже уровня каждой из таких частот.

3 Генерация сигналов DTMF

Как было описано выше, сигналы DTMF являются аналоговыми и состоят из двух независимых друг от друга синусоидальных сигналов. Таким образом, невозможно сгенерировать такие сигналы только цифровым способом. Цифровые сигналы должны быть преобразованы при помощи АЦП и/или аналоговых фильтров в требуемую синусоидальную форму.

3.1 Генерация при помощи прямоугольных сигналов

Если для формирования сигналов DTMF используются прямоугольные сигналы, требования к программному и аппаратному обеспечению минимальны. Любой непрерывный сигнал, имеющий период T может быть представлен рядом Фурье, состоящим из бесконечной суммы синусоид и косинусоид [2] следующим образом:

Где a0/2 – постоянная составляющая сигнала. Элемент суммы с наименьшей угловой частотой (w0) называется основной (фундаментальной) гармоникой, остальные – обертонами или высшими гармониками.

Наиболее простым непрерывным сигналом, реализуемым при помощи микроконтроллера, является меандр, ряд Фурье для которого имеет вид:

Вклад каждой из частотных составляющих в суммарный сигнал лучше всего демонстрируется амплитудным спектром (см. рис. 2):


Рис. 2: Амплитудный спектр прямоугольного сигнала

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

3.2 Программное обеспечение для генерации меандра

Программа генерации меандра должна удовлетворять следующим требованиям:

  • Иметь возможность синтеза двух независимых друг от друга прямоугольных сигналов.
  • В целях разделения сигналов требуются два выходных вывода, обеспечивающих генерацию сигналов из «верхнего» (Hi-Group) и «нижнего» (Lo-Group) частотных диапазонов соответственно.
  • ПО должно иметь возможность установки требуемой длительности сигналов в диапазоне примерно 65 мс - 100 мс.

Микроконтроллеры серии MSP430 имеют различные встроенные таймеры, способные генерировать прямоугольные сигналы. В семействе ‘31x/‘32x используются 8-битный таймер и таймер-порт (Timer Port) для генерации обоих прямоугольных сигналов. Данная программа проверялась при частоте MCLK равной 1.048 МГц. Таймер Timer_A в семействе ‘33x может самостоятельно формировать оба требуемых сигнала. Вторая программа использует этот таймер для генерации меандров и работает с любыми частотами MCLK. Далее будут подробно рассмотрены обе программы.

3.2.1 Генерация прямоугольных сигналов с использованием 8-битного таймера и таймера –порта Timer Port

На рис. 3 изображена блок-схема процедуры инициализации для генерации DTMF-сигналов. Чтобы синтезировать две частоты, используются счётчики таймера-порта Timer Port и 8-битного таймера. Каждый из них представляет собой программируемый счётный регистр, необходимый для точного синтеза требуемых частот. Если счётчики таймера-порта каскадированы в один 16-битный таймер и тактируются от системной частоты MCLK, то частоты верхнего диапазона могут быть сформированы с высокой точностью. При возникновении прерывания соответствующий выход переключается, и оба 8-битных счётных регистра перезагружаются. Загружаемые значения хранятся в двух переменных в ОЗУ с целью экономии внутренних регистров для других задач.

Частоты нижнего диапазона генерируются 8-битным таймером. Так как счётный регистр этого таймера имеет разрядность 8 бит, только каждое третье прерывание приводит к смене уровня на требуемом выходном выводе, позволяя генерировать этим же счётчиком частоты.

Два выхода таймера – порта используются для формирования двух меандров разной частоты.


Рис. 3 Блок-схема процедуры инициализации для генерации DTMF-сигналов

Процедура инициализации выполняется только один раз. После её завершения, шестнадцатеричное значение передаваемого символа читается из глобальной переменной в ОЗУ. После того, как две частоты, формирующие верхний и нижний тона DTMF, сгенерированы из двух таблиц, требуется только инициализация и запуск обоих таймеров. Длительность посылки контролируется путём подсчёта полупериодов «нижней» частоты и считывается из дополнительной таблицы. По завершении этой процедуры производится возврат к функции поллинга. Соответствующие подпрограммы обработки прерываний осуществляют переключение выводов порта. Этот процесс продемонстрирован на рис. 4 и 5.

В задачи таймера-порта входит только фиксация лог. уровня на выходе порта и перезагрузка счётчика из ОЗУ, работа же 8-битного таймера имеют несколько более сложную структуру: каждый вход в прерывание подсчитывается счётным регистром. Выход может сменить состояние только по истечении трёх прерываний. Кроме этого, каждый полупериод также подсчитывается. Генерация прекращается по достижении определённого количества полупериодов.


Рис. 4 Блок – схема прерываний от 8-битного таймера (Lo-Group)


Рис. 5 Блок – схема прерываний таймера-порта (Hi-Group)

; Пользовательские определения 

FLLMPY  equ   32            ; Умножитель частоты FLL на 1.048 МГц
TCLK    equ   FLLMPY*32768  ; TCLK: FLLMPY x f кварца
DL      equ   85            ; Длительность сигнала DTMF (65..100 мс)
LO_OUT  equ   02h           ; Выход «нижней» частоты
HI_OUT  equ   04h           ; Выход «верхней» частоты
RCOUNT  equ   r14           ; Счётчик длины DTMF
RTEMP   equ   r15           ; служебный регистр
.global	DTMF_NR             ; глобальная переменная в ОЗУ
; для номера DTMF (0..F)
; Определения ОЗУ

.even
.bss    DTMF_TL             ; Выравнивание по чётному адресу
.bss    DTMF_TH
.bss    DTMF_NR             ; глобальная переменная в ОЗУ
; для номера DTMF (0..F)
.even

; Определения для 8-битного таймера

TCCTL   EQU   42H
TCPLD   EQU   43H
TCDAT   EQU   44H

; Определения для универсального таймера-порта
TPCTL   equ   04bh          ; Управление таймером-портом
TPCNT1  equ   04ch          ; Счётчик таймера-порта 1
TPCNT2  equ   04dh          ; Счётчик таймера-порта 2
TPD     equ   04eh          ; Данные таймера-порта
TPE     equ   04fh          ; Разрешение таймера-порта
.text

; Таблицы частот DTMF: таблица содержит 
; число тактов MCLK для одного полупериода.
; Таблица для «верхней» частоты
; Добавлена корректирующая поправка
; для учёта времени входа в прерывание

DTMF_HI	.word  0ffffh-(TCLK/(1336*2))+25    ; Верхняя частота для 0
        .word   0ffffh-(TCLK/(1207*2))+28   ; Верхняя частота для 1
        .word   0ffffh-(TCLK/(1336*2))+25   ; Верхняя частота для 2
        .word   0ffffh-(TCLK/(1477*2))+24   ; Верхняя частота для 3
         word   0ffffh-(TCLK/(1207*2))+28   ; Верхняя частота для 4
        .word   0ffffh-(TCLK/(1336*2))+25   ; Верхняя частота для 5
        .word   0ffffh-(TCLK/(1477*2))+24   ; Верхняя частота для 6
        .word   0ffffh-(TCLK/(1207*2))+28   ; Верхняя частота для 7
        .word   0ffffh-(TCLK/(1336*2))+25   ; Верхняя частота для 8
        .word   0ffffh-(TCLK/(1477*2))+24   ; Верхняя частота для 9
        .word   0ffffh-(TCLK/(1633*2))+22   ; Верхняя частота для A
        .word   0ffffh-(TCLK/(1633*2))+22   ; Верхняя частота для B
        .word   0ffffh-(TCLK/(1633*2))+22   ; Верхняя частота для C
        .word   0ffffh-(TCLK/(1633*2))+22   ; Верхняя частота для D
        .word   0ffffh-(TCLK/(1207*2))+28   ; Верхняя частота для *
        .word   0ffffh-(TCLK/(1477*2))+24   ; Верхняя частота для #

; Таблица для «нижней» частоты

DTMF_LO .byte   0ffh-(TCLK/(941*2*3))   ; Нижняя частота для 0
        .byte   0ffh-(TCLK/(697*2*3))   ; Нижняя частота для 1
        .byte   0ffh-(TCLK/(697*2*3))   ; Нижняя частота для 2
        .byte   0ffh-(TCLK/(697*2*3))   ; Нижняя частота для 3
        .byte   0ffh-(TCLK/(770*2*3))   ; Нижняя частота для 4
        .byte   0ffh-(TCLK/(770*2*3))   ; Нижняя частота для 5
        .byte   0ffh-(TCLK/(770*2*3))   ; Нижняя частота для 6
        .byte   0ffh-(TCLK/(853*2*3))   ; Нижняя частота для 7
        .byte   0ffh-(TCLK/(853*2*3))   ; Нижняя частота для 8
        .byte   0ffh-(TCLK/(853*2*3))   ; Нижняя частота для 9
        .byte   0ffh-(TCLK/(697*2*3))   ; Нижняя частота для A
        .byte   0ffh-(TCLK/(770*2*3))   ; Нижняя частота для B
        .byte   0ffh-(TCLK/(853*2*3))   ; Нижняя частота для C
        .byte   0ffh-(TCLK/(941*2*3))   ; Нижняя частота для D
        .byte   0ffh-(TCLK/(941*2*3))   ; Нижняя частота для *
        .byte   0ffh-(TCLK/(941*2*3))   ; Нижняя частота для #

; Таблица длительностей сигнала

DTMF_L  .byte  2*941*DL/1000 ; Полупериоды для 0
        .byte   2*697*DL/1000       ; Полупериоды для 1
        .byte   2*697*DL/1000       ; Полупериоды для 2
        .byte   2*697*DL/1000       ; Полупериоды для 3
        .byte   2*770*DL/1000       ; Полупериоды для 4
        .byte   2*770*DL/1000       ; Полупериоды для 5
        .byte   2*770*DL/1000       ; Полупериоды для 6
        .byte   2*852*DL/1000       ; Полупериоды для 7
        .byte   2*852*DL/1000       ; Полупериоды для 8
        .byte   2*852*DL/1000       ; Полупериоды для 9
        .byte   2*697*DL/1000       ; Полупериоды для A
        .byte   2*770*DL/1000       ; Полупериоды для B
        .byte   2*852*DL/1000       ; Полупериоды для C
        .byte   2*941*DL/1000       ; Полупериоды для D
        .byte   2*941*DL/1000       ; Полупериоды для *
        .byte   2*941*DL/1000       ; Полупериоды для #
;****************************************************************************
; DTMF-TX Подпрограмма DTMF
;****************************************************************************
DTMF_TX
        mov.b   DTMF_NR,RTEMP           ; Сохранить номер во временном регистре
        mov.b   DTMF_L(RTEMP),RCOUNT    ; Сохранить счётчик длительности
;подготовка  8-битного таймера для частоты DTMF-Lo
        mov.b   #0a8h,&TCCTL            ; Тактирование от MCLK
        mov.b   DTMF_LO(RTEMP),&TCPLD   ; Подготовка регистра
;  предварительной загрузки
        mov.b   #000,&TCDAT             ; Загрузка счётчика из регистра
;  предварительной загрузки

        bis.b   #008h,&IE1          ; Разрешить прерывания 
; от 8-битного таймера
; подготовка  таймера-порта  для частоты DTMF-Hi
        rla r15                     ; * 2 для  16-битной таблицы
        mov DTMF_HI(RTEMP),&DTMF_TL 
; сохранить слово для верхней частоты
        mov #003,RTEMP              ; счётчик для 8-битного таймера	
        bis.b   #008h,IE2           ; Разрешить прерывания 
; от таймера-порта
        mov.b   &DTMF_TH,&TPCNT2    ; Загрузка старшего байта в TC2
        mov.b   &DTMF_TL,&TPCNT1    ; Загрузка младшего байта в TC1
        bis.b   #080h,&TPD          ; Разрешить 16-битный таймер
        bis.b   #HI_OUT+LO_OUT,&TPE	; Разрешить выходы DTMF-Hi/Lo
        mov.b   #090h,&TPCTL        ; Разрешить таймер
        ret
;****************************************************************************
; Прерывание таймера-порта
;****************************************************************************
TP_INT
        xor.b   #HI_OUT,&TPD        ; Инверсия выхода DTMF-Hi
        mov.b   &DTMF_TH,&TPCNT2    ; Загрузка старшего байта в TC2
        mov.b   &DTMF_TL,&TPCNT1    ; Загрузка младшего байта в TC1
        bic.b   #007h,&TPCTL        ; Очистка флагов
        reti
;****************************************************************************
; Прерывание P0.1/8-битный таймер
;****************************************************************************
TIM_8B
        eint                        ; Разрешить прерывания
        dec	RTEMP
        jz	TOGGLE                  ; переход по 3-му прерыванию
        reti
TOGGLE
        xor.b	#LO_OUT,&TPD        ; Инверсия выхода DTMF-Lo
        mov	#003,RTEMP              ; счётчик для 8-битного таймера
        dec	RCOUNT                  ; декремент счётчика длительности
        jz	DTMF_END                ; переход, если длительность закончилась
        reti
DTMF_END
        bic.b	#037h,&TPCTL        ; Остановить счётчик таймера-порта
        bic.b	#008h,TCCTL         ; Остановить счётчик 8-битного таймера
        bic.b	#008h,&IE2          ; Запретить прерывания 8-бит. таймера
        bic.b	#003h,&TPE          ; Запретить выходы
        reti
; Адреса векторов прерываний
        .sect	"TP_VECT", 0ffe8h
        .word TP_INT                ;Timer-Port
        .sect "TIM_VECT", 0fff8h
        .word TIM_8B                ; 8-битный таймер (P0.0)

3.2.2 1 Генерация прямоугольных сигналов с использованием таймера Timer_A

Данная подпрограмма генерации сигналов DTMF использует только таймер Timer_A для формирования меандров обоих требуемых частот. В процессе ассемблирования вычисляются соответствующие значения для таймера с целью использования программы независимо от значения частоты MCLK. Длительность выходного сигнала задаётся константой DL в миллисекундах.

; Аппаратные определения 
;
FLLMPY	.equ	32				; Умножитель частоты FLL на 1.048 МГц
        TCLK		.equ	FLLMPY*32768		; TCLK: FLLMPY x f кварца
DL		.equ	82				; длительность сигнала  DTMF в мс 
							; (65..100 мс)
STACK	.equ	600h				; Адрес инициализации стека

; Определения ОЗУ
;
STDTMF	.equ	202h				; Статус частот  Hi и Lo
TIM32B	.equ	204				; Расширение регистра таймера
LENGTH	.equ	206h				; Счётчик длительности DTMF 
;
.text	0F000h			; Стартовый адрес программы
;
; Инициализация таймера Timer_A: MCLK, Режим Continuous, прерывания разрешены
; Подготовка выходных модулей таймера Timer_A  MCLK = 1.048 МГц (автоматически)
;
INIT		MOV	#STACK,SP			;Инициализация указателя стека
CALL	#INITSR			;Инициализация умножителя
; частоты  FLL и ОЗУ
        MOV	#ISMCLK+TAIE+CLR,&TACTL
 ; Инициализация таймера
        MOV.B #TA2+TA1,&P3SEL		; Выходы TA2 и TA1 на портах P3.5/4
        CLR	TIM32B			; Очистить расширенный регистр таймера
        BIS	#MCONT,&TACTL		; Старт таймера Timer_A
        EINT					; Общее разрешение прерываний 
MAINLOOP	... 					; Основной цикл
;
;Нажатие клавиши: в SDTMF содержится смещение по таблице
; для 2-х частот (0..6,0..6) в старшем и младшем байте
;
        MOV	&TAR,R5			; Для немедленного старта:
        ADD	FDTMFLO,R5			; Смещение для меньшего времени
        MOV	R5,&CCR1			; Первая смена состояния через 0.71мс
        MOV	R5,&CCR2			; 1/(2x697) = 0.71мс
        MOV	#OMT+CCIE,&CCTL1	; Инверсия выхода, прерывание разр.
        MOV	#OMT+CCIE,&CCTL2	; Инверсия выхода, прерывание разр
        MOV.B STDTMF,R5			; Счётчик на 82 мс
        RRA	R5				; число смен состояния нижней частоты
        MOV.B DTMFL(R5),LENGTH	; для длительности сигнала
... 					; продолжение программы
;
; Обработчик прерывания от CCR0  (здесь не используется)
;
TIMMOD0 ...
        RETI
;
; Обработчик прерываний от регистров захвата-сравнения 1..4
;
TIM_HND	ADD	&TAIV,PC			; Обработка запроса с наивысшим 
							; приоритетом
        RETI					; нет запроса прерывания: RETI
        JMP	HCCR1			; запрос от CCR1 (нижняя частота DTMF)
        JMP	HCCR2			; запрос от CCR2 (верхняя частота DTMF)
        JMP	HCCR3			; запрос от CCR3 
        JMP	HCCR4			; запрос от CCR4 
;
TIMOVH	INC	TIM32B			; Расширение таймера Timer_A до 32 бит
        RETI
;
; Нижняя частота DTMF: TA1 инвертирует выход модуля Output Unit 1
; Каждая смена состояния подсчитывается для контроля длительности сигнала 
;
HCCR1	PUSH	R5				; Сохранение используемых регистров 
        MOV.B STDTMF,R5			; Статус нижней частоты DTMF 
        ADD	FDTMFLO(R5),&CCR1	; Добавить длительность полупериода
        DEC.B LENGTH			; Длительность сигнала DL завершена?
        JNZ	TARET			; Нет
;
; Да, прекратить выдачу сигнала DTMF: запретить прерывания
;
        BIC	#OMRS+OUT+CCIE,&CCTL1 ; Сброс TA1
        BIC	#OMRS+OUT+CCIE,&CCTL2 ; Сброс TA2
TARET   POP	R5				; Восстановить R5
        RETI					; Возврат из прерывания 
;
; Верхняя частота DTMF: TA2 инвертирует выход модуля Output Unit 2
;
HCCR2	PUSH R5				; Сохранение используемых регистров
        MOV.B STDTMF+1,R5		; Статус верхней частоты DTMF
        ADD	FDTMFHI(R5),&CCR2	; Добавить длительность полупериода
        POP R5				; Восстановить R5
        RETI					; Возврат из прерывания 
;
HCCR3	 ... 					;Задача, контролируемая регистром CCR3
RETI
HCCR4	... 					;Задача, контролируемая регистром CCR4

        RETI
;
; Таблица частот DTMF: в таблице содержится 
; число тактов MCLK на полупериод. Значения скорректированы для 
; действующей частоты MCLK в процессе ассемблирования 
; и округлены с минимально возможной ошибкой частоты
;
FDTMFLO .word	((TCLK/697)+1)/2		; Нижняя частота DTMF 697Hz
        .word	((TCLK/770)+1)/2		; 770Hz
        .word	((TCLK/852)+1)/2		; 852Hz
        .word	((TCLK/941)+1)/2		; 941Hz
FDTMFHI .word	((TCLK/1209)+1)/2		; Верхняя частота DTMF1209Hz
        .word	((TCLK/1336)+1)/2		; 1336Hz
        .word	((TCLK/1477)+1)/2		; 1477Hz
        .word	((TCLK/1633)+1)/2		; 1633Hz
;
; Таблица содержит число полупериодов для длительности сигнала  DL (мс). 
; Для подсчёта используется нижняя частота DTMF
;
DTMFL   .byte	2*697*DL/1000		; Число полупериодов
        .byte	2*770*DL/1000		; для  DL в мс
        .byte	2*852*DL/1000		;
        .byte	2*941*DL/1000		;
;
        .sect	"TIMVEC",0FFF0h		; Вектора прерываний таймера  Timer_A 
        .word	TIM_HND			; Вектор модулей 1..4 таймера
        .word	TIMMOD0			; Вектор модуля 0 таймера
        .sect	"INITVEC",0FFFEh		; Вектор сброса Reset
        .word INIT

Ниже приведено несколько более быстрое решение. Однако, при этом оно требует большего объёма ОЗУ т.к. данные, получаемые из таблиц не пересчитываются каждый раз, а хранятся в двух словах в ОЗУ DTMFLO и DTMFHI. Чтение производится из подпрограмм обработки прерываний таймера Timer_A. Используемые таблицы идентичны приведенным в предыдущем примере.

FLLMPY	.equ	32				; Умножитель частоты  FLL на  1.048МГц
TCLK		.equ	FLLMPY*32768		; TCLK: FLLMPY x f кварца
DL		.equ	82				; Длительность сигнала  DTMF
; в мс  (65..100 мс)
STDTMF	.equ	202h				; Статус частот  Hi и Lo
TIM32B	.equ	204				; Расширение регистра таймера
LENGTH	.equ	206h				; Счётчик длительности DTMF
DTMFLO	.equ	208h				; Полупериод нижней частоты
DTMFHI	.equ	20Ah				; Полупериод верхней частоты
STACK	.equ	600h				; Адрес инициализации стека
        .text	0F000h			; Стартовый адрес программы

; Инициализация таймера Timer_A: MCLK, Режим Continuous, прерывания разрешены
; Подготовка выходных модулей таймера Timer_A  MCLK = 1.048 МГц (автоматически)
;
INIT 		MOV	#STACK,SP			; Инициализация указателя стека
        CALL	#INITSR			; Инициализация умножителя
; частоты  FLL и ОЗУ

        MOV	#ISMCLK+TAIE+CLR,&TACTL ; Старт таймера
        MOV.B #TA2+TA1,&P3SEL		; Выходы TA2 и TA1 на портах P3.5/4
        CLR TIM32B				; Очистка расширенного регистра таймера

        BIS	#MCONT,&TACTL		;Запуск таймера Timer_A
        EINT					; Общее разрешение прерываний
MAINLOOP	 ...					; Основной цикл

;Нажатие клавиши: в SDTMF содержится смещение по таблице
; для 2-х частот (0..6,0..6) в старшем и младшем байте
;
        MOV	&TAR,R5			; Для немедленного старта
        ADD	FDTMFLO,R5			; Смещение для меньшего времени
        MOV	R5,&CCR1			; Первая смена состояния через 0.71мс
        MOV	R5,&CCR2			; 1/(2x697) = 0.71мс
;
; Fetch the two cycle counts for the DTMF frequencies
;
        MOV.B STDTMF+1,R5		; Верхняя частота DTMF
        MOV	FDTMFHI(R5),DTMFHI	; Длительность полупериода
        MOV.B STDTMF,R5			; Нижняя частота DTMF
        MOV	DTMFLO(R5),DTMFLO	; Длительность полупериода
;
; Счётчик длительности
        RRA	R5				; Prepare byte index
        MOV.B DTMFL(R5),LENGTH 	; число смен состояния нижней частоты
        MOV	#OMT+CCIE,&CCTL1	; Инверсия выхода, прерывание разр.
        MOV	#OMT+CCIE,&CCTL2	; Инверсия выхода, прерывание разр.
... 					; Возврат в основной цикл
;
; Обработчик прерывания от CCR0  (здесь не используется)
;
TIMMOD0 ...
        RETI
;
; Обработчик прерываний от регистров захвата-сравнения 1..4
;
TIM_HND	ADD	&TAIV,PC			; Обработка запроса с наивысшим 
							; приоритетом

        RETI		 			; нет запроса прерывания: RETI
        JMP	HCCR1			; запрос от CCR1 (нижняя частота DTMF)
        JMP	HCCR2			; запрос от CCR2 (верхняя частота DTMF)
        JMP	HCCR3			; запрос от CCR3 
        JMP	HCCR4			; запрос от CCR4 

;
TIMOVH	INC	TIM32B			; Расширение таймера Timer_A до 32 бит
        RETI
;
; Нижняя частота DTMF: TA1 инвертирует выход модуля Output Unit 1
;
HCCR1	ADD	DTMFLO,&CCR1		; Добавить длительность полупериода
DEC.B LENGTH			; Длительность сигнала DL завершена?
JNZ	TARET			; Нет 
;
; Да, прекратить выдачу сигнала DTMF: запретить прерывания
;
BIC	#OMRS+OUT+CCIE,&CCTL1 ; Сброс TA1
BIC	#OMRS+OUT+CCIE,&CCTL2 ; Сброс TA2
TARET	RETI					; Возврат из прерывания
; Верхняя частота DTMF: TA2 инвертирует выход модуля Output Unit 2
;

HCCR2 	ADD	DTMFHI,&CCR2		; Добавить длительность полупериода
RETI					; Возврат из прерывания
;
HCCR3	 ... 					;Задача, контролируемая регистром CCR3
RETI
HCCR4	... 					;Задача, контролируемая регистром CCR4

RETI
; 
; Таблицы и вектора прерываний идентичны приведенным в предыдущем примере

3.3 Аппаратная часть для генерации сигналов DTMF

Как было указано выше, в диапазоне частот 200 Гц .. 4600 Гц уровень сигнала частоты передачи должен быть как минимум на 20 дБ выше уровня посторонних сигналов (шумов). Кроме этого, исходя из спецификации, сигналы из «верхней» и «нижней» групп должны иметь разные уровни, поэтому для каждого сигнала требуется собственный фильтр. Амплитуды частот синусоидальной формы можно получить из ряда Фурье.

Для выбора частот среза при разработке аналогового фильтра необходимо придерживаться следующих требований, основанных на [1]:

  • Т.к. необходимо обеспечить возможность любых комбинаций частот «нижней» группы с частотами «верхней» группы, разность уровней между самой низкой и самой высокой частотой в группе не должна превышать 3 дБ.
  • Для самой низкой частоты в группе (f1), подавление гармоники (3f1) должно быть не хуже 20 дБ. Выполнение этого условия наиболее критично для нижней частоты в группе, т.к. она находится максимально далеко от частоты среза фильтра.

Формула [3] описывает квадрат абсолютного значения на выходе фильтра высоких частот Баттерворта порядка n:

Данная формула представляет собой зависимость коэффициента усиления фильтра высоких частот Баттерворта от частоты. Параметры fg и n определяют частоту среза и порядок фильтра соответственно.

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

Для выполнения первого условия отношение квадратов абсолютных значений самой нижней и самой верхней частоты в группе должно быть не более 3 дБ или :

Второе условие выполнится автоматически, если отношение квадратов абсолютных значений частот f1 и 3f1 будет более 10/3, в данном случае третья гармоника в прямоугольном сигнале меньше на 1/3 (см. ряд Фурье и рис. 2):

В результате вычислений для частот обеих групп имеем требуемый порядок фильтра n=1.15. Таким образом, требованиям будет удовлетворять фильтр 2-го порядка, который может быть построен на операционном усилителе. В случае использования фильтра 3-го порядка понадобится только два дополнительных элемента. Однако, это позволит снизить требования к разбросу параметров компонентов. Оба приведенных выше требования будут соблюдены, если частота среза находится в следующих пределах:

Нижняя группа fg>880 Гц fg<1418 Гц
Верхняя группа fg>1527 Гц fg<2460 Гц

Если частота среза минимальна, будет наблюдаться максимальное подавление гармоник. Однако, в этом случае разность уровней самой низкой и самой высокой частоты в группе будет равна 3 дБ. При максимально возможной частоте среза разность уровней минимальна, но гармонические составляющие подавляются только на 20 дБ.

При расчёте фильтра было обращено повышенное внимание на подавление гармоник, разность уровней внутри группы была зафиксирована на уровне 2 дБ. В результате этого, частоты среза имеют значения 977 Гц и 1695 Гц. Результирующее подавление гармоник значительно превосходит предъявляемые требования. Разность уровней частот в группе находится в пределах требований даже в случае девиации частоты среза, связанной с разбросом параметров применяемых компонентов. При вычислении значений элементов фильтра резисторы выбирались исходя из соображения их максимальной близости к стандартным значениям ряда E12.

На выходах фильтров в результате получаем два синусоидальных сигнала с значительно подавленными гармониками. Для объединения этих сигналов введен дополнительный сумматор.

Таким образом, используя только 3 ОУ и несколько пассивных элементов, мы имеем возможность генерировать сигналы DTMF при помощи микроконтроллера без использования значительных вычислительных ресурсов.

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


Рис. 6: Амплитудный спектр прямоугольного сигнала частотой 697 Гц на выходе фильтра 3-го порядка

На рис. 6 приведен амплитудный спектр прямоугольного сигнала частотой 697 Гц, пропущенного через фильтр 3-го порядка. Как видно из рисунка, третья и пятая гармоники (2091 Гц и 3485 Гц) существенно ослаблены (-25.6 dB).


Рис. 7: Амплитудный спектр прямоугольного сигнала частотой 941 Гц на выходе фильтра 3-го порядка

На рис. 7 показан спектр прямоугольного сигнала частотой 941 Гц. В интересующей нас частотной области до 4600 Гц присутствует только одна гармоника. После прохождения фильтра, эта гармоника частотой 2823 Гц значительно ослаблена (-27.9 дБ). Разность уровней между самой низкой и самой высокой частотой в группе не превышает 1.9 дБ.

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


Рис 8: Гистограмма – распределение уровней сигнала в группе


Рис 9: Гистограмма – подавление гармоник

На рис. 8 и 9 показаны гистограммы полученные при помощи анализа по методу Монте-Карло. В данном случае, значения компонентов менялись случайным образом в пределах разброса 10%. После 100 итераций результаты для всех смоделированных фильтров помещены на гистограммы. В гистограмме на рис. 8 показана разность уровней между частотами внутри группы. Максимально допустимая разность - 3 дБ между минимальной и максимальной частотой ни в одном случае не была достигнута. Среднее значение составляет 1.6 дБ, что несколько лучше расчётного значения 2 дБ.

На рис. 9 показано ослабление гармоник для «нижней» группы частот. Требуемая величина в 20 дБ достигается во всех случаях, среднее значение примерно 27 дБ. В наихудшем случае гармоника подавлена на 24.2 дБ.

Значения, рассчитанные для фильтра «нижней» группы частот выполняются также и для фильтра «верхней» группы частот.

Оба фильтра имеют идентичную схемотехнику. Различие только в частотах среза фильтров для верхней и нижней групп частот. R1 и C1 формируют ФВЧ 1-го порядка. Т.к. входное сопротивление схемы также зависит от R1, значение этого элемента не должно быть слишком маленьким; в противном случае выходы микроконтроллера будут перегружены, а прямоугольная форма сигнала искажена. В таком случае к сигналу будут добавлены дополнительные частоты, являющиеся результатом интермодуляционных искажений, что отрицательно скажется на соотношении сигнал-шум.

Функция передачи фильтров более высокого порядка не может быть получена с использованием только пассивных компонентов.

Таким образом, фильтр 2-го порядка должен содержать операционный усилитель. Усиление активного фильтра установлено на уровне 0.2 при помощи резисторов R1-1 и R1-2. Как видно, сигнал при этом несколько ослабляется. Это необходимо для исключения перегрузки ОУ, т.к. пиковая амплитуда фундаментальной синусоидальной гармоники прямоугольного сигнала превышает амплитуду собственно прямоугольного сигнала (См. ряд Фурье и Рис.2). В дополнительном сумматоре производится регулировка требуемого выходного уровня. Из-за имеющей место постоянной составляющей прямоугольного сигнала рабочая точка ОУ выставляется на уровне Vcc/2 (См. также ряд Фурье и Рис.2). При этом, постоянная составляющая не может быть устранена входным делителем R1-1/R1-2. Для развязки цепи ОС по постоянному напряжению служит конденсатор C3.

На каждом из выходов аналогового фильтра формируется сигнал верхней и нижней групп частот соответственно. В дополнительном сумматоре данные сигналы складываются. В этом элементе схемы можно установить соотношение между «нижней» и «верхней» частотой в суммарном сигнале и уровень выходного сигнала при помощи резисторов R4 и R5. Таким образом, выходная амплитуда может быть легко отрегулирована в соответствии с различными требованиями, существующими в разных странах.

При расчёте номиналов компонентов значения конденсаторов были, как обычно, зафиксированы, и в соответствии с ними рассчитывались номиналы резисторов. В данной схеме были использованы конденсаторы и резисторы стандартного ряда E12 с разбросом 10%.

На рис. 10 показана принципиальная схема аналоговых фильтров и сумматора:


Рис. 10: Принципиальная схема аналоговых фильтров с дополнительным сумматором

Конденсаторы C1-1 и C1-2 объединяют два сигнала вместе в рабочей точке с уровнем Vcc/2. Для этих элементов не следует выбирать слишком больших значений, т.к. они являются элементами ФНЧ для устранения низкочастотных субгармоник. Фильтрующий конденсатор C5 устраняет шумы опорного напряжения. Дополнительный конденсатор C6, подключенный в параллель к резистору обратной связи R6 формирует ФВЧ первого порядка. Если выбрана наименьшая частота среза фильтра, дополнительная фильтрация высокочастотных интермодуляционных помех улучшает качественные показатели выходного сигнала, однако при этом будет наблюдаться некоторое ослабление самых высоких частот «верхней» группы. В некоторых случаях генерация самой высокой частоты DTMF 1633 Гц не требуется, т.к. она используется только для формирования служебных символов A-D, при этом можно улучшить соотношение сигнал – шум понижением частоты среза фильтра. Таким образом, повышение частоты среза ведёт к увеличению уровня высокочастотных помех, но при этом снижается негативное влияние на наиболее высокочастотные компоненты сигнала DTMF.

4 Результаты исследований сигналов передатчика DTMF

Приведенные ниже спектрограммы (Рис. 11 и 12) демонстрируют выходные сигналы DTMF – передатчика на различных частотах. На рис. 11 показан амплитудный спектр символа “1”. Необходимые для его передачи частоты - 697 и 1207 Гц находятся на уровне -10.5 дБ и -8.5 дБ соответственно. Гармоники 2091 и 3621 Гц подавлены почти на 30 дБ. Для передачи символа “D” генерируются две наиболее высокие частоты - 941 и 1633 Гц. Как видно из рис. 12, уровень нижней частоты составляет -12 дБ, уровень верхней частоты -11 дБ. Соответствующие гармоники ослаблены более, чем на 30 дБ. Таким образом, измеренные значения соответствуют результатам моделирования и требованиям спецификации [1].


Рис. 11: Амплитудный спектр символа “1”: 697 и 1207 Гц


Рис. 12: Амплитудный спектр символа “D”: 941 и 1633 Гц

Абсолютной точности частоты генерируемых прямоугольных сигналов при использовании двух различных таймеров достичь не удастся, результат будет зависеть от комбинации двух частот и типа используемых таймеров. Причиной этого является конфликт прерываний таймеров. Тем не менее, требуемая точность ±1.8 % выполняется с большим запасом.

Если используются 8-битный таймер и таймер – порт Timer Port timer на системной частоте MCLK 1.048 МГц, то частоты «нижней» группы генерируются с точностью не хуже 0.3 %. Для частот «верхней» группы на практике получена девиация не выше 0.5 %.

Единственное исключение – символ DTMF “D”, для которого генерируются наивысшие частоты. В результате этого, в данной комбинации частота «верхней» группы 1633 Гц имеет отклонение в -0.97 %.

Без учёта этого исключения, даже самая высокая частота 1633 Гц генерируется с точностью лучше 0.5 %. Максимальные девиации для различных частот приведены в таблице:

«Нижняя» группа частот «Верхняя» группа частот
Частота, Гц Макс. девиация Частота, Гц Макс. девиация
697 -0,28% 1207 +0,33%
770 -0,13% 1336 +0,45%
853 ±0,12% 1477 ±0,14%
941 -0,21% 1633 -0,97%

Если для генерации частот используется таймер Timer_A, ошибка будет зависеть от используемой частоты MCLK:

MCLK, МГц 1,048 2,096 3,144 3,800
Умножитель FLL 32 64 96 116
697 Гц +0,027% +0,027% +0,027% +0,027%
770 Гц -0,015% -0,016% +0,033% -0,016%
852 Гц +0,059% -0,023% +0,005% +0,031%
941 Гц +0,029% +0,029% +0,029% +0,035%
1209 Гц -0,079% +0,036% +0,036% -0,003%
1336 Гц +0,109% -0,018% +0,025% +0,025%
1447 Гц -0,009% -0,009% -0,009% -0,009%
1633 Гц +0,018% +0,018% +0,018% +0,018%

5 Заключение

Программное обеспечение для данного примера весьма простое и, занимая примерно 300 Байт, требует малого объёма ОЗУ и ПЗУ. Благодаря наличию встроенного модуля таймера требуемые частоты генерируются с высокой точностью без непроизводительной загрузки ЦПУ. В конфигурации, где для генерации используются 8-битный таймер и таймер-порт Timer/Port, подпрограммы обработки прерываний занимают примерно 12% ресурса ЦПУ. В том случае, когда частоты генерируются таймером Timer_A, загрузка ЦПУ на обработку подпрограмм прерываний снижается до 6%. В результате этого, во время передачи сигналов DTMF могут выполняться другие задачи, либо ЦПУ может быть переведен в режим пониженного потребления с целью снижения потребляемого тока.

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

Если в конкретном случае требуется повысить соотношение сигнал – шум, используя дополнительный ОУ можно сконструировать фильтр для дальнейшего подавления интермодуляционных искажений. Такой дополнительный операционный усилитель уже присутствует в составе счетверённого ОУ в корпусе DIL14.

6 Ссылки

[1] Bundesamt fur Post und Telekommunikation (Federal Office for Post and Telecommunications): BAPT 223 ZV 5, Zulassungsvorschrift fur Endeinrichtungen zur Anschaltung an analoge Wahlanschlusse (ausgenommen Notruf- und Durchwahlanschlusse) des Telefonnetzes (официальная спецификация для оконечных устройств, подсоединяемых к аналоговым телефонным линиям, за исключением требований безопасности и вызова) / ISDN of the Deutschen Bundespost Telekom; Bundesministerium fur Post und Telekommunikation, Draft, Bonn April 1994 [2] Papula: Mathematik fur Ingenieure 2 (Математика для инженеров); Vieweg Verlag, Braunschweig 1990 [3] Tietze / Schenk: Halbleiterschaltungstechnik; (Титце/Шенк, Полупроводниковая схемотехника), 10th.Edition; Springer Verlag, Berlin 1993 [4] Lutz Bierl / Texas Instruments: MSP430 Family, Metering Application Report, Texas Instruments, Issue 2.1, Jan 1997, SLAAE10B [5] Texas Instruments: MSP430 Family, Architecture User’s Guide and Module Library, Texas Instruments, 1996, SLAUE10B [6] Texas Instruments: MSP430 Family, Software User’s Guide, Texas Instruments, 1996 [7] Texas Instruments: MSP430 Family, Assembly Language Tools User’s Guide, Texas Instruments, 1996 [8] Siwy, Robert: Systementwicklung einer Telekom-Applikation zum Senden und Empfangen von DTMF-Signalen mit dem Microcontroller MSP430 (Разработка телекоммуникационной системы для приёма и передачи цифровых сигналов на базе микроконтроллера MSP430); Diplomarbeit, Fachhochschule Landshut, Mai 1997