АЦП микроконтроллеров AVR. Делаем цифровой вольтметр 0 — 25V
Продолжим изучать аналого-цифровой преобразователь микроконтроллеров AVR на примере цифрового вольтметра постоянного напряжения, с пределами измерения от 0 до 25V. Измеряемое напряжение будет отображаться на четырехразрядном семисегментном индикаторе с общим анодом. В этом примере применим динамическую индикацию о которой подробней рассказано на одном из предыдущих занятий, кусок кода возьмем от туда же. Микроконтроллер Atmega8 тактируется от внутреннего генератора частотой 8MHz.
Входом АЦП является вывод PC0(ADCO), установлен по умолчанию в регистре ADMUX. Так как вольтметр у нас должен измерять напряжение от 0 до 25V, а 25V для порта контроллера это очень много, в таких случаях используют делитель напряжения, на схеме это резисторы R1 и R2. Например, если напряжение на входе будет меняться от 0 до 25V, то на выходе оно будет меняться от 0 до 5V. Резистор R3 — подстроечный, служит для подстройки отображаемого на дисплее уровня напряжения, желательно многооборотный. Источником опорного напряжения будет вывод питания AVCC с внешним конденсатором на выводе AREF, режим активируется установкой бита REFS0 в регистре ADMUX. Для снижения влияния шумов на результат преобразования вывод AVCC необходимо связать с цифровым питанием VCC через LC-цепь.
Рассчитаем максимальное входное напряжение делителя, чтобы случайно не подать на вход большее напряжение и не повредить микроконтроллер.
Применим такую формулу, где: R1 = 100k, R2 = 25k, Uin = 5V,
Umax = Uin*(R1+R2)/R2
Umax = 5*125k/25k = 25V
Из этого мы знаем, что больше 25V на вход делителя напряжения подавать нельзя.
Результат преобразования в Вольтах вычисляется по формуле:
U = ADC*Uref*K/1024
где ADC — результат преобразования;
Uref опорное напряжение(V);
K — коэффициент делителя напряжения.
1024 — Разрядность АЦП 10 бит
Коэффициент делителя напряжения напряжения вычисляется по формуле:
K = (R1+R2)/R2
K = (100k + 25k)/25k = 5
В нашем примере максимальная разрешающая способность будет 10 разрядов, поэтому частота на входе схемы последовательного приближения должна быть в диапазоне 50…200 кГц. Установим ее впределах 125kHz, включим предделитель на 64 путем установки битов ADPS2 и ADPS1 в регистре ADCSRA.
В программе используем прерывание по окончании преобразования АЦП, для этого включим непрерывный режим работы АЦП путем установки бита ADFR и активируем прерывание битом ADIE в этом же регистре ADCSRA
В обработчике прерывания от АЦП 10-ти битный результат преобразования(ADC) после каждого измерения помещаем в буфер, а уже в основном цикле значение буфера делим на количество измерений для усреднения показаний. Далее, применив формулу, вычисляем результат преобразования, переводим результат вычисления в милливольты, путем умножения на 100, и выводим его на дисплей. Полный текст программы ниже.
Многоканальный вольтметр с выводом на компьютер
Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y
Работоспособность сайта проверена в браузерах:
IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
При меньших разрешениях возможно появление горизонтальной прокрутки.
По всем вопросам обращайтесь к Коту: kot@radiokot.ru
©2005-2022
Работа схемы
Схема цифрового вольтметра на основе платы Arduino представлена на следующем рисунке.
ЖК-дисплей подключен в 4-битном режиме. Его контакты DB4, DB5, DB6, DB7, RS и EN непосредственно подключены к контактам D4, D5, D6, D7, D8, D9 платы Arduino Uno.
Средняя точка делителя напряжения на резисторах R1 и R2, подключена к аналоговому контакту A0 платы Arduino. Остальные два конца делителя напряжения подключаются к источнику измеряемого напряжения и корпусу (земле).
Технические показатели цифрового вольтметра
- Уровень измеряемого напряжения – 0…100 вольт.
- Число диапазонов — 2 (0…10 В, 10…100 В).
- Сопротивление входа — приблизительно 300 кОм.
- Автоматическое переключение между диапазонами.
Схема достаточно проста. Поскольку в схеме вольтметра применена динамическая индикация отпала необходимость в токоограничивающих резисторах в цепи индикатора BT-M51DRD.
В случае если возникнет необходимость поднять входное сопротивление вольтметра (хотя 300 кОм вполне достаточно), то для этого нужно будет заменить операционный усилитель LM358 на другой с входной частью на полевых транзисторах, к примеру, ОУ TL082. Так же будет необходимо пересчитать и делители напряжений на входе на резисторах R1, R4 и R2, R6. В качестве источника опорного напряжения применен управляемый стабилизатор TL431. Фильтр для АЦП микроконтроллера Atmega8 выполнен на L1C3.
В конструкции цифрового вольтметра применены SMD резисторы и конденсаторы размера 0805. Индикатор с общим анодом. Плата изготовлена по технологии ЛУТ на двухстороннем текстолите.
Работа микроконтроллера Atmega8 в данном устройстве организована от внутреннего 8 МГц генератора. В печатке не предусмотрен разъем для внутрисхемного программирования. Просто подпаиваем провода от AVR программатора к соответствующим контактам на плате. Для сигналов RESET и MOSI на плате подготовлены 2 контактные площадки. Для сигнальных линий MISO и SCK можно взять выводы 2 и 3 индикатора.
Фьюзы при программировании микроконтроллера выставляем следующим образом:
Четырехканальный вольтметр 0-50В на базе набора «Цифровая лаборатория» NR05
Нередко возникает необходимость одновременно контролировать несколько напряжений, например, выходные напряжения блока питания компьютера, нескольких аккумуляторов и т. п. В прошлой публикации мы рассмотрели принцип работы кодового замка, а теперь, на основе платы расширения набора «Цифровая лаборатория» NR05, соберем четырехканальный цифровой вольтметр с индикацией результатов на встроенном в плату дисплее. Диапазон измеряемых напряжений можно изменять, применяя внешний делитель, а шаг измерения определяется разрядностью аналогово-цифрового преобразователя (АЦП) микроконтроллера Atmega 328, примененного в плате Ардуино, и составляет 1024 значения. Тогда в диапазоне напряжений 0-50В шаг измерения напряжения будет около 50 мВ, что вполне достаточно для бытового применения.
Измеряемые напряжения будем подключать на свободные аналоговые входы платы. Это входы A0, A4, A5 и A7, расположенные в правой нижней части платы. Для использования входа A0 следует временно выпаять резистор R4, расположенный возле разъема XP3 в правой нижней части платы.
Внешний делитель с разъемами для подключения измеряемых напряжений и платы расширения изготовим методом ЛУТ (так называемая «лазерно-утюжная технология») и протравим плату в растворе хлорного железа. Мы применили SMD-резисторы, но, если у вас нет лазерного принтера, делитель можно изготовить, нарисовав проводники водостойким фломастером. В этом случае лучше использовать выводные резисторы, так как точность размеров получившихся проводников будет ниже. Подробно технологию изготовления печатных плат методом травления в хлорном железе можно изучить, приобретя набор NN201 производства Мастер Кит.
Готовая плата делителя представлена на фото ниже.
На плате расширения установлен 2-х строчный жидкокристаллический индикатор с 16-ю символами в каждой строке. На таком индикаторе вполне комфортно разместятся четыре показания от 0 до 50 вольт с одним знаком после запятой и идентификаторы каналов.
Сами измерения целесообразно проводить несколько раз за небольшой период времени, усредняя их значения. Так мы уменьшим случайные ошибки измерений.
Реализуем также в программе «замораживание» результатов при нажатии на одну из встроенных в плату кнопок, к примеру, среднюю. При втором нажатии непрерывные измерения будут возобновляться.
Задействуем светодиод, подсоединенный к 13-му цифровому выводу Ардуино для индикации процесса измерения.
С учетом сказанного выше составим программу для Ардуино:
/*—————————————————————
Четырехканальный вольтметр 0-50В, с усреднением,
одна цифра после запятой, с отображением на LCD-индикаторе
16 символов, 2 строки,
Используется плата расширения из набора Мастер Кит
NR05 «Цифровая лаборатория»; 4 делителя на 10 на резисторах
1М, 100к, подключенных с аналоговым входам A0,A4,A5,A7
Калибровка опорного напряжения
Измерьте напряжение 5В и измените значения константы V_REF
в соответствии с измеренным значением.
Измеряйте напряжение с подключенным ЖК-дисплеем
и при запущенном скетче.
Определение калибровочных значений делителей (проводится
для каждого делителя)
Подключите стабильное напряжение Vin к входу делителя и
измерьте его.
Измерьте напряжение Vout на выходе делителя.
Калибровочное значение DIV_* будет равно Vin/Vout.
// встроенный светодиод (используем для индикации процесса измерения)
#define LED 13
// число выборок на одно измерение
#define NUM_SAMPLES 20
// калибровочные значения делителя
#define DIV_1 11.186
#define DIV_2 11.186
#define DIV_3 11.186
#define DIV_4 11.186
// калибровочное значение опорного напряжения
#define V_REF 4.575
// число кнопок на плате
#define NUM_KEYS 5
// калибровочные значения для каждой кнопки (выведены экспериментально)
int adcKeyValNUM_KEYS = ;
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
unsigned long sum4 = ; // сумма выборок в каждом канале
unsigned char sample_count = 0; // номер текущей выборки
float voltage4 = ; // расчитанное напряжениен
int cnt = 0; // служебная переменная
int keyIsPressed = 0; // флаг нажатия кнопки «заморозки» измерений
void setup()
lcd.begin(16, 2);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
>
void loop()
// если кнопка 3 нажата, инвертируем флаг нажатия кнопки «заморозки»
if (get_key() == 3) keyIsPressed = !keyIsPressed;
delay(500);
>
// если флаг установлен (1), информация на дисплее не обновляется
if (keyIsPressed == 0) digitalWrite(LED, LOW);
// берем выборки в каждом канале и суммируем их
while (sample_count < NUM_SAMPLES) // sample channel A0, A4, A5, A7
sum0 += analogRead(A0);
sum1 += analogRead(A4);
sum2 += analogRead(A5);
sum3 += analogRead(A7);
sample_count++;
delay(10);
>
digitalWrite(LED, HIGH);
// рассчитываем напряжения в каждом канале путем усреднения по выборкам
for (cnt = 0; cnt < 4; cnt++) voltagecnt = ((float)sumcnt / (float)NUM_SAMPLES * V_REF) / 1024.0;
>
// отображаем значения на идикаторе
lcd.setCursor(0, 0);
lcd.print(«A „);
lcd.print(voltage0 * DIV_1, 1);
lcd.print(“V „);
// voltage 2 — B (pin A4)
lcd.setCursor(8, 0);
lcd.print(“B „);
lcd.print(voltage1 * DIV_2, 1);
lcd.print(“V „);
// voltge 3 — C (pin A5)
lcd.setCursor(0, 1);
lcd.print(“C „);
lcd.print(voltage2 * DIV_3, 1);
lcd.print(“V „);
// voltage 4 — D (pin A7)
lcd.setCursor(8, 1);
lcd.print(“D „);
lcd.print(voltage3 * DIV_4, 1);
lcd.print(“V „);
// сбрасываем счетчик и суммы
sample_count = 0;
for (cnt = 0; cnt < 4; cnt++) sumcnt = 0;
delay(20);
>
>
// функция возвращает номер нажатой кнопки
int get_key()
int input = analogRead(A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyValk)
return k + 1;
return 0;
>
Программа снабжена достаточно подробными комментариями, поясняющими особенности реализации алгоритма.
Пожалуй, самой главной особенностью является описанный в комментариях процесс калибровки констант, участвующих в вычислениях измеряемых напряжений. Для калибровки делителя (производится однократно) следует использовать источник стабильного постоянного напряжения. С учетом того, что калибровка занимает непродолжительное время, можно с успехом использовать батарею на 9В типа «Крона» и цифровой мультиметр. Вполне подойдет мультиметр из «Набора юного электронщика» NR02. Этот набор также отлично подойдет для обучения пайке и монтажу печатных плат.
Следует отметить, что при изменении напряжения питания, поступающего на Ардуино, следует обязательно соответственно изменить калибровочное значения опорного напряжения, относительного которого вычисляются измеренные значения.
Для изменения диапазона измерений необходимо применить делитель с другим коэффициентом деления входного напряжения.
Многоканальный вольтметр с выводом на компьютер
Программа для компьютерного вольтметра написана в среде программирования Borland Delphi и предназначена для работы с операционными системами Windows XP , Windows Vista и Windows 7 .
В окне приложения размещены (рис. 2.3.1): верхнее меню, включающее пункты «Файл», «Измерения», «Справка»; место для визуализации графика зависимости измеряемого напряжения от времени; индикатор, показывающий текущее значение напряжения на входе АЦП; группа радиокнопок для выбора частоты измерений; управляющие кнопки «Пуск/Пауза» и «Сброс»; выпадающий список существующих на данном компьютере портов.
Минимальная скорость проведения измерений электрического напряжения равна 1 измерению в 2 минуты. Максимальная скорость — около 100 измерений в секунду (примерно 1 измерение в 0,01 секунды). Это позволяет визуализировать на экране и анализировать медленные и быстропротекающие процессы, происходящие в исследуемых электрических цепях.
На самом деле программа не может обеспечить указанную выше максимальную частоту измерений. Более менее точно она обеспечивает частоту порядка 50 измерений в секунду и несколько больше. Вот это «несколько больше» и обозначено как 100 измерений в секунду для простоты восприятия графика временной зависимости.
При выборе скорости «100 измерений в секунду» надо помнить, что это число указано формально, а сам выбор такого значения оставлен для того, чтобы демонстрировать опыты, в которых нужна скорость измерений большая, чем 50 измерений в секунду. При этом точная оценка временнных интервалов исключена. Это справедливо и для других программ, представленных на этом сайте.
О том, как написать программу для вольтметра в среде программирования Lazarus, можно прочитать здесь или здесь.
Данилов О. Е. Программное обеспечение цифрового вольтметра на базе микросхемы TLC1549 Текст / О. Е. Данилов // Молодой ученый. — 2014. — №4. — С. 97-103.
Для измерений вполне может пригодиться и эта программа, составленная на языке программирования Borland Pascal 7.0. Если вы являетесь обладателем старого компьютера (или не совсем старого компьютера), то этот вариант вас устроит. В качестве операционной системы может выступить как MS-DOS, так и системы семейства Windows (95, 98, XP). Для нормальной работы в Windows XP скомпилированную программу нужно будет запускать в Far Manager. Программа также может быть применена при использовании в вольтметре микросхемы TLC549 вместо TLC1549. В этом случае надо изменить значение переменной n в программе на 8, так как такой АЦП будет 8-разрядным.