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

SAB
Offline
Зарегистрирован: 27.12.2016

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

satalexx
Offline
Зарегистрирован: 07.05.2021

SAB пишет:

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

Спасибо! Попробую

satalexx
Offline
Зарегистрирован: 07.05.2021

SAB пишет:

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

Незаработало

Конечно не в 20 раз меньше меряет, а всего в 2.5 раза вместо 1 кГц показывает 400 Гц, и еще начал тупить при переключении режимов 

Может как то можно в скетче просто умножить на 20 результат измерения частоты

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

satalexx пишет:

SAB пишет:

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

Незаработало

Конечно не в 20 раз меньше меряет, а всего в 2.5 раза вместо 1 кГц показывает 400 Гц, и еще начал тупить при переключении режимов 

Может как то можно в скетче просто умножить на 20 результат измерения частоты

В 349 строке замените rez=tic;  на  rez=tic*20; Но это очень большой костыль. Так быть не должно, частотомер должен работать без этого.

satalexx
Offline
Зарегистрирован: 07.05.2021

svm пишет:

satalexx пишет:

SAB пишет:

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

Незаработало

Конечно не в 20 раз меньше меряет, а всего в 2.5 раза вместо 1 кГц показывает 400 Гц, и еще начал тупить при переключении режимов 

Может как то можно в скетче просто умножить на 20 результат измерения частоты

В 349 строке замените rez=tic;  на  rez=tic*20; Но это очень большой костыль. Так быть не должно, частотомер должен работать без этого.

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

rez=tic на  rez=tic*20 менял - ничего не поменялось

Умножил тут oled.print (int(rez)*20) заработало, но меряет от 40Гц до 32кГц с шагом 20Гц. До 40Гц и выше 32кГц какой-то бред с минусовыми показаниями

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

Пока с этим рабирался, опять же ради спортивного... сделал для себя, два автопробника

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

satalexx пишет:

 

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

rez=tic на  rez=tic*20 менял - ничего не поменялось

Умножил тут oled.print (int(rez)*20) заработало, но меряет от 40Гц до 32кГц с шагом 20Гц. До 40Гц и выше 32кГц какой-то бред с минусовыми показаниями

 

Чудес не бывает.

1. Какой-то косяк с таймерами (неправильно тикают миллисекунды)

2. Берет результат не из функции частотомера, а из тестового замера (иначе почему умножение на 20 ничего не меняет). Поставьте вывод в сериал в функциях частотомера и тест частоты

3. Косяк с библиотекой дисплея

4. ХЗ

satalexx
Offline
Зарегистрирован: 07.05.2021

 

 

Спасибо за помощь

Да я и сам в чудеса не верю, придет дисплей буду эксперементировать на макетке

 

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

satalexx пишет:

svm пишет:

satalexx пишет:

SAB пишет:

фьюзы поставьте правильные в дудке 3F D9 FF 05 по вертикали и всё заработает правильно

Незаработало

Конечно не в 20 раз меньше меряет, а всего в 2.5 раза вместо 1 кГц показывает 400 Гц, и еще начал тупить при переключении режимов 

Может как то можно в скетче просто умножить на 20 результат измерения частоты

В 349 строке замените rez=tic;  на  rez=tic*20; Но это очень большой костыль. Так быть не должно, частотомер должен работать без этого.

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

rez=tic на  rez=tic*20 менял - ничего не поменялось

Умножил тут oled.print (int(rez)*20) заработало, но меряет от 40Гц до 32кГц с шагом 20Гц. До 40Гц и выше 32кГц какой-то бред с минусовыми показаниями

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

Пока с этим рабирался, опять же ради спортивного... сделал для себя, два автопробника

прикольные пробнички=) я все хочу в машину запихнуть чтобы валялся, но боюсь литий использовать в виде аккумулятора хз как он себя в холоде поведет длительное время. А аналоги размер не маленький

bva1
Offline
Зарегистрирован: 11.03.2017

А как это вам удалось Arduino pro mini и батарею запихнуть к коробочку из под OLED 0.96" ?

bva1
Offline
Зарегистрирован: 11.03.2017

satalexx     а как вы запихнули про мини в коробку из под дисплея ?

 

satalexx
Offline
Зарегистрирован: 07.05.2021

bva1 пишет:

А как это вам удалось Arduino pro mini и батарею запихнуть к коробочку из под OLED 0.96" ?

Извините, долго не отвечал, был занят другими делами

Плату Arduino pro mini сточил по 0.5 мм с обеих сторон до пистонов

И в той коробочке стоит не только дисплей OLED 0.96", Arduino pro mini, АКБ а и плата заряда на 4056, кнопка переключения режимов и выключатель питания

А еще, извините за флуд, точно в такой же коробочке сделал осциллографический пробник (осциллоскоп)

 

xfvlad
Offline
Зарегистрирован: 06.02.2021

Здравствуйте. Подскажите, если при измерении напряжения показания занижаются на 0,3 в. Можно как-то исправить?

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

xfvlad пишет:

Здравствуйте. Подскажите, если при измерении напряжения показания занижаются на 0,3 в. Можно как-то исправить?

В скетче подкорректировать значение сопротивлений делителя вольтметра.

xfvlad
Offline
Зарегистрирован: 06.02.2021

Последний скетч для дисплея 0,91? И какой емкости желательно использовать аккумулятор для компактности прибора?

xfvlad
Offline
Зарегистрирован: 06.02.2021

Просмотрел скетч и не нашел где можно изменить коефициент делителя

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

xfvlad пишет:

Просмотрел скетч и не нашел где можно изменить коефициент делителя

Скетч из какого поста?

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

Хотя в принципе код вольтметра практически везде одинаков.

//**********************************************************************
//вольтметр
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;   //если есть напряжения выводим - иначе измеряем сопротивление
//************************************************************************

В 13 строке измените последнее число

xfvlad
Offline
Зарегистрирован: 06.02.2021

Спасибо, уже исправил, измеряет точно. Теперь думаю поднять измерение напряжение вольт до 15.  Сильно повлияет на измерение емкости если изменить сопротивление 20 кОм на 62 кОм?

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

xfvlad пишет:

Спасибо, уже исправил, измеряет точно. Теперь думаю поднять измерение напряжение вольт до 15.  Сильно повлияет на измерение емкости если изменить сопротивление 20 кОм на 62 кОм?

По идее не должно. Я этим давно занимался, тонкости уже не помню.

xfvlad
Offline
Зарегистрирован: 06.02.2021

satalexx пишет:

Всем доброго времени суток!

Апну тему!

Спасибо автору и другим участникам, повторил пробник от автора на arduino pro mini (последний с кнопкой и измерением емкости). Точность измерения напряжения и сопротивления подправил резисторами, а вот частоту меряет ровно в 20 раз меньшую. К примеру на генераторе 1kHz а показывает 50Hz.

Может кто подскажет в чем дело?

Заранее спасибо! 

Подтверждаю. Частоту занижает тоже в 20 раз. Скетч последний. Для себя только изменил предел измерения напряжения до 20 В изменивши резистор 4,7 к на 1,2к и добавил резистор 4,7 к на A3 для защиты. Исправленной версии скетча вроде не заметил на форуме.

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

xfvlad пишет:

Подтверждаю. Частоту занижает тоже в 20 раз. Скетч последний. Для себя только изменил предел измерения напряжения до 20 В изменивши резистор 4,7 к на 1,2к и добавил резистор 4,7 к на A3 для защиты. Исправленной версии скетча вроде не заметил на форуме.

Теоретически этого не может быть, но один раз это случайность, а два - уже система. Скетч для измерения частоты подсказал в 13 посту  Димакс. Может к нему обратиться? Может быть какой-то  хитрый клон контроллера  попался, у которого таймеры иначе программируются?

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Тоже задумался над частотомером (еще не собирал,SSD1306 только приехал из поднебесной)

код частотомера работает в протеусе норм

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Исходник отсюда http://arduino.ru/forum/proekty/universalnyi-arduino-probnik?page=6#comment-605508

строка 342-

if (analogRead(A0)>100)rr=0;prob=1;goto vf;// ПРОВЕРКА КНОПКИ

Для чего тут goto vf;?

Если этот "goto vf;" закоментировать то частотомер должен работать норм

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Должно быть так 

if (analogRead(A0)>100){rr=0;prob=1;goto vf;}// ПРОВЕРКА КНОПКИ

иначе результат идет отсюда-

void test_F(){// ******* Тест наличия импульсов с F>5 Гц.********
init_fm();
ri=0;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц  устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
}

То есть измерение всего 50 миллисек,а это в аккурат меньше секунды в 20 раз!

xfvlad
Offline
Зарегистрирован: 06.02.2021

Проверял все скетчи и заметил что этот прокол появился со скетча с кнопкой.

xfvlad
Offline
Зарегистрирован: 06.02.2021

Анатолий89 пишет:

Должно быть так 

if (analogRead(A0)>100){rr=0;prob=1;goto vf;}// ПРОВЕРКА КНОПКИ

иначе результат идет отсюда-

void test_F(){// ******* Тест наличия импульсов с F>5 Гц.********
init_fm();
ri=0;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц  устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
}

То есть измерение всего 50 миллисек,а это в аккурат меньше секунды в 20 раз!

 

Работает как надо но только до 32700 Гц, дальше идет на уменьшение к 0, после 65400 снова считает от 0 и выше

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Строка 141 смущает

oled.print (int(rez));

Еще раз повторю что я в ардуино я дуб дубом,так,поверхностно...

 

Попробуйте замените на 

oled.print (long(rez));

у меня на маетке вроде работает

xfvlad
Offline
Зарегистрирован: 06.02.2021

Изменил на это

oled.print (uint32_t(rez));
oled.println("      ");
oled.print("HZ      ");
Еще заметил, что без кнопки пробник быстрее работает. 
alexandr55
Offline
Зарегистрирован: 26.03.2017

satalexx Можете поделится схемой и скетчем для пробника на семисегментном и ндикаторе

satalexx
Offline
Зарегистрирован: 07.05.2021

alexandr55 пишет:
satalexx Можете поделится схемой и скетчем для пробника на семисегментном и ндикаторе

В семисегментном автопробнике arduino нет, там обычный китайский вольтметр

 

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

Кажется нашел глюк частотомера

probn:;//******************** РЕЖИМ ПРОБНИКА ****************************
  
//****************************  ЧАСТОТОМЕР ******************************************
test_F();     //  Тест наличия импульсов с F>5 Гц.
if (tic>1) {  // Если есть импульсы измеряем частоту
f_meter();
goto ind;
}
//**************************** Вольтметр ******************************************

В 5 строке заменить tic на rez

изменений было много и не заметил, что эта переменная переопределяется.

satalexx
Offline
Зарегистрирован: 07.05.2021

svm пишет:

Кажется нашел глюк частотомера

probn:;//******************** РЕЖИМ ПРОБНИКА ****************************
  
//****************************  ЧАСТОТОМЕР ******************************************
test_F();     //  Тест наличия импульсов с F>5 Гц.
if (tic>1) {  // Если есть импульсы измеряем частоту
f_meter();
goto ind;
}
//**************************** Вольтметр ******************************************

В 5 строке заменить tic на rez

изменений было много и не заметил, что эта переменная переопределяется.

Спасибо!!! Сейчас перезалью скетч в пробник. Все таки глюк был

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

satalexx пишет:

Спасибо!!! Сейчас перезалью скетч в пробник. Все таки глюк был

Скорее всего причина в этом. Изменений было много и глаз замылился.

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

Анатолий89 пишет:

Исходник отсюда http://arduino.ru/forum/proekty/universalnyi-arduino-probnik?page=6#comment-605508

строка 342-

if (analogRead(A0)>100)rr=0;prob=1;goto vf;// ПРОВЕРКА КНОПКИ

Для чего тут goto vf;?

Если этот "goto vf;" закоментировать то частотомер должен работать норм

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

Здесь еще можно посмотреть http://arduino.ru/forum/obshchii/multimetr-arduinoandroid . Практически тот-же пробник, но вывод и переключение режимов через блютус. Добавлено измерение малых емкостей и генератор. Может что оттуда пригодится.

Анатолий89
Offline
Зарегистрирован: 16.03.2021

svm пишет:

Кажется нашел глюк частотомера

probn:;//******************** РЕЖИМ ПРОБНИКА ****************************
  
//****************************  ЧАСТОТОМЕР ******************************************
test_F();     //  Тест наличия импульсов с F>5 Гц.
if (tic>1) {  // Если есть импульсы измеряем частоту
f_meter();
goto ind;
}
//**************************** Вольтметр ******************************************

В 5 строке заменить tic на rez

изменений было много и не заметил, что эта переменная переопределяется.

А какая разница rez или tic,если в подпрограмме test_f() rez=tic

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

tic , изменяется внутри функции, снаружи он другой. A rez - глобальная переменная.

Анатолий89
Offline
Зарегистрирован: 16.03.2021

МММ...я об этом мало чего знаю,пойду гуглить...

xfvlad
Offline
Зарегистрирован: 06.02.2021
// Входом частотомера является пин цифровой пин 5
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

#define resistorValue  24500.0F   // Зарядный резистор для измерения емкости
volatile unsigned int int_tic = 0;
volatile unsigned long tic, startTime;
long adc_buff;
unsigned long elapsedTime;
float u_del, u_izm, rez, microFarads;
byte ri, rr = 1; // режим измерения

void setup() {
  pinMode(2, INPUT);// 2 пин высокий импеданс
  pinMode(3, INPUT);// 3 пин высокий импеданс
  pinMode(4, INPUT);// 4 пин высокий импеданс
  pinMode(5, INPUT);// вход сигнала частотомера (для atmega168/328)
  pinMode(6, INPUT_PULLUP); // кнопка
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(font5x7);
  oled.clear();
  oled.set2X();
  oled.println ("   Ucc");// При включении показать напряжение питания
  oled.print (readVcc() / 1000.0, 2);
  oled.print (" mV");
  delay(2000);

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

void loop() {
  if (digitalRead(6) == 0) {
    rr++;
    delay(250);
    if (rr > 5)rr = 1;
  }
  oled.setCursor(1, 0);
  switch (rr) {
    case 1: oled.println("  Probnik  ");
      test_f();
      if (tic > 1) f_meter();
      else {
        test_v();
        if (adc_buff > 150) {
          voltmeter();
        } else
          ommeter();
      }
      break;
    case 2: oled.println("  F meter  ");
      test_f();
      if (tic > 1) f_meter();
      break;
    case 3: oled.println("  V meter  ");
      test_v();
      voltmeter();
      break;
    case 4: oled.println("  R meter  ");
      ommeter();
      break;
    case 5: oled.println("  C meter  ");
      c_meter();
      break;
  }
  vdsp();
}

/*-------------------------------- ФУНКЦИИ -----------------------------------*/
/***************************** ИЗМЕРЕНИЕ БАТАРЕИ **************************/
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 = 1098702.00 / result; //1.03357 * 1023.0*1000 ((1.074 * 1023.0 * 1000))
  return result;
}

/*****************ВЫВОД НА SSD1306*********************************/
void vdsp() {
  if (rez > 4100000 || rez <= 0) {
    oled.print("_ _ _ _ _  ");  //ХЗ что на входе
  } else  if (ri == 5 && rez > 0 && rez < 1) { //Щупы 3акорочены или сопроивление < 1 Om
    //pinMode(8, OUTPUT);                // выводим на 8 пин 1, подключаем спикер
    //digitalWrite(8,1);                 // для активного спикера на 8 пине
    //tone(9, 500, 100);                   // для пассивного спикера на 9 пине
    oled.print(" S H O R T ");
  } else if (ri == 0) {
    oled.print (uint32_t(rez));
    oled.print(" HZ        ");    // Ввод частоты
  } else if (ri == 1) {
    oled.print(rez, 2);
    oled.print(" V         ");    // Вывод напряжения
  } else if (ri == 2 || ri == 3) {
    rez = rez / 1000;
    oled.print(rez, 1);
    oled.print(" kOhm     ");
  } else if (ri == 4 || ri == 5) {
    oled.print(rez, 1);
    oled.print(" Ohm      ");    // Вывод сопртивления
  } else if (ri == 6) {
    if (rez < 0.4)oled.print("<0.4");
    else {
      oled.print(rez, 1);
    }
    oled.print(" mF       ");    // Вывод емкости
  }
}

/***************************** ЧАСТОТОМЕР **************************/
void test_f() {
  pinMode(4, OUTPUT);        // выводим на 4 пин 0
  digitalWrite(4, 0);        // загрубляем вход (борьба с наводками)
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
  delay(50);// Тестовый замер (срабатывает> 5 Гц 10 устойчиво)
  TCCR1B = 0;
  tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
  pinMode(4, INPUT);
}

void f_meter() {
  ri = 0;
  pinMode(4, OUTPUT);        // выводим на 4 пин 0
  digitalWrite(4, 0);        // загрубляем вход (борьба с наводками)
  int_tic = 0; TCNT1 = 0;
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
  delay(1000);// Время измерения
  TCCR1B = 0;
  tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
  rez = tic;
  pinMode(4, INPUT);
}

/***************************** ВОЛЬТМЕТР **************************/
void test_v() {
  analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
  pinMode(4, OUTPUT);
  digitalWrite(4, 0);        //включаем нижний резистор делителя на 1,2 кОм
  delay(2);
  adc_buff = 0;
  for (int n = 0; n <= 255; n++ ) {
    adc_buff += analogRead(A1);
  }
  adc_buff >>= 4; // 16368 полная шкала 14bit
  analogReference(DEFAULT);// подключаем опорное 5 В
  pinMode(4, INPUT);
}

void voltmeter() {
  ri = 1;
  rez = (float)adc_buff / 16368.0 * 19.30; // реальный коэфф делителя ((r1+r2)/r2*1.1)
}

/***************************** ОММЕТР ***************************/
void ommeter() {
  ri = 2;

  //#############################  20 kOm  ######################################

  pinMode(4, OUTPUT);        // 4 пин выход
  digitalWrite(4, 1);        // переводим его в 1 подключаем измерительный резистор 20 kOm
  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(A3);
  }
  adc_buff >>= 4;
  u_izm = (float)adc_buff;
  rez = float(u_izm * 20000) / float(u_del - u_izm); // для 20 kOm
  pinMode(4, INPUT);
  if (u_izm > 4000) goto vdsp; //Если значение достоверно - вывод на индикацию

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

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

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

  // измеряем напряжение на измеряемом резисторе
  adc_buff = 0;
  for (int n = 0; n <= 255; n++ ) {
    adc_buff += analogRead(A1);
  }
  adc_buff >>= 4;
  u_izm = (float)adc_buff;
  rez = float(u_izm * 4750) / float(u_del - u_izm); // для 4,7 kOm
  pinMode(3, INPUT);
  if (u_izm > 4000) goto vdsp; //Если значение достоверно - вывод на индикацию

  //#############################  500 Om  ######################################

  ri = 4;
  pinMode(2, OUTPUT);        // 2 пин выход
  digitalWrite(2, 1);        // переводим его в 1 подключаем измерительный резистор 500 Ом
  delay(2);

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

  // измеряем напряжение на измеряемом резисторе
  // сначала при опорном 5 В
  adc_buff = 0;
  for (int n = 0; n <= 255; n++ ) {
    adc_buff += analogRead(A1);
  }
  adc_buff >>= 4;
  u_izm = (float)adc_buff;
  rez = float(u_izm * 500) / float(u_del - u_izm); // для 500 om
  pinMode(2, INPUT);

  if (u_izm > 4000) goto vdsp; //Если значение достоверно - вывод на индикацию

  //Если  точность не удовлетворяет переходим на опорное 1,1 В
  // измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
  ri = 5;
  pinMode(2, OUTPUT);        // 2 пин выход
  digitalWrite(2, 1);        // переводим его в 1 подключаем измерительный резистор 500 Ом
  adc_buff = 0;
  for (int n = 0; n <= 255; n++ ) {
    adc_buff += analogRead(A3);
  }
  adc_buff >>= 4;
  u_del = (float)adc_buff / 16368 * (float)readVcc();

  // измеряем напряжение на измеряемом резисторе при опорном 1.1 В
  analogReference(INTERNAL);// подключаем опорное 1.1 В
  delay(2);
  adc_buff = 0;
  for (int n = 0; n <= 255; n++ ) {
    adc_buff += analogRead(A1);
  }
  adc_buff >>= 4;
  u_izm = (float)adc_buff / 16368 * 1100;
  (rez) = float(u_izm * 500) / float(u_del - u_izm);
  pinMode(2, INPUT);
  analogReference(DEFAULT);// подключаем опорное 5 В
vdsp:;
}

/****************** Измерение емкости 0,1-500 Мкф ***************************/
void c_meter() {
  ri = 6;
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);              //Включаем заряд конденсатора
  startTime = millis();               //Засекаем время
  while (analogRead(A2) < 648) {}     //Ждем пока конденсатор не зарядится до 63,2% или 1,58 от  полной зарядки
  elapsedTime = millis() - startTime; //Фиксируем время заряда
  //if (elapsedTime<2)elapsedTime=0;    // Борьба с шумами
  microFarads = ((float)elapsedTime / resistorValue) * 1000;
  rez = microFarads;
  if (elapsedTime <= 1)rez = 0;
  digitalWrite(4, LOW);               //Снимаем напряжение
  pinMode(2, OUTPUT);                 //Разряжаем кондюк
  digitalWrite(2, LOW);               //Закорачивая его на землю
  while (analogRead(A2) > 0) {}       // Пока не разрядится
  pinMode(2, INPUT);                 // Отключаем разряд
  pinMode(4, INPUT);
}

Здравствуйте. Можете проверить код? У меня на макетке вроде работает нормально. 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

xfvlad пишет:

/

Что-то на схеме не видно цепи замера напряжения источника питания

xfvlad
Offline
Зарегистрирован: 06.02.2021

На схеме не нужно. Все делается в скетче.

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Быстренько залил скетч в макет,он правда от транзистортестера.Шрифт приятен.С мобилы фото залить не знаю как .

xfvlad
Offline
Зарегистрирован: 06.02.2021

Как работают остальные режимы измерения?

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Вообщем-  резистор на 12 килоом,Конденсатор на 0,22 мкф ,а 18650 на мультиметре показывает 3,96 вольта

xfvlad
Offline
Зарегистрирован: 06.02.2021

У меня все точно показывает. Только плата nano

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Ну от схемы отступил только не найдя резистора 1,2к ,поставил 900 Ом.Все остальные номиналы как по схеме

xfvlad
Offline
Зарегистрирован: 06.02.2021

А теперь смотрите на что влияет этот резистор (сопротивление, напряжение и емкость). На схеме я указал все режимы измерения.

Andry Smart
Offline
Зарегистрирован: 06.09.2016

Я тут обратил внимание на резистор 470 ом. 

в коде в расчетах используется 500 ом.

 

и еще коэффициент делителя у меня получаются другие цифры 

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

Сначала по картинке. Спасибо  xfvlad, за то, что он изобразил эквивалентные схемы для всех режимов измерений. Я немногo подкорректировал его работу.
   
1.  Убрал резисторы, которые не влияют на результаты измерений, т.к. по сравнению с входным сопротивлением АЦП, они ничтожны.
2. Отметил красным, что влияет на точность в данном режиме.
3. Исправил неточность в 4 режиме (было указано питание на делителе 1,1В. На самом деле - там питание 5В за вычетом падения напряжения на верхнем ключе Ардуино, а 1,1В - это опорное АЦП). 
 
  Теперь по другим вопросам про резистор 500 Ом вместо 470. Это гуляет из старых скетчей, просто никто не заморачивается с редактированием.
  По поводу резистора 900 ом вместо 1,2 КОм. Он влияет только на вольтметр и измерение емкостей. Для вольтметра нужно скорректировать коэффициент делителя, а для измерения емкостей, точно указать  resistorValue  (сумму сопротивлений резисторов 20 КОм и 900 Ом). 
  Ну а насчет коэффициента - здесь куча факторов. Точность резисторов, точность ИОН и прибора которым сравнивается. Так что он корректируется по фактическим данным.

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

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