151

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Прикрутить к скетчу модуль INA226 сложно?

У меня нет такого модуля, без него я не смогу написать скетч, можно использовать MCP3421 точность 18 бит.

При использовании INA226 и MCP3421 стабилизация тока будет невозможна из-за низкого быстродействия INA226 и MCP3421.

152

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

liman324 пишет:

Прикрутить к скетчу модуль INA226 сложно?

У меня нет такого модуля, без него я не смогу написать скетч, можно использовать MCP3421 точность 18 бит.

При использовании INA226 и MCP3421 стабилизация тока будет невозможна из-за низкого быстродействия INA226 и MCP3421.

Модуль на опыты я пришлю.
Немного почитал про INA226 https://www.radiokot.ru/artfiles/6422/ у него есть цифровой выход "Alert" позволяющий отслеживать повышение или снижение отслеживаемого параметра.

153

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

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

154 (2023-02-04 20:28:34 отредактировано Sergey-77)

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Есть мысли про другой принцип?
В режиме стабилизации тока быстродействие не является критичным. Быстродействие важно в режиме отсечки

155

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Я встречал схемы (без микроконтроллерного управления) с LM723 с токовой стабилизацией, надо найти их изучить и понять как в них задается значение тока для токовой стабилизации.

156

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

http://forum.rcl-radio.ru/uploads/images/2023/02/bcda50dd1a3896882b1258f04995fd0f.jpg

Вот например схема, надо на вывод 2 (выводы 2 и 3 разомкнуть между собой) lm723 подать напряжение от 0 до 5 В и посмотреть происходит ли стабилизация по току, если да, то в каких пределах.

Далее нужен еще один ЦАП который будет управлять стабилизацией по току.

157 (2023-02-05 21:32:53 отредактировано Sergey-77)

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Подключил на вывод 2 плюс дополнительного БП, минус соединил с землей.  Вольтметр дополнительного БП показывает 5 вольт при выставленном ноле. Если подключить нагрузку, например 10 ом. При состоянии выхода OFF ток в нагрузке 0,43А, при состоянии ON ток соответствует нагрузке более 1А. Пробовал между 2 и 3 подключить резистор 1 кОм, результат тот же.

158

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

А если на выходе источника питания выставить 5 В, подключить нагрузку 10 Ом, а на вход 2 подать 5 В и постепенно уменьшать до 0.

Произойдет уменьшение выходного напряжения источника питания и если да при каком токе?

159

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Выставил на обоих БП 5В. Без нагрузки перевожу в состояние ON - напряжение на дополнительном БП становиться 7,7В.
Подключаю нагрузку 10 Ом - ток 0,85А. Постепенно убавляю напряжение на доп. БП до 0, ток прежний, вольтметр на доп. БП 6,3В

160

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Я попробую  провести такой эксперимент с БП по другой схемотехнике.

161 (2023-02-14 21:08:47 отредактировано Sergey-77)

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Протестировал такую схему все работает, можно под нее первоначальный скетч допилить?
http://forum.rcl-radio.ru/uploads/images/2023/02/8bc2f0839190bd51d7f4e814bf3ca8eb.png

162

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Скетч написать можно, но измерение тока так же будет не точным, так как измеритель тока вход ардуино 10 бит. Рекомендую использовать LGT8F328P в нем АЦП 12 бит.

Соберите аналоговую часть схемы, подайте на входы out out1 напряжение от 0 до 5 В, посмотрите результат.

Если все работает, то начну писать скетч.

163 (2023-02-14 21:56:19 отредактировано Sergey-77)

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

liman324 пишет:

Соберите аналоговую часть схемы, подайте на входы out out1 напряжение от 0 до 5 В, посмотрите результат.

Если все работает, то начну писать скетч.

Это я проверил, оба входа. Также заливал существующий скетч, регулировка напряжения работает.

Да, платка гораздо интереснее ардуинки, буду заказывать.
https://aliexpress.ru/item/100500507835 … 4aa6zjCGcC   она прошивается как ардуино про мини, вы не в курсе?

164

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

https://aliexpress.ru/item/100500507835 … 4aa6zjCGcC   она прошивается как ардуино про мини, вы не в курсе?

Для прошивки нужен специальный програматор или плата Arduino Nano Uno.
Лучше выбрать версию на 5 В

Это я проверил, оба входа. Также заливал существующий скетч, регулировка напряжения работает.

Опубликуйте Ваш скетч, добавлю регулятор тока для ЦАП

165

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Для теста брал этот скетч с первой страницы:
#include <Wire.h>
#include <EEPROM.h>
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(8, 9);//CLK, DT
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

unsigned long times,oldPosition  = -999,newPosition;
int u_out,u_dig,menu,i_out;
const float u_k = 7.10; // калибровка регулятора напряжения
const float i_k = 0.975;// калибровка измерителя тока
const float r = 0.01;   // сопротивление шунта
byte power = 1; // при подачи питания выходное напряжение 0 В - OFF
float i;
byte w;

void setup(){
  Wire.begin();lcd.init();lcd.backlight();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);//  SW энкодер MENU
  pinMode(2,INPUT_PULLUP); // кнопка ON/OFF
  pinMode(A0,INPUT); // input I
  u_out=EEPROM.read(0)*256+EEPROM.read(1);i_out=EEPROM.read(2);
  }

void loop(){i_kz();
  if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}
  if(digitalRead(2)==LOW&&power==0){power = 1;delay(200);}
  if(digitalRead(2)==LOW&&power==1){power = 0;delay(200);}
  //////// set out 0-28 V
  if(menu==0){
  if (newPosition != oldPosition){oldPosition = newPosition;
     u_out=u_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(u_out<0){u_out=0;}if(u_out>280){u_out=280;}u_dig = float(u_out/10.00)/u_k*4096/5.00;}}
  //////// set i 0-2.5 A
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     i_out=i_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(i_out<0){i_out=0;}if(i_out>250){i_out=250;}}}

  //////// lcd
  i_kz();
  lcd.setCursor(0, 0);if(menu==0){lcd.print("U*= ");}else{lcd.print("U = ");}if(u_out<100){lcd.print(" ");}
  lcd.print(float(u_out/10.00),1);lcd.print(" V "); 
  lcd.setCursor(11, 0);lcd.print(abs(i),2);lcd.print("A");
  lcd.setCursor(0, 1);if(menu==1){lcd.print("A*= ");}else{lcd.print("I = ");}lcd.print(float(i_out/100.00),2);lcd.print(" A ");
  i_kz();

  //////////////// EEPROM
  if(millis()-times>5000&&w==1){EEPROM.update(0,highByte(u_out));EEPROM.update(1,lowByte(u_out));EEPROM.update(2,i_out);menu=0;times=millis();w=0;}
  }//loop

void MCP4725(int data){ 
  byte buffer[3];
  buffer[0] = 0b01000000;
  // data=0;
  // buffer[0] = 0b01100000; // запись в память ЦАП 0 В
  buffer[1] = data >> 4;             
  buffer[2] = data << 4;
  Wire.beginTransmission(0x60);
  Wire.write(buffer[0]);
  Wire.write(buffer[1]);
  Wire.write(buffer[2]);
  Wire.endTransmission();
  } 
void i_kz(){ 
  i = analogRead(A0)/250.00*i_k;
  if(i > float(i_out/100.0)){MCP4725(0);lcd.setCursor(12, 1);lcd.print("ERR");delay(3000);power=1;}
  else{lcd.setCursor(12, 1);
  if(power==0){MCP4725(u_dig+i*4.00);lcd.print("ON ");}
  if(power==1){MCP4725(0);lcd.print("OFF");}
  }}

void to_Timer(){newPosition = myEnc.read()/4;}

166

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Убрал токовую защиту.

Подключите второй ЦАП, посмотрите его адрес в i2C сканере, он должен отличатся от первого ЦАП, запишите адрес второго ЦАПа в строке:

#define ADDR_MCP_I 0x62

В мониторе порта выводится цифровое значение подаваемое на ЦАПы, оно не должно превышать 4095 что равно 5 В на выходе.

#define ADDR_MCP_U 0x60
#define ADDR_MCP_I 0x62

#include <Wire.h>
#include <EEPROM.h>
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(8, 9);//CLK, DT
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

unsigned long times,oldPosition  = -999,newPosition;
int u_out,u_dig,menu,i_out,i_dig;
const float u_k = 5.600; // калибровка регулятора напряжения
const float i_k = 4.999; // калибровка регулятора тока

const float i_k_r = 0.975;// калибровка измерителя тока
const float r = 0.01;   // сопротивление шунта
float i;
byte w;

void setup(){
  Wire.begin();lcd.init();lcd.backlight();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);//  SW энкодер MENU
  pinMode(A0,INPUT); // input I
  u_out=EEPROM.read(0)*256+EEPROM.read(1);i_out=EEPROM.read(2);
  }

void loop(){
  reg_u(); 
  reg_i(); 
  i = analogRead(A0)/250.00*i_k_r;
  if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}

  //////// set out 0-28 V
  if(menu==0){
  if (newPosition != oldPosition){oldPosition = newPosition;
     u_out=u_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(u_out<0){u_out=0;}if(u_out>280){u_out=280;}u_dig = float(u_out/10.00)/u_k*4096/5.00;}
     Serial.print("U_DATA ");Serial.println(u_dig);
     }

  //////// set i 0-2.5 A
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     i_out=i_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(i_out<0){i_out=0;}if(i_out>250){i_out=250;}i_dig = float(i_out/10.00)/i_k*4096/5.00;}
     Serial.print("I_DATA ");Serial.println(i_dig);
     }

  //////// lcd
  lcd.setCursor(0, 0);if(menu==0){lcd.print("U*= ");}else{lcd.print("U = ");}if(u_out<100){lcd.print(" ");}
  lcd.print(float(u_out/10.00),1);lcd.print(" V "); 
  
  lcd.setCursor(11, 0);lcd.print(abs(i),2);lcd.print("A");
  
  lcd.setCursor(0, 1);if(menu==1){lcd.print("A*= ");}else{lcd.print("I = ");}lcd.print(float(i_out/100.00),2);lcd.print(" A ");

  //////////////// EEPROM
  if(millis()-times>5000&&w==1){EEPROM.update(0,highByte(u_out));EEPROM.update(1,lowByte(u_out));EEPROM.update(2,i_out);menu=0;times=millis();w=0;}
  }//loop

void reg_i(){MCP4725(ADDR_MCP_I,i_dig);}
void reg_u(){MCP4725(ADDR_MCP_U,u_dig);}

void to_Timer(){newPosition = myEnc.read()/4;}

void MCP4725(byte addr,int data){ 
  byte buffer[3];
  buffer[0] = 0b01000000;
  // data=0;
  // buffer[0] = 0b01100000; // запись в память ЦАП 0 В
  buffer[1] = data >> 4;             
  buffer[2] = data << 4;
  Wire.beginTransmission(addr);
  Wire.write(buffer[0]);
  Wire.write(buffer[1]);
  Wire.write(buffer[2]);
  Wire.endTransmission();
  } 

167

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

в порт выводится только значение "U", адрес второго ЦАПа удалось установить только 0х61

168

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

в порт выводится только значение "U",

Если перейти в регулировку тока должен выводится значение I (у меня выводится)

адрес второго ЦАПа удалось установить только 0х61

Это верный адрес?

Рекомендую проверить сканером адресов-http://forum.rcl-radio.ru/viewtopic.php?id=64

На платке ЦАП должны быть перемычки для смены адреса

169

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Про то что нужно перейти в регулировку тока не догадался) Все выводится, адрес верный, значение 4095 не превышается.

170

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Напряжение на ЦАПах меняется от 0 до 5В ?

171

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

liman324 пишет:

Напряжение на ЦАПах меняется от 0 до 5В ?

По току да от 0 до 5В, по напряжению от 0 до 3,2  потому что я предел 32 вольта поставил

172

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Как работает измерение тока и защита:
-Ток меньше выставленной уставки: измеряемое значение тока постоянно меняется сотые доли (можно от этого эффекта как то избавиться?)
- Ток больше выставленной уставки: изменяемое значение тока также меняется,  и плюс выставлено значение 0,22А а ограниченное значение составляет 0,12А

173

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

-Ток меньше выставленной уставки: измеряемое значение тока постоянно меняется сотые доли (можно от этого эффекта как то избавиться?)

Есть три варианта:

Перейти на LGT8F328P, 12 бит АЦП точность увеличится в 4 раза.

Использовать внешний АЦП, например MCP3421 18 бит, доступны будут даже единицы мА

Оставить адуино с 10 бит АЦП, но сделать усреднение измерения. Сделать 10 измерений в течении секунды и выводить среднее значение, стабильность показаний однозначно возрастет.

- Ток больше выставленной уставки: изменяемое значение тока также меняется,  и плюс выставлено значение 0,22А а ограниченное значение составляет 0,12А

1. калибровка напряжения строка - const float u_k = 5.600; // калибровка регулятора напряжения
нужно подобрать коэффициент, но можно сразу указать его, но для этого Вам нужно выставить на выходе ровно 20 В и написать мне цифровое значение ЦАП при этом напряжении.

2. откалибровать измеритель тока - const float i_k_r = 0.975;// калибровка измерителя тока

3. калибровка регулятора тока, проводить только после калибровки измерителя тока - const float i_k = 4.999; // калибровка регулятора тока

можно сразу указать его, но для этого Вам нужно выставить на выходе ровно 2 А и написать мне цифровое значение ЦАП при этом токе.

174 (2023-02-18 23:54:05 отредактировано Sergey-77)

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

liman324 пишет:

Есть три варианта:

Перейти на LGT8F328P, 12 бит АЦП точность увеличится в 4 раза.

Использовать внешний АЦП, например MCP3421 18 бит, доступны будут даже единицы мА

Оставить адуино с 10 бит АЦП, но сделать усреднение измерения. Сделать 10 измерений в течении секунды и выводить среднее значение, стабильность показаний однозначно возрастет.

LGT8F328P заказал, приедет в начале апреля;

МСР3421 у меня в наличии нет, только если заказывать;

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

Цель: точность 10 мА в уставке защиты и показаниях на экране.

можно сразу указать его, но для этого Вам нужно выставить на выходе ровно 2 А и написать мне цифровое значение ЦАП при этом токе.

const float u_k  откалибровал = 8,22
const float i_k_r откалибровал = 0.607

Выставил на экране 2А, в мониторе порта при этом выводится 3277

175

Re: LM723 + ARDUINO = ИСТОЧНИК ПИТАНИЯ 0-28В 0-2.5А С ЗАЩИТОЙ ПО ТОКУ

Выставил на экране 2А, в мониторе порта при этом выводится 3277

Вы подобрали коэффициент const float i_k = 4.999; ?
Если нет то нужно на выходе получить стабилизированный ток примерно 2 А, из мерить его и опубликовать число из монитора порта. Но можно подобрать коэффициент методом подбора.

Я сделал усреднение измерения

#define ADDR_MCP_U 0x60
#define ADDR_MCP_I 0x61

#include <Wire.h>
#include <EEPROM.h>
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(8, 9);//CLK, DT
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

unsigned long times,oldPosition  = -999,newPosition,times_ads;
int u_out,u_dig,menu,i_out,i_dig;
const float u_k = 8.22; // калибровка регулятора напряжения
const float i_k = 4.999; // калибровка регулятора тока

const float i_k_r = 0.607;// калибровка измерителя тока
const float r = 0.01;   // сопротивление шунта
float i,i_sum;
byte w;
int ads_i;

void setup(){
  Wire.begin();lcd.init();lcd.backlight();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);//  SW энкодер MENU
  pinMode(A0,INPUT); // input I
  u_out=EEPROM.read(0)*256+EEPROM.read(1);i_out=EEPROM.read(2);
  }

void loop(){
  reg_u(); 
  reg_i(); 
  if(millis()-times_ads>100){times_ads=millis();ads_i++;i_sum = i_sum + analogRead(A0)/250.00*i_k_r;}
  if(ads_i>9){ads_i=0;i = i_sum/10;i_sum=0;}
  if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}

  //////// set out 0-28 V
  if(menu==0){
  if (newPosition != oldPosition){oldPosition = newPosition;
     u_out=u_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(u_out<0){u_out=0;}if(u_out>280){u_out=280;}u_dig = float(u_out/10.00)/u_k*4096/5.00;}
     Serial.print("U_DATA ");Serial.println(u_dig);
     }

  //////// set i 0-2.5 A
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     i_out=i_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
     if(i_out<0){i_out=0;}if(i_out>250){i_out=250;}i_dig = float(i_out/10.00)/i_k*4096/5.00;}
     Serial.print("I_DATA ");Serial.println(i_dig);
     }

  //////// lcd
  lcd.setCursor(0, 0);if(menu==0){lcd.print("U*= ");}else{lcd.print("U = ");}if(u_out<100){lcd.print(" ");}
  lcd.print(float(u_out/10.00),1);lcd.print(" V "); 
  
  lcd.setCursor(11, 0);lcd.print(abs(i),2);lcd.print("A");
  
  lcd.setCursor(0, 1);if(menu==1){lcd.print("A*= ");}else{lcd.print("I = ");}lcd.print(float(i_out/100.00),2);lcd.print(" A ");

  //////////////// EEPROM
  if(millis()-times>5000&&w==1){EEPROM.update(0,highByte(u_out));EEPROM.update(1,lowByte(u_out));EEPROM.update(2,i_out);menu=0;times=millis();w=0;}
  }//loop

void reg_i(){MCP4725(ADDR_MCP_I,i_dig);}
void reg_u(){MCP4725(ADDR_MCP_U,u_dig);}

void to_Timer(){newPosition = myEnc.read()/4;}

void MCP4725(byte addr,int data){ 
  byte buffer[3];
  buffer[0] = 0b01000000;
  // data=0;
  // buffer[0] = 0b01100000; // запись в память ЦАП 0 В
  buffer[1] = data >> 4;             
  buffer[2] = data << 4;
  Wire.beginTransmission(addr);
  Wire.write(buffer[0]);
  Wire.write(buffer[1]);
  Wire.write(buffer[2]);
  Wire.endTransmission();
  }