Универсальный Ардуино пробник

Novice User
Offline
Зарегистрирован: 25.09.2017

Что-то при измерении собственного источника питания как и у вас отбрасывается дробная часть,попробую разобраться,видимо из-за этого омметр немного врет,в остальном все отлично!

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

Что-то при измерении собственного источника питания как и у вас отбрасывается дробная часть,попробую разобраться,видимо из-за этого омметр немного врет,в остальном все отлично!

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

Novice User
Offline
Зарегистрирован: 25.09.2017

заработало измерение питания...

long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}

 

svm
Offline
Зарегистрирован: 06.11.2016

Все Ok.  Ищем следующие глюки?

MaksVV
Offline
Зарегистрирован: 06.08.2015

на oled 0.96 будет популярно. Полезный прибор. 

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

на счет 0.96 олед согласен

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Надо взять и себе на заметку.

arduinec
Offline
Зарегистрирован: 01.09.2015

Novice User пишет:

заработало измерение питания...

long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}

Функция readVcc() возвращает long, а return возвращает float.

Может лучше так сделать?

  long result = (high<<8) | low;
  result = (1100 * 1023L) / result;
  return result;

Кстати, можно не заморачиваться с ADCL и ADCH, а сразу взять ADC.

P.S. Пробник ещё и температуру может мерять: http://arduino.ru/forum/programmirovanie/sysinfo-arduino

svm
Offline
Зарегистрирован: 06.11.2016

arduinec пишет:

Novice User пишет:

заработало измерение питания...

long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}

Функция readVcc() возвращает long, а return возвращает float.

Может лучше так сделать?

  long result = (high<<8) | low;
  result = (1100 * 1023L) / result;
  return result;

Кстати, можно не заморачиваться с ADCL и ADCH, а сразу взять ADC.

P.S. Пробник ещё и температуру может мерять: http://arduino.ru/forum/programmirovanie/sysinfo-arduino

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

И еще можно вопросик. Что означает "L" после 1023 ? Я особо глубоко в программирование не погрузился еще. Изучаю по мере надобности. 

arduinec
Offline
Зарегистрирован: 01.09.2015

svm пишет:

Что означает "L" после 1023 ?

L после 1023 означает, что это число формата long.

svm
Offline
Зарегистрирован: 06.11.2016

Ok! 

Novice User
Offline
Зарегистрирован: 25.09.2017

Немного переделал измерение сопротивления-незачем там мерить напряжение питания-теперь сопротивления измеряются без мельтешения цифр и точнее

итоговая программа,вроде пока все нормально


// Входом частотомера является пин цифровой пин 5
#include <OLED_I2C.h>
#include <Wire.h>
OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];// 4 х 6 пикселей
//extern uint8_t MediumNumbers[];//12 х 16 пикселей
extern uint8_t BigNumbers[];//14 х 24 пикселей
//extern uint8_t MegaNumbers[];

  volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 

 long adc_buff,rezd,rezult;
 float u_del,u_izm,rez;
 byte ri,x,y,ro;// режим измерения

//***************************************************************

void setup()
{
 myOLED.begin();
  myOLED.setFont(SmallFont); 
 Serial.begin(9600); 
 Wire.begin();
 TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
 }
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop(){
start:
/*
myOLED.setFont(SmallFont);
x=50;
rez=readVcc()*1; //myOLED.printNumI(rezult,10, x);
    myOLED.setFont(SmallFont);
    rezult=rez/1000;rezult=rezult%10; myOLED.printNumI(rezult,1, x);
    myOLED.setFont(SmallFont);myOLED.print(".", 7, x);
    myOLED.setFont(SmallFont);
    rezult=rez/100;rezult=rezult%10; myOLED.printNumI(rezult,13, x);
    rezult=rez/10;rezult=rezult%10; myOLED.printNumI(rezult,19, x);
    //rezult=rez/1;rezult=rezult%10; myOLED.printNumI(rezult,26, x);
    myOLED.update();
*/    
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
pinMode(8, OUTPUT);     // выводим на 8 пин 0, выключаем спикер
digitalWrite(8,0); 
  
  //****************************  ЧАСТОТОМЕР ******************************************
  ri=0;
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // загрубляем вход (борьба с наводками)

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц 10 устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
//int_tic=0; TCNT1 = 0; 
rez=tic;
if (tic<1)goto voltmeter;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);// Время измерения
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
//int_tic=0; TCNT1 = 0; 
rez=tic; goto vyv;
//**********************************************************************
//вольтметр
voltmeter:
   ri=1; 
  analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*12.07;//6.133;//12.335; //1.1*11.214 - реальный коэфф делителя   
if (adc_buff > 150) goto vyv;   //если есть напряжения выводим - иначе измеряем сопротивление
//************************************************************************
rezist:
// ---------------ВЫКЛЮЧЕНИЕ ДИСПЛЕЕВ---------------------


//#############################  4,719 kOm  ######################################
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=2;
pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
  delay(3);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;///16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_izm= (float)adc_buff;///16368*readVcc()
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (rez>1000) goto vyv;
//goto vyv;
 //#############################  430 Om  ######################################
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 470 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;//16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
 u_izm= (float)adc_buff;//16368*readVcc()
rez= float(u_izm*469)/float(u_del-u_izm);// для 430 om
if (u_izm>=0.99) goto vyv;
//goto start;
vyv:
/////////////////////////////////////////////////////////////////////////

pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
//myOLED.clrScr();

if (ri==0){;//          ******************************ВЫВОД ПОКАЗАНИЙ ЧАСТОТОМЕРА***********************************
if (ro!=0){ myOLED.clrScr();ro=0;}

Serial.print(rez,1);
    myOLED.setFont(BigNumbers);  
    x=25;//ПОЛОЖЕНИЕ ПО Х
    rezult=rez/1000000;rezult=rezult%10; myOLED.printNumI(rezult,10, x);
    rezult=rez/100000;rezult=rezult%10; myOLED.printNumI(rezult,26, x);
    rezult=rez/10000;rezult=rezult%10; myOLED.printNumI(rezult,42, x);
    rezult=rez/1000;rezult=rezult%10; myOLED.printNumI(rezult,58, x);
    myOLED.setFont(SmallFont);myOLED.print(".", 72, x+17);
    myOLED.setFont(BigNumbers);
    rezult=rez/100;rezult=rezult%10; myOLED.printNumI(rezult,78, x);
    rezult=rez/10;rezult=rezult%10; myOLED.printNumI(rezult,94, x);
    rezult=rez/1;rezult=rezult%10; myOLED.printNumI(rezult,110, x);
  //myOLED.printNumI(rez,10, 45);
  myOLED.update();
Serial.println(" - HZ");
myOLED.setFont(SmallFont);
myOLED.print("FREQUENCY", CENTER, 0);
myOLED.update();
goto start;
}
if (ri==1){;//                 ******************************ВЫВОД ПОКАЗАНИЙ ВОЛЬТМЕТРА***********************************
if (ro!=1){ myOLED.clrScr();ro=1;}
Serial.print(rez,5);
myOLED.setFont(SmallFont);
myOLED.print("VOLTMETER", CENTER, 0);
myOLED.setFont(BigNumbers);
rez=rez*100.0;
x=25;//ПОЛОЖЕНИЕ ПО Х
y=50;//ПОЛОЖЕНИЕ ПО Y 58
//myOLED.setFont(BigNumbers);
rezult=rez/1000;rezult=rezult%10; myOLED.printNumI(rezult,y, x);y=y+14;
rezult=rez/100;rezult=rezult%10; myOLED.printNumI(rezult,y, x);y=y+14;
myOLED.setFont(SmallFont);myOLED.print(".", y, x+17);y=y+7;
myOLED.setFont(BigNumbers);
rezult=rez/10;rezult=rezult%10; myOLED.printNumI(rezult,y, x);y=y+14;
rezult=rez/1;rezult=rezult%10; myOLED.printNumI(rezult,y, x);

//myOLED.printNumI(rezult,LEFT, 10);
myOLED.update();
Serial.println(" - Volt");
myOLED.setFont(SmallFont);
myOLED.print(" V", RIGHT, x+17);//myOLED.print("VOLTMETER", LEFT, 0);
myOLED.update();
goto start;
}
if (rez> 1999999){;     //Щуп в воздухе или сопроивление> 1 MOm
Serial.println("- ??? - ");
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print("- ??? - ",CENTER, 0);
myOLED.update();
goto start;
}
if (rez >=0 && rez < 1){;           //Щупы 3акорочены или сопроивление < 1 Om
if (ro!=2){ myOLED.clrScr();ro=2;}
pinMode(8, OUTPUT);     // выводим на 8 пин 0, подключаем спикер
digitalWrite(8,1);  
  Serial.print(rez,5);
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(rez,RIGHT, 25);
  myOLED.update();
  Serial.println(" short ");
  myOLED.setFont(SmallFont);
  myOLED.print("  short  ", CENTER, 0);
  myOLED.update();
  delay(100);
goto start;
}
if (rez< 1000){;//ЕСЛИ МЕНЕЕ 1000 ОМ ТО ВЫВОДИМ В ОМАХ
if (ro!=2){ myOLED.clrScr();ro=2;}
Serial.print(rez,1);
myOLED.setFont(SmallFont);
  myOLED.print(" OMMETER ", CENTER, 0);
myOLED.setFont(BigNumbers);
x=25;//ПОЛОЖЕНИЕ ПО Х
y=58;//ПОЛОЖЕНИЕ ПО Y
//myOLED.printNumI(rez,y, x);
myOLED.setFont(BigNumbers);
    rezult=rez/100;rezult=rezult%10; myOLED.printNumI(rezult,y, x);y=y+14;//выводим сотни ом
    rezult=rez/10;rezult=rezult%10;myOLED.printNumI(rezult,y, x);y=y+14;//выводим десятки ом
    rezult=rez/1;rezult=rezult%10;myOLED.printNumI(rezult,y, x);y=y+14;//выводим ом
myOLED.update();
myOLED.setFont(SmallFont);
myOLED.print(" Om", RIGHT, x+17);//myOLED.print(" - OM", LEFT, 0);
myOLED.update();
Serial.println(" - OM");
goto start;
}
if (ro!=4){ myOLED.clrScr();ro=4;}
myOLED.setFont(SmallFont);
  myOLED.print(" OMMETER ", CENTER, 0);
myOLED.setFont(BigNumbers);
     x=25;//ПОЛОЖЕНИЕ ПО Х
     y=50;//ПОЛОЖЕНИЕ ПО Y 58
    //if (rez> 10000){y=58;;}
    //if (rez> 100000){y=58;;}
    //if (rez> 100000){y=58;;}
    rezult=rez/1000000;rezult=rezult%10; if (rez> 1000000){myOLED.printNumI(rezult,y, x);y=y+14;}
    rezult=rez/100000;rezult=rezult%10;if (rez> 100000){ myOLED.printNumI(rezult,y, x);y=y+14;}
    rezult=rez/10000;rezult=rezult%10;if (rez> 10000){ myOLED.printNumI(rezult,y, x);y=y+14;}
    rezult=rez/1000;rezult=rezult%10;myOLED.printNumI(rezult,y, x);y=y+14;//if (rez< 1000000){ myOLED.printNumI(rezult,y, x);y=y+14;}
    myOLED.setFont(SmallFont);if (rez< 1000000){myOLED.print(".", y, x+17);y=y+7;}
    myOLED.setFont(BigNumbers);
    rezult=rez/100;rezult=rezult%10;if (rez< 100000){  myOLED.printNumI(rezult,y, x);y=y+14;}//выводим если менее 10 ком
    rezult=rez/10;rezult=rezult%10;if (rez< 10000){  myOLED.printNumI(rezult,y, x);y=y+14;}//выводим если менее 1 ком
    rezult=rez/1;rezult=rezult%10;if (rez< 1000){  myOLED.printNumI(rezult,y, x);y=y+14;}//выводим если менее 10 ком
myOLED.update();
myOLED.setFont(SmallFont);
myOLED.print("kOm", RIGHT, x+17);//myOLED.print(" - kOm", LEFT, 0);
myOLED.update();
Serial.println(" - kOm");
goto start;
}
long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}
svm
Offline
Зарегистрирован: 06.11.2016

В принципе для пробника такой вариант наверное подойдет. У меня вначале было то-же самое. Потом почитал как измеряер сопротивленмя транзистор тестер. Там если падение напряжения на измеряемом сопротивлении менее 1.1 В импользуют опорное 1.1 В, что дает увеличение точностм в 4.5 раза. Но при этом нужно  точное UCC 5 В или использовать внешний точный источник опорного напряжения. Или измерять напряжение питания, вот я и пошел этим путем. Но путь оказался тупиковым. Хотя теоретически и верный. Слишком много факторов влияет. А Ваш вариант исключает влияние напряжения питания , т.к. сопртивление от него не зависит, а зависит от соотношения напряжений на плечах делителя.

Novice User
Offline
Зарегистрирован: 25.09.2017

ну сопротивления от 100 ом до 91 ком измеряет с точностью процентов 5,более чем достаточно,это же пробник ...

вот что подумал-скрестить с пультоскопом в режиме частотомера-если частота менее 10 кгц то выводить форму сигнала,места на экране достаточно

svm
Offline
Зарегистрирован: 06.11.2016

Хотелось бы чтобы начинал хотя бы от 1 Ома и до 1 МОма. При точном питании 5 В.и замене измеренного на фиксированное 5В. В этих пределах работает нормально, но при питании от USB или мсточника испытуемого устройства врет. Попробую пойти вашим путем, но добавлю еще один поддиапазон. Резистор на 47 кОм при измерении сопротивлений можно задействовать (это увеличит диапазон вверх), а внизу все-таки придется использовать измерение напряжения питания. 

 

Правда у меня почему-то резистор вместо 47 кОм оказался на 18. А вместо 470 Ом- 680 поэтому странные числа в формулах. 680 лучше бы заменить до 470, а может и меньше чтобы сдвинуться вниз. Главное выход не перегузить по току.

Пробовал мерять от 1 ома до 3,9 МОм. На омах меньше 10 подвирает. Теперь осталось еще правильно задать условия переключения диапазонов. Но это уже мелочи. Удалось даже отказаться от выключения дисплея на время измерения. Показания стабильные, а если еще и младший разряд убрать, то все что меньше мегаома стоят как вкопанные.

Измененный код измерения резисторов:


rezist:
// ---------------ВЫКЛЮЧЕНИЕ ДИСПЛЕЕВ---------------------


//#############################  18 kOm  ######################################

  ri=3;
pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(3);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*18000)/float(u_del-u_izm);// для 18 kOm
if (u_izm>1500){;
info();
goto vyv;
}

//#############################  4,7 kOm  ######################################

  ri=2;

pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(3);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (u_izm>1500){;
info();
goto vyv;
}

 //#############################  680 Om  ######################################
 
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 680 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;//16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
 u_izm= (float)adc_buff;//16368*readVcc()
rez= float(u_izm*680)/float(u_del-u_izm);// для 680 om
if (u_izm >1500){
info();
  goto vyv;
}
//Если  точность не удовлетворяет переходим на опорное 1,1 В
// измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
//**************************************************************
ri=5;
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff/16368*(float)readVcc();

// измеряем напряжение на измеряемом резисторе
analogReference(INTERNAL);// подключаем опорное 1.1 В
delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_izm= (float)adc_buff/16368*1100;
(rez)= float(u_izm*680)/float(u_del-u_izm);
info();
vyv:
/////////////////////////////////////////////////////////////////////////

void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("UCC   = ");
Serial.print((float)readVcc()/1000);
Serial.println(" V");
Serial.print("U_del - ");
Serial.println(u_del);
Serial.print("U_izm - ");
Serial.println(u_izm);
Serial.print("REZULT- ");
Serial.println((float)rez);
Serial.println("");
Serial.println("-------<>-------");
//delay(1500);
}

И вот полный вариант (без индикации). Изулучшений можно применить измерение на аналоговых входах предложенное  yul-i-an в 28 посту, что заметно сократие потребление памяти, и код будет легче читаться.



 // Входом частотомера является пин цифровой пин 5
 #include <Wire.h>
  volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 
 long adc_buff,rezd;
 float u_del,u_izm,rez;
 byte ri;// режим измерения

//***************************************************************

void setup()
{
 Serial.begin(9600); 
 Wire.begin();
 TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
 }
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop(){
start:
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
pinMode(8, OUTPUT);     // выводим на 8 пин 0, выключаем спикер
digitalWrite(8,0); 
  
  //****************************  ЧАСТОТОМЕР ******************************************
  ri=0;
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // загрубляем вход (борьба с наводками)

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц 10 устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
//int_tic=0; TCNT1 = 0; 
rez=tic;
if (tic<1)goto voltmeter;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);// Время измерения
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
//int_tic=0; TCNT1 = 0; 
rez=tic; goto vyv;
//**********************************************************************
//вольтметр
voltmeter:
   ri=1; 
  analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*6.133;// - реальный коэфф делителя
if (adc_buff > 150) goto vyv;   //если есть напряжения выводим - иначе измеряем сопротивление
//************************************************************************
rezist:

//#############################  18 kOm  ######################################

  ri=3;
pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*18000)/float(u_del-u_izm);// для 18 kOm
if (u_izm>1000){;//Если значение достоверно - вывод на индикацию
info();
goto vyv;
}

//#############################  4,7 kOm  ######################################

  ri=2;

pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (u_izm>1500){;
info();
goto vyv;
}

 //#############################  430 Om  ######################################
 
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 470 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;//16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
 u_izm= (float)adc_buff;//16368*readVcc()
rez= float(u_izm*700)/float(u_del-u_izm);// для 680 om
if (u_izm >1500){
info();
  goto vyv;
}
//Если  точность не удовлетворяет переходим на опорное 1,1 В
// измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
//**************************************************************
ri=5;
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff/16368*(float)readVcc();

// измеряем напряжение на измеряемом резисторе
analogReference(INTERNAL);// подключаем опорное 1.1 В
delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_izm= (float)adc_buff/16368*1100;
(rez)= float(u_izm*790)/float(u_del-u_izm);
info();
vyv:
/////////////////////////////////////////////////////////////////////////
vdspl_7();// Вывод на 7 сегментный дисплей !!!! закомментировать или написать свой вывод
goto start;//!!!!!!!!!!!!!! закомментировать если нужен вывод в серийный монитор

if (ri==0){;
Serial.print(rez,1);
Serial.println(" - HZ");
goto start;
}
if (ri==1){;
Serial.print(rez,5);
Serial.println(" - Volt");
goto start;
}
if (rez> 7999999){;     //Щуп в воздухе или сопроивление> 1 MOm
Serial.println("- ??? - ");
goto start;
}
if (rez >=0 && rez < 1){;           //Щупы 3акорочены или сопроивление < 1 Om
pinMode(8, OUTPUT);     // выводим на 8 пин 0, подключаем спикер
digitalWrite(8,1);  
  Serial.print(rez,5);
  Serial.println(" short ");
  delay(100);
goto start;
}
if (rez< 1000){;
Serial.print(rez,1);
Serial.println(" - OM");
goto start;
}
rez=rez/1000;
Serial.print(rez,1);
Serial.println(" - kOm");
goto start;
}

long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}

//************* отладочная информация *****************
void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("UCC   = ");
Serial.print((float)readVcc());
Serial.println(" V");
Serial.print("U_del - ");
Serial.println(u_del);
Serial.print("U_izm - ");
Serial.println(u_izm);
Serial.print("REZULT- ");
Serial.println((float)rez);
Serial.println("");
Serial.println("-------<>-------");
//delay(1500);
}

Насчет пультоскопа, наверное проще в него добавить пробник, если память позволит.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

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

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Автор. Могу плату разработать под такой дисплей для серийного производства и сделать из этого проекта продажный продукт. если будут корпуса. Ябкупилсебе. Мульиметр реально не удобный на заваленном железками столе.

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

Автор. Могу плату разработать под такой дисплей для серийного производства и сделать из этого проекта продажный продукт. если будут корпуса. Ябкупилсебе. Мульиметр реально не удобный на заваленном железками столе. 

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

Насчет коммерческого использования сомнительно. Девайс специфический, защит никаких нет и поэтому лазить им можно только в ардуиноподобных устройствах. Чтобы сильно не вылезать за габариты дисплея, делать придется на 328 или 168 и явно не в DIP корпусе. Что тоже не каждый сможет распаять.

Ну и насчет корпусов вряд-ли партия будет такой, чтобы заказать литье. Как вариант прилагать к плате STLку и пусть каждый печатает или сам или где-то на стороне. 

Но это чисто мои рассуждения. Может кто еще что скажет.

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

У меня как оно бывает. Публикую девайс и открытый код, а собрать может 1 из 10 желающих. Остальные просят - сделай нам за деньги. Я делаю. Код остается открытым для личного пользования, кто хочет переписывает для себя. Так и живем. Но у программистов часто сложности с железом. С правильной разводкой и подбором деталей. Мне Мегу в любом корпусе паять не сложно (с микроскопом), а другим сложно. У каждого своя работа и возможности. И платы если на фабрике заказывать, то выгодно от 10 штук, причем на одной плате 10x10 можно много маленьких разместить, но куда их потом девать, если нужен 1-2 девайса для себя? Отсюда и сложности в повторении. Автор придумал классную вещь, для себя собрал, показал другим и затихла тема. И не все готовое можно у китайцев купить, иначе бы этого форума не было!

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

 И платы если на фабрике заказывать, то выгодно от 10 штук, причем на одной плате 10x10 можно много маленьких разместить, но куда их потом девать, если нужен 1-2 девайса для себя? Отсюда и сложности в повторении.

Я думаю голые платы, многие бы взяли. Но гемморой с отправкой отбивает все желание заниматься этим.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ни какого геморроя с отправкой. Конверт, плату на скотч к открытке. 47 рублей. 

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

Ни какого геморроя с отправкой. Конверт, плату на скотч к открытке. 47 рублей. 

Такой вариант, я не предполагал. Отправка  у меня обычно занимает от часа до трех. Поездка нна почту или в ТК, стояние в очереди, заполнение документов . Правда я в основном отправлял достаточно габаритные предметы.

Novice User
Offline
Зарегистрирован: 25.09.2017

плату сделать-час максимум,я понимаю что чел хочет сорвать бабло,но ...

проект сырой,на сегодняшний момент-пока все норм,добавил измерение при подключении резистора 47 ком-при измерении более 200 ком показания  скачут-видимо сказывается входное сопротивление порта,программатор при этом отключен от платы,или моя атмега из шины и потому глюк...

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

//#############################  47 kOm  ######################################
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=2;
pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 47 kOm
  delay(3);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;///16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_izm= (float)adc_buff;///16368*readVcc()
rez= float(u_izm*47200)/float(u_del-u_izm);// для 4,7 kOm было 4750
if (rez>4700) goto vyv;
//goto vyv;

еще провел испытания-короче надо делать переключение пределов измерения (я про омметр) если измеряемое сопротивление менее "опорного"*0,1,то  есть

ставим 47 ком-если менее 4,7 ком то ставим "опорное" 4,7 ком и т д,кто в теме тот поймет...

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

проект сырой,на сегодняшний момент-пока все норм,добавил измерение при подключении резистора 47 ком-при измерении более 200 ком показания  скачут-видимо сказывается входное сопротивление порта,программатор при этом отключен от платы,или моя атмега из шины и потому глюк...

еще провел испытания-короче надо делать переключение пределов измерения (я про омметр) если измеряемое сопротивление менее "опорного"*0,1,то  есть ставим 47 ком-если менее 4,7 ком то ставим "опорное" 4,7 ком и т д,кто в теме тот поймет...

Скачущие показания - связаны скорее всего с наводками. Сопртивление на входе высокое и сказывается влияние индустриальных помех. У меня к щупу идет кусочек экранированного кабеля. При измерении резистора 3,9 МОм показания скачут в пределах 5 кОм если вставляю резистор прямо в разъем щупа, если используются проводки около 100 мм до платы с тестовыми резисторами, то показания пляшут уже килоом на 50, а иногда и больше. Сейчас проверил с резистором 510 кОм. При включении прямо на вход пробника, показани неизменны до тысячных. Если приближаю палец к резистору, то на расстоянии около 10 мм начинается болтанка до 2 кОм. При касании резистора - показывает напряжение 0,07 В. Кроме того зависит от питания.  При питании от USB на трех разных ПК - на работе, в мастерской и основном достаточно заметна. Попрбую запитать от STEP-UP преобразователя. Пришли только сегодня и получить не успел. Но я думаю в течении трех дней смогу проверить.

Novice User  если есть возможность подключите небольшой кондючок на А0, возможно удастся избавиться от наводок от переменки. А то у меня уже в корпусе и проблема с изменениями.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Novice User пишет:

плату сделать-час максимум,я понимаю что чел хочет сорвать бабло,но ...

Человек зарабатывает этим бабло. Человек хочет помочь запустить проект в жизнь. У человека много своих проектов и без этого. Человек не рассчитывает на сколь-нибудь значимую прибыль именно от этого пробника. 

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

Человек зарабатывает этим бабло. Человек хочет помочь запустить проект в жизнь. У человека много своих проектов и без этого. Человек не рассчитывает на сколь-нибудь значимую прибыль именно от этого пробника. 

Не надо нервничать. Просто напишите: "Я могу изготовить печатные платы такого- прибора по такой цене" будьте проще и люди к Вам потянутся. А то Ваше предложение звучало как-то двусмысленно, как-бы Вы можете сделать, но что за этим стоит - неясно. 

Но Все равно сначала девайс нужно отработать, а потом говорить о серии.

Если проект дойдет до кончной стадии, можно будет к Вам обратиться?

Novice User
Offline
Зарегистрирован: 25.09.2017

я пока воюю с выключателем питания,схема отсюда https://img.mysku-st.ru/uploads/images/02/55/13/2014/07/29/6a7ae4.jpg ,не могу понять как сделать длинное нажатие кнопки=выключение,а провода у меня так есть-длинные,20 см где-то,уменьшу и отпишусь...

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

я пока воюю с выключателем питания,схема отсюда https://img.mysku-st.ru/uploads/images/02/55/13/2014/07/29/6a7ae4.jpg ,не могу понять как сделать длинное нажатие кнопки=выключение,а провода у меня так есть-длинные,20 см где-то,уменьшу и отпишусь...

А смысл делать выключатель питания? Ну надоело работать все выключили и ушли. Я решил в дежурном режиме выводить температуру (которая мне по барабану)  и время.  Вот сейчас лежит пробник и показывает цифирь. Вокруг темнота, а он живой, и даже немного освещает комнату. Ну а насчет длительности нажатия - используйте http://arduino.ru/Reference/Millis  или что-то с ними не получается?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

SVM, обращайтесь как код допилите. Обсудим.

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

SVM, обращайтесь как код допилите. Обсудим.

Ok!

Novice User
Offline
Зарегистрирован: 25.09.2017

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

А ночью и так есть освещение, http://radiokot.ru/konkursCatDay2017/33/

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

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

А ночью и так есть освещение, http://radiokot.ru/konkursCatDay2017/33/

Ok!  но все-таки будет время попробуйте кондюк на А0. С длинными проводами. Постараться подобрать минимально достаточную емкость. При этом возможно придется увеличить задержки перед измерениями вольтметра и омметра. Чтобы показания устаканились.

bwn
Offline
Зарегистрирован: 25.08.2014

Novice User пишет:

я пока воюю с выключателем питания,схема отсюда https://img.mysku-st.ru/uploads/images/02/55/13/2014/07/29/6a7ae4.jpg ,не могу понять как сделать длинное нажатие кнопки=выключение,а провода у меня так есть-длинные,20 см где-то,уменьшу и отпишусь...

Надоест воевать с программным, берите аппаратный. Правая часть начиная с VT3 не нужна, кроме диода VD1, без него не выключится. Самоотключение примерно 3В.
Питание 3,3В от лития не очень удобно, чтобы высосать весь заряд придется ставить SEPIC, при 5В достаточно обычной повышайки. ИМХО.

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

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

svm
Offline
Зарегистрирован: 06.11.2016

MaksVV пишет:

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

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

Novice User
Offline
Зарегистрирован: 25.09.2017

у меня стоит  XC6206P332 ,минимальное входное 3,36 в при 3,3 в на выходе-специально замерил,и

вовсе незачем высасывать всю энергию аккумулятора-этому есть предел,иначе аккумулятоу кердык

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

у меня стоит  XC6206P332 ,минимальное входное 3,36 в при 3,3 в на выходе-специально замерил,и

вовсе незачем высасывать всю энергию аккумулятора-этому есть предел,иначе аккумулятоу кердык

Удалось победить кнопку выключения?

svm
Offline
Зарегистрирован: 06.11.2016

?

Novice User
Offline
Зарегистрирован: 25.09.2017

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

имеются точные резисторы (1 %),110 ком,220 ком и 510 ком,так вот если выставить чтоб резисто 220 ком измерял точно (220 ком) то резистор 110 ком показывает 108 ком,а резистор 510 ком показывает 516 ком,какая то странная нелинейность...

в режиме частотомеа если частота менее 10 кгц сделал отображение формы сигнала,но экран зависает намертво

попробую переписать на баском авр,что там покажет...

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

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

имеются точные резисторы (1 %),110 ком,220 ком и 510 ком,так вот если выставить чтоб резисто 220 ком измерял точно (220 ком) то резистор 110 ком показывает 108 ком,а резистор 510 ком показывает 516 ком,какая то странная нелинейность...

в режиме частотомеа если частота менее 10 кгц сделал отображение формы сигнала,но экран зависает намертво

попробую переписать на баском авр,что там покажет...

Ясно, пробник потихоньку превращается в некое подобие "Магического шара". Скоро можно будет даже не подключая щупы (положить рядом с платой) и он на экране схему нарисует и сктч распечатает.

Насчет резисторов в принципе не страшно, но интересно как это получается. Если бы разница показаний у 110 и 510 кОм была в разные стороны логика былы-бы, а так неясно. Вариантов не так уж и много. Возможно  диапазоны переключаюся? Других вариантов при таких странных результатах в голову не приходит. Ели только не сами резисторы. Для 110 кОм 1% это 1,1 кОм , а для 510 это уже 5,1 кОм. Если у 220  кОм  номинал ня 1 % в минусе, а у 110 и510 в плюсе, то так примерно и получится.

Novice User
Offline
Зарегистрирован: 25.09.2017

Ну до такого такого шара еще далеко,смирился с показаниями омметра,для пробника вполне достаточно

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

я пока воюю с выключателем питания,схема отсюда https://img.mysku-st.ru/uploads/images/02/55/13/2014/07/29/6a7ae4.jpg

Сегодня попрбовал запитать пробник вот от такого китайского девайса https://ru.aliexpress.com/item/5pcs-5V-Step-Up-Power-Module-Lithium-Battery-Charging-Protection-Board-Boost-Converter-LED-Display-USB/32732400277.html?spm=a2g0s.9042311.0.0.jaWnjR

В принципе все устраивает. И заряжает аккум корректно и питание на выходе стабильное 5 В, и не греется. Единственное , что не дождался, когда он отключится при разрядке аккума ниже 2,9 В

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Прикольная заряжалка. Спасибо за ссыль, купил. 

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:

Прикольная заряжалка. Спасибо за ссыль, купил. 

Есть пара нюансов, если на выход прицепить кондюк более 500 мкф,  то при включении может срабатывать защита по току. У меня стояли 2000 и я долго не мог понять работает он или нет. И второе - минимальный ток нагрузки 60мА. Если ниже то периодически (около 10 сек) кратковременные отключения.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Вот второе это минус большой. Поизучать даташит на контроллер надо.

svm
Offline
Зарегистрирован: 06.11.2016

Umka пишет:
Вот второе это минус большой. Поизучать даташит на контроллер надо.

В даташите на  HT4928s так и написано. Но в приципе 60 мА - это не так уж и мало. Во всяком случае переходник USB TTL на CH340  один уже нормально работает.  У мея на плате стоит SW2808S, вроде похожая судя по обвязке на HT4928s, может у нее минимальный ток меньше. Но даташит на неё я еще не смотрел.

Немного поторопился. Оказывается свтодиод по питанию переходника все-таки через десять секунд слегка подмаргивает. А индикатор на плате зарядника, который показывает, что плата работает в режиме STEP UP преобразователя не горит. Он включается только когда подключен пробник и на индикаторе есть какая-то цифирь. Если индикации нет, то через пару секунд зарядник переходит в дежурный рехим. Придется еще разбираться. Но никакой обвязки у МС практически нет.

Вот схема устройства:

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

подскажите пожалуйста, что нужно изменить в схеме чтобы мерить напряжение до 16 вольт примерно, нужно для авто пробника

svm
Offline
Зарегистрирован: 06.11.2016

Xumuk пишет:

подскажите пожалуйста, что нужно изменить в схеме чтобы мерить напряжение до 16 вольт примерно, нужно для авто пробника

Этот пробник планировался только для измерения в цепях с напряжением не выше напряжения питания Ардуино. Поэтому для упрощения схемы никаких защит не предусмотрено. Если Вам нужны измерения в бортсети автомобиля, то наверное придется выкинуть элементы для измерения сопротивлений (в том виде и для тех диапазонов измерения) т.к. сейчас они на 80% должны вывести ардуино из строя. Напишите конкретней что должен определять авто пробник. И я думаю , что найдется много вариантов решения задачи. 

Если только как вольтметр и частотомер, то выкинуть несколько резисторов и урезать программу, с остальным надо думать.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

svm пишет:

Xumuk пишет:

подскажите пожалуйста, что нужно изменить в схеме чтобы мерить напряжение до 16 вольт примерно, нужно для авто пробника

Этот пробник планировался только для измерения в цепях с напряжением не выше напряжения питания Ардуино. Поэтому для упрощения схемы никаких защит не предусмотрено. Если Вам нужны измерения в бортсети автомобиля, то наверное придется выкинуть элементы для измерения сопротивлений (в том виде и для тех диапазонов измерения) т.к. сейчас они на 80% должны вывести ардуино из строя. Напишите конкретней что должен определять авто пробник. И я думаю , что найдется много вариантов решения задачи. 

Если только как вольтметр и частотомер, то выкинуть несколько резисторов и урезать программу, с остальным надо думать.

мне нужно хотябы элементарно мерить напряжение и прозвонку....(частотомер если останется тоже неплохо) ну и чтобы можно было выводить на олнед 0.96 чтоюы не использовать 7сегментный индикатор

svm
Offline
Зарегистрирован: 06.11.2016

Что-то никаких идей никто не предлагает. 

Рассмотрим все варианты доработки исходной схемы:

 

- Вольтметр - прблем нет ,но диодик на входе  для защиты от переполюсовки нужен. Хорошо-бы еще сделать независимость от полярности с индикацией оной.

- Частотомер- поставить пару диодов на всякий случай

Прозвонка - как вариант подать на вход напряжение превышающее макимально возможное в борт сети (воль 20 с током 5-10 мА). Вопрос не повредит-ли оно что-то в электронике автомобиля? Хотя в принципе не должно, но где-то (в блоках электроники) может и исказить реалность.

Ну ,а дальше смотреть если есть эти 20 В , то "обрыв", если от 20 до 14 - "утечка " (как вариант можно очень грубо измерить сопротивление), если "0" - "Коза" в противном случае - попытаться измерить напряжение.

Кто предложит еще какие варианты?