воскресенье, 23 марта 2025 г.

Подсчёт времени на ATmega328P

В прошивке измерителя ёмкости аккумуляторов есть код, который считает время разряда аккумулятора. Этот код я нашёл на одном из форумов посвящённых Arduino тематике и он выглядит довольно простым:

volatile uint8_t runTimeIsr = 0;
uint8_t runTimeLoop;
uint32_t runTime;

// https://gist.github.com/raspberrypisig/8bf856ae9b55bb433d4c11ac9540a881
void timerInit() {
    noInterrupts();
    // Clear registers
    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1 = 0;

    // 1 Hz (16000000/((15624+1)*1024))
    OCR1A = 15624;
    // CTC
    TCCR1B |= (1 << WGM12);
    // Prescaler 1024
    TCCR1B |= (1 << CS12) | (1 << CS10);
    // Output Compare Match A Interrupt Enable
    TIMSK1 |= (1 << OCIE1A);
    interrupts();
}

ISR(TIMER1_COMPA_vect) {
    runTimeIsr += 1;
}

После запуска таймера переменная runTimeIsr считывается в основном цикле и затем обнуляется. Поскольку операция сложения с четырёхбайтной переменной занимает несколько циклов, то используется промежуточная переменная runTimeLoop чтобы избежать конфликта с обработчиком прерывания

void timerDo() {
    runTimeLoop = runTimeIsr;
    runTimeIsr = 0;
    runTime += runTimeLoop;
}

В теории обработчик прерывания должен вызываться каждую секунду если микроконтроллер работает на частоте 16 МГц, но в реальности за 3 часа тестирования время, измеренное микроконтроллером отстало от реального на 35 секунд.

При этом посчитанная ёмкость составила 299 мАч вместо ожидаемых 300 - выглядит как допустимая погрешность, но стало любопытно в чём причина.

вторник, 18 марта 2025 г.

Схема измерителя ёмкости аккумуляторов

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

Полная схема устройства

Далее я рассмотрю отдельно интересные части схемы.

Источник питания


Для питания схемы нужен источник постоянного напряжения от 7,5 В до 9 В и током 500 мА. От неправильной полярности защищает диод по входу, напряжение 5В берётся с выхода линейного стабилизатора L7805.

Схема потребляет до 350 мА (если включены оба реле) и при питании от 9 В на стабилизаторе рассеивается около 1,2 Вт. Поскольку корпус TO-220 не может рассеять больше 1 Вт, то на линейном стабилизаторе установлен небольшой радиатор.

четверг, 13 марта 2025 г.

Проверка работы Distribution Registry

 Чтобы проверить работоспособность Distribution Registry достаточно только curl. Для примера получу манифест для образа registry.example.com/helloworld-python:latest

$ REGISTRY_USERNAME=read-only
$ REGISTRY_SERVER=registry.example.com
$ IMAGE_NAME=helloworld-python
$ IMAGE_NAME=latest

$ curl --user $REGISTRY_USERNAME \
  --header 'Accept: application/vnd.docker.distribution.manifest.v2+json' \
  https://$REGISTY_SERVER/v2/$IMAGE_NAME/manifests/$IMAGE_TAG

среда, 12 марта 2025 г.

Защита входа АЦП для INA226

В процессе наладки схемы измерителя я умудрился поджарить микросхему INA226, подав 5 В на вход VBUS в обратной полярности. Согласно документации абсолютный максимум напряжения на входе VBUS у INA226 от -0,3 В до 40 В. Поначалу микросхема не определялась микроконтроллером, но чуть позже стала отвечать но показания напряжения было около 88 В на входе VBUS. Перепаивать мелкий корпус INA226 несколько раз (первая замена оказалась контрафактной) было тем ещё "удовольствием".

Чтобы не повторить ошибку собрал схему защиты от обратной полярности и перенапряжения

От обратной полярности защищает диод шоттки 1N5819. В случае неправильного подключения он открывается и ограничивает напряжение на входе АЦП.

суббота, 8 марта 2025 г.

Очередная замена диска в домашнем сервере

В домашнем сервере есть жёсткий диск Toshiba DT01ACA300 на 3 TB который работает почти 8 лет или 69623 часов, если быть точным.

На этой неделе мониторинг оповестил что показатель S.M.A.R.T. "Current_Pending_Sector" у этого диска вырос до 32

при этом показатели Reallocated_Sector_Ct и Reallocated_Event_Count пока по нулям.

Для меня это означает что пора искать замену для этого старичка, но особой спешки нет, т.к. этот диск - часть RAID1 и потерю одного диска можно пережить. Однако существует вероятность что второй диск откажет в момент синхронизации массива после добавления нового диска. Прошлый раз менять диск в массиве пришлось 4,5 года назад, но тогда ситуация была печальнее.

На замену взял диск Seagate ST4000VX015 на 4 TB. У этого диска технология записи CMR (Conventional Magnetic Recording), он предназначен для работы 24x7 и есть поддержка Error Recovery Control. Скорость вращения шпинделя меньше 7200 RPM (я не нашёл точной цифры в документации производителя, а продавцы указывают 5900 RPM), но это перестало быть критичным после переноса системы на SSD.

среда, 5 марта 2025 г.

SMD зажим-пинцет для мультиметра

 Очень краткий обзор на SMD зажим-пинцет для мультиметра - либо мне пришёл бракованный экземпляр, либо этот зажим полная ерунда и не стоит его брать вовсе.

При разомкнутых щупах мультиметр показывает сопротивление около 43 МОм. Это указывает на проблемы с изоляцией где-то внутри пинцета.

Как результат - будут искажаться показания высокоомных сопротивлений - измерил SMD сопротивление номиналом 1 МОм, с обычными щупами мультиметр показывает 0,999 МОм, а с пинцетом 0,982 МОм. Для простой проверки сгодится, но подбирать номинал сопротивления таким пинцетом точно не стоит.

При измерениях конденсаторов скорее всего будет показывать ток утечки (но мне нечем проверить эту теорию), хотя сам конденсатор не виноват. Измерил номинал конденсатора 100 нФ - показания мультиметра с обычными щупами и пинцетом близкие, но в случае пинцета они не фиксируются как от плохого контакта.

воскресенье, 2 марта 2025 г.

Корпус для измерителя ёмкости аккумуляторов

Делаю новый проект измерителя ёмкости аккумуляторов на замену модулю ZB2L3 который ограничен напряжением 15 В и током 3 А. Модуль ZB2L3 не отличается точностью из-за отсутствия четырёхпроводной схемы измерения напряжения.

Когда проверял ёмкость нового аккумулятора для робота-пылесоса конфигурация которого 4S2P (напряжение полностью заряженного аккумулятора 16,8 В), то использовать ZB2L3 не получилось. В дизайн своего устройства закладываю поддержку напряжения до 30 В и тока до 20 А (ограничение силового реле по постоянному току) а также соединение с компьютером для передачи измерений напряжения и тока.

Сейчас идёт этап написания прошивки для микроконтроллера и доводка принципиальной схемы. Чтобы не возиться с ворохом проводов на столе решил потратить несколько часов и смоделировать корпус в OpenSCAD.

Печатную плату изолированного преобразователя USB UART экспортировал из Kicad PCB Editor (в меню "File" / "Export" / "STEP/GLB/BREP/XAO/PLY/STL...", выбрать формат STL и остальные параметры оставить без изменения).

Остальная электроника смонтирована на макетной плате и я рисовал в Kicad только её габаритный аналог с отверстиями для крепления и тактовыми кнопками. Далее экспортировал в STL аналогично плате преобразователя.

Шунт на 20 А упрощённо смоделировал чтобы посмотреть на габарит и совпадение креплений.

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