| Ваш IP: 52.23.219.12 | Online(50) - гости: 16, боты: 34 | Загрузка сервера: 1.03 ::::::::::::

Аудиопроцессор TDA7433 (Arduino)

ИМС TDA7433 — аудиопроцессор позволяющий регулировать громкость и тембр, снабжен коммутатором входов (2 стерео и один моно), аттенюатором выходов.

Основные основные параметры аудиопроцессора TDA7433:

  • Напряжение питания от 7 В до 10.2 В (9 В — рекомендуемое)
  • Входное напряжение 1.6 Vrms (мах)
  • Гармонические искажения не более 0,05% (V = 1Vrms f = 1kHZ)
  • Отношение сигнал/шум 102 дБ
  • Разделение каналов 100 дБ
  • Регулировка громкости с шагом 1 дБ в диапазоне от -79 до +32 дБ
  • Регулировка тембра НЧ (BASS) с шагом 2 дБ в диапазоне от -18 до +18 дБ
  • Регулировка тембра ВЧ (TREBLE) с шагом 2 дБ в диапазоне от -14 до +14 дБ
  • Аттенюаторы выходов (независимый для каждого выхода) от -37,5 до 0 дБ
  • Уровень MUTE -100 дБ
  • Управление I2C

На базе Arduino используя TDA7433 можно собрать простой регулятор громкости и тембра. Основное управление параметрами аудиопроцессора будет осуществляться при помощи энкодера (KY-040) и 3-х кнопок, так же будет применен ИК пульт который будет дублировать энкодер и кнопки управления (только основное меню, кнопки INPUT, MUTE, MENU). Вся информация будет выводится на дисплей LCD1602 + I2C (I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея.)

Регулятор тембра имеет два меню, первое основное (main menu), содержит регуляторы громкости и тембра, второе меню (set menu), содержит редко изменяемые параметры, такие как аттенюаторы выходов.

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

#define UP    0x33B8E01F
#define DOWN  0x33B810EF
#define MENU  0x33B820DF
#define MUTE  0x33B8946B
#define IN    0x33B8C03F 

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

Схема регулятора громкости и тембра

#define UP    0x33B810EF
#define DOWN  0x33B8E01F
#define MENU  0x33B820DF
#define MUTE  0x33B8946B
#define IN    0x33B8C03F 
 
#include <TDA7433.h>           // https://rcl-radio.ru/wp-content/uploads/2021/08/TDA7433.zip
#include <Wire.h>              // Входит в состав Arduino IDE
#include <Encoder.h>           // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <EEPROM.h>            // Входит в состав Arduino IDE
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <boarddefs.h>         // Входит в состав библиотеки IRremote
#include <IRremote.h>          // https://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip 
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
 TDA7433 tda;
 Encoder myEnc(9, 8);//CLK, DT подключение энкодера
 decode_results ir;
 IRrecv irrecv(12); // указываем вывод модуля IR приемника
 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
 byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};      
 byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
 byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
 byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
 byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; 
 unsigned long time,oldPosition  = -999,newPosition;
 byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w1,gr1,gr2;
 int a[3],menu,fun_d,vol,in,bass,treb,menu_set=100,mute;
 int lf,rf,lr,rr,lf_old,rf_old,lr_old,rr_old;
 
 
 
void setup(){
  Wire.begin();Serial.begin(9600);irrecv.enableIRIn();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  lcd.init();lcd.backlight(); 
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  lcd.setCursor(4,0);lcd.print("TDA7433");delay(1000);lcd.clear();// ЗАСТАВКА
  pinMode(10,INPUT);        // КНОПКА ЭНКОДЕРA
  pinMode(2,INPUT_PULLUP);  // INPUT
  pinMode(3,INPUT_PULLUP);  // SET
  pinMode(4,INPUT_PULLUP);  // MUTE
  vol = EEPROM.read(0)-79;bass = EEPROM.read(1)-9;treb = EEPROM.read(2)-7;in = EEPROM.read(3);
  lr = EEPROM.read(4);rr = EEPROM.read(5);lf = EEPROM.read(6);rf = EEPROM.read(7);
  audio();
  }
 
void loop(){
//////// IR ////////////////////////////////////////////////////////////////////
 if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();delay(50);}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
 if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
//////// BUTTON ////////////////////////////////////////////////////////////////
if(mute==0){ 
 if(((digitalRead(10)==LOW||ir.value==MENU)&&menu_set==100)){menu++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(menu>2){menu=0;}}// menu
 if((digitalRead(10)==LOW&&menu==100)){menu_set++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(menu_set>3){menu_set=0;}}// menu
 if(digitalRead(2)==LOW||ir.value==IN){in++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(in>2){in=0;}lcd.setCursor(4,0);lcd.print("INPUT  ");lcd.print(in+1);audio();delay(1500);cl();}// input
 if(digitalRead(3)==LOW&&menu_set==100){menu_set=0;menu=100;cl();myEnc.write(0);time=millis();w=1;w1=1;lcd.setCursor(4,0);lcd.print("SET MENU");delay(1500);cl();}// menu
 if(digitalRead(3)==LOW&&menu_set<100){menu_set=100;menu=0;cl();myEnc.write(0);time=millis();w=1;w1=1;lcd.setCursor(3,0);lcd.print("MAIN MENU");delay(1500);cl();}// menu
}
 if((digitalRead(4)==LOW||ir.value==MUTE)&&mute==0){mute=1;cl();lf_old=lf,rf_old=rf,lr_old=lr,rr_old=rr; lf=32,rf=32,lr=32,rr=32;menu=100;menu_set=100;myEnc.write(0);audio();lcd.setCursor(6,0);lcd.print("MUTE");}
 if((digitalRead(4)==LOW||ir.value==MUTE)&&mute==1){mute=0;cl();lf=lf_old,rf=rf_old,lr=lr_old,rr=rr_old;menu=0;w=1;myEnc.write(0);time=millis();audio();cl();}
 
//////// VOLUME ////////////////////////////////////////////////////////////////  
 if(menu==0){
  if(ir.value==UP){vol++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка > 
  if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка >>>>>>
  if(ir.value==DOWN){vol--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка <
  if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка <<<<<<
 
  if (newPosition != oldPosition){oldPosition = newPosition;
  vol=vol-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;vol_fun();audio();}
  lcd.setCursor(0,0);lcd.print(F("VOLUME "));
 
 lcd.setCursor(0,1);lcd.print(F("INPUT "));lcd.print(in+1);
 fun_d = vol+79;
 if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      for(i=0;i<2;i++){
      switch(i){
        case 0: e1=10,e2=11,e3=12;break;
        case 1: e1=13,e2=14,e3=15;break;
        }
      switch(a[i]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
 }}} 
 
/////// BASS /////////////////////////////////////////////////////////////////// 
 if(menu==1){
  if(ir.value==UP){bass++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка > 
  if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка >>>>>>
  if(ir.value==DOWN){bass--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка <
  if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка <<<<<<
 
  if (newPosition != oldPosition){oldPosition = newPosition;
  bass=bass-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;bass_fun();audio();}
  lcd.setCursor(0,0);lcd.print(F("BASS"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=bass*2;
  if(fun_d<0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}} 
 
/////// TREBLE /////////////////////////////////////////////////////////////////// 
 if(menu==2){
  if(ir.value==UP){treb++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка > 
  if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка >>>>>>
  if(ir.value==DOWN){treb--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка <
  if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка <<<<<<
 
  if (newPosition != oldPosition){oldPosition = newPosition;
  treb=treb-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;treb_fun();audio();}
  lcd.setCursor(0,0);lcd.print(F("TREB"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=treb*2;
  if(fun_d<0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}}  
 
///// MENU_SET ///////////////////////////////////////////////////////////////////////
 
//////// LF ////////////////////////////////////////////////////////////////  
 if(menu_set==0){
  if (newPosition != oldPosition){oldPosition = newPosition;
  lf=lf+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_LF"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=lf;
  if(fun_d>0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}}
 
//////// RF ////////////////////////////////////////////////////////////////  
 if(menu_set==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
  rf=rf+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_RF"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=rf;
  if(fun_d>0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}}  
 
//////// LR ////////////////////////////////////////////////////////////////  
 if(menu_set==2){
  if (newPosition != oldPosition){oldPosition = newPosition;
  lr=lr+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_LR"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=lr;
  if(fun_d>0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}}
 
//////// RR ////////////////////////////////////////////////////////////////  
 if(menu_set==3){
  if (newPosition != oldPosition){oldPosition = newPosition;
  rr=rr+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_RR"));
  lcd.setCursor(14,1);lcd.print(F("dB"));
  fun_d=rr;
  if(fun_d>0){fun_d=abs(fun_d);lcd.setCursor(6,0);lcd.write((uint8_t)3);}else{lcd.setCursor(6,0);lcd.print(" ");}
  if(w==1){w=0;
     a[0]=(fun_d)/10;a[1]=(fun_d)%10;
      cif();}} 
 
//////// EEPROM //////////////////////////////////////////////////
 if(millis()-time>10000 && w1==1&&mute==0){
     EEPROM.update(0,vol+79);EEPROM.update(1,bass+9);EEPROM.update(2,treb+7);EEPROM.update(3,in);
     EEPROM.update(4,lr);EEPROM.update(5,rr);EEPROM.update(6,lf);EEPROM.update(7,rf);
     menu_set=100;if(menu!=0){lcd.clear();}menu=0;w=1;w1=0;}
 
  }// LOOP END
 
void cl(){ir.value=0;delay(300);lcd.clear();}  
void cl1(){ir.value=0;delay(300);} 
void bass_fun(){if(bass<-9){bass=-9;}if(bass>9){bass=9;}}
void treb_fun(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}  
void vol_fun(){if(vol<-79){vol=-79;}if(vol>20){vol=20;}}
void to_Timer(){newPosition = myEnc.read()/4;}
 
void cif(){
  for(i=0;i<2;i++){
      switch(i){
        case 0: e1=7,e2=8,e3=9;break;
        case 1: e1=10,e2=11,e3=12;break;
        }
      switch(a[i]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
 }}  
void audio(){
        tda.setInput(in, 0, 0, bass*2); // не менять
// in >>> 0=in2, 1=in1, 2=mono, 3=mute
// bass_cut >>> 0=non-symmetrical bass cut, 1=symmetrical bass cut
// bass_range >>> 0=extended bass range, 1=standard bass range ±14dB
// bass >>> -18...+18 (-18...+18 dB) step 2
        tda.setVolume(vol);
// vol >>> -79...+32 (-79...+32 dB) // более +20дБ не рекомендуется повышать
        tda.setBass_Treb(bass*2, treb*2);
// bass >>> -18...+18 (-18...+18 dB) step 2
// treb >>> -14...+14 (-14...+14 dB) step 2
        tda.setAtt_LF(lf);
// lf >>> 0...31 (0...-31 dB), 32=mute 
        tda.setAtt_LR(lr);
// lr >>> 0...31 (0...-31 dB), 32=mute
        tda.setAtt_RF(rf);
// rf >>> 0...31 (0...-31 dB), 32=mute
        tda.setAtt_RR(rr);
// rr >>> 0...31 (0...-31 dB), 32=mute
  }

Примечание: вход 1 отображается на дисплее как 2, вход 2 как 1, вход моно как 3.

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=419


Доработка

  • Добавлена функция STANDBY
    • Выход D13 используется для управления режимом STANDBY УМЗЧ
    • Кнопка на входе D5 (POWER) и дополнительная кнопка пульта активирует режим STANDBY
    • #define POWER 0x33B800FF — добавить кнопку пульта
  • Добавлен модуль часов реального времени DS3231
    • Часы выводятся на дисплей в режиме STANDBY
    • Коррекция времени часов: в режиме STANDBY нажать и удерживать кнопку энкодера, далее нажать кнопки INPUT, SET, MUTE для изменения времени часов, минут и обнуления секунд.
  • Изменение яркости дисплея в режиме STANDBY: выход D6 Arduino подключить к пину управления подсветки:

Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).

Яркость подсветки можно настроить через скетч:

#define BRIG_L 50
#define BRIG_H 250
  • BRIG_L — яркость в режиме STANDBY (0-250)
  • BRIG_H — яркость в рабочем режиме (0-250)

В режиме STANDBY все кнопки и кнопки пульта (кроме кнопки POWER), блокируются.

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=4649#p4649

Схема

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

Войти с помощью: 

Случайные статьи

  • Автомобильный регулятор освещения

    В темное время суток иногда необходимо дополнительное освещения в автомобиле (для ремонта, регулировка двигателя и др), предложенная схема позволяет плавно регулировать осветительную 12В/2А лампу от 5% до 90% ее яркости при помощи ШИМ регулятора. Регулятор предназначен для автомобилей с отрицательной массой. Конструкция регулятора основана на микросхеме 40106 которая работает как …Подробнее...
  • Удвоитель напряжения на микросхеме NE555

    Описание. Схема простейшего удвоителя напряжения использованием микросхемы NE555 показана на рисунке. Здесь IC NE555 подключен в схеме как нестабильный мультивибратор с частотой генерации около 9KHz. Базы двух транзисторов (Q1 и Q2) подключены напрямую к выходу мультивибратора (контакт 3). При выходе сигнала из мультивибратора в первый момент Q1 будет OFF и …Подробнее...
  • Микрофонный усилитель на К153УД2

    Входное напряжение номинальное 1,5мВ максимальное 3000мВ Выходное напряжение номинальное 220мВ максимальное 9000мВ Перегрузочная способность не менее 66дБ Отношение сиг\шум -55дБ Коэф. гармоник 0,08% Номинальный диапазон частот 20…20000Гц Напряжение питания ±15В Ток потребления 12 мА Усилитель включен по схеме инвертирующего усилителя. Неинвертирующий вод DA1 подключен к общему проводу, а на инвертирующий …Подробнее...
  • Запись String в энергонезависимую память EEPROM

    Запись String в энергонезависимую память EEPROM

    EEPROM.put()  функция записывает данные любого стандартного типа или произвольную структуру в энергонезависимую память EEPROM, иначе говоря если размер данных превышает 1 байт, нужно использовать функцию EEPROM.put(). При записи данных в EEPROM размер которых превышает 1 байт, необходимо корректный расчет адресов по которым будет производится запись, для расчета адресов используется функция sizeof(). Для чтения …Подробнее...
  • Блок питания с защитой от КЗ

    Практически каждый начинающий радиолюбитель стремится вначале своего творчества сконструировать сетевой блок питания (БП), чтобы впоследствии использовать его для питания различных экспериментальных устройств. И конечно, хотелось бы, чтобы этот БП «подсказывал» об опасности выхода из строя отдельных узлов при ошибках или неисправностях монтажа. На сегодняшний день существует множество схем, в том …Подробнее...