Комментарии 35
насколько неинтересно когда у процессора 128 ног и их можно подключить ко всей периферии
и насколько интересной становится жизнь, когда ног всего 8, две из которых - питание!
У мелких процессоров - свои конкурсы, у больших - свои
Несколько питаний (vcc, gnd) на SoC заводится с разных сторон, не с целью удобства, или еще чего.. А чтобы целесообразно "равномерно" распределить токи по всему кристаллу процессора.. как собственно и микроконтроллера..
Не маловажную роль, в данном случае, играет физическая архитектура, на уровне кристалла..
Не столько для распределения токов, сколько для подключения к этим местам на кристалле внешних фильтрующих конденсаторов. Поэтому на каждой паре таких выводов должно быть по конденсатору.
У больших контроллеров свои приколы - в частности, если на 144-ногом STM32H7 подключить езернет, SDRAM и дисплей, то свободной остаётся только одна ножка АЦП.
Только вот конкретно эта "мало ног" у ATtiny 85 - это илюзия экономии и эффективности. Он стоит 200р, в то время как модуль esp12 с кучей ног стоит 100р.
А у кошки четыре ноги, вход выход, vcc и gnd
а у вас питание контроллера напрямую связано с аккумулятором? Без промежуточных стабилизаторов? Я когда-то в подобной ситуации, но со стабилизатором между VCC и аккумом, использовал временное переключение режима пина с выхода на вход, и подключением pull-up резистора к аккумулятору. Конечно точность невысокая, но для анализа заряда хватало.
подключением pull-up резистора к аккумулятору
Но в этом случае измеряемое напряжение выходит за границы диапазона АЦП. Значит напряжение нужно как-то поделить, но чтобы это незначительно повлияло на разряд аккумулятора.
Делить резисторами большого номинала нельзя, из-за низкого входного сопротивления АЦП. Для всяких решений с коммутацией нужны дополнительные выводы.
Кроме того может возникнуть проблема с фантомным питанием.
А смысл что-то ещё мутить, батарейка 4.2в до 3.0в разряжается, стабилизатор отожрет ещё полтора вольта и получается нужно повышать с потерями, а все это при батарейном питании не очень. Китайские клоны ардуинки от 5 до 2,7в хавают, идеально для питания от лития. Но питание контролировать надо. Индикаторы на светодиодах и компараторе неточные, меньше 3.7 и уже говорят в морг. Вольтметры точнее, но как и первые жрут довольно много, от 20ма.
Кстати для Ардуино есть библиотека, которая именно по такой методике работает. Вот только LG8F328 немного не такой😥
Если идея уберечь аккумулятор от опасного разряда( около 3V ) то, возможно, внешняя схема с компаратором каким-нибудь была-бы уместнее, как мне кажется.
Так это ж штатная процедура, описанная в datasheet и с примером в refnotes, нет?
Чтобы измерить собственное напряжение питания у тиньки 85 нужно:
-включить ацп, режим однократного замера, предделитель высьавить в 128
-установить vcc как опорное напряжение
-включить ИОН 1.1в на вход ацп
-считать показания, перевести в вольты
Никакие доп. выводы не нужны.
Примерно так:
#define REFERENCE 1.10
float getADC( void ) {
ADCSRA = (0x01 << ADEN) | (0x01 << ADPS2) | (0x01 << ADPS1) | (0x01 << ADPS0);
ADMUX = (0x01 << MUX3) | (0x01 << MUX2);
delayms(2);
ADCSRA |= (0x01 << ADSC);
while (ADCSRA & (0x01 << ADSC));
return (REFERENCE * 1024.0) / ( (uint16_t)ADCL | ((uint16_t)ADCH << 8) );
}
Причем это, вместе с куском кода есть прямо в даташите - собственно, в чем проблема?
Ну или я неверно понял задачу...
О сколько нам открытий чудных приносит даташита текст...
Внутренний ИОН для того и придуман, чтобы не нужно было "подавать стабильное и заранее известное напряжение".
рубрика вредные советы онлайн?)))
внимательно прочитайте документацию, заметьте, что точность встроенного источника 20%, и измерения основанные на нем будут показывать погоду на Марсе

еще раз перечитайте, посмотрите графики ухода этого напряжения, еще раз подумайте и никогда не используйте...)))
ps: очень с ним намучился, пока не перешел на микроконтроллеры с 1% ИОН
точность встроенного источника 20%,
с точки зрения инженерной точности - нормально же

Вообще-то погрешность на вашем скриншоте 10%.
Спросим DeepSeek.
Напиши программу на си измерения напряжения питания микроконтроллера ATtiny85
DeepSeek отвечает:
Программа измерения напряжения питания ATtiny85 на Си
Вот программа для измерения напряжения питания ATtiny85 с использованием внутреннего источника опорного напряжения 1.1В:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// Настройка UART для вывода результатов (если нужен вывод на компьютер)
#define BAUD 9600
#define UBRR_VALUE ((F_CPU / 16 / BAUD) - 1)
void uart_init() {
UBRRH = (uint8_t)(UBRR_VALUE >> 8);
UBRRL = (uint8_t)UBRR_VALUE;
UCSRB = (1 << TXEN);
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
}
void uart_putc(char c) {
while (!(UCSRA & (1 << UDRE)));
UDR = c;
}
void uart_puts(const char* str) {
while (*str) {
uart_putc(*str++);
}
}
void uart_put_hex(uint8_t value) {
const char hex_digits[] = "0123456789ABCDEF";
uart_putc(hex_digits[value >> 4]);
uart_putc(hex_digits[value & 0x0F]);
}
void uart_put_uint16(uint16_t value) {
char buffer[6];
uint8_t i = 0;
do {
buffer[i++] = '0' + (value % 10);
value /= 10;
} while (value > 0);
while (i > 0) {
uart_putc(buffer[--i]);
}
}
// Функция инициализации АЦП
void adc_init() {
ADMUX = (1 << MUX3) | (1 << MUX2); // Выбираем VCC как вход (1.1V reference)
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // Включить АЦП, предделитель 64
}
// Функция чтения АЦП
uint16_t adc_read() {
ADCSRA |= (1 << ADSC); // Начать преобразование
while (ADCSRA & (1 << ADSC)); // Ждем окончания преобразования
return ADC;
}
int main(void) {
// Инициализация
uart_init();
adc_init();
// Разрешаем прерывания
sei();
uart_puts("ATtiny85 VCC measurement\r\n");
while (1) {
// Читаем значение АЦП
uint16_t adc_value = adc_read();
// Рассчитываем напряжение питания в милливольтах
// VCC = (1.1V * 1024) / ADC_value
uint32_t vcc_mv = (1126UL * 1024UL) / adc_value; // 1.1V * 1024 = 1126 (корректировка)
// Выводим результат
uart_puts("VCC: ");
uart_put_uint16(vcc_mv);
uart_puts(" mV\r\n");
// Задержка между измерениями
_delay_ms(1000);
}
return 0;
}
Объяснение работы программы:
Программа использует внутренний источник опорного напряжения 1.1В для измерения напряжения питания VCC.
Алгоритм измерения:
Источником измерения выбирается внутренний источник 1.1В
Входом АЦП выбирается VCC через внутренний делитель
Измеренное значение АЦП позволяет вычислить фактическое напряжение питания
Формула расчета:
VCC = (1.1V * 1024) / ADC_value
Программа выводит результат в милливольтах через UART (если подключен).
Важные замечания:
Для работы UART вам понадобится подключение к компьютеру через USB-UART преобразователь.
Если вывод через UART не нужен, можно заменить вывод на мигание светодиодом или другие индикаторы.
В ATtiny85 нет аппаратного UART, поэтому используется программная реализация (библиотека SoftwareSerial или аналогичная).
Для более точных измерений может потребоваться калибровка внутреннего источника 1.1В.
Не забудьте установить правильную частоту F_CPU в настройках проекта (должна соответствовать частоте вашего микроконтроллера).
------------------------------
Спросим DeepSeek.
С какой погрешностью будет измерено напряжение питания по этой программе
DeepSeek отвечает:
Точность измерения напряжения питания ATtiny85 по предложенной программе зависит от нескольких факторов. Давайте разберём основные источники погрешности и оценим общую точность:
Основные источники погрешности:
Точность внутреннего ИОН 1.1В:
Типичная погрешность: ±10% (по datasheet)
После калибровки можно достичь: ±1-2%
Это главный источник погрешности
Разрешение АЦП:
10-битный АЦП (1024 уровня)
Теоретическая погрешность квантования: ±0.1% (1/1024)
На практике из-за шумов: ±2-3 младших бита (±0.3%)
Температурная стабильность:
ИОН имеет температурный дрейф: ±0.5-1%/°C
При изменении температуры на 10°C: дополнительно ±5-10%
Напряжение насыщения АЦП:
АЦП не может измерить напряжение вблизи VCC
Добавляет небольшую погрешность (±0.5%)
Точность вычислений:
Использование целочисленной арифметики
Погрешность округления: ±0.1-0.2%
Оценка общей погрешности:
Без калибровки:
Худший случай: до ±12%
Типичный случай: ±5-8%
С калибровкой ИОН:
Худший случай: ±3-4%
Типичный случай: ±1-2%
С калибровкой и температурной компенсацией:
Можно достичь: ±1% в стабильных условиях
Как улучшить точность:
Калибровка ИОН:
// Добавьте калибровочное значение (уникально для каждого чипа) #define VREF_CALIBRATION 1126 // Пример: 1.100В * 1024 = 1126.4
Усреднение измерений:
uint16_t adc_read_avg(uint8_t samples) { uint32_t sum = 0; for(uint8_t i = 0; i < samples; i++) { sum += adc_read(); _delay_ms(1); } return sum / samples; }
Температурная компенсация (если измеряете температуру).
Использование внешнего точного ИОН (если требуется высокая точность).
Практический пример:
При VCC = 5.00В:
Без калибровки: показания 4.6-5.4В (±8%)
С калибровкой: показания 4.95-5.05В (±1%)
Вывод: предложенный метод хорош для мониторинга питания, но если нужна высокая точность (лучше ±1%), потребуется калибровка каждого конкретного экземпляра микроконтроллера.
--------------------
Рад был помочь! Если в будущем понадобится доработать программу под конкретные задачи (например, увеличить точность, добавить вывод на дисплей или реализовать пороговые сигналы), обращайтесь.
Краткий итог по измерению VCC на ATtiny85:
Простота: Метод не требует внешних компонентов
Точность: ±1-2% с калибровкой, ±5-10% без нее
Оптимизации: Усреднение, калибровка, температурная стабильность
Успешных проектов! 😊
P.S. Для самых критичных измерений можно рассмотреть внешние АЦП (например, ADS1115) или прецизионные ИОН.
в этом и есть коварство этого ужасного ИОН, вам кажется, что с ним можно работать, но по мере работы с ним выясняется, что это нестабильный источник напряжения где-то около 1.1В. (насколько я понимаю, он используется для определения порогов напряжения включения микросхемы, а бонусом его завели на опору ADC)
еще раз подумайте и никогда не используйте...)))
Такая точность вполне пойдет для показометра заряда аккумулятора, как у автора поста. Или, как у меня в фонарике, для ограничения максимальной яркости по мере расхода батареи.
в этом и есть вредность совета, завтра молодой инженер зайдет на хабр и прочитает эту статью, и разработает схему на этом ИОН, потому что так рекомендовали на хабре. В итоге схема в серии работать не будет. Это я не вам в комментариях пишу, а этому инженеру, которым был я...
ps: простой и эффективный способ использовать качественные линейные стабилизаторы, в ответственных применениях прицезионные ИОН.
завтра молодой инженер зайдет на хабр и прочитает эту статью, и разработает схему на этом ИОН, потому что так рекомендовали на хабре
На заборе много чего рекомендуют пишут. Если этот ваш инженер такой впечатлительный, он может и в когтеточечный бизнес удариться.
еще раз поясню, что пишу не для вас, а для тех, кто прочитает статью и захочет использовать этот нестабильный ИОН в своих проектах, это вредный совет, которому более 10 лет и инженеры постоянно наступают на эти грабли и все равно приходят к тому, чтобы использовать внешние источники опорного напряжения, никакие калибровки не помогут.
pss: в современных реалиях attiny25/85 не перспективные морально устаревшие контроллеры, ценник на который сильно завышен, есть более удачные со стабильным ИОН, точным стабильным встроенным генератором, большей памятью за цену меньше бакса. Много кодил под tiny, когда перешел на современные - с облегчением выдохнул...
ps: а когтеточный бизнес чем плох?) вот та статья была хороша))
Он вполне стабильный и точный для измерения заряда батареи. Но нужна калибровка и чтение даташита обязательно
для тех, кто прочитает статью и захочет использовать этот нестабильный ИОН в своих проектах
Для них придумали даташиты. Инженер он же обучен читать документацию, правда? (ц) принцесса Падме.
А какой смысл в 21 веке в новых разработках использовать tiny 85?
Эта проблема удобно решена в контроллерах STM32 в которых есть зашитое с завода калибровочное значение внутреннего опорного напряжения VREFINT_CAL при точном известном Vdd (+- 10 mV). Считав его и измерив АЦП свое опорное получаем весьма точное напряжение питания МК.
Вполне себе элегантное решение! Возьму на заметку. Жаль только, что опорник калибровать нужно прямо на каждом экземпляре. Сталкивался с подобной ситуацией, на той же тиньке, правда с выводами было чуть проще, и я задолбался все 25 устройств калибровать. Правда потом выяснилось, что виной плывущей калибровки был плохо отмытый флюс, который остался под корпусом контроллера после сборщиков. Отмыл всё ещё раз в уз и спирту, всё полетело
Вариант из каких-то примеров применения atmel. Без индивидуальной калибровки каждого чипа не годится, у atmega опорное напряжение с точностью +/-10%. Калибровку можно автоматизировать, подав точное напряжение питания например 4.00V и нажав какую-то кнопку, но это костыль. Лучше использовать внешний ИОН, даже TL431 и то будет лучше.
Измерение собственного напряжения питания микроконтроллера