Передача цифровых данных через низкоскоростное соединение.
Частотная модуляция (ЧМ) – это вид модуляции сигнала для осуществления передачи цифровых данных через аналоговую линию связи. Частотный модулятор состоит из управляемого цифровым сигналом генератора синусоидального напряжения, частота которого переключается между двумя предопределенными значениями в соответствии с двумя логическими уровнями цифровых данных. Схема на рис.1 генерирует синусоидальное напряжение, непрерывно производя выборку каждого периода синуса. Выходной сигнал IC2A пропорционален токам, протекающим через резисторы R1, R2 и R3. Эти резисторы присоединены совместно к одному из выводов инвертирующего входа IC2A, на котором поддерживается половина напряжения питания схемы VCC/2. Выходы GP0, GP1 и GP2 микроконтроллера IC1 создают последовательность неперекрывающихся импульсов. Когда выход устанавливается в высокое или низкое логическое состояние, другие выводы отключены — т.е. находятся в состоянии высокого импеданса. Когда на выходе установлен высокий уровень, напряжение на подключенном к нему резисторе имеет значение VCC/2. Когда на выходе установлен низкий уровень, напряжение на подключенном к нему резисторе имеет значение –VCC/2.
Значения резисторов R1, R2 и R3 выбираются таким образом, чтобы импульсы тока имели амплитуду, пропорциональную значениям синусоидального напряжения в точках с фазами 30, 60 и 90°, соответственно. Установка всех выходов IC1 в отключенное состояние соответствует выборке sin(0°), и ток через резистор не течет. Таким образом, начиная с состояния, в котором все выходы IC1 выключены и последовательная периодическая установка выводов GP0, GP1 и GP2 в состояние высокого уровня и, затем, в обратном порядке, установка выводов GP1 и GP0 снова в состояние высокого уровня, приводит к генерации положительной полуволны синусоидального напряжения. Повторение этого процесса, но с установкой выводов в состояние низкого уровня, приводит к генерации отрицательной полуволны синусоидального напряжения.
С помощью этой схемы получается синусоидальная волна, состоящая из 12 отсчетов за период. Кроме того, гармоники этой частоты этого сигнала, f0, содержат высокочастотные компоненты с частотами (12k+1)f0 и (12k−1)f0, k=1,2,3 и т.д. Фильтр низких частот, состоящий из IC2B, R7, R8, C3 и C4 легко отфильтровывает эти нежелательные компоненты малой амплитуды. На Листинге 1 показан пример программы на языке ассемблера, который реализует алгоритм ЧМ, удовлетворяющий стандарту Bell 202. Когда управляющий вход Data In находится в состоянии высокого уровня, выходная частота составляет 1200 Гц; когда управляющий вход находится в состоянии высокого уровня, выходная частота составляет 2200 Гц. Переход от одной частоты к другой осуществляется так, чтобы фаза сигнала оставалась непрерывной. На рис.2 показано соответствие сигнала на выходе ЧМ модулятора (CH1) уровнями напряжения на модулирующем входе (CH2).
Листинг 1
DI 4445
TITLE "A SIMPLE FSK MODULATOR"
; THIS CODE IMPLEMENTS A BELL 202 FSK MODULATOR
list p=10F200
include
;------------------------- PIC10F2xx CONFIGURATION -----------------------------
__CONFIG _MCLRE_OFF & _WDT_OFF & _CP_OFF ; External Reset off
; Watch Dog timer off
; Code Protection off
;-------------------------- VARIABLE DEFINITIONS -------------------------------
UDATA
PERIOD RES 1 ; Delay counter (Presets to time between sine samples)
#define DATA_IN GPIO,3 ; GP3 is DATA_IN input pin
OUT_0 EQU b'00001111' ; GP0-GP3 configured as High Impedance
OUT_1 EQU b'00001110' ; Only GP0 configured as output
OUT_2 EQU b'00001101' ; Only GP1 configured as output
OUT_3 EQU b'00001011' ; Only GP2 configured as output
P1 EQU d'19' ; Delay constant for 1200 Hz
P2 EQU d'9' ; Delay constant for 2200 Hz
; Start of program
RESET CODE 0x000
GOTO init
SUBS CODE 0X10
CHK_DATA: ; Checks Data input pin
MOVLW P1 ; Load W with 1200 Hz Delay constant
BTFSS DATA_IN ; If DATA_IN == High skip next instruction
MOVLW P2 ; Load W with 2200 Hz Delay constant
MOVWF PERIOD ; Load Delay counter;
NOP ; NOP'S added here to fine tune FSK frequencies
NOP
RETLW 0
init:
MOVWF OSCCAL ; Load the factory Internal oscillator calibration
; value
MOVLW OUT_0 ; GP0 - GP3 are OFF (High impedance)
TRIS GPIO
CLRF GPIO ; initialize outputs to Low Level
; initialize OPTION register
MOVLW b'11000111' ; Weak Pull-ups disabled ,Wake-up on pin change
OPTION ; disabled
LOOP: ; This loop produces the twelve sine samples
CALL CHK_DATA ; Check Data
DECF PERIOD,F ; decrement delay counter twice to compensate for
DECF PERIOD,F ; the 6 added instruction cycles:
; GOTO LOOP(2 cycles) DECF PERIOD,F DECF PERIOD,F
; MOVLW 0xFF and MOVWF GPIO
MOVLW OUT_0
TRIS GPIO ; GP0-GP2 are OFF (High impedance)
MOVLW 0xFF
MOVWF GPIO
L1: DECFSZ PERIOD,F
GOTO L1
CALL CHK_DATA
MOVLW OUT_1
TRIS GPIO ; GP0 is High
L2: DECFSZ PERIOD,F
GOTO L2
CALL CHK_DATA
MOVLW OUT_2
TRIS GPIO ; GP1 is High
L3: DECFSZ PERIOD,F
GOTO L3
CALL CHK_DATA
MOVLW OUT_3
TRIS GPIO ; GP2 is High
L4: DECFSZ PERIOD,F
GOTO L4
CALL CHK_DATA
MOVLW OUT_2
TRIS GPIO ; GP1 is High
L5: DECFSZ PERIOD,F
GOTO L5
CALL CHK_DATA
MOVLW OUT_1
TRIS GPIO ; GP0 is High
L6: DECFSZ PERIOD,F
GOTO L6
CALL CHK_DATA
DECF PERIOD,F ; decrement delay counter to compensate for the
; following 3 added instruction cycles
; (DECF PERIOD,F MOVLW 0x00 and MOVWF GPIO )
MOVLW OUT_0
TRIS GPIO ; GP0-GP2 are OFF (High impedance)
MOVLW 0x00
MOVWF GPIO
L7: DECFSZ PERIOD,F
GOTO L7
CALL CHK_DATA
MOVLW OUT_1
TRIS GPIO ; GP0 is Low
L8: DECFSZ PERIOD,F
GOTO L8
CALL CHK_DATA
MOVLW OUT_2
TRIS GPIO ; GP1 is Low
L9: DECFSZ PERIOD,F
GOTO L9
CALL CHK_DATA
MOVLW OUT_3
TRIS GPIO ; GP2 is Low
L10: DECFSZ PERIOD,F
GOTO L10
CALL CHK_DATA
MOVLW OUT_2
TRIS GPIO ; GP1 is Low
L11: DECFSZ PERIOD,F
GOTO L11
CALL CHK_DATA
MOVLW OUT_1
TRIS GPIO ; GP0 is Low
L12: DECFSZ PERIOD,F
GOTO L12
GOTO LOOP
END