C&ESR Meter, v2, ремейк. Часть 1.

  Творческое переосмысление достаточно точной и не очень сложной конструкции измерителя емкости и ESR конденсаторов. Речь идет о измерителе C&ESR автора Келехсашвили В.А. (vyachko), конструкция опубликована и описана в журнале «Радио», №6 и №7 за 2010г. Т.к. времени со дня публикации прошло немало, порылся в инете, почитал статьи повторивших эту конструкцию и форумы где ее обсуждали, предлагали усовершенствования и т.д. Также собрал моделируемый прототип в симуляторе Proteus 7.10 для изучения работы программы, понимания принципа ее работы. Все это закончилось тем, что и схема была изменена, и программа % на 80 переделана. Неизменным остался только принцип измерения емкости и ESR конденсаторов на постоянном токе, но внес изменение в алгоритм разрядки конденсатора.

  О точности прибора и возможности внутрисхемных измерений сказал сам автор в топике на форуме vrtp.ru:
      Если Ваша цель измерение ESR с лабораторной точностью, то данный прибор не для Вас. Цель создания прибора — из максимально доступных деталей получить прибор с точностью достаточной для домашнего использования. Грамотные специалисты-ремонтники могут себе позволить приобретение настоящего измерительного прибора, а желающие «за копейки» получить лабораторную точность пусть обратят внимание на другие конструкции;
      Если в схеме параллельно измеряемому конденсатору нет шунтирующих сопротивлений или германиевых п/п переходов, или переходов с барьером Шоттки, то мерять (внутрисхемно) можно (в принципе эти ограничения в той или иной мере свойственны практически всем измерителям ЭПС);

Теория. Способ измерения С и ESR на постоянном токе.

  Если испытываемый конденсатор ёмкостью C заряжать от источника постоянного тока I, напряжение на его выводах будет линейно нарастать от значения UR по закону:




UR – падение напряжения на активном сопротивлении конденсатора (ESR).

  При этом измеряются два интервала времени t1 и t2, в течении которых напряжение между обкладками конденсатора достигает значений соответственно U1 и U2. Все эти значения связаны с параметрами конденсатора следующим образом:



Посчитать величину заряда для двух фиксированных значений напряжения U1 и U2, в этом случае можно по формуле:

Взяв значение U2 вдвое большим U1 формулу расчёта ёмкости можно упростить:


Формула для расчета активного сопротивления конденсатора (ESR) в общем случае составит:


Опять-же, взяв значение U2 вдвое большим U1, формулу расчёта ESR тоже можно упростить:



  Для реализации такого метода нет необходимости в применении АЦП, пороговые значения напряжений для управления таймером устанавливаются компараторами, а математические вычисления ёмкости и ESR производятся микроконтроллером с выводом информации на дисплей.

Теория. Применяемая арифметика с фиксированной точкой.

Для удобства вычисления микроконтроллером формулы необходимо преобразовать, выразив метки времени t1 и t2 через частоту счетного таймера F и кол-во счетных импульсов n1 и n2 соответственно.




Преобразованная формула вычисления ESR примет следующий вид:



Частота таймера F взаимно сократилась из числителя и знаменателя и формула почти не отличается от предыдущей.

  Для мимизации кол-ва и времени вычислений (а для МК, у которого отсутствуют команды для работы с плавающей точкой это очень важно) формулы можно доработать, т.е. преобразовать не меняющиеся во время рабочего цикла измерения значения в константы. Константы можно вычислить препроцессором на этапе компиляции, это позволит упростить вычисления и уменьшить их обьем.

Константа для вычисления емкости:


Формула вычисления емкости при этом примет вид:


Константы для вычисления ESR:


Формула вычисления ESR при этом примет вид:


Практика. Арифметика с фиксированной точкой в программе.

Емкость счетного таймера составляет 18 разрядов. Два дополнительных разряда добавлены программно, и инкрементируются таймером 1 по переполнению. Таким образом счетный таймер считает в диаппазоне 0х00000- 0х3FFFF.

В программе для расширения диаппазона измерений задействованы 5 режимов таймера 1 и два генератора зарядного тока, большой (8,0мА) и малый (0,5мА):
  1. Диаппазон 0, прескалер таймера 1 отключен, таймер считает импульсы частотой 20 Мгц, измеряемая емкость 100nF — 300μF;
  2. Диаппазон 1, прескалер 8, таймер считает импульсы частотой 20 Мгц/8, измеряемая емкость 300μF — 3mF;
  3. Диаппазон 2, прескалер 64, таймер считает импульсы частотой 20 Мгц/64, измеряемая емкость 3mF — 23mF;
  4. Диаппазон 3, прескалер 256, таймер считает импульсы частотой 20 Мгц/256, измеряемая емкость 23mF — 90mF;
  5. Диаппазон 4, прескалер 1024, таймер считает импульсы частотой 20 Мгц/1024, измеряемая емкость 90mF — 300mF;

Емкость и ESR от 100nF до 25μF измеряются на малом токе, выше уже на большом.

Констант для вычисления емкости стало две, для большого (Ibig) и малого (Ilow) тока:


А формулы вычисления емкости с учетом диаппазонов при этом примут вид:


  Где D — номер диаппазона (0..4), M — массив коэффициентов деления на соответствующем диаппазоне [15, 12, 9, 7, 5]. При малом токе делится еще на 16 (Ibig/Ilow). Легко посчитать, что с учетом коэффициентов деления прескалера на разных диаппазонах, в делителе коэффициент деления всегда один, и для большого тока всегда равен 2^15, для малого 2^19.
  В моем варианте кода емкость после расчета домножается еще на 10. Это сделано для того, чтобы после BCD преобразования число разбилось по порядку, три младших разряда — нанофарады, три средних — микрофарады, три старших — милифарады. Причем для доумножения на 10 дополнительного кода почти не потребовалось. Общеизвестно, что умножить на 10 можно сдвинув число влево (умножить на 2), запомнить результат, и сдвинуть еще два раза влево (умножить на 8). Если теперь промежуточной и конечный сдвиги сложить и получим искомое умножение на 10, этим я и воспользовался. Теперь при делении я контролирую номер шага, и когда остается три шага запоминаю промежуточный результат (эквивалент умножения на 8). Использовать изначальное число шагов здесь избыточно, мне достаточно предпоследнего (эквивалент умножения на 2), поэтому массив коэффициентов деления на соответствующих диаппазонах [14, 11, 8, 6, 4] изменен. После деления складываем результат с промежуточным, вот и все умножение.
  Тут может возникнуть закономерный вопрос, а почему сразу нельзя учесть это умножение в коэффициенте Кс? Дело в том, что регистр результата умножения содержит 32 бита и при увеличении Кс для малого тока может произойти его переполнение.
Констант для вычисления ESR стало тоже две по той-же причине:


В зависимости от тока, на котором производился цикл измерения, соответствующая константа и используется в упрощенной формуле:


Схема.

  Хотя я и указал в качестве первоисточника схему от vyachko,



на самом деле с самого начала моделировалась схема от DesAlex с сайта «Паяльник». Это схема, из которой по словам автора (и я с ним согласен) выброшено все лишнее. Вот как об этом пишет сам автор:
  Автономное питание — убираем, так как прибор будет работать в помещении от сетевого адаптера, оставляю только разъём для его подключения. Автоматическое отключение источника питания от схемы и его квазисенсорное включение — вычёркиваем — это нерациональное пижонство. Подключение к компу через СОМ-порт — убираем — какой дурак будет включать целый компьютер ради замера ёмкости одного конденсатора, что и так отображается на ЖКИ прибора; подсветку индикатора делаю постоянно включенной. Итого — схема «похудела» процентов на 25 :-) Кроме того, после внимательного чтения описания и вникания в принцип работы измерителя была обнаружена и одна ошибка на схеме — источники тока двух поддиапазонов измерения оказались перепутаны между собой — исправляем...




В итоге две функции, автономное питание и управление подсветкой я все-же вернул, но немного по другому.

  При проектировании собственной схемы измерителя были использованы материалы обсуждения данной схемы с сайта vrtp.ru. Там очень хороший топик с разбором и усовершенствованием схемы, указанием первоисточников, присутствуют комментарии и обяснения от vyachko.
Большая работа по доработке схемы была проведена участником форума borys, вот его схема:



и сборный комментарий от него, существенные изменения в этом варианте таковы:
      В схему введен каскад на ОУ с коэффициентом усиления 25. При этом входным напряжениям 50 мВ и 100 мВ соответствуют наряжения 1,25 В и 2,5 В на входах компараторов. Тип ОУ был выбран исходя из его параметров, стоимости и наличия. Можно ставить одинарный вариант (TLC271). Его просто не было на тот момент и (странно) цена его выше. Резисторы R13 и R15 желательно ставить точные (не хуже 1%). Применение ОУ типа TL082 нежелательно (их параметры значительно хуже).
      Компараторы LM393 заменил на LM311 и организовал их двухполярное питание. В оригинальной схеме уровни сигналов и пороги находятся около потенциала земли, при этом компараторы правильно работать не будут по определению.
      При двухполярном питании эти уровни попадают почти в середину диапазона, что гораздо лучше. Показания по ESR стали больше похожи на правду.
      Пороговые напряжения на компараторах формируются с помощью довольно хорошего ИОН типа LM336, точная установка производится подстроечником R7. Необходимо выставить напржение ИОН точно 2,5В. Это напряжение будет на 2 выоде DA3 (обозначения по ранее выложенной схеме). На 2 выводе DA2 будет 1,25 В. Номиналы R18 и R19 не очень критичны, но они должны быть одинаковы насколько возможно точно.
      При расчете коэффициентов до трансляции исходника надо принять значения U2, U1 равными 100 мВ и 50 мВ. В этом варианте прибора напряжение на проверямых конденсаторах не превышает 100 мВ, что позволяет корректно проверять конденсаторы без выпаивания из платы.

Моя итоговая схема получилась такой:



От схемы borys взяты как идея:
  1.   Двухполярное питание усилителя на ОУ и компараторах. Т.к. отрицательное напряжение нужно только для сдвига порогов переключения от нуля, оно не обязательно должно быть симметрично положительному, тем более и у ОУ и у компараторов заявлена полная работоспособность при однополярном питании. Потому и выбрана схема формирования искуственной средней точки по делителю выходного напряжения. А т.к. напряжение положительного плеча стабилизировано и равно 5В, напряжение отрицательного будет зависеть от поданного питающего напряжения за вычетом падения напряжения на LDO DA3 и эмиттерно-коллекторном переходе транзистора VT3. Полностью симметричным двуполярное питание станет при питании от 12В.
  2.   Усилитель входного напряжения (и формирователь искуственной средней точки) собраны на сдвоенном ОУ TCL2272. Это Rail-to-Rail ОУ, выполненный по улучшенной технологии LinCMOS. Его типовые характеристики:
    • Низкий уровень шума: 9 nV/Hz на f = 1 kHz;
    • Ультранизкий входной ток: 1-pA;
    • Полоса пропускания усилителя с единичным усилением: 2,2 MHz;
    • Высокая скорость нарастания выходного напряжения: 3.6-V/μs;
    • Низкое напряжение смещения: 950 мV максимум при температуре 25°C;
    • Дальнейшее развитие усилителя TLC272;
  3.   Пороговые напряжения на компараторах формируются с помощью ИОН TL431A в нерегулируемом включении. Т.к. они выше напряжения на измеряемом конденсаторе на коэффициент усиления ОУ, это повышает четкость порогов срабатывания и быстродействие компараторов.
В схему внесены следующие изменения:
  •   Для лучшей стабилизации зарядных токов стабилитроны в генераторах стабильного тока заменены на ИОН TL431A в нерегулируемом включении.
  •   Компараторы применены серии LM319D, это два прецизионных высокоскоростных компаратора в одном корпусе. Пороговые уровни на конденсаторе как и у vyachko, 150mV и 300mV. Серия LM319 отличается более быстрым откликом чем LM311, более высокой скоростью, более широким диапазоном рабочего напряжения. Это делает LM319 более универсальным, чем старые устройства, такие как LM311 (из даташита).Его типовые характеристики:
    • Полностью работоспособен при единственном 5В напряжении питания;
    • Время задержки 80нс при +15В;
    • Максимальный входной ток 1μА;
  •   Для контроля остаточного напряжения на измеряемом конденсаторе использован внутренний аналоговый компаратор микроконтроллера, пороговый уровень 12,5mV. И хотя он имеет довольно большую погрешность сдвига входного напряжения (<10mV type, 40mV max), в данной схеме это мимизировано применением на входе компаратора операционного усилителя.
  •   На измерительный вход в качестве дополнительной защиты добавлен двусторонний супрессор, рекомендовали в обсуждении на vrtp.ru. В обсуждении автор по поводу надежности защиты двумя обратновключенными диодами отвечал так:
    … я не утверждаю, что два обратновключённых диода гарантированно спасут, но всё-же это лучше, чем ничего. В общем на два обратновлючённых диода надейся, а сам не плошай (разряжай конденсаторы перед измерением).
  • В схему добавлен разьем ISP для внутрисхемного перепрограммирования.
  • Предусмотрено автономное питание от Li-Ion аккумулятора.
  * Резистор R8, шунтирующий вход можно не ставить, он предусмотрен на всякий случай, если шумы будут наводиться на высокоомный вход ОУ.

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



Программа.

  Программа разработана на основе оригинальной программы Келехсашвили В.А версии 1.3d (отключен USART, автовыключение и контроль за напряжением батареи). Сначала я не собирался столь кардинально переделывать программу, хотел только исправить явные ошибки:
  1. На программу vyachko очень много жалоб из-за неработоспособности второй строки дисплея. На мой взляд потому, что автор применил в устройстве дисплей с контроллером KS7066, это аналог от SAMSUNG хитачевского контроллера HD44780. Аналог то он аналог, но процедура инициализации у них немного отличается.



    Внесена условная компиляция под контроллеры HD44780/ST7066U (дефайн HD44780), в авторской посдедовательности инициализации LCD отсутствовала повторная команда инициализации дисплея, внес ее для HD44780. Тайминги управления LCD подкорректированы согласно даташитам, код задержек переделан.
  2. Исправил явную ошибку в обьявлении ячеек EEPROM. (на каждую отводилось на 1 байт больше предыдущей), видимо автор посчитал, что это порядковый номер размещения (в оригинале):
    ;------ Резервирование ячеек памяти EEPROM -------------------------------------;
    	.eseg
    	.org	0x08		;установка адреса сегмента
    
    	n1_1b:		.byte 1	;Ячейка EEPROM для 1-го байта поправки для n1
    	n1_2b:		.byte 2	;Ячейка EEPROM для 2-го байта поправки для n1
    	n2_1b:		.byte 3	;Ячейка EEPROM для 1-го байта поправки для n2
    	n2_2b:		.byte 4	;Ячейка EEPROM для 2-го байта поправки для n2
    	n2_n1_1b:	.byte 5	;Ячейка EEPROM для 1-го байта поправки для (n2-n1)
    	n2_n1_2b:	.byte 6	;Ячейка EEPROM для 2-го байта поправки для (n2-n1)
    	flag:		.byte 7	;Ячейка EEPROM для записи флага расчёта поправки
    

    Из-за этого на 7 байтовых ячеек отводилось 28 байт, поправил. Кроме того применение обозначения
    .byte по стандарту AVR ассемблера допускается только в RAM, в ROM и EEPROM нужно применять .DB,
    тоже исправил.
    Применил защитную ячейку предотвращения порчи данных EEPROM. Дело в том, что в архитектуре AVR доступ к EEPROM производится через адресный регистр EEAR (EEPROM Address Register) и регистр управления EECR (EEPROM Control Register). Для чтения/записи используется один и тот же регистр данных – EEDR (EEPROM Data Register). Порча данных в EEPROM происходит по адресу, оставшемуся в EEAR от предыдущего обращения. Для защиты необходимо выделить одну неиспользуемую ячейку (например нулевую), и после любого обращения к EEPROM сбрасывать адрес на нее.
    
    ;------ Резервирование ячеек памяти EEPROM -------------------------------------;
    .ESEG
    .ORG	0x00						; начало сегмента
    	eNull:		.DB 1				; защитная ячейка
    ;
    .ORG	0x04						; установка адреса сегмента
    	EE_MRK:		.DB 1				; ячейка EEPROM для проверки наличия поправки в программе
    ;
    .ORG	0x08						; установка адреса сегмента
    	EE_n1A:		.DB 1				; ячейка EEPROM поправки для n1
    	EE_n2B:		.DB 1				; ячейка EEPROM поправки для n2
    

  Чтобы закончить с EEPROM расскажу тут-же о переделках работы с ним. Это не ошибка, это корректировка логики работы программы.
  • Сократил кол-во поправок (корректирующих значений) и их разрядность. И раньше и теперь расчеты начинаются при достижении напряжения порогового значения U2. В программе vyachko далее происходит вычисление n2-n1, сравнение с пороговыми значениями и переход на применение поправок. Т.к. применение поправок происходило после вычисления n2-n1 приходилось хранить и эту поправку.
      В моем варианте программы применение поправок происходит до вычисления n2-n1, поэтому хранить поправку разности без надобности. Размерность поправок в один байт вместо двух сократилась из-за первоначальной избыточности по моему мнению. Ведь что такое поправка, это время за которое срабатывают компараторы низкого U1 и высокого U2 напряжения при включении зарядного тока и отсутствии испытытываемого конденсатора. Понятно, что мгновенно напряжение не вырастет, компараторы также имеют задержку срабатывания. При поправке в один байт максимальная задежка в моем варианте составит 1/20МГц * 256 или 12,8 мкс, типовая задержка примененных компараторов LM319 — 80 нс (при + 15В). У vyachko поправка могла быть до 65536/20МГц или 3276,8 мкс. Второй байт явное излишество, при такой поправке ни о каких достоверных измерениях и речи быть не может.
  • Значения поправок в каждом цикле измерения читались непосредственно из EEPROM, что довольно медленно. Поэтому ввел в программу теневое ОЗУ, которое дублирует ячейки EEPROM. В процессе начальной загрузки используемые ячейки EEPROM копируются в ОЗУ, и обращение в цикле измерения происходит уже к нему. Запись в EEPROM происходит вне цикла измерения (как и ранее), при этом ведется одновременная запись в теневое ОЗУ.



По мере понимания алгоритма работы добавлял другие доработки кода:
  1. Некоторые часто встречающиеся операции оформил макросами (для сокращения длины пролистываемого кода).
  2. Внес изменения в алгоритмы математики (время исполнения дано для частоты 20Мгц):
    • Заменил код подпрограммы умножения mul16x16 на код основанный на аппноте AVR200. Алгоритм старой подпрограммы складывает множимое само с собой множитель раз. Выполняемое время зависит от номинала множителя, перед запуском производится сравнение множимого и множителя, и при необходимости они меняются местами. Дополнительной трудностью адаптации стало то, что хотя подпрограмма называется mul16x16, она производит умножение 17х16, результат ограничен 24-разр. Самый тяжелый случай, умножение 0x0FFF на само себя, время исполнения ~18мс. Самый легкий, умножение на 1, время исполнения ~10мкс. Для сравнения в новой подпрограмме умножения на основе сдвигов и сложения нахождение результата производится за 16 итераций и занимает ~80,5мкс в обоих случаях. Размеры и старой и новой подпрограмм одинаковы, 54 байта.
    • Заменил код подпрограммы деления div32_16 на код основанный на аппноте AVR200. Алоритм старой подпрограммы вычитает делитель из делимого до появления отрицательного результата. Самый тяжелый вариант деление 0хFFFFFFFF на 0x100 (результат ограничен 24-разр.), время исполнения составило ~4,2 сек (!!!). Самый быстрый результат, делить число на само себя, например 0хFFFF на 0хFFFF, время исполнения составит 12,8мкс. Для сравнения в новой подпрограмме деления на основе сдвигов и вычитания нахождение результата производится за 33 итерации и занимает ~270мкс в обоих случаях. Размеры старой подпрограммы 30 байт, новой 58 байт.
    • Заменил подпрограмму bin2dec на подпрограмму на основе кода из аппноты AVR204. Исходная подпрограмма определяла BCD цифру последовательным делением (через вычитание) на коэффициенты 1000000, 100000, 10000, 1000, 100, 10, 1 до появления отрицательного результата. При таком алгоритме кол-во требуемых действий, как и время выполнения, зависит от кол-ва значимых цифр в числе и их номинала. Самый тяжелый случай, конвертация числа 9999999, время исполнения ~300мкс. Самый легкий, конвертация числа 1, время исполнения ~77мкс. Подпрограмма на основе аппноты AVR204 всегда находит BCD число за 32 итерации, т.е. выполняемое время от числа не зависит. Для обоих случаев время конвертации ~610мкс. Как минимум в два раза больше, но стабильное. Если учесть что время в микросекундах, и размер старой 136 байт, а новой 90 байт (-23 команды), меня это более чем устроило.
  3. В исходной программе выход из двух прерываний происходил не по RETI. Кроме того обработчики этих прерываний располагались в главном цикле Main, и несколько раз выходили в этот цикл прямым переходом (два раза перед этим сделав POP чтобы убить адрес возврата). Это затрудняло отладку, и мешало внедрить в программу управление от флагового автомата. Поэтому переделал, теперь обработчики всех прерываний расположены вне цикла Main, выход из них происходит по RETI.
  4. Логику работы программы переделал на управление от флагового автомата. Так легче обеспечить многопоточную работу программы (ядро у МК всего одно). Для флагового автомата использованы регистры общего назначения (не связанные с внутренними устройствами контроллера) GPIOR0, GPIOR1, GPIOR2. Эти регистры есть не только в более новом контроллере ATtiny2313А, но и в старом ATtiny2313.
  5. Добавил в код применение системного таймера 0 для постоянного и независимого отсчета системных тиков ~76Гц (не связанная с основной программой ветвь исполнения, ~13,1 мs). В прерывании только устанавливается флаг MRK_0_Tick, его обработка осуществляется в основном цикле. По этому флагу производится опрос кнопки, разрешается запуск программы на измерение (задержка между циклами измерения, длительность задержки зависит от диаппазона) и производится анимация бегущей точки в цикле ожидания.
  6. Регистр tok_zar (R25) заменил на единственный битовый флаг MRK_0_IZar.
  7. Полностью переделал логику кода вывода на дисплей, в варианте vyachko емкость отображалась в нано, микро и фарадах, т.е. миллифарады былы пропущены. И при этом в алгоритме форматирования строки емкости в фарадах была допущена ошибка на границе переключения микрофарады <-> фарады. Я отказался от такого разбиения, теперь емкость отображается в нано, микро и миллифарадах (слева вариант vyachko, справа мой, 100mF (100000 μF), ESR-0,05Om):



    Странный символ в варианте vyachko на месте «m» это так и должно быть, код символа 0xBC. Символ из второй половины таблицы ASCII, в знакогенераторе Proteus он такой, что было у vyachko не знаю.
  8. Полностью заменил подпрограмму обработки нажатия кнопки. Теперь кнопка тестируется каждые 13,1 мs системным таймером, независимо от режима работы программы.
  9. При измерении больших емкостей время получения показаний с учетом переключения диаппазонов может составить 20 сек. и более. Максимальный таймаут цикла измерения (при закороченных клеммах) в программе составляет ~21 сек. Поэтому на время ожидания, чтобы не создавалось впечатления зависшей программы, ввел в программу анимированную индикацию точек в строке «ждите».



  10. Расчет коэффициентов с помощью сторонней программы C_ESR_Helper.exe мне показался излишним, для этого хватит препроцесора ассемблера. Теперь измерительные токи, напряжения, частота задаются в программе, препроцессор сам пересчитывает их в коэфициенты.
    
    ;****** напряжения, токи, частота кварца для расчета констант ******************;
    .EQU	BigCompU2	= 2400			; большее пороговое напряжение компаратора в mV
    .EQU	LowCompU1	= BigCompU2 / 2		; меньшее пороговое напряжение компаратора в mV
    .EQU	AmpGain		= 8			; коэффициент усиления операционного усилителя
    ;
    .EQU	LowCurrent	= 500			; меньший зарядный ток конденсатора в mkA
    .EQU	BigCurrent	= 8000			; больший  зарядный ток конденсатора в mkA
    ;
    .EQU	FreqQuarz	= 200			; частота кварца в сотнях кГц
    

  Общий алгоритм вычислений почти не изменился. Почти здесь означает более полное распознавание нерабочих ситуаций. Ранее прошивка vyachko распознавала только две:
  • слишком маленькая емкость
  • слишком большая емкость
Моя теперь определяет четыре:
  • вход закорочен
  • слишком маленькая емкость
  • слишком большая емкость
  • вход никуда не подключен
  Так-же подкорректированы пороги переключения на распознавание нерабочих ситуаций и переключение диаппазонов, в оригинале для расчета ESR использовалась полная формула, заменил ее на сокращенную.

  В самом начале кода расположены дефайны препроцессора, они позволяют корректировать работу программы, не внося изменения в сам код:
;-------------------------------------------------------------------------------;
//#define Relise; раскомментировать для прошивки, закомментировать для Proteus
//#define HD44780; дисплей с контроллером HD44780
#define Comparator; код контроля U конденсатора перед измерением
#define Inter; код чередования точки/запятой после измерения
;*******************************************************************************;
  Дефайн Relise раскоментируется для прошивки в железе, дело в том, что в моей версии Proteus происходил нечеткий переход при проверке на 0 (иногда не срабатывал), поэтому и добавлены 2 лишних команды (вторая проверка). В железе они ненужны, но и вреда от них кроме увеличения размера кода на 4 байта нет.
  Дефайн HD44780 раскоментируется при применении в дисплее контроллера HD44780, немного меняется процедура инициализации.
  Дефайн Comparator включает код контроля U конденсатора перед измерением, если у вас уже есть измеритель собранный по схеме vyachko, и вы хотите залить в него измененную прошивку, дефайн надо будет закоментировать, т.к. в схеме vyachko нет такого контроля.
  Дефайн Inter может убрать код чередования точки/запятой после каждого измерения если он будет вас раздражать.
  * Дефайн Inter убран из кода в результате обсуждения, см. далее.

P.S. Делитель опорного напряжения.

Gornist, комментарий:
мне вилы как не нравится опорник на VD3.
Уж лучше бы вместо tl431 просто резистор бы поставили.
Поясняю, в чём прикол:
tl431 держит напряжение между анодом и референсом, таким образом на верхнем конце R5 напряжение = выходное напряжение кренки ncp551 минус 2.5v.
То есть фактически стабильность напряжения на делителе ничем не лучше стабильности напряжения +5 на выходе ncp551. А если не видно разницы — зачем платить больше? Поставьте вместо tl431 резистор суммарным номиналом r5+r14+r15+r16, и получите на делителе те же 2.5в с теми же шумами и дрейфами, что и в оригинальной схеме.
Или — включите tl431 в её родном шунтовом режиме, и не забудьте зашунтировать маленьким конденсатором, вот прям как в даташите нарисовано. Случиццо тогда вам щясте, в виде повышенной стабильности референсных напряжений.


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



P.S. Индикатор обновления цикла измерения.

Vga, комментарий:
… выводил бы его только если обновления реже чем, скажем, раз в две секунды.


  Логично, подумал и отключил индикатор обновления на диапазоне 0 с коротким циклом измерения (емкость 100nF-300μF). Теперь индикатор обновления включается только на диапазонах с длинным циклом измерения (диапазоны 1-4, емкость 300μF-300000μF). Дефайн Inter убрал из кода, архив для скачивания обновил.

Продолжение, часть 2.

  Приложены в архиве проекты AVR_Studio и Proteus обоих вариантов, и vyachko и мой. Гифку скачивать не нужно, необходимо было ее приаттачить, чтобы она стала анимированной.

  • +3
  • 25 апреля 2020, 07:58
  • anakost
  • 2
Файлы в топике: Cycle.gif, C_ESR_Meter.zip

Комментарии (23)

RSS свернуть / развернуть
Работа над данным проектом тянулась два года, благо начало благодаря инету можно определить более-менее точно. Вернее это не работа, для меня это хобби, то брался делать, то или был недостаток времени, или просто терял интерес. Но периодически к нему возвращался, именно поэтому исходники хорошо комментированы, возвращаясь через пару-тройку месяцев, а то и полгода к своему-же коду не сразу все впомнишь и приходилось восстанавливать и дописывать в исходник комментарии того, что успел забыть.
И вот опять остановился на последнем шаге, форс-мажор, коронавирус, самоизоляция и т.д. И дело не в переизбытке свободного времени, дело в экономии финансов. Решил пока выложить свои наработки в сообщество, измеритель доделаю после пандемии, может быть…
P.S. Разбиение на 2 части это ограничение используемого движка, сначала попытался опубликовать одной частью, не дает, ограничение по кол-ву символов, а жаль одной частью смотрелось бы более цельно.
P.P.S. Одно из изображений (иллюстрация состояния «wait...») представляет собой анимированый GIF, к сожалению есть ограничение движка WordPress для того, чтобы посмотреть его в динамике нужен доступ к загрузчику файлов, которого в текущей реализации сообщества нет. Может кто знает, как в этой ситуации показать GIF анимированным?
Так-же с тексте есть код HTML для надстрочного/подстрочного форматирования, движок его не понимает, это как-то лечится?
0
1) Это не вордпресс.
2) Sub и Sup (а также еще которые теги) работают, но на кой-то хрен в CSS задано рендерить их как обычный текст. Пофиксить это дело минутное, но хрен бы там уж сколько лет.
3) Загрузи гифку как аттач, прицепи к статье второй кнопкой «изображение».
0
P.S. Вместо «кликабельно» лучше оторви у картинок атрибуты width и height. Мониторов, где картинки шириной 720рх (именно до такого размера их режет движок) не влезут в 2020 году еще поискать. И во второй статье тоже оторви.
0
… поискать.
Это сделать нетрудно, я учитывал что некоторые используют немолодые ноутбуки и планшеты, а то и смартфоны. У них боюсь не влезет.
0
Последними ноутбуками, имевшие менее чем 1366х768 (на котором такие картинки вполне влазят), из тех что я видел, были старые нетбуки, и современные интернетики на них жутко тормозят. На новых нетбуках FHD.
У современных смартфонов и планшетов разрешение такое, что половина мониторов позавидует, а на не-современных уже ничего и не запустишь.
Ну и наконец, если у кого-то такая древность, что картинка режется, то он может открыть картинку в новой вкладке. Это дело пары кликов. Или тапов. А вот ломать глаза, пытаясь разглядеть зашакаленные картинки приходится всем.
0
оторви у картинок атрибуты width и height
Оторвал почти у всех, там где по ширине картинки и раньше были меньше 720рх оставил, так лучше смотрится.
0
Лучше всего — не мешать браузеру нарисовать картинку в масштабе 1:1. А еще желательно самому картинки подгонять под 720рх ширины, а не полагаться на ресайзер движка. Он шакалит.
0
Алсо, если оторвал масштабирование — то оторви и кликабельность, какой смысл открывать в том же разрешении?
0
Логично, сделаю.
0
3) Загрузи гифку как аттач, прицепи к статье второй кнопкой «изображение».
Т.е. приложить как и архив с кодом и указать ее ссылку? Так не делал, попробовал было указать имеющуюся ссылку на GIF как видео, вместо картинки пустое место. Вечером попробую по вашему, спасибо.
0
3) Загрузи гифку как аттач, прицепи к статье второй кнопкой «изображение».
Сделал как предложено гифка забегала большое спасибо.
0
И вообще, почему-то не могу найти табличку различающихся тегов WordPress и HTML. Такая вообще существует?
0
Если я правильно понимаю, диапазоны 2-5 работают по принципу «ой, счетчик переполнился, меряем заново». Что мешало просто добавить счетчику еще десять бит вместо переключения на прескалер 1024? Лишние младшие биты можно просто выкинуть уже после замера.
Дефайн Inter может убрать код чередования точки/запятой после каждого измерения если он будет вас раздражать.
Чего-чего? ЯННП.
0
  • avatar
  • Vga
  • 28 апреля 2020, 03:27
Что мешало просто добавить...
Ничего не мешало, при попытке переложить этот код для MSC-51 N76E003 я так и сделал, т.к. прескалеров у него нет.
Дефайн Inter может убрать код чередования точки/запятой после каждого измерения если он будет вас раздражать.
Если дефайн закоментировать не будет чаредования точки/запятой после каждого измерения. Это чаредование полезно при цикле измерения > 10 сек, позволяет визуально отслеживать циклы, если показания не дисплее не меняются. При тестировании емкости 100 мкФ тоска с запятой будут меняться каждые ~400 мс, мне подумалось что это может кого-то раздражать.
0
Ничего не мешало, при попытке переложить этот код для MSC-51 N76E003 я так и сделал, т.к. прескалеров у него нет.
Тогда стоит это сделать, на воспринимаемом быстродействии прибора это скажется куда заметнее всех остальных оптимизацией вместе взятых. Точнее, это будет единственной заметной оптимизацией.
Это чаредование полезно при цикле измерения > 10 сек, позволяет визуально отслеживать циклы, если показания не дисплее не меняются.
А, индикатор обновления. Я бы подумал над более очевидным индикатором обновления и выводил бы его только если обновления реже чем, скажем, раз в две секунды.
0
Вот в этой схеме

мне вилы как не нравится опорник на VD3.
Уж лучше бы вместо tl431 просто резистор бы поставили.
Поясняю, в чём прикол:
tl431 держит напряжение между анодом и референсом, таким образом на верхнем конце R5 напряжение = выходное напряжение кренки ncp551 минус 2.5v.
То есть фактически стабильность напряжения на делителе ничем не лучше стабильности напряжения +5 на выходе ncp551. А если не видно разницы — зачем платить больше? Поставьте вместо tl431 резистор суммарным номиналом r5+r14+r15+r16, и получите на делителе те же 2.5в с теми же шумами и дрейфами, что и в оригинальной схеме.
Или — включите tl431 в её родном шунтовом режиме, и не забудьте зашунтировать маленьким конденсатором, вот прям как в даташите нарисовано. Случиццо тогда вам щясте, в виде повышенной стабильности референсных напряжений.
+1
Да, и нафига нужны резисторы r11 r12 r13 я тоже не понял.
0
Да, и нафига нужны резисторы r11 r12 r13 я тоже не понял.
Эти резисторы стоят и у vyachko и у Borys'а.
0
Да стоят-то они стоят. Вопрос — зачем? Три потребителя подключены к выходу усилителя — два компаратора и… третий компаратор внутри проца. Все три сделаны так, что пока напряжения на входах не выходят за рельсы питания — тока через входы нет. От слова совсем.
Поэтому защищать выход da1.1 нет смысла. Может у этих резисторов есть глубинный смысл, но от меня он ускользает.

Резисторы r18 r19 r20 тоже смело можно убирать, внутри проца подтяжка включается.
0
Резисторы r18 r19 внутренней подтяжки не подойдут по сопротивлению, это нагрузка открытого коллектора выхода компараторов, напрямую влияет на фронты и быстродействие. r20 на кнопку можно не ставить, подтяжка включена, r21 на RESET учитывая наличие ISP разьема я бы поставил.
0
А вообще хочу сказать — спасибо, хорошая статья.
0
Т.е. сделать как на схеме Borys'а, наверное вы правы, я как-то пропустил этот момент.
0
Немного добавил в статью по комментариям, спасибо всем прокомментировавшим.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.