Измерение напряжения питания микроконтроллера



Измерение питающего напряжения микроконтроллера
Иногда возникает необходимость контроля напряжения питания в автономном устройстве на микроконтроллере, то есть измерение напряжения на аккумуляторе или батарейке, в процессе длительной работы устройства. Поначалу может показаться, что эта несложная задача, но не все так просто. Можно подключить к линии питания делитель из двух резисторов, и в точке их соединения измерять напряжение с помощью АЦП, далее с учетом коэффициента делителя и величины опорного напряжения рассчитать реальное напряжение. Этот вариант подошел бы для устройства с внешним питанием, но в автономном устройстве резистивный делитель будет постоянно потреблять энергию.
Максимальное сопротивление аналогового источника на входе АЦП микроконтроллеров PIC16 не должно превышать 10 кОм, отсюда при напряжении питания 4В получим ток через резистивный делитель 400 мкА, для сравнения, микроконтроллер в спящем режиме потребляет всего 1 мкА. Для автономного устройства это лишний расход энергии, поэтому такой метод измерения напряжения не подойдет.

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

Uпит = (Uоп*255) / Xацп

где Uоп – величина напряжения на стабильном источнике, Xацп – результат измерения АЦП (число 0-255). Напряжение Uоп можно считать константой, таким образом, чтобы узнать напряжение питания необходимо разделить известную константу на результат преобразования АЦП.

Для реализации этой идеи я использовал микроконтроллер PIC16F676 с встроенным модулем АЦП. Для отображения величины напряжения использовал цифровое табло на драйвере MAX7219. Схема подключения приведена ниже:
Схема измерения напряжения питания PIC
В качестве источника стабильного напряжения используется стабилизатор напряжения на регулируемом стабилитроне TL431, который обладает достаточно высокой стабильностью. Стабилизатор управляется от линии RA2 микроконтроллера, резистор R1 ограничивает ток через стабилитрон, конденсатор C3 сглаживающий. Стабилизация напряжения сохраняется при изменении тока в широком диапазоне от 1 до 100 мА. Стабилизатор настроен на минимальное напряжение в 2,5В, эта величина опорного напряжения стабилитрона TL431. Напряжение измеряется на линии RA0 микроконтроллера, которая подключена к катоду стабилитрона.

Ниже представлен код программы микроконтроллера:

Измерение напряжения выполняется каждые 4 секунды, сначала включается стабилизатор, через 2 секунды измеряется напряжение, после чего стабилизатор отключается на 2 секунды. Временные задержки установлены для того чтобы конденсатор C3 успевал зарядиться. Если нет необходимости в экономии энергии, то стабилизатор можно не отключать. Результат преобразования АЦП 10-битной число, но я использую только 8 бит для упрощения арифметических операций.

Константа (Uоп*255) в моем варианте равна 2,49*255=634,95; но я использую значение константы умноженное на 100 (63495), чтобы в итоге при делении получить значение напряжения с двумя знаками после запятой. После вычисления, значение напряжения передается в подпрограмму преобразования двоичного числа в десятичное по разрядам, а далее выводится на цифровой индикатор. Затем все этапы повторяется по циклу.

Я сравнил измеренные значения напряжения с показаниями цифрового мультиметра, в среднем разница составляет ±0,02В, (иногда скачет в пределах ±0,06В ) что весьма неплохо. Таким образом, с помощью данного способа можно измерить напряжение питания микроконтроллера в автономном устройстве, не увеличивая энергопотребления.
Измерение напряжения PIC, макетИзмерение напряжения питания PIC, макет

Прошивка МК и исходник

Последние записи:

Комментариев 7 на “Измерение напряжения питания микроконтроллера

  1. Добрый день. А как реализовать такое же устройство, но с питанием от аккумулятора 12в? Идея состоит в том, чтобы видео регистратор в автомобиле оставался работать после выключения зажигания, а мк следил, чтобы акб не разрядился ниже программно установленного уровня. А если это все будет на pic16f628a то совсем замечательно будет

    • В PIC16F628A нет АЦП, но там можно воспользоваться встроенным компаратором, на один вход компаратора подать напряжение с резистивного делителя подключенного к 12В, а на второй вход тоже резистивный делитель только с переменным резистором, чтобы регулировать напряжение срабатывания, хотя второй вход можно подключить к внутреннему источнику опорного напряжения, и программно регулировать напряжение срабатывания. Сам микроконтроллер придется подключать к 12В через стабилизатор напряжения 5В. Резистивный делитель нужен для снижения напряжения 11-14В до приемлемого уровня 0-5В, чтобы не повредить микроконтроллер.

      Если брать микроконтроллер с встроенным АЦП, просто через резистивный делитель подавать напряжение на вход АЦП, и измерять напряжение. Резистивный делитель будет потреблять около 1мА, микроконтроллер примерно также, стандартный стабилизатор напряжения 5мА, итого 7мА.

  2. Здравствуйте. Есть вопрос по измерению. Ситуация следующая. Я собрал простенькую схему измерения напряжения в диапозоне 0 — 50 В на PIC16F676. Источник опорного напряжения — напряжение питания, от стабилизатора 7805. Так же от него питается индикатор. Через резистивный делитель подается измеряемое напряжени на один из входов. При первом измерении выводится одно значение, во втором другое, и в дальнейшем случайным образом выводятся эти два значения, отличаются друг от друга на 0,2 В. Причиной этих колебаний может быть то, что индикатор и контроллер питаются от одного источника?? И еще не можете ли мне подсказать кратко какие бывают причины погрешности измерений.

    • Из даташита на PIC контроллеры, погрешность АЦП составляет 1/2LSB при соблюдении условия временной задержки перед измерением, расчет задержки можно посмотреть в даташите. Для 10-битного разрешения и Uоп=5В получим погрешность (1/2)*(5В/1024)=2,44 мВ.
      Резистивный делитель также добавляет погрешность, возьмем делитель на 10, при изменении напряжения на 5В (например с 30 до 35В) на выходе делителя напряжение изменится всего на 0,5В. Выше рассчитанная погрешность в этом случае увеличится в 10 раз 2,44 мВ*10=24,4 мВ, то есть прямо пропорционально коэффициенту делителя напряжения.
      Кроме этого погрешность зависит от стабильности источника опорного напряжения, стабилизатор 7805 в качестве опорного не подойдет для более-менее точных измерений.

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

  3. Привет! Поясни пожалуйста, откуда взялась формула Uпит = (Uоп*255) / Xацп ?
    На мой взгляд Uоп надо поделить на 255 и умножить на полученное Xацп, разве нет?
    Да, кстати, в комментариях кода вызова подпрограммы деления почему то указано число 62475, а не рассчитанное 63495 — ну я думаю это просто опечатка.
    И как рассчитать обвязку схемы TL431, в даташите не нашел такой схемы. Да и потом, вроде везде пишут, что нельзя конденсатор на выходе TL431 ставить — приводит к самовозбуждению. В общем ниче не понятно 🙂

    • В стандартном варианте для АЦП измеряемое напряжение рассчитывается из пропорции Uизм = (Uоп*Xацп) / 255, но здесь в качестве опорного напряжения используется напряжение питания микроконтроллера: Uоп=Uпит , а измеряем мы стабильный источник напряжения (назовем его Uоп), так что приравниваем Uизм=Uоп. В итоге получим Uоп = (Uпит*Xацп) / 255, отсюда Uпит = (Uоп*255) / Xацп.

      Да, в коде опечатка

      В даташите на TL431 приведена формула:
      sgtc-rashet

      правой частью формулы (Iref*R1) можно пренебречь

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *