Блок питания для радиолюбителя (много DIY)

Каждый радиолюбитель должен сделать блок питания :)
Причем правильный прибор — должен быть тяжелым и горячим. А если бы сделать его не сильно греющимся?
Будет много фото, радиолюбительства, и самодельщины, или, как сейчас модно говорить, DIY.
И еще: купить готовое — намного дешевле, чем сделать самому.
Кого не пугает — добро пожаловать :)

Сложно переоценить нужность блока питания в хозяйстве. Свою поделку я «мучил» около полугода. иногда занимался целый день, иногда пару-тройку часов. Были и моменты, когда неделями руки не доходили. Плюс ко всему — конструкция менялась во время сборки.

Не смотря на высокий КПД импульсных блоков, обычный трансформаторный с линейным стабилизатором все таки лучше в плане более низких помех. Но есть и минус — большие потери на регулирующем елементе. Можно сделать трансформатор с отводами и переключать их с помощью реле. Но я очень не люблю мотать, поэтому заказал трансформатор без отводов, так дешевле. Напряжение перед регулирующим транзистором понижается с помощью импульсного преобразователя. Помехи от него, конечно же, есть, но линейный блок — с ними справляется.
Блок получился на 24 вольт 5 ампер. Большинство комплектующих — приобреталось в интернет-магазинах.

Линейный регулятор
Вдохновением послужили этот обзор и его продолжение, а также — коментарии к ним. Саму плату — покупал на али. К ней же — многооборотные потенциометры и пакованчик ручек. При получении посылок — понял, что ось резистора меньше отверстия в ручке. Тут выручил знакомый кондиционерщик: медная трубка как раз оказалась нужных размеров. Пара движений ножовкой — и получился переходник.
Переходник

Сначала была хотелка 30 Вольт 5 Ампер. Для этого выпрямитель должен был дать 35 вольт. Был заказан трансформатор на 26 вольт 5 ампер. Больше не позволял предрегулятор на XL4016.
Трансформатор, с добавлением накальной обмотки и термопредохранителя

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

Отдельное спасибо Kirich за схему в формате splan
Плата после допилинга


Импульсный пред-регулятор
Поддерживает напряжение перед линейным блоком на 2 с копейками вольта выше, чем на выходе. Силовая часть сначала была на XL4016. но у нее предел по входу 40 вольт, а в моей схеме — 35, что почти в притык. поэтому была собрана новая сила, аналогична ZXY6005, только ШИМ заменен на XL4001, потому что они у меня есть. Кстати, замечательная микросхема, рекомендую обратить внимание.
Дроссель — выдран с цепи 3,3В блока ATX. С него — смотал два витка, что бы получить 47мкГн. 5 ампер в течении часа он держит, хотя и греется. Со временем, может быть, перемотаю лидцентратом.
Схема пред-регулятора:


Индикация и управление
За измерения отвечает АЦП ADS1115. точность — не супер, показания напряжения плавают ± до 5мВ, тока ± до 5 мА. в зависимости от погоды на Марсе. Опрос АЦП, датчиков температур радиатора и трансформатора, измерение падения на регулирующем транзисторе, пересчет величин, управление вентилятором и реле, общение с драйвером дисплея реализовано на Arduino pro. Индикация — вакуумный люминесцентный дисплей (куплен на радиорынке, ждал своего часа лет 5). Для него только пришлось намотать обмотку для накала с отводом от середины. Высокое отрицательное — получено с основной обмотки.
Дисплей

Схема измерительной части:


Реализовано 8 режимов индикации
1. Индикация напряжения с дискретностью до десятых Вольт и тока с дискретностью до сотых Ампер

2. Индикация выходного напряжения с дискретностью до 1мВ и заданого, до 10мВ

3. Индикация выходного и заданого тока с дискретностью, до 1мА

4. Индикация выходной мощности с дискретностью до 0,1Вт

5. Индикация сопротивления нагрузки с дискретностью до 0,1Ом

6. Счетчик Вт*час с дискретностью до 1мВт

7. Счетчик А*час с дискретностью до 1мА

8. Индикация температур трансформатора и радиатора


Управление осуществляется 5-ю кнопками
1. Отключение выходного реле
2. Включение выходного реле
3. Нажатие: режим индикации 2 или 3.
Удержание более 2 сек: реакция на превышение заданого тока (стабилизация тока или отключение)
4. Нажатие: режим индикации 1 или 4.
Удержание более 2 сек: режим работы с 4-хпроводным подключением
5. Нажатие: режим индикации 5, 6 или 7.
Удержание более 2 сек: если отображается счетчик — обнуление. Иначе — режим индикации 8

Еще есть четыре светодиода
зеленый: выход отключен
красный: стабилизация тока
желтый: стабилизация напряжения
синий: режим 4-х проводного подключения

Код для Ардуины:

// Power source measure unit
#include <Wire.h>
#include <EEPROM.h>
// pins discr.
#define  OVER_CURRENT  2
#define  OFF_BTN  3
#define  ON_BTN  4
#define  B1_BTN  5
#define  B2_BTN  6
#define  B3_BTN  7
#define  OUT_REL  8
#define  FAN  9
#define  STB 10
#define  DAT_TX 11
#define  DAT_RX 12
#define  CLK 13
#define  SEN_REL  14
// pins analog
#define  U_DROP  1
#define  T_RAD  2
#define  T_TRANS  3
// display constants
#define displayMode 0b00000111 // 11 digits, 11 segments
#define dataSettings 0x40 // Data write & read mode settings
#define incrementAddress 0x00 // Increment address after data has been written mode
#define fixedAddress 0x04 // Fixed address mode
#define LEDregister 0x00000001 // LED data send
#define addressSettings 0xC0 // Address settings command
#define startAddress 0x00 // start address of ram memory
#define endAddress 0x0F // end address of ram memory
#define displayControl 0x8F // Display settings ON/OFF
// adc constants
#define  ADR_ASD1115  0b01001000   //address of ads1115
// cooperating with ADC
byte writeBuf[3];            
byte readBuf[3]; 
// SPU's ADC values
int TempTransBuf[10];
int TempTransSum;
int TempTransADC;
int TempRadBuf[10];
int TempRadSum;
int TempRadADC;
int UdropADC;
byte i,j;
// Fan speed values
byte speed1, speed2, speed3;
// output booleans
bool output, protect, extSense;
// button statuses
bool bt1_tap, bt1_hold;
byte bt1_timer;
bool bt2_tap, bt2_hold;
byte bt2_timer;
bool bt3_tap, bt3_hold;
byte bt3_timer;
// 1 sec counter
byte tick1S;
bool int1S;
// 3.6 sec counter
byte tick36S;
bool int36S;
// ADC cooperate values
byte ADCchannel;
int UsenADC;
int UsetADC;
int IsenADC;
int IsetADC;
int ResultADC;
bool EnblADC;
byte ADCtimer;
long OutVoltage, OutCurrent;
// current display index
byte screen;
// errors 
bool ErrOverheat, ErrReg;
byte UdropErrTimer, UsetErrTimer;
// setup indicate
bool setdispU, _setdispU, setdispI, _setdispI;
byte setdisptimer;
int _UsetADC, _IsetADC;
// counters
unsigned long CurrentCounter, PowerCounter;
// for EEPROM store values
byte storeTimer;
bool storeEnbl;
// display data
byte symbolReg;
const byte symbols[44] =
  {
    //xxx0xxx0    000000x0
    //cbajfge-    -----idh
    0b11101010, 0b00000010,  // 0
    0b11000000, 0b00000000,  // 1
    0b01100110, 0b00000010,  // 2
    0b11100100, 0b00000010,  // 3
    0b11001100, 0b00000000,  // 4
    0b10101100, 0b00000010,  // 5
    0b10101110, 0b00000010,  // 6
    0b11101000, 0b00000000,  // 7
    0b11101110, 0b00000010,  // 8
    0b11101100, 0b00000010,  // 9
    0b10000010, 0b00000010,  // 10, U
    0b11101110, 0b00000000,  // 11, A
    0b00101110, 0b00000010,  // 12, E
    0b00000110, 0b00000000,  // 13, r
    0b00000000, 0b00000000,  // 14, blank
    0b10001010, 0b00000010,  // 15, W 1/2
    0b11000010, 0b00000010,  // 16, W 2/2
    0b00000100, 0b00000000,  // 17, -
    0b10001110, 0b00000000,  // 18, h
    0b00100000, 0b00000000,  // 19, - on upper
    0b01101100, 0b00000000,  // 20, degree
    0b00001110, 0b00000010   // 21, t
  };

long PrevTime;
//-------------------------------------------------------------------------------
void setup() {
 pinMode(OVER_CURRENT, INPUT_PULLUP);
 pinMode(OFF_BTN, INPUT_PULLUP);
 pinMode(ON_BTN, INPUT_PULLUP);
 pinMode(B1_BTN, INPUT_PULLUP);
 pinMode(B2_BTN, INPUT_PULLUP);
 pinMode(B3_BTN, INPUT_PULLUP);
 pinMode(OUT_REL, OUTPUT);
 pinMode(FAN, OUTPUT);
 pinMode(STB, OUTPUT);
 pinMode(DAT_TX, OUTPUT);
 pinMode(DAT_RX, INPUT);
 pinMode(CLK, OUTPUT);
 pinMode(SEN_REL, OUTPUT);

 output = 0;
 protect = 0;
 extSense = 0;
 storeTimer = 0;
 storeEnbl = 0;

 bt1_tap = 0; bt1_hold = 0;
 bt2_tap = 0; bt2_hold = 0;
 bt3_tap = 0; bt3_hold = 0;

 symbolReg = 0;

 setdispU = 0; _setdispU = 0; setdispI = 0; _setdispI = 0;
 
 ADCchannel = 0;

 screen = 0;

 TCCR2A = 0; //TMR2 normal mode
 TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20; // prescale 1024, overflow each 1/(16000000/1024/256=61Hz) = 16.4mS
 TIMSK2 = 1<<TOIE2; // enable overflow interrupt
 TCNT2 = 0; // reset counter

 EICRA = 1<<ISC11 | 1<<ISC01; // Falling edge generate interrupt
 EIMSK = 1<<INT1 | 1<<INT0; // Enable interrupt

 CurrentCounter = EEPROM_long_read(0);
 PowerCounter = EEPROM_long_read(4);

 Serial.begin(9600); 
 Wire.begin();              // begin I2C
 // initialize vfd display
 initDisplay();
 }  
//--------------------------------------------------------------------------------
void loop() {                

 if (int1S)
   {
    int1S = 0;
    if (UdropErrTimer<255) UdropErrTimer ++;
    // Temperature measure filtering
    j++;
    if (j>9) j = 0;
    TempTransBuf[j] = analogRead(T_TRANS);
    TempRadBuf[j] = analogRead(T_RAD);
    TempTransSum = TempTransBuf[0];
    TempRadSum = TempRadBuf[0];
    for (i = 1; i <= 9; i++)
      {
        TempTransSum = TempTransSum + TempTransBuf[i];
        TempRadSum = TempRadSum + TempRadBuf[i];
      }
    TempTransADC = TempTransSum / 10;
    TempRadADC = TempRadSum / 10;
    // Linear regulator drop voltage measure
    UdropADC = analogRead(U_DROP);

    if (0) // serial U drop and temperature display
     {
      Serial.print("U drop: ");
      Serial.print(UdropADC);
      Serial.print(";  Trans_temp: ");
      Serial.print(((TempTransADC - 105)*10) / 2);
      Serial.print(";  Rad_temp: ");
      Serial.println(((TempRadADC - 105)*10) / 2);
     }
    if (0) // serial Voltage and Current display
     {
      Serial.print("Usen=");
      //Serial.print(GetOutVoltage(UsenADC));
      Serial.print(UsenADC);
      Serial.print(";  Uset=");
      //Serial.print(GetSetVoltage(UsetADC));
      Serial.print(UsetADC);
      Serial.print(";  Isen=");
      //Serial.print(GetOutCurrent(IsenADC));
      Serial.print(IsenADC);
      Serial.print(";  Iset=");
      //Serial.println(GetSetCurrent(IsetADC));
      Serial.println(IsetADC);
           }
    if (0) // serial capacity display
     {
      Serial.print("mA*h= ");
      Serial.print(CurrentCounter/1000);
      Serial.print("  mW*h= ");
      Serial.println(PowerCounter/1000);
     }
   }

 if (int36S)
   {
     int36S = 0;
     if (output)
       {
        CurrentCounter = CurrentCounter + OutCurrent;
        if (CurrentCounter > 999999999) CurrentCounter = 0;
        PowerCounter = PowerCounter + ((OutCurrent * OutVoltage)/1000);
        if (PowerCounter > 999999999) PowerCounter = 0;
       }
     //Serial.println(millis()-PrevTime); PrevTime = millis();  
   }

 if (EnblADC) {EnblADC = 0; GetADC();}

 if (storeEnbl) {storeEnbl=0; SaveData();}
 
 //buttons, output, LED
 if ( (!(digitalRead(ON_BTN)))&&(!(ErrOverheat || ErrReg)) ) {output = 1;}
 if ( ErrOverheat || ErrReg ) {digitalWrite(OUT_REL,LOW); output = 0;}
 if (output) digitalWrite(OUT_REL,HIGH); else digitalWrite(OUT_REL,LOW); 
 if (output) {if (!(digitalRead(OVER_CURRENT))) updateLED(0b11111101); else updateLED(0b11111011);} else updateLED(0b11111110);
 if (bt1_tap) 
   {
    bt1_tap = 0; 
    switch (screen)
      {
        case 1: screen = 2; break;
        case 2: screen = 1; break;
        default: screen = 1; break;
      }
   }
 if (bt1_hold) 
   {
    bt1_hold = 0;
    if (protect) protect = 0; else protect = 1;
    updateSymbol(0,protect);
   }
 if (bt2_tap)    
   {
    bt2_tap = 0; 
    switch (screen)
      {
        case 0: screen = 3; break;
        case 3: screen = 0; break;
        default: screen = 0; break;
      }
   }
 if (bt2_hold) 
   {
    bt2_hold = 0;
    if (extSense) {extSense = 0; digitalWrite(SEN_REL,LOW);}
    else {extSense = 1; digitalWrite(SEN_REL,HIGH);}
   }
 if (bt3_tap)    
   {
    bt3_tap = 0; 
    switch (screen)
      {
        case 4: screen = 5; break;
        case 5: screen = 6; break;
        case 6: screen = 4; break;
        default: screen = 6; break;
      }
   }
 if (bt3_hold) 
   {
    bt3_hold = 0;
    if ( (screen == 5)||(screen == 6) ) {CurrentCounter = 0; PowerCounter = 0;}
    else screen = 7;
   }
 //Fan control
// if ( (TempTransADC>245) || (TempRadADC>245) || (IsenADC>18750) || (!(digitalRead(ON_BTN))) ) 
//      digitalWrite(FAN,HIGH); // Trans>70, Rad>70, I>3000, inrush fan
// if ( (TempTransADC<215) && (TempRadADC<185) && (IsenADC<18750) && (digitalRead(ON_BTN)) ) // Trans<55, Rad<40, I<3000
//   {
//     if (output) analogWrite(FAN,45); else digitalWrite(FAN,LOW); 
//   }
 if (TempTransADC < 215) speed1 = 0;
    else if (TempTransADC > 245) speed1 = 255;
    else speed1 = map(TempTransADC,215,245,40,255); // Ttrans (55...70)
 if (TempRadADC < 185) speed2 = 0;
    else if (TempRadADC > 245) speed2 = 255; 
    else speed2 = map(TempRadADC,185,245,40,255); // Trad (40...70)
 if (IsenADC < 15528) speed3 = 0;
    else if (IsenADC > 21739) speed3 = 255; 
    else speed3 = map(IsenADC,15528,21739,40,255); // I load (2500...3500)
 analogWrite(FAN,GetMax(speed1, speed2, speed3));
 //Setup display
 if ( abs(UsetADC - _UsetADC) > 100) 
   {
    _UsetADC = UsetADC; 
    setdisptimer = 0; 
    setdispU = 1; 
    //Serial.print("Set U "); Serial.println(UsetADC);
   }
 if (setdispU != _setdispU) {_setdispU = setdispU; updateSymbol(1,((setdispU | setdispI)&&(screen == 0)));} 
 if ( abs(IsetADC - _IsetADC) > 100) 
   {
    _IsetADC = IsetADC; 
    setdisptimer = 0; 
    setdispI = 1;
    //Serial.print("Set I "); Serial.println(IsetADC);
   }
 if (setdispI != _setdispI) {_setdispI = setdispI; updateSymbol(1,((setdispU | setdispI)&&(screen == 0)));}
 
 //Errors
 if ( (TempTransADC>185) || (TempRadADC>185) ) ErrOverheat = 1; // Trans>90, Rad>90
 if ( (TempTransADC<245) && (TempRadADC<245) ) ErrOverheat = 0; // Trans<70, Rad<70
 if ( (UdropADC > 200) && (UdropADC < 360) ) UdropErrTimer = 0; // Udrop>1 and Udrop<1.8; 1.45 - optimal
 if ( (UdropErrTimer > 5)||(UsetErrTimer > 12) ) ErrReg = 1; else ErrReg = 0;

 // display
 if ( ErrOverheat || ErrReg ) DisplayErr();
 else
   {
    if (screen == 0) Display0(); // U + I
    if (screen == 1) Display1(); // U
    if (screen == 2) Display2(); // I
    if (screen == 3) Display3(); // W
    if (screen == 4) Display4(); // R
    if (screen == 5) Display5(); // W*h
    if (screen == 6) Display6(); // A*h
    if (screen == 7) Display7(); // T'C
   }
}

//-------------------------------------------------------------------------------
void DisplayErr()
  {
   putSymbol(12,1,0,0,0);
   putSymbol(13,2,0,0,0);
   putSymbol(13,3,0,0,0);
   for (i=4; i<=10; i++) putSymbol(14,i,0,0,0); 
  }
void Display0()
  {
   long value;
   if (setdispU) value = GetSetVoltage(UsetADC); 
     else {if (output) value = OutVoltage; else value = 0;}
   putSymbol(((value/10000)%10),1,setdispU,0,0); 
   putSymbol(((value/1000)%10),2,setdispU,1,0); 
   putSymbol(((value/100)%10),3,setdispU,0,0); 
   putSymbol(10,4,setdispU,1,1); 
   putSymbol(14,5,setdispU,0,0); 
   if (setdispI) value = GetSetCurrent(IsetADC); 
     else value = OutCurrent;
   putSymbol(((value/1000)%10),6,setdispI,1,0); 
   putSymbol(((value/100)%10),7,setdispI,0,0); 
   putSymbol(((value/10)%10),8,setdispI,0,0); 
   putSymbol(11,9,setdispI,0,0); 
   putSymbol(14,10,setdispI,0,0); 
  }
void Display1()
  {
   long value;
   if (output) value = OutVoltage; else value = 0;
   putSymbol(((value/10000)%10),1,0,0,0); 
   putSymbol(((value/1000)%10),2,0,1,0); 
   putSymbol(((value/100)%10),3,0,0,0); 
   putSymbol(((value/10)%10),4,0,0,0); 
   putSymbol(((value)%10),5,0,0,0); 
   putSymbol(10,6,0,1,1); 
   value = GetSetVoltage(UsetADC);
   putSymbol(((value/10000)%10),7,0,0,0); 
   putSymbol(((value/1000)%10),8,0,1,0); 
   putSymbol(((value/100)%10),9,0,0,0); 
   putSymbol(((value/10)%10),10,0,0,0); 
  }
void Display2()
  {
   int value;
   value = OutCurrent;
   putSymbol(((value/1000)%10),1,0,1,0); 
   putSymbol(((value/100)%10),2,0,0,0); 
   putSymbol(((value/10)%10),3,0,0,0); 
   putSymbol(((value)%10),4,0,0,0); 
   putSymbol(11,5,0,1,1); 
   value = GetSetCurrent(IsetADC);
   putSymbol(((value/1000)%10),6,0,1,0); 
   putSymbol(((value/100)%10),7,0,0,0); 
   putSymbol(((value/10)%10),8,0,0,0); 
   putSymbol(((value)%10),9,0,0,0);
   putSymbol(14,10,0,0,0); 
  }
void Display3()
  {
   int value;
   value = (OutCurrent * OutVoltage)/100000;
   putSymbol(14,1,0,0,0);
   putSymbol(14,2,0,0,0);
   putSymbol(((value/1000)%10),3,0,0,0); 
   putSymbol(((value/100)%10),4,0,0,0); 
   putSymbol(((value/10)%10),5,0,1,0); 
   putSymbol(((value)%10),6,0,0,0);
   putSymbol(14,7,0,0,0);
   putSymbol(14,8,0,0,0);
   putSymbol(15,9,0,0,0);
   putSymbol(16,10,0,0,0);
  }
void Display4()
  {
   long value;
   putSymbol(14,1,0,0,0);
   if (OutCurrent > 0)
     {
      value = (OutVoltage * 10)/OutCurrent;
      if ( value > 99999 ) value = 99999;
      putSymbol(((value/10000)%10),2,0,0,0);
      putSymbol(((value/1000)%10),3,0,0,0); 
      putSymbol(((value/100)%10),4,0,0,0); 
      putSymbol(((value/10)%10),5,0,1,0); 
      putSymbol(((value)%10),6,0,0,0);
     }
   else
     {
      putSymbol(17,2,0,0,0);
      putSymbol(17,3,0,0,0); 
      putSymbol(17,4,0,0,0); 
      putSymbol(17,5,0,1,0); 
      putSymbol(17,6,0,0,0);
     }
   putSymbol(14,7,0,0,0);
   putSymbol(5,8,0,0,0);
   putSymbol(19,9,0,0,0);
   putSymbol(2,10,0,0,0);
  }
void Display5()
  {
   long value;
   value = (PowerCounter)/1000;
   putSymbol(((value/100000)%10),1,0,0,0);
   putSymbol(((value/10000)%10),2,0,0,0);
   putSymbol(((value/1000)%10),3,0,1,0); 
   putSymbol(((value/100)%10),4,0,0,0); 
   putSymbol(((value/10)%10),5,0,0,0); 
   putSymbol(((value)%10),6,0,0,0);
   putSymbol(14,7,0,0,0);
   putSymbol(15,8,0,0,0);
   putSymbol(16,9,0,0,0);
   putSymbol(18,10,1,0,0);
  }
void Display6()
  {
   long value;
   value = (CurrentCounter)/1000;
   putSymbol(((value/100000)%10),1,0,0,0);
   putSymbol(((value/10000)%10),2,0,0,0);
   putSymbol(((value/1000)%10),3,0,1,0); 
   putSymbol(((value/100)%10),4,0,0,0); 
   putSymbol(((value/10)%10),5,0,0,0); 
   putSymbol(((value)%10),6,0,0,0);
   putSymbol(14,7,0,0,0);
   putSymbol(14,8,0,0,0);
   putSymbol(11,9,0,0,0);
   putSymbol(18,10,1,0,0);
  }  
void Display7()
  {
   int value;
   value = (((TempTransADC - 105)*10) / 2);
   putSymbol(21,1,0,0,0);
   putSymbol(((value/100)%10),2,0,0,0);
   putSymbol(((value/10)%10),3,0,1,0); 
   putSymbol(((value)%10),4,0,0,0); 
   putSymbol(20,5,0,0,0); 
   value = (((TempRadADC - 105)*10) / 2);
   putSymbol(13,6,1,0,0);
   putSymbol(((value/100)%10),7,0,0,0);
   putSymbol(((value/10)%10),8,0,1,0); 
   putSymbol(((value)%10),9,0,0,0); 
   putSymbol(20,10,0,0,0); 
  }  
//-------------------------------------------------------------------------------
// read
long EEPROM_long_read(int addr) {    
  byte raw[4];
  for(byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr+i);
  long &num = (long&)raw;
  return num;
}
// store
void EEPROM_long_write(int addr, long num) {
  byte raw[4];
  (long&)raw = num;
  for(byte i = 0; i < 4; i++) EEPROM.write(addr+i, raw[i]);
}
// save
void SaveData()
  {
   updateLED(0b11111000); 
   EEPROM_long_write(0,CurrentCounter);
   EEPROM_long_write(4,PowerCounter);
  }
//-------------------------------------------------------------------------------
ISR(TIMER2_OVF_vect) //timer 2 interrupt
 {
  //  ADC read run
  ADCtimer++;
  if (ADCtimer>6) {EnblADC = 1; ADCtimer = 0;}
  //  1 sec. intervals
  tick1S++;
  if (tick1S>60) {tick1S = 0; int1S = 1;}
  //  3,6 sec. intervals
  tick36S++;
  if (tick36S>219) {tick36S = 0; int36S = 1;}
  //  store interval, AC off
  if (!(digitalRead(OFF_BTN))) storeTimer++; else storeTimer = 0;
  if (storeTimer == 122) {storeEnbl = 1;}// 2000mS
  // button 1 manage
  if (digitalRead(B1_BTN)) if ( (bt1_timer>6) && (bt1_timer<122) ) {bt1_tap = 1; bt1_hold = 0;}// >100mS, <2000mS
  if (bt1_timer==122) {bt1_tap = 0; bt1_hold = 1;}// =2000mS  
  if (!(digitalRead(B1_BTN))) {if (bt1_timer<255) bt1_timer++;} else bt1_timer = 0;
  // button 2 manage
  if (digitalRead(B2_BTN)) if ( (bt2_timer>6) && (bt2_timer<122) ) {bt2_tap = 1; bt2_hold = 0;}// >100mS, <2000mS
  if (bt2_timer==122) {bt2_tap = 0; bt2_hold = 1;}// =2000mS  
  if (!(digitalRead(B2_BTN))) {if (bt2_timer<255) bt2_timer++;} else bt2_timer = 0;
  // button 3 manage
  if (digitalRead(B3_BTN)) if ( (bt3_timer>6) && (bt3_timer<122) ) {bt3_tap = 1; bt3_hold = 0;}// >100mS, <2000mS
  if (bt3_timer==122) {bt3_tap = 0; bt3_hold = 1;}// =2000mS  
  if (!(digitalRead(B3_BTN))) {if (bt3_timer<255) bt3_timer++;} else bt3_timer = 0;
  //setup value display
  if (setdisptimer<255) setdisptimer++;
  if (setdisptimer==183) {setdispU=0; setdispI=0;} // =3000mS
 }

ISR(INT1_vect) //INT1 interrupt, OFF button, AC off
 {
  digitalWrite(OUT_REL,LOW);
  output = 0;
 }

ISR(INT0_vect) //INT0 interrupt, overcurrent input
 {
  if ( (digitalRead(ON_BTN)) && protect ) {digitalWrite(OUT_REL,LOW); output = 0;}
 }

byte GetMax(byte val1, byte val2, byte val3)
  {
    byte result = val1;
    if (val2 > result) result = val2;
    if (val3 > result) result = val3;
    return result;
  }

void GetADC()//
 {
  readBuf[0] = 0; // ask for conversion register
  Wire.beginTransmission(ADR_ASD1115);  // ask for ADC 
  Wire.write(readBuf[0]);              // pointer to register
  Wire.endTransmission();
  Wire.requestFrom(ADR_ASD1115, 2);    // repeat start
  readBuf[1] = Wire.read();  // 
  readBuf[2] = Wire.read();  // 
  Wire.endTransmission();  
  ResultADC = readBuf[1] << 8 | readBuf[2];  // get result
  switch(ADCchannel)
    {
      case 0: UsenADC = ResultADC; OutVoltage = GetOutVoltage(UsenADC); break;
      case 1: UsetADC = ResultADC; break;
      case 2: IsenADC = ResultADC; OutCurrent = GetOutCurrent(IsenADC); break;
      case 3: IsetADC = ResultADC; break;
    }
  if ( ((UsenADC-UsetADC)>1000)||((IsenADC-IsetADC)>1000) ) {if (UsetErrTimer < 255) UsetErrTimer++;} else UsetErrTimer = 0;  
  ADCchannel = ADCchannel + 1;
  if (ADCchannel>3) ADCchannel = 0;
  writeBuf[0] = 1; // ask for config register
  writeBuf[1] = ( 0b11000010 | (ADCchannel << 4) ); // start convertion at ±4.096V
  writeBuf[2] = 0b01000011; // 32 SPS, disable comparator
  Wire.beginTransmission(ADR_ASD1115);  // ask for ADC 
  Wire.write(writeBuf[0]);     // register
  Wire.write(writeBuf[1]);     // bit's 15:8
  Wire.write(writeBuf[2]);     // bit's 7:0
  Wire.endTransmission();  
 }
//-------------------------------------------------------------------------------
long GetOutVoltage(long data)
  {
  int mult;  
  data = (data - 93);                 
  if ((data > 32000)||(data < 0)) {data = 0; return data;}
  if (data < 500) mult = 10549; 
    else mult = map(data,500,30500,10500,10484);
  data = data * mult;
  data = data / 10000;
  return data;    
  }
//-------------------------------------------------------------------------------
long GetSetVoltage(long data)
  {
  int mult;  
  data = (data - 107);                 
  if ((data > 32000)||(data < 0)) {data = 0; return data;}
  if (data < 500) mult = 10549; 
    else mult = map(data,500,30500,10542,10532);
  data = data * mult;
  data = data / 10000;
  return data;    
  }
//-------------------------------------------------------------------------------
long GetOutCurrent(long data)
  {
  int mult;  
  data = (data - 121);                 
  if ((data > 32000)||(data < 0)) {data = 0; return data;}
  if (data < 600) mult = 16367; 
    else mult = map(data,600,31000,16311,16175);
  data = data * mult;
  data = data / 100000;
  return data;
  }    
//-------------------------------------------------------------------------------
long GetSetCurrent(long data)
  {
  int mult;  
  data = (data - 143);                 
  if ((data > 32000)||(data < 0)) {data = 0; return data;}
  if (data < 600) mult = 25719;//16367; 
    else mult = map(data,600,31000,16220,15940);
  data = data * mult;
  data = data / 100000;
  return data;    
  }

// sending commands to display
void sendCommand(unsigned int command, boolean data)
{
 digitalWrite(CLK, HIGH);
 digitalWrite(STB, LOW);

 for(int i = 0; i < 8; i++)
 {
 if(bitRead(command, i) & 0x01)
 {
 digitalWrite(DAT_TX, HIGH);
 }else{
 digitalWrite(DAT_TX, LOW);
 }
 digitalWrite(CLK, LOW);
 digitalWrite(CLK, HIGH);
 }

 if(data) digitalWrite(STB, HIGH);
}

// sending data to display
void sendData(byte data, boolean last)
{
 for(byte index = 0; index < 8; index++)
 {
 if(bitRead(data, index) & 0x01)
   { digitalWrite(DAT_TX, HIGH); }
 else
   { digitalWrite(DAT_TX, LOW); }
 digitalWrite(CLK, LOW);
 digitalWrite(CLK, HIGH);
 }
 if(last) digitalWrite(STB, HIGH);
}

// set ram address
void setAddress(unsigned int address, boolean data)
{
 sendCommand(addressSettings | (address & 0x1F), data);
}

// cleaning of display memory
void clearDisplay()
{
 sendCommand((dataSettings | incrementAddress), true);
 setAddress(startAddress, false);
 for(int i = 0; i <= endAddress; i++)
 {
 sendData(0x00, false);
 }
 digitalWrite(STB, HIGH);
}

// routines for initialize display
void initDisplay()
{
 delay (200);
 // clear display ram memory
 clearDisplay();
 // set display mode to 5 digits, 16 segments
 sendCommand(displayMode, true);
 // set display on and minimum dimming
 sendCommand(displayControl, true);
}

// update fixed memory addresses
void updateFixedAddres(int address, int data)
{
 sendCommand((dataSettings | fixedAddress), true);
 setAddress(address, false);
 sendData(data, true);
}

// write symbol data to memory
void putSymbol(byte symIndex, byte posit, bool upcom, bool dot, bool dncom)
{
 byte symbol;
 sendCommand((dataSettings | incrementAddress), true);
 setAddress(posit * 2, false);
 symbol = symbols[(symIndex*2)];
 if (upcom) symbol |= 1<<4;
 sendData(symbol, false);
 symbol = symbols[(symIndex*2)+1];
 if (dot) symbol |= 1;
 if (dncom) symbol |= 1<<2;
 sendData(symbol, true);
}

// update LED status
void updateLED(int data)
{
 sendCommand((dataSettings | LEDregister), false);
 sendData(data, true);
}

// additional symbol of VFD updating
void updateSymbol(byte posit, bool value)
{
 if (value) symbolReg |= (1<<posit+2); else symbolReg &= ~(1<<posit+2);
 updateFixedAddres(0, symbolReg);
}
//-------------------------------------------------------------------------------

со временем — переделаю общение по I2C, что бы без библиотеки, и связь с дисплеем на SPI, а не ногодрыг.


Корпус и сборка
Корпус Z2A был куплен в Украинском интернет — магазине.
Сверление и порезка плат и корпуса делались на ЧПУ. Примеры как раз для этого блока — в обзоре на этот ЧПУ.
Фрезы — использовал из этого набора. Еще про запас прикупил таких, абсолютно идентичные. Кстати, такая фреза в паре с маленькой дрелькой дает инструмент, которым очень легко и удобно резать дорожки на печатных платах.
Сверла — эти.
Переднюю панель резал первой. По неопытности — дал много мощности и малую подачу.
Получилось не очень

Сверху — распечатанная на бумаге передняя панель и пленка для скоросшивателя.
Мощные полупроводниковые компоненты разместились на радиаторе от компьютерного процессора, его пришлось немного посверлить и порезать резьбу. На нем же примостились платы пред-регулятора, АЦП с ОУ слежения за падением напряжения и шунты измерения тока.
Радиатор

В обработке радиатора очень помогал автоматический кернер.
Термопаста — GD900.
Радиатор и трансформатор в корпусе

и с двумя платами

Сверху трансформатора — плата стабилизаторов и основная.
Плата стабилизаторов

На передней панели — закреплены платы индикатора и измерений
Передняя панель

и уже с платами




Плата индикатора

Плата измерений, в процесе сборки, лишилась шунтов, еще решено было оснастить ее разьемами, уже после изготовления. Поэтому — вид у нее — трэшовый
Плата измерений

Разъемы
Выходные клеммники — вот эти. Для обратной связи по напряжению — заказал такие, но не понравились, гайка полностью пластмассовая, поэтому купил эти. Кстати, если нужны цветные, вот нормальные, с гайкой из металла.
На задней панели — вентилятор, разьем сети питания, держатель предохранителя и разьем uart Arduino
Добавить в избранное +104 +153
+
avatar
  • bdos
  • 03 июля 2019, 16:17
+1
Пульсации наверно небольшие получились?
+
avatar
+2
Под нагрузкой — шум порядка 50мВ. Пока не поборол.
+
avatar
+2
Это весьма много. У меня самодельный БП с предрегулятором на 100 Гц (отключаю выпрямитель от конденсатора как только тот зарядится до нужного мне напряжения) и пульсации на выходе от него — меньше 2 мВ. И то я считаю это немало, поэтому есть возможность предрегулятор отключать.
+
avatar
  • Z2K
  • 03 июля 2019, 21:23
+1
А какая у Вас необходимость иметь такие низкие шумы на питании. В каких использованиях это критично?
+
avatar
+1
Питание какой-либо специфической аудиоаппаратуры, например. Конкретно сейчас такой потребности нет, но я ставил цель построить наиболее универсальный лабораторный блок питания радиолюбителя, который сможет и для таких случаев пригодиться.
+
avatar
  • Z2K
  • 04 июля 2019, 03:28
+5
Понятно, планируете в ближайшем будущем разрабатывать хайфай аудио. Класса А надеюсь. Посколько классу Д пульсации к тому самому месту. А по сути «конкретно сейчас такой потребности нет».
«Построить наиболее универсальный лабораторный блок» — БП и стартерные батареи заряжать и предусилители питать мягко говоря не лучший вариант. Плохая идея и плохое решение.
Я не со зла — просто удивляет с каким упорством обсуждаестя начие вч шумов. Времена изменились — теперь в основном цифровая техника и цифровая обработка сигнала. И допустимый уровень этих шумов никак не влияет на работу эл техники. А радиэфир так засорен спектральными помехами так, что общий уровень э/м шумов в сравнении с 30тыми годами прошлого века возрос на 2 порядка. И ничего с этим не поделать, надо только принять.
+
avatar
+1
Ну, конечно, каждому свое. Для питания D-класса у меня есть импульсный лабораторный БП из китая, купленный много лет назад и справляющийся со своей функцией на отлично. Но мы же тут не готовые решения обсуждаем, а говорим о DIY, так почему я не могу к DIY выдвигать такие требования, которые мне интересны? Для меня в этом и смысл DIY — получать удовольствие делая устройства, обладающие весьма высокими характеристиками, потому что ширпотреб проще и дешевле купить.

А если вас устраивают ВЧ пульсации в 50 мВ, зачем вообще линейный стабилизатор? Зачем трансформатор на 50 Гц? Возьмите обычный импульсный БП, добавьте к нему набор регулируемого импульсного стабилизатора с экраном и микропроцессорным управлением, неоднократно тут обозревавшийся, и будут вам ваши 50 мВ, а может даже и ниже. А если уж мы ставим линейный стабилизатор, то я на выходе ожидают максимум милливольты пульсаций.

Кстати, по поводу ВЧ пульсаций — если вам интересна тема КВ-приемников (особенно регенеративных), вряд ли вы их сможете питать от такого БП.
+
avatar
  • Z2K
  • 03 июля 2019, 21:24
+1
У меня БП, когда нужны мин пульсации, (что бывает крайне редко, и то не совсем что б очень нужно — лишь что б проверить есть ли разница в работе от питания) — есть сборка 4S2P — 12В-10А отлично держит. Никаких шумов. Проще и дешевле.
+
avatar
  • ksiman
  • 04 июля 2019, 09:44
0
есть сборка 4S2P — 12В-10А отлично держит. Никаких шумов.
Шумы есть всегда, но в данном случае они очень низкие.
+
avatar
+2
попробуй на выход синфазный 2-обмоточный дроссель + мелкий кондер
+
avatar
0
Спасибо за совет.
На общий выход, или между импульсником и линейником?
+
avatar
  • ksiman
  • 04 июля 2019, 09:45
0
Под нагрузкой — шум порядка 50мВ. Пока не поборол.
Очевидно, неправильная разводка общего проводника.
Надо внимательно проверять монтаж и схему.
Сразу бросается в глаза питание модуля индикации от основной обмотки трансформатора. Выход моста данного источника подключается на общий проводник и сразу образуется один из источников проблемы
+
avatar
0
Очевидно, неправильная разводка общего проводника.
Почему? Линейный стабилизатор просто не обладает необходимым быстродействием, чтобы гасить такие пульсации изменением сопротивления транзистора, они проходят через него, как через резистор. Поднять быстродействие тоже не получится, будет возбуждаться. Тут просто ФНЧ хороший нужен на выходе предрегулятора.

p.s. возможно, земляной контур и действительно неправильно разведен, в дополнение к вышесказанному.
+
avatar
  • ksiman
  • 04 июля 2019, 15:47
0
Пульсации на частоте работы входного преобразователя линейник легко отфильтрует. Тут проблема скорее всего глубже…
+
avatar
0
Пульсации от работы импульсного преобразователя имеют спектр, начинающийся с рабочей частоты и уходящий в мегагерцы. Никакой линейник просто не обладает таким быстродействием, чтобы фильтровать мегагерцы.
+
avatar
  • ksiman
  • 04 июля 2019, 18:30
+1
Убедили, сдаюсь…
+
avatar
0
Масштабно! +за DIY.
А как у прибора со стабильностью В и А?
+
avatar
+1
За 3 часа — не поплыл
+
avatar
  • Xylene
  • 03 июля 2019, 16:24
+1
10 оборотов на регулятор? Долго менять с 3.3 вольт на 12 к примеру? Вариант Грубо-точно не рассматривали?
+
avatar
+1
Места на передней панели не хватило бы. Один оборот — около 3,5 вольт
+
avatar
  • Dfcz22
  • 03 июля 2019, 16:28
+1
Причем правильный прибор — должен быть тяжелым и горячим. А если бы сделать его не сильно греющимся?
Когда-то на подготовке диплома (по БП для цифровых устройств) мне препод сказал: у вас максимальная температура трансформатора ниже 100 градусов — плохо: не эффективно работает. ))
+
avatar
  • Z2K
  • 03 июля 2019, 20:38
+1
«мне препод сказал: » — ну не все же преподы могут быть умными.
+
avatar
  • Jet
  • 04 июля 2019, 00:37
+1
скорее это был сарказм)
+
avatar
  • mzr910
  • 03 июля 2019, 16:29
+1
вид очень эклектичный
+
avatar
  • Xylene
  • 03 июля 2019, 16:30
+1
да ладно, просто теплый ламповый
+
avatar
0
А зачем этот вариант? Собрал БП по варианту Леонид Иваныча, огонь схема, с синхронным выпрямителем, очень низкие пульсации, нет помех.
+
avatar
  • Xylene
  • 03 июля 2019, 17:20
0
а зачем Леонид Иваныча? Keysight, огонь схема. 6 штук евро и он ваш.
Ну что за люди «зачем делать, возьми да скопируй»
+
avatar
0
Keysight, огонь схема. 6 штук евро и он ваш
нафиг он нужен для diy)
+
avatar
0
Можно ссылку?
+
avatar
+9
Вот автор.
+
avatar
0
Крутая вещь! спасибо
+
avatar
  • ploop
  • 03 июля 2019, 19:55
+1
Я помню этапы его рождения. Действительно крутая вещь.
+
avatar
  • Bako
  • 04 июля 2019, 15:01
0
Я его ещё по радиокоту помню, пока «национальный вопрос» его не испортил и он со скандалом не ушёл с форума. Одно время думал что Леонид Иваныч и kirich один и тот же человек — внимание к мелочам и один и тоже город наводили на эту мысль.
+
avatar
  • ploop
  • 04 июля 2019, 15:22
+2
Ну и я его оттуда же знаю. И помню, как задолбало меня этот «национальный» срач вычищать, да чтобы никого не обидеть :)
+
avatar
  • Z2K
  • 06 июля 2019, 06:54
0
«и один и тоже город» — зато у Вас внимания к мелочам нет. :))
+
avatar
+4
да leoniv крутой мужик самоучка с прямыми руками и дотошный в мелочах. продумывает все вплоть до наклейки. сам из деревни. старше меня лет на 10, но какая пропасть в знаниях. мне еще расти и расти. раньше вроде работал в белорусской академии наук.
+
avatar
0
Скопировал «БП по варианту Леонид Иваныча» и вставил в Google, заняло ~ 3-4 сек. Сложно? :)
+
avatar
+5
Не сложно.
Но если у человека есть 100% точный источник, почему бы и не поделится?
А послать в гугол — может каждый :)
+
avatar
+1
Странно, что вы про него не слышали — обычно все, кто конструируют БП с линейным стабилизатором знакомы с его схемами =)

Решение с автоматическим подключением нужной обмотки весьма интересное.
+
avatar
0
знакомы с его схемами
первый раз слышу
решение с автоматическим подключением нужной обмотки весьма интересное
этому решению лет 50
+
avatar
0
Лет то 50, но реализация — интересна.
Мог бы и не заморачиватся, а коммутировать отводы симисторами и упростить выпрямитель, а так — уважение за труд
+
avatar
+1
Ээ, нет. Основное преимущество его решения (ну, или не его, но я с таким решением познакомился именно на его схеме) — это очень быстрая коммутация. Надо вам выходное напряжение за миллисекунду поднять с 5 В до 30 В — пожалуйста, открывается другой ключ и напряжение поднято. Если же коммутировать обмотки перед выпрямителем, то поднять напряжение вы сможете только через 1 полупериод.

Это бывает надо, например, для быстрого перехода из СС в CV.
+
avatar
0
Дайте ссылку, пожалуйста! Уже увидел ниже. Спасибо!
+
avatar
  • Z2K
  • 03 июля 2019, 21:05
0
А зачем Вам сверхнизкие пульсации. Занимаетесь гидролокацией?
+
avatar
  • wwest
  • 04 июля 2019, 21:10
0
От 20 до 80 килогерц вся гидролокация.Ну ещё поиск АПЛ на сверхнизких частотах вплоть до инфразвука.
Ну и чем при такой частоте пульсации могут помешать? Всё тоже что и в звуковом усилителе.А в цифровой форме анализ Фурье сигнала все ваши пульсации на постоянной частоте отсекает на раз-два.
При чём тут гидролокация.Это скорее для радио или в измерительной технике.
+
avatar
  • prohuk
  • 03 июля 2019, 22:48
-1
Собрал БП по варианту Леонид Иваныча,
Кто такой Леонид Иваныч?
+
avatar
  • Xylene
  • 03 июля 2019, 22:53
-1
известный писатель и параход www.litmir.me/br/?b=186939&p=1
+
avatar
0
известный писатель и
Спасибо за ссылку — я её потерял когда-то, теперь сохраню надежнее!
+
avatar
  • X3Shim
  • 03 июля 2019, 17:11
+1
Транс — импульсник — линейный стаб. Я правильно понял идею?
+
avatar
+1
Точно. Есть еще схемы «следящего» импульсника, который поддерживает +3В относительно выхода линейного преобразователя. У кого-то получалось собрать и получить низкие шумы. Но тема на радиокоте, если память не изменяет, так и не переросла в нечто законченное-рекомендованное. Но люди делились тем, что получилось.
+
avatar
  • u3712
  • 03 июля 2019, 18:53
0
2.4 достаточно, меньше 2 мало, для тока порядка 3-5А. Если меньше, то можно снизить до 2В.
+
avatar
0
Смотря на чем линейник. В теме на коте было 2.7В вроде, задавали стабилитроном.
+
avatar
+4
Да. Транс — лучшая гальваническая развязка. Импульсник — снижает напряжение перед линейником. Линейник — высокая точность и уменьшение помех.
Но все же шумы есть, пока борюсь
+
avatar
0
линейник — высокая точность и уменьшение помех
у многих стабилизаторов линейных PSRR на высоких частотах плохой. Поэтому пульсации от импусника давятся плохо. Конечно, есть разные решения проблемы
+
avatar
0
К сожалению, линейный стабилизатор не справится с помехами, генерируемыми импульсным — их спектр начинается с сотни килогерц и уходит в мегагерцы, линейники просто не обладают таким быстродействием, иначе они будут возбуждаться на емкостной нагрузке. Во всех схемах всегда есть корректирующая цепочка, снижающая усиление тракта на частоте, где сдвиг фазы приближается к 360 градусам до уровня меньше единицы.

В вашем случае после предрегулятора нужен хороший пассивный ФНЧ 3-го или 5-го порядка (то есть, 2 или 3 конденсатора плюс 1 или 2 дросселя) и правильное разведение земли.
+
avatar
  • kven
  • 03 июля 2019, 17:38
+1
зачот! особенно за ВЛИ.
+
avatar
+2
Корпус тесноват, а интикатор похоже от калькулятора серии Sharp — Compet.
+
avatar
  • kven
  • 03 июля 2019, 18:18
0
индикатор может быть от чего угодно, но точно не от калькулятора на фото
+
avatar
0
как раз нормальный индикатор
у меня вмультиметре вли большой и корпус там тоже большой
+
avatar
  • kven
  • 03 июля 2019, 20:16
0
кстати, на ибее можно купить vfd индикатор от мультиметра с кучей символов всяких, правда от популярных, типа 34401, будет дорого стоить, от дешёвых флюков настольных должно быть недорого
+
avatar
  • Xylene
  • 03 июля 2019, 20:28
-4
Да вообще копейки, 140 баксов


Ссылки на дешевые флюки тоже приветствуются, у них вообще бывает что либо дешевое?
+
avatar
  • kven
  • 03 июля 2019, 22:26
0
вам удалось найти самый дорогой лот.
а вообще, полурабочие Fluke 8840A или 45 стоят от $30 плюс доставка, но надо мониторить, как и все на ибее.
+
avatar
  • Xylene
  • 03 июля 2019, 22:28
0
ну вы везучий. Сколько не вижу лотов с приборами — доставка меньше 50 не бывает. Если прогнать посредником — столько же и выйдет. Правда еще есть и ненулевая вероятность, что это барахло завернет таможня
+
avatar
  • kven
  • 03 июля 2019, 22:52
0
вы про индикатор или мультиметр?
и то и другое нужно мониторить, покупал себе год назад мультиметр настольный, по асашай free, в москву посредником $55 вышло.
vfd индикаторы б/у для мультиметров видел от $20.
ссылок не будет, потому что все дешевое надо искать, сходу только втридорога можно купить.
+
avatar
0
вли сам по себе дешев не бывает
разве только просто 7 сегментная трубка как у автора

у меня валяется несколько штук от музцентров и подобного, врят ли под блок питания покатит
зато при помощи чпу фрезера и лазера можно сделать крутые панели со светящимися символами и даже самими сегментами
вчера в ютубе увидел, мужик делает панели для полетного симулятора
выглядят вообще нереально круто, надписи подсвечены, линии там всякие от ручек управления, даже стрелки приборные у самопальных приборов и шкалы подсвечены
+
avatar
  • kven
  • 03 июля 2019, 22:54
0
да, от МЦ самые красивые индикаторы, еще от видиков и ресиверов норм.
+
avatar
-1
и настолько же бесполезные
+
avatar
0
Тоже возникла такая мысль…
+
avatar
0
почему на схеме индикации выводы драйвера 5 и 6 соединены и на меге тоже?
+
avatar
0
PT6312, кроме управления дисплеем, умеет опрашывать 4 переключателя и 24 кнопки. Эти даные — она выдает на 5-ю ногу. Там — открытый сток.
Я соединил их вместе, что бы тянуть меньше проводов. Так делает большинство :)
Я думал, что когда переделаю обмен на SPI, мега будет слать инфу на дисплей через 11-ю ногу, а читать — через 12.
Изначально задумывалось больше органов управления, с задействованием PT6312, но потом — захотелось меньшый корпус, и пришлось оптимизировать.
+
avatar
  • Gruffy
  • 03 июля 2019, 18:51
+1
Сделано красиво, это плюс.
Боюсь, что 2 В запаса для стабилизатора — маловато, надо чуть больше.
Полагаю, надежда на то, что стабилизатор подавит все пульсации от ИИП — заблуждение, скорее всего они легко проходят через него. Надо поставить после ИИП фильтр с катушками (на схеме их не увидел). Всё-таки 50 мВ — многовато для такой сложной схемы.
На мой взгляд, компьютерный радиатор с вентилятором должен торчать наружу — будет гораздо эффективное охлаждение (если тепловая мощность выделяется в десятки Ватт).
В целом, поздравляю, мало кто сегодня способен сотворить такой прибор.
+
avatar
  • Z2K
  • 03 июля 2019, 21:29
0
«Полагаю, надежда на то, что стабилизатор подавит все пульсации от ИИП — заблуждение, скорее всего они легко проходят через него.»
Обычный параметрический стабилизатор отлично снимет низкочастотные 100Гц, — но ВЧ будут пролезать легко. Для борьбы с ними путем электронной фильтрации нужно городить ВЧ схемы с вч транзисторами.
+
avatar
  • KiV
  • 03 июля 2019, 21:49
+2
Дроссели между импульсной и линейной схемой могут частично решить проблему. Но еще влияет и расположение схем друг относительно друга, расположение и ориентация дросселя импульсного источника. Даже разводка платы импульсника будет влиять.
Кардинальное решение для данного источника — полное отключение импульсника на малых токах. Микроконтроллер в схеме есть — программно выключаем импульсник, открываем полностью его транзистор. Если используемый стабилизатор позволяет сделать 100% ШИМ на входе, то это реализуется просто «врезкой» сигнала в цепь обратной связи. При этом надо будет следить за рассеиваемой мощностью на линейнике и переключаться на импульсник при превышении какого-то порога.
+
avatar
  • Z2K
  • 03 июля 2019, 21:56
0
Зачем все эти сложности — если Вам действительно важны отсутствие вч шумов не проще ли при сегодняшней доступности и цене литиевих аку сделать батарею с линейным регулятором и питать лабораторные поделия от нее. И решить проблему вкорне, а не изголяться в борьбе с ней ища оптимальное расположение блоков. Вам же не нужен такой БП для 24/7.
+
avatar
  • KiV
  • 03 июля 2019, 22:09
+3
Я предложил вариант конкретно для этого блока. Обычно низкий уровень шумов нужен именно для слаботочных устройств. Поэтому отключение предрегулятора на низких токах считаю хорошей идеей.
А «расположение» это больше мои рассуждения, чем реальный совет — у автора источник уже сделан и он вряд-ли будет его так кардинально перелопачивать. Разве что фильтрующий дроссель после импульсника поставить.
+
avatar
  • Xylene
  • 03 июля 2019, 22:56
+1
идея действительно хорошая. На сильный токах уже на шумы плевать. Этакий универсал выйдет, бесшумный где надо, и мощный
+
avatar
  • u3712
  • 03 июля 2019, 19:14
+5
Делал подобный тип БП, на базе обычного китайского 1503DD. Вполне вменяемые характеристики, при миниуме затрат. Доработка очень простая — между питанием и коллектором силового транзистора ставится DC/DC преобразователь, настроенный на отслеживание 2.4В между КЭ транзистора.
Забавно, но потом у проекта было расширение — к корпусу припаян АТХ БП, отмодденый в тот-же фром-фактор. В нем реализован инвертер ±30В 10А. Потом была эпопея по прикручиванию регулятора 1503 на этот гибридный БП. В итоге, «переключатель типа» на 1503 выбирает режим работы устройства — полностью линейный 30В 1А, гибридный 30В 3А (с разрешением работы DC/DC) и третий, с запуском импульсного источника. Потом было начал расширять его на добавление регулируемого изолированного +300В 1.5А, да «наигрался».
Итак, замечания по конструкции.
Основное — очень захламлена face. Крутилками напряжения и тока пользоваться невозможно. Да-да, невозможно. Как первая мера, можно поставить тонкие-высокие ручки, но это все-равно полумера. Нет места для пальцев.
Второе — количество кнопок зашкаливает. Не спорю, они нужны, но «не так».
Третье — для работы с БП удобно иметь индикацию 3х величин — напряжения, тока и мощности. Для работы с аккумуляторами — напряжения, тока и емкости. Всё остальное лишь утяжеляет интерфейс.
Четвертое — выходные соединители. Купите что дорогое, а? Или, на крайний случай, поставьте «советские». Весь этот китацкий пластик — зря выброшенные деньги. Себе же делаете, сделайте нормально. У вас ток большой, «пластик» раздолбается очень быстро.
И вообще, доступ к крутилкам через провода?… короче, face надо переделывать. Начните проектировку со стандартного — разъемы внизу, крутилки по правой стороне, индикатор слева.
+
avatar
+1
Доработка очень простая — между питанием и коллектором силового транзистора ставится DC/DC преобразователь, настроенный на отслеживание 2.4В между КЭ транзистора.
В таком случае переход из CC в CV с повышением напряжения на выходе будет затянут на время реакции импульсника.

Основное — очень захламлена face
Это называется «лицевая панель» :)
+
avatar
  • kven
  • 03 июля 2019, 20:19
0
думаете, автор кинется переделывать уже законченный девайс?
+
avatar
  • KiV
  • 03 июля 2019, 21:36
0
И вообще, доступ к крутилкам через провода?
А если автор левша? Или просто источник стоит слева? Даже у фирменных приборов бывает такое расположение.
+
avatar
0
Спасибо за советы.
По передней панели: очень хотелось ВЛИ, поэтому потенциометры сбоку никак. Там еще внутри есть стойки, скрепляющие верх и низ корпуса, поэтому по краях — только светодиоды. да и им пришлось повыгибать ноги.
Крутилки — очень легко оперируются одним пальцем. А высокие тонкие ручки — не умею искать на али.
ВЛИ, конечно, красив, но полезная площадь индикации относительно габаритов корпуса — очень мала. Отобразить еще одно значение — будет сложно. Разве что — раз в 1..2 секунды переключать изображение
+
avatar
+1
Это корпуса такие, расслаиваются при обработке. Не важно сколько мощности и подачи
+
avatar
+2
Какие у вашего источника получились переходные характеристики при переходе из CV в CC и обратно? Например, ставим 30 В 10 мА, подключаем к выходу светодиод — перегорит?

По поводу точности АЦП — используете ли вы усреднение нескольких измеренных значений? Если нет, и скорость АЦП позволяет — используйте. У меня в БП тоже 16-битный АЦП из серии ADS, я усредняю 32 или 64 сэмпла по каждому каналу. В итоге показания «прыгают» на 1 мВ при максимуме в 35 В.
+
avatar
0
Спасибо, с АЦП проработаю.
По переходу на СС — попробую еще, чуть попозже
+
avatar
+2
Для чпу станочка и 3D принтера, года два назад за 270 грн. приобрел блок питания ELTEK 1000 на Вт Они использовались в базовых станциях мобильной связи Киевстар. После реорганизации разошлись по сайтам бесплатных обьявлений. Сосед радиолюбитель после взятия на тестирование уже не вернул. :-) Доволен был как слон. Пришлось покупать второй. На выходе 10-30В Думаю со стабилизацией там все отлично.
+
avatar
  • Xylene
  • 03 июля 2019, 20:09
0
стабилизация это вообще ерунда. 99 % современных схем оно особо и не нужно, выше мин. предела и хорошо. А вот тот факт, что ИБП излучают широченный спектр всевозможных гармоник своей частоты переключения — большое зло для измериловки, аудио и подобных приложений.
+
avatar
  • Xylene
  • 03 июля 2019, 21:14
0
о, у кого то и флюки дешевые под ногами, и ибп не излучают, ну чисто цирк
+
avatar
+1
может свои поделки покажете? а то кроме кривого корпуса напечатанного на 3D принтере мы от вас нечего увидели.

есть у вас что то вот такого уровня исполнения? вот с таким мануалом?
+
avatar
  • Z2K
  • 04 июля 2019, 04:57
0
эргономика на высоте. Только кнопку он/офф перенести во вторую вертикаль — правее. Странно что так не сделано.
+
avatar
  • Z2K
  • 04 июля 2019, 05:11
+1
Перфекционист он конченный. Документ слов нету — информация воспринимается без прочтения. :). Смотрите дизайнера хреновы и учить наизусть!
+
avatar
  • Xylene
  • 04 июля 2019, 08:12
-1
Я где то писал, что у меня крутые поделки? Крутые корпуса? Вы это как заключили из фразы, говорящей о дороговизне Fluke? Или уровень ЭМС от ИБП навел вас на эты мысль? Логика есть?
+
avatar
  • Z2K
  • 03 июля 2019, 22:00
0
Было такое. Бежит река, плывут года.
+
avatar
0
Квт за 480 грн — это не дорого. Спасибо за наводку
+
avatar
0
мой вариант. регулируемый с ножками и встроенной нагрузкой. так и не рискнул проверить на ток КЗ. побоялся :)

+
avatar
+1
а так ли надо было дроссель сматывать? я всегда думал что если индуктивность чуть больше, то и ладно. главно что не меньше чем надо.
+
avatar
0
В принципе, да. Но чем больше витков, тем больше магнитное поле при том же самом токе — можно материал сердечника дросселя загнать в насыщение. Не знаю, как это применимо в данному БП (наверное, никак, т.к. тут дроссель от БП с током больше), просто факт, который надо учитывать.
+
avatar
  • KiV
  • 03 июля 2019, 20:48
0
Отличный обзор! И источник питания хорошо сделан.
Я бы вот только в затвор полевика предрегулятора стабилитрон поставил, на 12-15 Вольт параллельно R105. А то там напряжение до -35 В может быть, а транзистор только до +-20 В обычно на затворе допускает.
+
avatar
+1
D11 для этого и применен. Эмитерный повторитель на Т4 не выдаст больше напряжения, чем на базе
+
avatar
  • KiV
  • 04 июля 2019, 11:22
0
О! А слона-то я (D11) и не заметил )
+
avatar
  • Grobik
  • 03 июля 2019, 22:00
+3
DIY Отличный!
перемотаю лидцентратом
Странно, что никто не заметил этой грубейшей ошибки;)
ЛиТценДрат (нем. Litzen + Draht — пряди и провод)
+
avatar
  • Z2K
  • 03 июля 2019, 22:06
+1
В накладних правильно писали, Но никогда не знал что значит. Драт = дріт — догадывался. :)
+
avatar
+1
Благодаря Вашему исправлению — наконец то нашел этот обзор. Давно искал, спасибо
+
avatar
  • tuz_83
  • 03 июля 2019, 22:13
+2
Хорошие тороидальные трансформаторы для линейников у торэл ))
+
avatar
0
Вопрос не по теме к автору топика
В спойлере «Реализовано 8 режимов индикации» на фотках на заднем плане виден монитор ресурсов, не подскажете, что за проект?
+
avatar
+1
Это Arduino с дисплеем. подруженная с LCD smartie. Как настроить и собрать — смотрите здесь. Но у меня заработал только код отсюда
+
avatar
+5
Спасибо за интереснй обзор.
Отдельное спасибо за «Блок живлення»!
+
avatar
  • KiV
  • 03 июля 2019, 22:36
+3
А я вот в старой книжке видел схему «Джерело живлення».
По-моему даже более круто.
+
avatar
  • vovand
  • 04 июля 2019, 08:18
-1
Это на каком языке?
«Блок живлення»!
+
avatar
+2
Украинский
+
avatar
  • vovand
  • 04 июля 2019, 13:59
0
Да я знаю, просто в первый раз вижу надпись на украинском и русском в одном предложении на приборе, хотя тут, наверно, половина народа с Украины.
Ведь правильно «Джерело живлення», так?
А вообще на Украине есть такого же типа сайт, только на украинском?
+
avatar
+1
в украинском языке — есть слово «блок»
+
avatar
  • KiV
  • 04 июля 2019, 17:49
0
Блок — это блок и на украинском.
Джерело — это по-русски «источник».
Так что оба варианта правильны.
+
avatar
  • vovand
  • 04 июля 2019, 20:48
0
Спасибо за пояснение. А про сайт что скажите?
+
avatar
  • KiV
  • 04 июля 2019, 22:19
0
Я из Беларуси, поэтому украинских сайтов увы, не знаю.
+
avatar
  • ksiman
  • 03 июля 2019, 22:56
0
И получился а итоге гибридный источник питания :)
+
avatar
  • vovand
  • 04 июля 2019, 05:34
+2
Не могу понять, для чего эта вся эпопея с
Импульсный пред-регулятор
, от фона которого нельзя избавиться? Есть тороид, у которого вся вторичка на виду, не надо ничего мотать, ищи тестером нужное напряжение и делай отвод на тумблер или на реле. Какой смысл в бочке меда с ложкой дегтя?
За самодельщину плюсую, но передняя панель не фонтан, не эргономичная.
ИМХО. Я для себя всегда делаю БП вертикальные, меньше места на столе занимают.
+
avatar
0
За измерения отвечает АЦП ADS1115. точность — не супер, показания напряжения плавают ± до 5мВ, тока ± до 5 мА. в зависимости от погоды на Марсе
c 16-bit такая точность?
+
avatar
0
Да, типа 65535
+
avatar
0
Хотелось бы попросить присутствующих. Дайте ссылку на изготовление регулируемого, с защитой по току блока питания, самого простого и дешевого из компьютерного блока питания. Наверняка кто то сделал. Хотелось бы иметь дома такой для простых задач, уровень помех тут не важен, важно чтобы не сгорело подключаемое устройство и сам блок питания. И простота изготовления.
+
avatar
  • ksiman
  • 04 июля 2019, 10:07
0
Сильно зависит от используемого БП. Некоторые из них переделать очень сложно, другие — проще.
+
avatar
0
Самый простой, мне это нужно время от времени. Для простых задач, блок питания есть и старого образца и нового с разъемами сата.
+
avatar
0
Самый простой, мне это нужно время от времени. Для простых задач, блок питания есть и старого образца и нового с разъемами сата.
Это зависит от используемого контроллера в конкретном БП, а не от версий и/или ревизий стандарта АТХ и иже. Имею сказать, что переделать нормально и недорого, без знаний, хотя бы теоретических, и вложений минимальных, а также траты времени — не выйдет. Чаще всего, БП доведенный до ума, будет «золотым». Купите gophert в новой версии, который 30/5.
+
avatar
0
хочется подешевле и из того что есть на работе, списанное.
+
avatar
+1
хочется подешевле и из того что есть на работе, списанное.
Я не буду описывать весь цикл переделки, хотя бы потому что не знаю какой у вас контроллер в БП. Вскройте БП хотя бы, для начала. Смотрите/считайте: нужен ампервольтметр, замена всех конденсаторов в низковольтной части, пара энкодеров и разъемы под бананы. Это то, что будет нужно 100% (читайте минимально). Давайте подсчитаем, бюджетненько так: ампервольтметр 6-7 баксов (средне-паршивый, а более или менее нормальный все десять, а то и дороже), замена конденсаторов еще баксов 8-10, даже если менять на джамиконы какие-нибудь, энкодеры и разъемы — это еще баксов 5. Итого (возможно у вас что-то есть, плюс/минус округлил): 6 + 9 + 5 = 20 баксов. При этом нужны еще знания и БП получившийся, все равно, будет не очень таким. Нормальные комплектующие — это баксов 25-30, с учетом, что есть знания, радио «хлам» какой-никакой у вас в загашнике и иже. Типа паяльник, флюс, припой и прочее.

Не подумайте, что я «умничаю», упаси бог, да и отговорить вас не пытаюсь. Вскройте имеющиеся у вас блоки, выпишите названия контроллеров и погуглите, написав примерно следующее: «переделка компьютерного блока питания в лабораторный tl494». Без кавычек, а вместо tl494 пишите, что там у вас есть/стоит в БП. Также, вместо лабораторный можно попробовать написать регулируемый. И вот уже потом можно оценивать, а стоит ли вообще — это делать… Примерно так.
+
avatar
0
Сам нашел куплю и пристрою к блоку питания, может еще переменный резик пристрою для плавной регулировки напряжения.

aliexpress.com/item/32891103974.html

И еще:
sdelaysam-svoimirukami.ru/3871-laboratornyy-istochnik-pitaniya-iz-bp-kompyutera.html
+
avatar
0
У выше указанного лота, не удобно ставит ограничение пот току, вот лучше поищите по названию B3603 в нём ограничение по току выставляется кнопками
Есть ещё вариант дорогие блоки DPS серии…