Принципиальная схема цифрового вольтметра. Цифровой вольтметр на очень высокую точность. Сопротивление электрической схемы

Автомобильные , лабораторные источники питания, могут иметь токи, которые достигают до 20 ампер и более. Ясно, что пару ампер можно легко померять обычным дешёвым мультиметром, а как быть с 10, 15, 20 и более ампер? Ведь даже на не очень больших нагрузках встроенные в амперметры шунтирующие резисторы в течение длительного времени замера, иногда даже часов, могут перегреться и в худшем случае поплавится.

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

Электрическая схема мощного амперметра

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


Рисунок платы мощного амперметра

Особенность заключается в том, что в данном случае используется шунт (R1) с сопротивлением очень низкого значения - 0.01 Ом 1% 20W - это дает возможность рассеять совсем немного тепла.

Работа схемы амперметра

Работа схемы довольно проста, при прохождении определенной тока через R1 будет падение напряжения на нём, его можно измерить, для этого напряжение усиливается операционным усилителем OP1 и поступает далее на выход через контакт 6 на внешний вольтметр, включенный на пределе 2V.


Настройки будут заключаться в установке ноля на выходе амперметра при отсутствии тока, и в калибровке, сравнивая его с другим, образцовым инструментом для замера тока. Питается амперметр стабильным симметричным напряжением. Например от 2-х батареек по 9 вольт. Для измерения тока подключите датчик к линии и мультиметр в диапазоне 2V - смотрите показания. 2 вольта будет соответствовать току 20 ампер.

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

В сегодняшнем занятии мы рассмотрим вариант изготовления самодельного цифрового вольтметра для измерения напряжения на одиночном элементе питания. Пределы измерения напряжения 1-4.5 Вольт. Внешнее дополнительное питание, кроме измеряемого, не требуется.

25 лет назад у меня был кассетный плеер. Питал я его Ni-Cd аккумуляторами НКГЦ-0.45 ёмкостью 450мА/ч. Чтобы в дороге определять какие аккумуляторы уже сели, а какие ещё поработают было сделано простое устройство.


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


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

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

Итак, схема проектируемого устройства.

Используемые детали:
1. OLED дисплей с диагональю 0.91 дюйм и разрешением 128x32 (около $3)
2. Микроконтроллер ATtiny85 в корпусе SOIC (около $1)
3. Boost DC/DC Converter LT1308 от компании Linear Technology. ($2.74 за 5 штук)
4. Конденсаторы керамические, выпаяны из неисправной видеокарты.
5. Индуктивность COILTRONICS CTX5-1 или COILCRAFT DO3316-472.
6. Диод Шоттки, я использовал MBR0520 (0.5A, 20V)

Преобразователь напряжения LT1308

Характеристики из описания LT1308:

Обещают 300мА 3.3В с одного элемента NiCd, нам подходит. Выходное напряжение устанавливается делителем, резисторы 330кОм и 120кОм, при указанных номиналах выходное напряжение преобразователя получается около 4.5В. Выходное напряжение выбиралось достаточным для питания контроллера и дисплея, чуть выше максимального измеряемого напряжения на литиевом аккумуляторе.

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

Прекрасно, идём дальше.

Особенности измерения напряжения микроконтроллером

Микроконтроллер ATtiny85 имеет АЦП разрядностью 10 бит. Поэтому считываемый уровень лежит в диапазоне 0-1023 (2^10). Для перевода в напряжение используется код:
float Vcc = 5.0; int value = analogRead(4); / читаем показания с А2 float volt = (value / 1023.0) * Vcc;
Т.е. предполагается, что напряжение питания строго 5В. Если напряжение питания микроконтроллера изменится, то измеренное напряжение тоже изменится. Поэтому нам нужно узнать точное значение напряжения питания!
Многие чипы AVR включая серию ATmega и ATtiny обеспечивают средства для измерения внутреннего опорного напряжения. Путем измерения внутреннего опорного напряжения, мы можем определить значение Vcc. Вот как:
  • Установить источник опорного напряжения analogReference(INTERNAL).
  • Снять показания АЦП для внутреннего источника 1.1 В.
  • Расчитать значение Vcc основываясь на измерении 1.1 В по формуле:
Vcc * (Показания АЦП) / 1023 = 1.1 В
Из чего следует:
Vcc = 1.1 В * 1023 / (Показания АЦП)
На просторах интернета была найдена функция для измерения напряжения питания контроллера:

Функция readVcc()

long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(75); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }


Для вывода на экран используется библиотека Tiny4kOLED с включенным шрифтом 16х32. Из шрифта, для уменьшения размера библиотеки, удалены 2 не используемых символа (, и -) и нарисована отсутствующая буква «В». Код библиотеки соответственно изменен.
Так-же для стабилизации выводимых измерений использована функция с , спасибо автору dimax , работает хорошо.

Код я отлаживал на платке Digispark в среде arduino IDE. После чего ATtiny85 была выпаяна и припаяна на макетку. Собираем макетную плату, подстроечным резистором выставляем напряжение на выходе преобразователя (сначала я выставлял на выходе 5В, при этом ток на входе преобразователя был под 170мА, уменьшил напряжение до 4.5В, ток снизился до 100мА). Когда ATtiny85 припаяна на макетку код приходится заливать с помощью программатора, у меня обычный USBash ISP.


Код программы

// НАСТРОЙКА /* * Ставим #define NASTROYKA 1 * Компилируем, заливаем код, запускаем, запоминаем значение на дисплее, например 5741 * Измеряем мультиметром реальное напряжение на выходе преобразователя, например 4979 (это в мВ) * Считаем (4979/5741)*1.1=0.953997 * Считаем 0.953997*1023*1000 = 975939 * Записываем результат в строку 100 в виде result = 975939L * Ставим #define NASTROYKA 0 * Компилируем, заливаем код, запускаем, готово. */ #define NASTROYKA 0 #include #include long Vcc; float Vbat; // тонкая настройка алгоритма сглаживания shumodav() #define ts 5 // *table size* количество строк массива для хранения данных, для девиации ± 2 отсчёта оптимально 4 строки и одна в запас. #define ns 25 // *number samples*, от 10..до 50 максимальное количество выборок для анализа 1й части алгоритма #define ain A2 // какой аналоговый вход читать (А2 это P4) #define mw 50 // *max wait* от 15..до 200 ms ожидать повтора отсчёта для 2 части алгоритма unsigned int myArray, aread, firstsample, oldfirstsample, numbersamples, rezult; unsigned long prevmillis = 0; boolean waitbegin = false; //флаг включённого счётчика ожидания повтора отсчёта void setup() { oled.begin(); oled.clear(); oled.on(); oled.setFont(FONT16X32_sega); } void loop() { for (byte i = 0; i < 5; i++) { Vcc += readVcc(); } Vcc /= 5; shumodav(); Vbat = ((rezult / 1023.0) * Vcc) / 1000; if (Vbat >= 0.95) { oled.setCursor(16, 0);#if NASTROYKA oled.print(rezult); #else oled.print(Vbat, 2); oled.print("/"); #endif } Vcc = 0; } long readVcc() { // чтение реального напряжения питания // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(75); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; // result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 // индикатор показывал 4990, вольтметр 4576мВ (4576/4990)*1.1=1.008737 result = 1031938L / result; // Calculate Vcc (in mV); 1031938 = 1.008737*1023*1000 return result; // Vcc in millivolts } void shumodav() { // главная функция //заполнить таблицу нолями в начале цикла for (int s = 0; s < ts; s++) { for (int e = 0; e < 2; e++) { myArray[s][e] = 0; } } // основной цикл накопления данных for (numbersamples = 0; numbersamples < ns; numbersamples++) { #if NASTROYKA aread = readVcc(); #else aread = analogRead(ain); #endif // уходим работать с таблицей//// tablework(); } // заполнен массив, вычисляем максимально повторяющееся значение int max1 = 0; // временная переменная для хранения максимумов for (byte n = 0; n < ts ; n++) { if (myArray[n] > max1) { //перебор 2-х элементов строк max1 = myArray[n]; // запомним куда больше всего попало firstsample = myArray[n]; // его 1 элемент = промежуточный результат. } } //*****вторая фаза алгоритма *********///// // если старый отсчёт не равен новому, //и флага включения счёта времени небыло, то if (oldfirstsample != firstsample && waitbegin == false) { prevmillis = millis(); // скидываем счётчик времени на начало waitbegin = true; } // активируем флаг ожидания // если до истечения лимита времени отсчёт сравнялся //со старым, то снимаем флаг if (waitbegin == true && oldfirstsample == firstsample) { waitbegin = false; rezult = firstsample; } // если всё таки отсчёт не сравнялся, а время ожидания вышло if (waitbegin == true && millis() - prevmillis >= mw) { oldfirstsample = firstsample; waitbegin = false; rezult = firstsample; } //то признаём новый отсчёт конечным результатом функции. } // конец главной функции void tablework() { // функция внесения данных в таблицу // если в таблице совпадает отсчёт, то инкрименировать //его счётчик во втором элементе for (byte n = 0; n < ts; n++) { if (myArray[n] == aread) { myArray[n] ++; return; } } // перебираем ячейки что б записать значение aread в таблицу for (byte n = 0; n < ts; n++) { if (myArray[n] == 0) { //если есть пустая строка myArray[n] = aread; return; } } // если вдруг вся таблица заполнена раньше чем кончился цикл, numbersamples = ns; } // то счётчик циклов на максимум


Как упоминалось выше, в контроллерах есть внутренний источник опорного напряжения 1.1В. Он стабильный, но не точный. Поэтому его реальное напряжение скорее всего отличается от 1.1В. Чтобы узнать, сколько на самом деле, необходимо провести калибровку:

* Ставим #define NASTROYKA 1
* Компилируем, заливаем код, запускаем, запоминаем значение на дисплее, например 5741
* Измеряем мультиметром реальное напряжение на выходе преобразователя, например 4979 (это в мВ)
* Считаем (4979/5741)*1.1=0.953997 - это реальное напряжение источника опорного напряжения
* Считаем 0.953997*1023*1000 = 975939
* Записываем результат в строку 100 в виде result = 975939L;
* Ставим #define NASTROYKA 0
* Компилируем, заливаем код, запускаем, готово.

В программе DipTrace разводим плату, размером с OLED дисплей 37х12мм


Полчаса нелюбимого занятия ЛУТом.


Найдите 10 отличий

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



Припаиваем. SMD индуктивность 4,7мкГн была мне любезно предоставлена , большое спасибо, Сергей.


Собираем бутерброд из платы и экрана. На концах проводов я припаял небольшие магниты, вольтметр сам прищелкивается к измеряемому аккумулятору. Неодимовые магниты при нагреве выше 80 градусов теряют магнитные свойства, поэтому паять нужно легкоплавким сплавом Вуда или Розе очень быстро. Еще раз проводим калибровку и проверяем точность измерения:






Обзор понравился +126 +189

На рисунке 1 представлена схема цифрового амперметра и вольтметра, которая может быть использована, как дополнение к схемам блоков питания, преобразователей, зарядных устройств и т.д. Цифровая часть схемы выполнена на микроконтроллере PIC16F873A. Программа обеспечивает измерение напряжения 0... 50 В, измеряемый ток — 0... 5 А.

Для отображения информации используются светодиодные индикаторы с общим катодом. Один из операционных усилителей микросхемы LM358 используется в качестве повторителя напряжения и служит для защиты контроллера при внештатных ситуациях. Все-таки цена контроллера не так уж и мала. Измерение тока производится косвенным образом, при помощи преобразователя ток-напряжение, выполненного операционном усилителе DA1.2 микросхемы LM358 и транзисторе VT1 – КТ515В. Почитать о таком преобразователе еще можно и . Датчиком тока в этой схеме служит резистор R3. Преимуществом такой схемы измерения тока состоит в том, что здесь отпадает необходимость точной подгонки миллиомного резистора. Скорректировать показания амперметра можно просто триммером R1 и в довольно широких пределах. Сигнал тока нагрузки для дальнейшей оцифровки снимается с нагрузочного резистора преобразователя R2. Напряжение на конденсаторе фильтра стоящем после выпрямителя вашего блока (вход стабилизатора, точка 3 на схеме)питания не должно быть более 32 вольт, это обусловлено максимальным напряжением питания ОУ. Максимальное входное напряжение микросхемного стабилизатора КР142ЕН12А – тридцать семь вольт.

Регулировка вольтамперметра заключается в следующем. После всех процедур — сборки, программирования, проверки на соответствие на собранное вами произведение подают напряжение питания. Резистором R8 выставляют на выходе стабилизатора КР142ЕН12А напряжение 5,12 В. После этого вставляют в панельку запрограммированный микроконтроллер. Измеряют напряжение в точке 2 мультиметром, которому вы доверяете, и резистором R7 добиваются одинаковых показаний. После этого к выходу (точка 2) подключают нагрузку с контрольным амперметром. Равенства показаний обоих приборов в данном случае добиваются при помощи резистора R1.

Резистор-датчик тока можно изготовить самому, используя для этого, например, стальную проволоку. Для расчета параметров этого резистора можно использовать программу « » Программу скачали? Открыли? Значит так, нам нужен резистор номиналом в 0,05 Ом. Для его изготовления выберем стальную проволоку диаметром 0,7мм – у меня она такая, да еще и не ржавеющая. С помощью программы вычисляем необходимую длину отрезка, имеющего такое сопротивление. Смотрим скрин окна данной программы.

И так нам нужен отрезок стальной нержавеющей проволоки диаметром 0,7мм и длиной всего 11 сантиметров. Не надо этот отрезок свивать в спираль и концентрировать все тепло в одной точке. Вроде все. Что не понятно, прошу на форум. Успехов. К.В.Ю. Чуть не забыл про файлы.

Целью этого дела было собрать очень точный вольтметр, с 3 цифрами после запятой. Нужен был вольтметр постоянного напряжения показывающий значения напряжения в диапазоне 0-10 В. не подходили. Поэтому после принятия решения о самостоятельном исполнении выбор пал на микросхему ICL7135.

Схема точного цифрового вольтметра

Генератор сделан на микросхеме 4047, он должен также питать преобразователь отрицательного напряжения. Вольтметр имеет три диапазона измерений: 2 V, 20 V, 200 V.

В делителе применены резисторы 0,1%. При запуске системы возникла проблема её калибровки. Не имея доступа к эталонному прибору с точностью не менее 5 цифр, решено было купить готовый источник стабильных напряжений для калибровки. Основан он на AD584KH обеспечивает четыре уровня: 2,5 V и 5,0 V, 7,5 V и 10,0 V.

На прилагаемых фотографиях видно измеренные значения. Корпус вольтметра была изготовлен из листовой стали, выдранной из корпуса старого компьютера. Питание идёт постоянным напряжением от БП на 15 В.

Точность действительно сверх высокая. Показания реально стабильны, даже на открытых (не экранированных) измерительных проводах последняя цифра не «прыгает».

Придумать все самому не получается – пока знаний программирования микропроцессоров не достаточно (только учусь), а отставать не хочется. Серфинг Интернета дал несколько разных вариантов как по сложности схемотехники и выполняемых функций, так и самих процессоров. Анализ ситуации на местных радиорынках и трезвый подход (покупать то что по карману; делать то, что реально сможешь, а процесс изготовления да время настройки не затянется на неограниченное время) остановил мой выбор на схеме вольтметра описанного на www.CoolCircuit.com.

Итак, нижеприведенная принципиальная схема уже исправлена . Прошивка осталась родная (main.HEX - приобщаю).

Те, кто процессоры «держит в руках часто» дальше могут не читать, а остальным, особенно кто в первый раз, расскажу, как все сделать хоть и не оптимально (да простят мне профессионалы стиль изложения), но в итоге правильно.
Итак, для справки: семейство процессоров РІC на 14 ножек имеют разную распиновку поэтому нужно проверить подходит ли имеющийся у Вас программатор с панельками под этот чип. Обратите внимание именно на 8-пиновую панельку, как правило, именно она и подходит, а крайние справа выводы просто висят. Я пользовался обычным программатором «PonyProg» .

Следует учесть при пограммировании РІС важно не затереть калибровочную константу внутреннего генератора чипа ибо внешний кварц здесь не используется. Она записана в последней ячейке (адресе) памяти процессора. Если использовать IcProg, выбрав тип МК, то в окне – «Адрес программного кода» в последней строке обозначенной адресом - 03F8 крайние справа четыре символа и есть указанная индивидуальная константа. (Если микросхема новая и ни разу не программированная то после кучи символов 3FFF – последним будет что то типа 3454 – это самое то).

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

Перед программированием МК, необходимо в IcProg сначала дать команду «Читать все» и посмотреть на вышеуказанную ячейку памяти – там будет значится индивидуальная константа этого чипа. Ее надо переписать на бумажку (в памяти не держать!- забудешь).
- загрузить программный файл прошивки МК – с расширением *.hex (в даном случае -"main.hex") и проверить какая константа записана в той же ячейке в данном программном продукте. Если она отличается – поставить курсор и ввести туда данные, ранее записанные на бумажке.
- нажимаем команду программировать - после появившегося вопроса типа: «использовать ли данные осцилятора из файла» – соглашаетесь. Ибо Вы уже проверили, что там то что надо.

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

Итак, если все этапы пройдены верно, – микросхема МК готова к использованию. Дальше дело техники.
От себя хочу добавить, что транзисторы здесь не критичные – подходят любые р-n-р структуры, в т.ч. советские, в пластмассовом корпусе. Я использовал выпаянные из импортной бытовой техники после проверки на соответствие структуры проводимости. В этом случае присущ еще один нюанс – расположение вывода базы транзистора может быть по середине корпуса или с краю. Для работы схемы это безразлично, нужно только соответственно формировать выводы при пайке. Постоянные резисторы для делителя напряжения – именно указанного номинала. Если найти импортный подстроечный резистор на 50 кОм не удастся, то советского производства желательно взять чуточку больше - 68 кОм, а 47 кОм брать не рекомендую ибо в случае одновременного совпадения пониженных номиналов - потеряется расчетное соотношение сопротивлений делителя напряжения, которое может быть трудно исправить подстоечником.

Как я уже писал у моего блока питания два плеча – поэтому сделал сразу два вольтметра на одной плате, а индикаторы вывел на отдельную плату для экономии места на лицевой панели. Развел под обычные элементы. Файлы с разводкой плат, исходник и hex прилагаются в архиве. У Вас - SMD, то переделать ее не трудно, если надо обращайтесь.

Для тех, кто захочет повторить этот вольтметр и имеет, как у меня, двухполярный блок питания с общей средней точкой - напоминаю о необходимости питания обоих вольтметров от двух отдельных (гальванически разделенных) источников. Скажем - отдельных обмоток сылового трансформатора или, как вариант – импульсный преобразователь, но обязательно с двумя обмотками по 7 Вольт (нестабилизированных). Для тех, кто будет делать «импульсник»: ток потребления вольтметра от 70 до 100 мА в зависимости от размера и цвета индикатора. Иначе никак ибо на порт МК нельзя подавать отрицательное напряжение.
Если кому понадобится и схема преобразователя, спрашивайте на форуме, я сейчас над этим вопросом работаю.

Архив с нужными даными и печатками в SLayout-5rus: