1

Тема: XL4016

Основная статья - http://rcl-radio.ru/?p=131518

#define KALL_U 115
#define KALL_I 1.52
#define KALL_I_0 0.02

#include <Wire.h> 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
Encoder myEnc(6, 5);// DT, CLK
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);

float u=0, i_alarm=0;
long i_dig,i_sum,i;
int n,m;
bool w,w1,alarm,iu,off;
long times,oldPosition  = -999,newPosition,times0;

void setup() {
  delay(200);
  Wire.begin();
  Serial.begin(9600);
  pinMode(7,INPUT);        // SW ENCODER
  pinMode(12,INPUT_PULLUP);// OVERLOAD OFF
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  u = float(EEPROM.read(0));i_alarm=float(EEPROM.read(1));
  ADMUX = 0b000;
  ADCSRD |= 1 << REFS2;
  ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;
  cli();
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1;
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 5000;
  OCR1A = KALL_U*u/10;
  sei();
}

void loop(){
  while((ADCSRA & (1 << ADIF)) == 0);
  i_dig = (ADCL|ADCH << 8);
  i_sum = i_sum+i_dig;
  n++;if(n>999){n=0;i=i_sum/1000;i_sum=0;w=1;}  

  if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);}

  if(float(i)*KALL_I/1000.0-KALL_I_0>i_alarm/10.0){alarm=1;OCR1A = 0;}
  if(digitalRead(12)==LOW&&alarm==1){alarm=0;OCR1A = KALL_U*u/10;delay(200);}
  if(digitalRead(12)==LOW&&alarm==0 && off==0){off=1;alarm=0;OCR1A = 0;delay(200);}
  if(digitalRead(12)==LOW&&alarm==0 && off==1){off=0;alarm=0;OCR1A = KALL_U*u/10;delay(200);}

  if(iu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  u=u+newPosition;myEnc.write(0);newPosition=0;
  if(u<0){u=0;}if(u>250){u=250;}times=millis();if(alarm==0&&off==0){OCR1A = KALL_U*u/10;}w=1;w1=1;}
  }
  if(iu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  i_alarm=i_alarm+newPosition;myEnc.write(0);newPosition=0;
  if(i_alarm<0){i_alarm=0;}if(i_alarm>30){i_alarm=30;}times=millis();w=1;w1=1;}
  }
  
  if(w==1){w=0;
  
  u8g.firstPage();  
   do {
  u8g.drawLine(0, 26, 128, 26);u8g.drawLine(0, 53, 128, 53);
  u8g.setFont(u8g_font_profont29r); 
  u8g.drawStr(0,22,"U");u8g.setPrintPos(35, 22);u8g.print(u/10.0,1);u8g.drawStr(110,22,"V");
  u8g.drawStr(0,50,"I");u8g.setPrintPos(35, 50);u8g.print(float(i)*KALL_I/1000.0-KALL_I_0,2);u8g.drawStr(110,50,"A");
  u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(0, 64);u8g.print(i_alarm/10.0,1);
  if(iu==0){u8g.drawStr(25,64,"A ");}else{u8g.drawStr(25,64,"A*");}
  u8g.setPrintPos(60, 64);
  if(alarm==1){u8g.print("OVERLOAD");}
  if(alarm==0&&off==0){u8g.print("enabled ");}
  if(alarm==0&&off==1){u8g.print("disabled");}
  } while( u8g.nextPage() );}
   
 if(millis()-times>3000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i_alarm);w1=0;w=1;iu=0;myEnc.write(0);} 
  }

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

2

Re: XL4016

http://forum.rcl-radio.ru/uploads/images/2024/02/558674f4da6eb893a6c1b206aff44cfb.png

3

Re: XL4016

http://forum.rcl-radio.ru/uploads/images/2024/02/b3c76b4a4a5db997b767a6dd2a377564.png

http://forum.rcl-radio.ru/uploads/images/2024/02/8162a6c37d8183a4cf2c51bd02de1726.png

http://forum.rcl-radio.ru/uploads/images/2024/02/68853c3ab9c602cd4eb82e64a4ea77cf.png

http://forum.rcl-radio.ru/uploads/images/2024/02/983834a84de47312457fb5799df6f411.png

http://forum.rcl-radio.ru/uploads/images/2024/02/d82858993e681f4b60daa43447c90584.png

http://forum.rcl-radio.ru/uploads/images/2024/02/6721c2510f172b03a497e25a57ea332e.png

http://forum.rcl-radio.ru/uploads/images/2024/02/abc6c76e1e5ef2d6be37694ef04d51f0.png

4

Re: XL4016

http://forum.rcl-radio.ru/uploads/images/2024/02/563b5701e64182ba5f892ee5e430ceef.png

http://forum.rcl-radio.ru/uploads/images/2024/02/d06cc0a5a7aac6bcc862f8b5ece19b9d.png

http://forum.rcl-radio.ru/uploads/images/2024/02/b98685b7276c28bb7aec2bef3cd75651.png

http://forum.rcl-radio.ru/uploads/images/2024/02/0c67d39ea26ae14750df0eb1195c58ed.png

http://forum.rcl-radio.ru/uploads/images/2024/02/0a3258e37410c8919e62f692af364b3c.png

http://forum.rcl-radio.ru/uploads/images/2024/02/e17e9439a1ad8bbd9b94722290add6b3.png

5

Re: XL4016

Доброе утро. Очень интересно!
А можно все это, только с индикатором 1602 ( по шине i2c).
А почему у Вас 2 корпуса LM358? Ведь в одном корпусе LM два операционника.

6

Re: XL4016

А почему у Вас 2 корпуса LM358? Ведь в одном корпусе LM два операционника.

Были проблемы с импульсными помехами при измерении тока, возникла идея управлять XL4016 и измерять ток в разных корпусах, но это не помогло. Поэтому на фото 2 микросхемы. Проблема решена путем создания ООС по переменке в ОУ.

А можно все это, только с индикатором 1602 ( по шине i2c).

я подумаю над этим вопрососм

7

Re: XL4016

OLED нужно заказывать у китайцев, а 1606 есть у меня куча. соберу за вечер и протестирую

8

Re: XL4016

http://forum.rcl-radio.ru/uploads/images/2024/02/3652050fafea72fb34c524b528db1cbd.png

http://forum.rcl-radio.ru/uploads/images/2024/02/89b17b980e0ee2dd5c735e36933be373.png

http://forum.rcl-radio.ru/uploads/images/2024/02/be08547278a0ef89753e0a5081550d24.png



#define KALL_U 232
#define KALL_I 1.45
#define KALL_I_0 0.01

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>           // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
Encoder myEnc(6, 5);// DT, CLK
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 

float u=0, i_alarm=0;
long i_dig,i_sum,i;
int n,m;
bool w,w1,alarm,iu,off;
long times,oldPosition  = -999,newPosition,times0;

void setup() {
  delay(200);
  Wire.begin();
  Serial.begin(9600);
  lcd.init();lcd.backlight();
  pinMode(7,INPUT);        // SW ENCODER
  pinMode(12,INPUT_PULLUP);// OVERLOAD OFF
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  u = float(EEPROM.read(0));i_alarm=float(EEPROM.read(1));
  ADMUX = 0b000;
  ADCSRD |= 1 << REFS2;
  ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;
  cli();
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1;
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 10000;
  OCR1A = KALL_U*u/10;
  sei();
}

void loop(){
  while((ADCSRA & (1 << ADIF)) == 0);
  i_dig = (ADCL|ADCH << 8);
  i_sum = i_sum+i_dig;
  n++;if(n>999){n=0;i=i_sum/1000;i_sum=0;w=1;}  

  if(digitalRead(7)==LOW &&iu==0){iu=1;times=millis();w=1;w1=1;delay(200);}
  if(digitalRead(7)==LOW &&iu==1){iu=0;times=millis();w=1;w1=1;delay(200);}

  if(float(i)*KALL_I/1000.0-KALL_I_0>i_alarm/10.0){alarm=1;OCR1A = 0;}
  if(digitalRead(12)==LOW&&alarm==1){alarm=0;OCR1A = KALL_U*u/10;delay(200);}
  if(digitalRead(12)==LOW&&alarm==0 && off==0){off=1;alarm=0;OCR1A = 0;delay(200);}
  if(digitalRead(12)==LOW&&alarm==0 && off==1){off=0;alarm=0;OCR1A = KALL_U*u/10;delay(200);}

  if(iu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  u=u+newPosition;myEnc.write(0);newPosition=0;
  if(u<0){u=0;}if(u>250){u=250;}times=millis();if(alarm==0&&off==0){OCR1A = KALL_U*u/10;}w=1;w1=1;}
  }
  if(iu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  i_alarm=i_alarm+newPosition;myEnc.write(0);newPosition=0;
  if(i_alarm<0){i_alarm=0;}if(i_alarm>30){i_alarm=30;}times=millis();w=1;w1=1;}
  }
  
  if(w==1){w=0;
  lcd.setCursor(0,0);lcd.print("U ");lcd.print(u/10.0,1);lcd.print("V ");
  lcd.setCursor(0,1);lcd.print("I ");lcd.print(float(i)*KALL_I/1000.0-KALL_I_0,2);lcd.print("A ");
  lcd.setCursor(11,1);lcd.print(i_alarm/10.0,1);

  if(iu==0){lcd.setCursor(14,1);lcd.print("A ");}else{lcd.print("A*");}
  lcd.setCursor(8,0);
  if(alarm==1){lcd.print("OVERLOAD");}
  if(alarm==0&&off==0){lcd.print("enabled ");}
  if(alarm==0&&off==1){lcd.print("disabled");}
 }
   
 if(millis()-times>3000 && w1==1){EEPROM.update(0,u);EEPROM.update(1,i_alarm);w1=0;w=1;iu=0;myEnc.write(0);} 
  }

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

9

Re: XL4016

Классный проект. Если его сделать на двухцветном экране?
Нижнюю часть текста переместить наверх( там желтое поле), тогда измерения будут прозодить веселей и красивее.

10

Re: XL4016

Добрый день.
К сожалению у меня чип XL4015, просто надпись затерта и я его определил как 16-й.
Но схемы включения у них одинаковые, так что начал на XL4015 собирать. Что получится напишу позже.
Впросы. -Скеч влезет в Атмегу8 ?
             -Возможно-ли ввести в эту схему регулировку тока? В популярных модулях на
               этом чипе регулировка тока есть.
              (но это не срочно, сначала разберусь с этой схемой)

11

Re: XL4016

Скетч рассчитан только для lgt8f328

12 (2024-02-20 15:56:12 отредактировано sanj76a)

Re: XL4016

на ардуино будет работать?

13 (2024-02-20 16:01:59 отредактировано sanj76a)

Re: XL4016

не знаю что делать lgt у меня нет, попробую собрать на ардуинке

14

Re: XL4016

В принципе должно, но показания тока будут неверные. Используется lgt, так как иметься АЦП 12 бит и внутренний ИОН 4.096В

15

Re: XL4016

очень жаль. куплю lgt тогда займусь