Стереофонический приёмник УКВ
В статье представлен стереофонический приёмник УКВ, работающий в диапазоне 87,5…108 МГц. Схема приёмного тракта подобна схеме, которая была представлена в статье «Приёмник УКВ диапазона с плавной настройкой», и также выполнена на микросхеме КР174ХА34 (см. Рис.1)
Рис.1 - Схема стереофонического приемника УКВ
Отличиями стереофонического варианта приёмника являются:
- ёмкость конденсатора С17 – 0,01 мкФ;
- комплексный стерео – сигнал (КСС) снимается с вывода 14 микросхемы DA2;
- КСС проходит через фильтр низкой частоты, образованного R24, C22 и R7, и далее через разделительный конденсатор С14 на микросхему DA4 (TDA7040T), которая является стереодекодером.
TDA7040T декодирует КСС формата CCIR (с пилот – тоном), который используется при вещании в указанном диапазоне. DA4 обеспечивает переходное затухание между каналами не менее 40 дБ и нелинейные искажения 0,1 – 0,3%. КСС поступает на вывод 8 микросхемы. Выходные сигналы снимаются с выводов 5 (правый канал) и 6 (левый канал) и далее через переменные резисторы R22 и R23, которые регулируют баланс звука между каналами, поступают на усилители низкой частоты (УНЧ) DA5, DA6.
УНЧ имеют идентичные принципиальные схемы. Они собраны на микросхеме К174УН14 (аналог TDA2003). Данный УНЧ был также применён в первом варианте приёмника.
Следует отметить, что резисторы R22 и R23 входят в состав одного сдвоенного резистора типа RK-1233G1.
Данные катушек L1, L2 такие же, как и в первом варианте приёмника:
Катушка L1 – бескаркасная, намотана на оправке диаметром 3 мм и содержит 4,5 витка провода ПЭВ-2 диаметром 0,47 мм. Снятую с оправки необходимо растянуть, придавая её виткам шаг приблизительно 1 мм (общая длина - 4…5 мм). Катушка L2 – бескаркасная и имеет 7,5 витков того же провода, намотанного виток к витку на такой же оправке.
Основным отличием этого варианта приёмника является блок управления, который состоит из микроконтроллера DD1 - ATmega16 (тактовая частота от внутреннего генератора – 8 МГц), интерфейса RS-232 (разъём – DB9-F, микросхема преобразователя уровней DD2 – MAX3232), жидко - кристаллического индикатора (LCD 16x2) типа MT-16S2H (производитель МЭЛТ), 8 – ми битного цифро – аналогово преобразователя (ЦАП) DD3 – PCF8591 и буферного повторителя DA7 – LM358N. Блок управления содержит также цепь регистрации «захвата» частоты радиостанции. Она имеет ключ на транзисторе VT1 и резисторах R4, R5, R2 и формирователь импульсов – на слотах микросхемы CD4011B – DD4.1, DD4.4. Сброс микроконтроллера осуществляется посредством цепи сброса – на элементах R1, C1 и формирователе импульсов – DD4.2, DD4.3.
Схема работает по принципу «следящего аналогово – цифрового преобразователя (АЦП)».
Код напряжения на варикапе VD1 задается с персонального компьютера (ПК) через интерфейс RS-232 и UART микроконтроллера. При этом используется среда программирования BASCOM, в частности терминал и функция «эхо», позволяющая выводить на монитор ПК содержимое команды INPUT.
Заданный код поступает из микроконтроллера по шине I2C в ЦАП (DD3), поскольку в микроконтроллерах AVR (ATtiny, ATmega) подобного аппаратного средства, где цифровой код преобразуется в постоянное напряжение, не предлагается. Данное напряжение фильтруется фильтром низкой частоты R12, C29 и буферизируется с помощью повторителя DA7, с выхода которого подаётся на варикап VD1 через резистор R13. Одновременно с выхода DA7 напряжение поступает и на вход микроконтроллера DD1 – ADC0 (PA0), который является входом встроенного в контроллер АЦП.
АЦП преобразует это напряжение (на варикапе) в цифровой код, который сравнивается с заданным кодом. Если значение, потупившего с варикапа кода напряжения больше или меньше заданного, то происходит его соответствующая коррекция, и он вновь по шине I2C отправляется в ЦАП и.т.д.. Таким образом, осуществляется слежение за напряжением, а следовательно и за принимаемой частотой.
Для того, чтобы задать какую – либо команду блоку управления необходимо (как и в первом варианте приёмника) нажать на клавиатуре ПК любую клавишу (курсор должен находиться на экране терминала), а после ввода определённой цифры нажать «ENTER». На экране терминала появиться надпись: «Enter: READeeprom – (0), > - (1), <- (2), WRITeeprom – (3):». Это значит, что если вы введёте «0», то данное значение кода напряжения на варикапе будет считано из энергонезависимой памяти микроконтроллера (EEPROM). Если вы введёте «1», то значение кода увеличится на 5. При введении «2» код напряжения уменьшится на 5. При вводе цифры «3» текущее значение кода, а следовательно и частота выбранной радиостанции, будет сохранено в энергонезависимой памяти микроконтроллера.
На экране жидко – кристаллического индикатора (ЖКИ) в верхней строке высвечивается значение заданного напряжения, которое дублируется графическим индикатором уровня в нижней строке.
При нахождении сигнала какой – либо радиостанции на выводе 9 DA 2 появляется постоянное напряжение (2,5…3В), загорается светодиод HL1, открывается транзистор VT1, напряжение на входе INT0 контроллера DD1 падает, и контроллер входит в режим обработки внешнего прерывания. В результате на верхней строке ЖКИ (с седьмого знакоместа) высвечивается в течении двух секунд надпись «Radio SС». Надпись «Radio SCAN» появляется и на экране терминала, что свидетельствует о «захвате» частоты радиостанции (см. Рис.2).
Питание приёмника осуществляется от постоянного стабилизированного напряжения 12В, и от последовательно включённых стабилизаторов 78L05 (5B), 78L03 (3B). При этом следует отметить, что питание микросхем DA2, DA3 и опорное напряжение АЦП -Vref развязаны LC фильтрами.
Программа «Приёмник УКВ стерео» содержит:
- основной цикл DO…LOOP;
- подпрограмму обработки прерывания по приёму «RxD»;
- подпрограмму обработки внешнего прерывания «Send»;
- подпрограмму отсылки по I2C в ЦАП кода напряжения «Sub Upr».
В основном цикле происходит преобразование значения напряжения, приложенного к варикапу в восьмибитный цифровой код. Следует отдельно остановиться на конфигурировании АЦП микроконтроллера, поскольку эта тема не была затронута в цикле статей «Bascom для начинающих», опубликованных на нашем сайте.
Конфигурирование осуществляется следующим образом:
Config Adc = Free|Single, Preskaler=Auto|коэфф. дел,
Reference=OFF|AVCC|Internal
где:
- Free – режим непрерывного преобразования;
- Single – режим одиночного преобразования (запуск каждого преобразования осуществляется по команде);
- Auto – устанавливает максимальную частоту преобразования;
- коэффициент деления предделителя АЦП=2|4|8|16|32|64|128. Отимальная частота преобразования= тактовая частота/коэфф.дел.=50…200 КГц;
- off – использование внешнего источника опорного напряжения;
- AVCC – использование в качестве источника опорного напряжения питания АЦП;
- Internal – использование в качестве источника опорного напряжения внутреннего источника питания – 2,56 В.
Само преобразование осуществляется так: w=Getadc (№ канала входа аналогово сигнала). Здесь w – переменная, определяемая as Byte при преобразовании с точностью до восьми бит или as Word – с точностью до десяти бит.
Командами Start Adc, Stop Adc, соответственно, преобразование запускается или останавливается.
Полученный АЦП код сравнивается с заданным кодом при помощи условных операторов IF…THEN, и если коды неравны, то полученный код корректируется в соответствующую сторону (увеличение или уменьшение) и отправляется (Cаll Sub Upr) в ЦАП.
В основном цикле осуществляется также пересчёт кода в значение напряжения и его округление до двух знаков после запятой. Также происходит определение знакомест для индикатора уровня. В конце цикла значение заданного напряжения отображается на первой строке ЖКИ, а индикатор уровня в цикле FOR…NEXT – на второй. (Более подробно работа микроконтроллеров AVR с ЖКИ описана в статьях №6, 18 цикла статей «Bascom для начинающих»).
Подпрограмма обработки прерывания по приёму использует, как уже говорилось выше, функцию Bascom «эхо» при задании команд контроллеру с терминала по шине RS-232: «0» - чтение кода из EEPROM, «1» - увеличение кода на 5, «2» - уменьшение кода на 5, «3» - запись кода в EEPROM. Кроме того, подпрограмма содержит условия ограничения, чтобы при изменении кода его величина не была бы больше 255 или равна 0. При входе в подпрограмму процесс преобразования останавливается (Stop Adc).
Подпрограмма обработки внешнего прерывания «Send» выводит на ЖКИ с помощью команды Locate 1, 7 в первую строку, начиная с седьмого знакоместа, надпись «Radio SK», а также отправляет сообщение «RADIO SKAN» в терминал.
Подпрограмма «Sub Upr» отсылает код напряжения в ЦАП по шине I2C. Подробно работа микроконтроллеров AVR c данной шиной рассмотрена в статьях №7, 8, 9 и др. цикла статей «Bascom для начинающих».
Текст программы с подробными комментариями приводится ниже:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Adc = Single , Prescaler = 64 , Reference = Off 'АЦП режим одиноч. ‘преобраз. ,делитель=64, Vref-внешнее
Config Pina.0 = Input 'вход АЦП
Config Int0 = Falling 'прерывание по спаду импульса
Config Pind.2 = Input 'вход INT0
Config Sda = Portc.1 'конфигурация шины I2C
Config Scl = Portc.0
Config I2cdelay = 10 'частота - 100 КГц
Config Pind.0 = Input 'UART-RXD
Config Portd.1 = Output 'UART-TXD
Config Debounce = 100 'задержка 100мс при начале обработ.внеш прерывания
Dim W As Byte 'определение перем. А/Ц преобразования напряж. на варикане
Dim N As Byte 'опред. заданного кода напряжения
Dim L As Byte 'опред.реальнщго кода напряжения в ЦАП
Dim X As Byte 'опред.кода, записанного в EEPROM
Dim Dn As Byte 'опред приращения кода напряжения
Dim V As Single ' определение знач. напряжения
Dim Z As Byte 'опред. знакоместа индикатора настройки
Dim I As Byte
Dim K As Byte 'определение номера команды
Dim Vstring As String * 4 'опред. знач.напряж.для индикатора
Const Pcf8591write = &H91 'адрес для записи в ЦАП- PCF8591
Const Pcf8591config = &B01000000 'байт управления - включение аналогового выхода
Const Channel = 0 'вход АЦП - ADC0
$eeprom 'определение ячейки памяти
Number:
Data 10%
On Urxc Rxd 'определение подпрограммы обраб. прер. по ‘приёму
On Int0 Send 'по внешнему прерыванию
Declare Sub Upr 'подпрограмма передачи данных в ЦАП
Enable Interrupts 'разрешение прерываний
Enable Urxc
Enable Int0
I2cstart 'включение ЦАП - PCF8591
I2cwbyte Pcf8591write
I2cwbyte Pcf8591config
I2cstop
Deflcdchar 0 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 32 'рис.квадрата для шкалы ‘настройки
N = 5 ’начальные условия
Portc = N
Do 'основной цикл
Start Adc 'старт преобразования А/Ц
W = Getadc(channel)
If W < N Then 'напряжение на варикапе меньше заданного
L = N
Dn = L - W
L = L + Dn 'увеличение напряжения на варикапе
Call Upr 'передача в ЦАП
End If
If W > N Then 'напряжение на варикапе больше заданного
L = N
Dn = W – L
If Dn >L Then ’в случае резкого уменьшения заданного кода
L=N
Else
L = L - Dn 'уменьшение напряжения на варикапе
End If
Call Upr
End If
V = N / 85 'значение напряжения
Z = V * 5 'знакоместо напряжения на индикаторе
Vstring = Fusing(v , "0.00") 'округление знач. напряжения для индикации
Cls 'очистка ЖКИ
Lcd ; Vstring ; "V" 'отображение значения напряжения
For I = 1 To Z Step 1 'отображение индикатора настройки
Locate 2 , I '2-й ряд I-e знакоместо
Lcd Chr(0) 'графика (квадрат)
Next I
Loop
Rxd: 'обработка прерывания по приёму
Stop Adc 'остановка преобразования А/Ц
Do
Input "Enter: READeeprom-(0),>-(1), <-(2), WRITeeprom-(3) :" , K 'ввод управляющих команд
If K = 0 Then 'считывание значения кода из EEPROM
Readeeprom X , Number
N = X
Exit Do
End If
If K = 1 Then 'увеличение значения кода
N = N + 5
If N => 255 Then 'при достижении предельного значения
N = N - 5
End If
Exit Do
End If
If K = 2 Then 'уменьшение значения кода
N = N - 5
If N = 0 Then 'при достижении пред. знач
N = N + 5
End If
Exit Do
End If
If K = 3 Then 'выход из цикла с записью значения кода в EEPROM
X = N
Writeeeprom X , Number
Exit Do
End If
Loop
Return
Send:
Print "RADIO SCAN." 'отсыл в терминал при захвате
Locate 1 , 7
Lcd "RADIO SC" 'отображение на ЖКИ
Wait 2 'задержка 2 сек
Return
Sub Upr
I2cstart 'отсыл кода напряжения в ЦАП
I2cwbyte Pcf8591write
I2cwbyte L
I2cstop
End Sub
End 'end program
В случае, если вы не сможете или не захотите приобрести микросхему ЦАП, то тогда можно использовать схему, где в качестве ЦАП используется суммирующий повторитель напряжения, резисторы которого имеют определённые весовые коэффициенты и подключены к PORTС. Иными словами мы имеем 32 возможных значения напряжения, что позволяет преобразовывать восьмибитный цифровой код в постоянное напряжение.
Схема третьего варианта приёмника представлена на Рис.3. Резисторы R25…R32 прецизионные типа С2-29В или С2-36В и имеют отклонение от номинала, не превышающее 0,1%. Повторитель выполнен на микросхеме DA7 (LM358N). Конденсатор С29 служит для сглаживания бросков напряжения при изменении кода. В остальном схема полностью идентична предыдущему варианту.
Рис.3 - Схема стереофонического приемника УКВ с суммирующим повторителем
Разумеется, ЦАП, созданный из дискретных компонентов, уступает по тонности преобразования и другим характеристикам его интегральному исполнению, но с точки зрения соотношения цена – качество для данной схемы – это решение вполне приемлемо.
Программа «радиоприёмник УКВ стерео1» упрощается. В ней отсутствуют блок и подпрограмма передачи кода по шине I2C ЦАП. В данном случае откорректированный код передаётся непосредственно в PORTС.
Текст программы приведён ниже:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Adc = Single , Prescaler = 64 , Reference = Off 'АЦП режим одиноч.преобраз.,делитель=64,Vref-внешнее=3В
Config Pina.0 = Input 'вход АЦП
Config Int0 = Falling 'прерывание по спаду импульса
Config Pind.2 = Input 'вход INT0
Config Pind.0 = Input 'UART-RXD
Config Portd.1 = Output 'UART-TXD
Config Debounce = 100 'задержка 100мс при начале обработ.внеш ‘прерывания
Сonfig Portc = Output
Dim W As Byte 'определение перем. А/Ц преобразования напряж. на варикане
Dim N As Byte 'опред. заданного кода напряжения
Dim L As Byte 'опред.реальнщго кода напряжения в PORTC
Dim X As Byte 'опред.кода, записанного в EEPROM
Dim Dn As Byte 'опред приращения кода напряжения
Dim V As Single ' определение знач напряжения
Dim Z As Byte 'опред. знакоместа индикатора настройки
Dim I As Byte
Dim K As Byte 'определение номера команды
Dim Vstring As String * 4 'опред. знач.напряж.для индикатора
Const Channel = 0 'вход АЦП - ADC0
$eeprom 'определение ячейки памяти
Number:
Data 10%
On Urxc Rxd 'определение подпрограммы обраб. прер. по приёму
On Int0 Send 'по внешнему прерыванию
Enable Interrupts 'разрешение прерываний
Enable Urxc
Enable Int0
Deflcdchar 0 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 32 'рис.квадрата для шкалы настройки
N =5 ’начальные условия
Portc = N
Do 'основной цикл
Start Adc 'старт преобразования А/Ц
W = Getadc(channel)
If W < N Then 'напряжение на варикапе меньше заданного
L = N
Dn = L - W
L = L + Dn 'увеличение напряжения на варикапе
Portc = L 'передача кода в PORTC
End If
If W > N Then 'напряжение на варикапе больше заданного
L = N
Dn = W – L
If Dn > L Then ’в случае резкого уменьшения заданного кода
L = N
Else
L = L - Dn 'уменьшение напряжения на варикапе
End If
Portc = L ’передача кода в PORTC
End If
V = N / 85 'значение напряжения
Z = V * 5 'знакоместо напряжения на индикаторе
Vstring = Fusing(v , "0.00") 'округление знач. напряжения для индикации
Cls 'очистка ЖКИ
Lcd ; Vstring ; "V" 'отображение значения напряжения
For I = 1 To Z Step 1 'отображение индикатора настройки
Locate 2 , I '2-й ряд I-e знакоместо
Lcd Chr(0) 'графика (квадрат)
Next I
Loop
Rxd: 'обработка прерывания по приёму
Stop Adc 'остановка преобразования А/Ц
Do
Input "Enter: READeeprom-(0),>-(1), <-(2), WRITeeprom-(3) :" , K 'ввод управляющих команд
If K = 0 Then 'считывание значения кода из EEPROM
Readeeprom X , Number
N = X
Exit Do
End If
If K = 1 Then 'увеличение значения кода
N = N + 5
If N => 255 Then 'при достижении предельного значения
N = N - 5
End If
Exit Do
End If
If K = 2 Then 'уменьшение значения кода
N = N - 5
If N = 0 Then 'при достижении пред. знач
N = N + 5
End If
Exit Do
End If
If K = 3 Then 'выход из цикла с записью значения кода в EEPROM
X = N
Writeeeprom X , Number
Exit Do
End If
Loop
Return
Send:
Print "RADIO SCAN." 'отсыл в терминал при захвате
Locate 1 , 7
Lcd "RADIO SC" 'отображение на ЖКИ
Wait 2 'задержка 2 сек
Return
End 'end program
Программы можно скачать здесь.
Автор andre