Поиск по сайту: |
|
По базе: |
|
Главная страница > Применение > Микроконтроллеров > MSP430 |
|
|||||||||||
Использование широтно-импульсной модуляции таймера В в качестве ЦАПАннотация В этом примере применения описан способ одновременной генерации синусоидального, пилообразного и сигнала с постоянным уровнем с использованием сигналов широтно-импульсной модуляции (ШИМ), получаемых с помощью таймера Timer_B семейства микроконтроллеров со сверхнизким энергопотреблением MSP430. Сигналы ШИМ обычно используются для получения аналоговых сигналов во встраиваемых применениях. Ниже будет рассмотрен способ получения, как переменных, так и постоянных напряжений при помощи выходов ШИМ. В данном примере использован таймер Timer_B микроконтроллера MSP430F149, аналогичным образом можно также использовать таймер Timer_A. 1 Введение Во многих встраиваемых применениях на базе микроконтроллеров требуется генерация аналоговых сигналов. В некоторых случаях для этих целей используются встроенные либо внешние цифро-аналоговые преобразователи (ЦАП). Тем не менее, сигналы ШИМ также могут быть использованы для получения требуемых аналоговых сигналов. С их помощью можно синтезировать аналоговые сигналы, как с переменным, так и с постоянным уровнем. В этой статье обсуждается использование ШИМ-таймера в качестве ЦАП и приводится пример одновременной генерации синусоидального сигнала, пилообразного сигнала и сигнала с постоянным уровнем, а также суммирование синусоидального сигнала с постоянным уровнем для создания смещения. В данном примере использован таймер Timer_B, аналогичным образом можно также использовать таймер Timer_A. 2 Теория работы Сигналы ШИМ представляют собой цифровые сигналы с постоянной частотой и меняющимся коэффициентом заполнения. Пример таких сигналов приведен на Рис. 1. Если коэффициент заполнения ШИМ-сигнала изменяется со временем, то, отфильтровав его, получим на выходе аналоговый сигнал. Блок-схема ЦАП на базе ШИМ с использованием такого способа приведена ниже на Рис. 2. В примере программы в конце этой статьи таймер Timer_B микроконтроллера MSP430F149 используется для одновременной генерации синусоидального и пилообразного сигналов с разными частотами и сигнала с постоянным уровнем. ЦАПы, основанные на ШИМ также позволяют синтезировать другие сигналы. Некоторые аудиопроцессоры фирмы Texas Instruments Inc. также используют сигналы ШИМ для генерации речевых сигналов. Рис. 1. ШИМ-сигнал Рис. 2. Блок-диаграмма ЦАП на базе ШИМ 2.1 Разрешение Разрешение ЦАП на базе ШИМ, построенного на таймере Timer_B эквивалентно длине счётчика, которая, как правило, представлена значением в регистре CCR0. МЗР ЦАП на базе ШИМ представляет собой единичный отсчёт, а разрешение соответствует общему числу отсчётов: Rcounts = Lcounts Где Rcounts – разрешение (в отсчётах) Например, в этой статье рассматривается 8-битный ЦАП, таким образом, длина счётчика 8 бит или 256 отсчётов. В общем виде, разрешение ЦАП на базе ШИМ, построенного на таймере и фильтре эквивалентно разрешению ШИМ-сигнала, используемого ЦАП-ом. Таким образом, разрешение ШИМ-сигнала зависит от длины счётчика и наименьшего возможного изменения коэффициента заполнения в ШИМ-счётчике. Математически это можно записать как: Rcounts = L/C Где Rcounts - разрешение (в отсчётах) Разрешение, выраженное в количестве бит, будет выглядеть следующим образом: Или Например, если счётчик ШИМ имеет длину 512 отсчётов, а коэффициент заполнения может изменяться как минимум на 2 отсчёта, результирующее разрешение в отсчётах ЦАП на базе ШИМ будет составлять: Разрешение в битах составляет: 2.2 Частота Частота, требуемая для формирования выходного сигнала ШИМ эквивалентна частоте обновления ЦАП, а каждое изменение коэффициента заполнения ШИМ эквивалентно одному отсчёту ЦАП. Требуемая для ШИМ-таймера частота зависит от требуемой частоты ШИМ-сигнала и необходимого разрешения: Fclock = FPWM * 2n Где Fclock - требуемая частота тактирования ШИМ-таймера В этой статье описан способ построения 8-битного ЦАП на базе ШИМ и одновременная генерация с его помощью синусоидального сигнала частотой 250Гц и пилообразного сигнала частотой 125Гц. Требуемая частота для данного примера – 8кГц (32 отсчёта на каждый период синуса (передискретизация 16x), и 64 отсчёта на каждый период пилы (передискретизация 32x). Это соответствует требуемой частоте сигнала ШИМ в 8кГц и требуемой частоте тактирования ШИМ в 2.048МГц. Как правило, наилучшие результаты получаются в том случае, когда частота ШИМ намного превышает требуемую частоту синусоидального сигнала, либо требуемую полосу синтезируемых частот. Это обусловлено тем, что чем больше частота ШИМ, тем меньше порядок требуемого фильтра и проще реализация подходящего фильтра. 2.3 Используемые ресурсы MSP430 Пример программы, приведенный в конце этой статьи, демонстрирует одновременный синтез синусоидального сигнала частотой 250Гц, пилообразного сигнала частотой 125Гц и постоянное значение с уровнем 2/3 Vcc, используя для этого таймер Timer_B и внешние фильтры. Аналогичным образом можно также использовать таймер Timer_A. Таймер Timer_B используется в 16-битном режиме и сконфигурирован для работы в режиме инкремента, но при этом счётчик считает до значения, записанного в регистр захвата-сравнения 0 (CCR0), после чего сбрасывается в 0. В регистр CCR0 загружается значение 255, таким образом, эффективная разрядность счётчика составляет 8 бит. Регистр CCR1 и выход TB1 используются для формирования синусоиды. CCR2 и TB2 используются для пилообразного сигнала, а CCR3 и TB3 – для постоянного значения. Для всех выходов выбран выходной режим 7 «сброс/установка» (reset/set mode). В этом режиме каждый выход сбрасывается в «0» в тот момент, когда значение счётчика достигает значения в соответствующем регистре CCRx и устанавливается в «1», когда значение счётчика равно значению в регистре CCR0. Это обеспечивает на соответствующих выходах импульсы положительной полярности с длительностью, эквивалентной значению в соответствующих регистрах CCRx. В качестве источника тактирования таймера Timer_B выбрана частота SMCLK. Также в примере использованы:
2.4 Принципиальная схема и осциллограммы Полная принципиальная схема устройства приведена на Рис. 3. Генерируемые ей переменные сигналы показаны на Рис. 4. Сигнал с постоянным уровнем показан на Рис. 5 совместно с сигналом ШИМ. Рис. 3. Принципиальная схема Рис. 4. Осциллограммы сигналов Рис. 5. Сигнал ШИМ и постоянный сигнал Синусоидальный сигнал, формируемый в этом примере, использует 32 отсчёта на период. Значения отсчётов хранятся в таблице в начале программы. Для определения текущей ячейки используется указатель, в конце каждого периода ШИМ в регистр сравнения-захвата ШИМ-таймера записывается новое значение. Для генерации пилообразного сигнала в этом примере табличные значения не используются. «Пила» формируется обычным инкрементом коэффициента заполнения на каждом периоде ШИМ до тех пор, пока не будет достигнуто максимальное значение. После этого инкремент начинается снова с минимального значения. Такое последовательное увеличение коэффициента заполнения ШИМ-сигнала после его фильтрования формирует на выходе пилообразный сигнал. Сигнал с постоянным уровнем в данном примере формируется записью неизменного значения коэффициента заполнения ШИМ-сигнала. Постоянный уровень прямо пропорционален значению коэффициента заполнения ШИМ-сигнала. Таким образом, раз значение коэффициента заполнения ШИМ-сигнала на выходе TB3 не изменяется, после фильтрования RC-цепью получим на выходе постоянное значение. 2.5 Требования к фильтрам Фильтры, используемые для восстановления сигналов, показаны выше на Рис. 3. Фильтры для переменных сигналов представляют собой простые двухполюсные каскадированные RC-цепочки. Этот выбор обусловлен простотой реализации и нежелательностью использования активных элементов в приборах с низким энергопотреблением. Однако, при этом требуется более высокая частота дискретизации, чем при использовании фильтров более высокого порядка. Для фильтров, показанных на рис. 3 рекомендуется передискретизация для ЦАП не менее, чем 16x. Частота среза фильтра вычисляется следующим образом: Где R1C1 = R2C2 = RC Наилучшие характеристики фильтра получаются при R2 >> R1. Кроме этого, выбор частоты среза, слишком близкой к границе полосы сигнала, приведёт к существенному ослаблению. Для уменьшения такого ослабления, вносимого фильтром, следует выбирать частоту среза выше границы полосы сигнала, но намного ниже частоты ШИМ-сигнала. В отличие от фильтров переменных сигналов, фильтр для постоянного сигнала используется только для хранения заряда. Поэтому в этом случае применена простая однополюсная RC-цепь. 2.6 Суммирование постоянного и переменного сигналов Сигналы, синтезируемые ЦАП-ом на базе ШИМ, можно сложить. Схема на Рис. 6 демонстрирует формирование смещённого синусоидального сигнала добавлением постоянного смещения в 2/3Vcc к синусоидальному сигналу. Кроме этого, синусоидальный сигнал ослаблен примерно на 2/3, чтобы обеспечить возможность его смещения по постоянному напряжению без перегрузки суммирующего усилителя. В результате получаем синусоидальный сигнал амплитудой 1VPP с постоянным смещением примерно в 2В, как показано на рис. 7. На заднем плане также показан ШИМ-сигнал. Рис. 6. Суммирующая схема Рис. 7. Синусоидальный сигнал со смещением Сложение сигналов таким образом, как описано в примере выше, позволяет легко регулировать постоянную и переменную составляющую по отдельности через ШИМ-выходы. Например, синусоидальная составляющая может оставаться постоянной, а постоянная составляющая при этом изменяться в большую или меньшую сторону простым изменением коэффициента заполнения ШИМ-сигнала, отвечающего за постоянный сигнал. Обратите внимание на то, что фильтр, используемый для синусоидального сигнала, немного изменён. Так как в схему был добавлен суммирующий усилитель для добавления смещения к синусоидальному сигналу, часть элементов фильтра была совмещена со схемой усилителя. Для получения аналогичных результатов также можно использовать другие схемы фильтров и активных сумматоров. 3 Описание и листинг программы Полный листинг программы приведен в Приложении A. Процесс выполнения программы проиллюстрирован на Рис 8. Рис. 8. Процесс выполнения программы После сброса (reset) производится останов сторожевого таймера watchdog, конфигурация выходных портов и системы тактирования. Далее формируется программная задержка для стабилизации кварцевого резонатора 32768Гц, что необходимо для калибровки генератора DCO. Далее вызывается подпрограмма стабилизации генератора DCO. После её завершения, таймер Timer_B, регистры CCR1 и CCR2 конфигурируются для генерации сигналов ШИМ и осуществляется запуск таймера. В завершение, MSP430 переводится в режим пониженного энергопотребления 0 (LPM0) для сохранения энергии. ЦПУ «просыпается» для обработки каждого прерывания CCIFG0, после чего возвращается в режим LPM0. 3.1 Калибровка генератора DCO Генератор DCO микроконтроллера MSP430 представляет собой генератор RC типа и обладает схожими с RC-генератором характеристиками, в частности такими, как неточная установка частоты и её уход. Тем не менее, цифровое управление этим генератором позволяет настроить его на стабильную частоту, используя источник тактирования со стабильным известным значением, такой, как кварцевый резонатор 32768Гц. Некоторые микроконтроллеры семейства MSP430 имеют встроенный генератор с автоподстройкой частоты Frequency Lock Loop (FLL), позволяющий осуществить это автоматически, однако, устройства подсемейства MSP430x1xx такого модуля не имеют. За более подробными сведениями о генераторе DCO и системе тактирования MSP430 обратитесь к разделу «Система тактирования» (Clock system) соответствующего руководства пользователя. Ввиду того, что микроконтроллеры MSP430x1xx не имеют встроенного FLL, генератор DCO должен быть программно откалиброван для того, чтобы источник тактирования имел стабильную и известную частоту. Программное обеспечение, приведенное в этом примере, реализует стабилизатор частоты FLL для калибровки генератора DCO. Осуществляется это путём сравнения числа тактов генератора DCO за один период генератора 32768Гц. Точнее говоря, в данном примере частота 32768Гц (ACLK) делится на 4, поэтому программный FLL подсчитывает количество тактов генератора DCO за ? периода ACLK. После этого, подсчитанное число сравнивается с номинальным значением и значение DCO увеличивается либо уменьшается на одну ступень в зависимости от результата счёта, после чего счёт повторяется снова. Процедура повторяется до тех пор, пока не будет достигнуто требуемое количество тактов. По выполнении этого условия частота генератора DCO является откалиброванной к требуемому значению. В этом примере программный FLL выполняется только один раз, т.к. устройство не подвергается атмосферному воздействию, колебаниям питающего напряжения Vcc или длительному использованию. Однако, в реальных условиях эксплуатации, подпрограмма FLL должна выполняться периодически для отстройки генератора DCO от вышеперечисленных воздействий и традиционного ухода частоты генераторов RC-типа. За дополнительной информацией по программной реализации FLL обращайтесь к примеру применения «Управление частотой генератора с цифровым управлением (DCO) микроконтроллеров MSP430x11x» («Controlling the DCO Frequency of the MSP430x11x» literature number SLAA074). Альтернативой программной калибровке генератора DCO может служить использование внешних кварцевых резонаторов с требуемой для ШИМ-таймера частотой. Это применимо для микроконтроллеров семейств 13x и 14x благодаря наличию высокочастотного кварцевого XT-генератора. При использовании такого метода, SMCLK должна тактироваться от XT-генератора, а не от генератора DCO. См. главу 7 руководства пользователя MSP430x1xx Family User’s Guide, literature number SLAU049, по вопросам использования системы тактирования микроконтроллеров семейства 1xx. Также см. документацию на конкретные устройства по вопросам максимальных рабочих частот. Ссылки
Приложение A. Листинг программы NAME PWMDAC ;************************************************************************************ ; Программа реализации ЦАП на базе ШИМ ; Генерирует синусоиду частотой 250Гц с использованием ШИМ на базе таймера Timer_B. ; ; Описание: программа демонстрирует использование ШИМ-таймера совместно ; с внешними фильтрами для реализации ЦАП. Показан способ формирования ; синусоиды частотой 250Гц, пилообразного сигнала частотой 125Гц и ; сигнала с постоянным уровнем с использованием таймера Timer_B. ; Возможно аналогичное использование таймера Timer_A. В таблице sine table holds the ; хранятся отсчёты значений синусоиды. Для формирования «пилы» используется ; простой инкремент значения ШИМ. Постоянный уровень формируется зарядом ; конденсатора RC-цепи при помощи выхода ШИМ. Значение напряжения при этом ; прямо пропорционально коэффициенту заполнения сигнала ШИМ. После ; инициализации, ЦПУ переводится в режим пониженного энергопотребления LPM0. ; Он остаётся в этом режиме до прихода прерывания CCIFG0 от таймера Timer_B ; В подпрограмме обработки прерывания таймера Timer_B ISR в регистр CCR1 ; загружается следующее значение для синусоиды, значение «пилы» инкрементируется ; и загружается в регистр CCR2. По возвращении из прерывания ; ЦПУ снова переходит в режим пониженного энергопотребления LPM0. ;************************************************************************************ #include "MSP430X14x.H" ; Включить в проект файл со ; стандартными определениями Delta EQU 250 ; Delta = требуемая частота DCO/8192 ; Требуемая частота генератора DCO = 2.048МГц ; Это значение используется ; в программном стабилизаторе FLL ; для калибровки частоты генератора DCO ; с использованием кварцевого ; резонатора с частотой 32768Гц ; в качестве опорного. Более подробная ; информация по стабилизации частоты ; генератора DCO и программе ; стабилизатора FLL см. пример применения ; под названием «Управление частотой ; генератора с цифровым управлением (DCO) ; микроконтроллеров MSP430x11x» ; ( "Controlling the DCO frequency of the ; MSP430x11x" Literature number SLAA074) ;-------------------------------------------------------------------------------------- RSEG CODE ;-------------------------------------------------------------------------------------- Sine_Tab DW 255 ; Таблица синуса, отсчёты DW 254 ; десятичные значения DW 246 ; загружаемые в регистр TBCCR1 для изменения DW 234 ; коэффициента заполнения ШИМ. DW 219 ; Вместо байт требуется использовать слова DW 199 ; т.к. в регистры ТВ DW 177 ; требуется записывать слово целиком DW 153 ; Значение '0' использовать нельзя DW 128 ; иначе таймер будет глючить. DW 103 DW 79 DW 57 DW 37 DW 22 DW 10 DW 2 DW 1 DW 2 DW 10 DW 22 DW 37 DW 57 DW 79 DW 103 DW 128 DW 153 DW 177 DW 199 DW 219 DW 234 DW 246 DW 255 ;------------------------------ Здесь начинается программа ---------------------------- RESET mov #02FEh,SP ; Инициализация указателя стека StopWDT mov #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер WDT SetupP4 bis.b #00Eh,&P4SEL ; Выбрать TB1, TB2 и TB3 вместо портов bis.b #00Eh,&P4DIR ; P4.x, и назначить их выходами SetupBC mov.b #0A6h,&BCSCTL1 ; ACLK делится на 4. RSEL=6, ; MCLK и SMCLK не делятся, ; источником MCLK и SMCLK является DCO ; генератор XT2 выключен. ; ПРИМЕЧАНИЕ: для определения значения ; Rsel для требуемой частоты DCO, ; обратитесь к таблице DCO в докуметнтации call #Delay ; Пауза для стабилизации кварца. ; Необходима из-за того, что ; кварцевый резонатор 32768Гц используется ; в качестве опорного для стабилизации частоты ; генератора DCO. Поэтому резонатор на 32768 ; должен быть стабильным. call #SW_FLL ; Вызов подпрограммы стабилизации ; частоты генератора DCO. call #TB_SETUP ; Инициализация таймера Timer_B ; для генерации сигналов ШИМ clr R15 ; R15 и R14 используются как указатели clr R14 ; на таблицу синусов и для хранения ; значения «пилы» после стабилизации DCO eint ; Разрешение прерываний bis #LPM0,SR ; «усыпить» ЦПУ. ; Завершение программы ; остаётся обработчик прерывания CCIFG0 ; где обновляются значения ШИМ ;-------------------------------------------------------------------------------------- Delay ; Программная пауза для стабилизации кварца ;-------------------------------------------------------------------------------------- mov #0004h,R15 L1 mov #0FFFFh,R14 ; ~ 1 секунда . L2 dec R14 ; jnz L2 ; dec R15 ; jnz L1 ; ret ; ; ;-------------------------------------------------------------------------------------- SW_FLL ; Подпрограмма стабилизации частоты DCO. ; Кварцевый генератор 32768Гц используется ; в качестве опорной частоты для стабилизации ; и подстройки генератора DCO до требуемой ; частоты 2.048МГц. Это требуется в устройствах ; где нужна фиксированная частота DCO и для ; тех моделей MSP430 где нет аппаратного ; модуля FLL. См. руководства пользователя ; MSP430x3xx и MSP430x1xx Family ; User's Guides (literature number SLAU012 и ; SLAU049 соответственно) по вопросам, ; касающимся системы тактирования MSP430 ; ; процедура основана на подсчёте тактов DCO ; за период ACLK (точнее, за 1/4 периода ACLK ; т.к. частота ACLK поделена на 4). Таймер ; Timer_A используется для подсчёта тактов DCO ; Полученное значение сравнивается с ; номинальным (Delta). Если число слишком ; большое, DCO декрементируется. Если число ; слишком маленькое, DCO инкрементируется. ; Далее сравнение повторяется. ; Процесс продолжается до тех пор, пока ; значения не сравняются. После этого ; DCO генерирует на требуемой частоте ; См. пример применения «Управление частотой ; генератора с цифровым управлением (DCO) ; микроконтроллеров MSP430x11x» ; ( "Controlling the DCO frequency of the ; MSP430x11x" Literature number SLAA074) по ; вопросам, связанным с управлением ; генератором DCO. ; ; Эта процедура вызывается только один раз ; в качестве примера, в реальных условиях ; её требуется выполнять периодически, чтобы ; быть уверенным, что генератор DCO ; остаётся откалиброванным. ;-------------------------------------------------------------------------------------- clr R15 ; Setup_TA mov #TASSEL1+TACLR,&TACTL ; Источник тактирования TA - SMCLK Setup_CC2 mov #CCIS0+CM0+CAP,&CCTL2 ; Определить CCR2,CAP,ACLK bis #MC1,&TACTL ; Запустить таймер timer_A ; в непрерывном режиме Test_DCO bit #CCIFG,&CCTL2 ; Проверка флага захвата jz Test_DCO ; bic #CCIFG,&CCTL2 ; Очистка флага захвата ; AdjDCO mov &CCR2,R14 ; В R14 число тактов SMCLK sub R15,R14 ; в R14 разница mov &CCR2,R15 ; В R15 число тактов SMCLK cmp #Delta,R14 ; Delta = SMCLK/(32768/4) jlo IncDCO ; jeq DoneFLL ; DecDCO dec.b &DCOCTL ; jmp Test_DCO ; IncDCO inc.b &DCOCTL ; jmp Test_DCO ; DoneFLL clr &CCTL2 ; очистить CCR2 clr &TACTL ; остановить таймер timer_A ret ; возврат из подпрограммы ;-------------------------------------------------------------------------------------- TB_SETUP ; Подпрограмма инициализации таймера ; Timer_B для генерации ШИМ ;-------------------------------------------------------------------------------------- mov #TBSSEL1+TBCLR,&TBCTL ; SMCLK –источник тактирования TB. mov #CCIE,&TBCCTL0 ; Перевести CCR0 в режим сравнения, ; разрешить прерывания от него mov #0FFh,&TBCCR0 ; Записать 255d в CCR0. Это соответствует ; периоду ШИМ-выходов в 256 отсчётов (8 бит). ; т.е. получаем 8-битный ЦАП. mov #02E0h,&TBCCTL1 ; Перевести CCRx в режим сравнения, запретить mov #02E0h,&TBCCTL2 ; прерывания, режим выхода '7' , т.е. mov #02E0h,&TBCCTL3 ; сброс/установка. Сигнал EQU0 устанавливает ; выход в «1», а EQU1 в «0». Установим ; условия сравнения для регистра как ; его равенство нулю mov #Sine_Tab,&TBCCR1 ; Загрузить первый отсчёт в CCR1 mov #01h,R14 ; Загрузить начальное значение «пилы» в R14. mov #0AAh,&TBCCR3 ; И значение для постоянного уровня ; которое соответствует ~ 2/3 Vcc т.к. ; #0AAh это примерно 2/3 от #0FFh. bis #MC0,&TBCTL ; Запустить таймер timer_B в режиме инкремента ret ;-------------------------------------------------------------------------------------- TB_ISR ; Подпрограмма обработки прерываний таймера ; Timer_B: изменяет значения в регистрах ; CCR1 и CCR2 для изменения коэффициента ; заполнения ШИМ для синусоиды и «пилы». ; Значение в CCR3 не изменяется для ; формирования постоянного уровня ;-------------------------------------------------------------------------------------- incd R15 ; Инкремент указателя в R15 to ; для следующего значения в таблице синуса ; Инкремент двойной, т.к. ; значения в таблице двухбайтовые and #03Fh,R15 ; Операция лог. «И» с числом 03Fh даёт ; счётчик по модулю 32 для указания на ; значения в таблице mov Sine_Tab(R15),&TBCCR1 ; Загрузить следующее значение синуса в CCR1 add #04h,R14 ; Инкрементировать значение «пилы» ; Изменение шага в R14 ; приведёт к изменению частоты «пилы» and #0FFh,R14 ; Исключим лишние биты mov R14,&TBCCR2 ; Загрузим новое значение пилы в CCR2 reti ; возврат, прерывания разрешены ;----------------------------------------------------------------------------------- COMMON INTVEC ; Вектора прерываний MSP430x14x ;----------------------------------------------------------------------------------- ORG TIMERB0_VECTOR DW TB_ISR ; Прерывание от CCIFG0 ORG RESET_VECTOR DW RESET ; POR, внеш. Reset, Watchdog END стационарные и мобильные бетонные заводы
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|