Осваиваем STM32 или ESR-метр на быстром ADC
Автор: Поскряков Дмитрий, balmer@inbox.ru
Опубликовано 14.08.2013
Создано при помощи КотоРед.
Доброго всем здоровья. Расскажу о своем переходе с ATmega8 на STM32, и немного затрону теорию и практику измерения ESR. Радиолюбитель я с одной стороны с давней историей, а с другой стороны начинающий. Потому как в молодости занимался паянием схемок всяких. Потом учеба, кризис. И вот год назад мне таки стало интересно, почему многие из схем в детстве не работали. И понеслось все по новой. Пока занимаюсь измерением разных параметров катушек индуктивности и конденсаторов. Сделал несколько схемок, спасибо этому сайту и замечательной статье Измеритель ESR/L/C/F/P/t на PIC16F876A.
Перво наперво руководствуясь заветами этой стати сделал измеритель ESR и LC. Правда вместо PIC16 поставил ATmega8, вместо MCP6022 поставил LM328, а вместо TL431 поставил стабилитрон на 3.3 v. Результаты получились не очень. Прибор безбожно врал на емкостях меньше 10 микрофарад. И если емкость он еще измерял правильно, то веры в ESR для маленьких конденсаторов не было никакой. Впрочем результат закономерен. LM328 тормоз еще тот. ADC ATMega8 имеет максимальную частоту в 10 кГц. Всего 10 КИЛОГЕРЦ. Почертыхавшись на такие параметры и потихоньку изучая современую базу увидел микроконтроллеры фирмы STM.
Вот возьмем STM32F102CBT6 который купил за 120 руб/шт. Это сравнимо с ценой Atmega8. Смотрим характеристики:
- ATMega8 — 2 кб RAM, 8 кб FLASH, 10 кгц 10 бит ADC. Частота ядра 16 Мгц
- STM32F102CBT6 — 16 кб RAM, 128 кб FLASH, 500 кгц 12 бит ADC и хардварный USB. Частота ядра 48 Мгц
Сначала не поверил такому. Может быть в наших краях нельзя купить? Может плату нельзя вытравить под него? Может ADC гавно хоть и быстрое? Может программировать эту штуку настолько сложно, что документацию пол года читать надо? Оказалось, что все хорошо и никаких проблемм нет.
Травим платку. Обычный ЛУТ. Фотки составляющих успеха.








Схема довольно простая. STM32 процессор по центру. Слева-сверху инвертор напряжения на ICL7660. Слева-посредине USB разъем чтобы к компьютеру подключать. Справа-сверху аналоговая часть, быстрый операционный усилитель AD825 , несколько pullup резисторов и один pull-down транзистор. Сравним с Измеритель ESR/L/C/F/P/t на PIC16F876A. Там два каскада усиления, у меня один. Два каскада усиления не стал делать, потому как понимаю — таких маленьких шумов не смогу обеспечить. С одним каскадом улиления в 10 раз уже получается 300 милливольт на входе, делим на 4096, получаем младший разряд 100 микровольт. Источник тока тоже не стал делать, потому как стабилитроны отнюдь не предназначенны на работы на высоких частотах, а 400 килогерц это уже довольно приличная частота и стабилитрон, особенно составной вроде TL431 может попортить нам картину на начале графика. pull-down транзистор взял маломощный, чтобы лишней емкости и утечек не было на входе.
Логика работы программы
Сначала хотел припаять LCD дисплей, но потом понял — от лукавого это все. Схемка ведь чисто для обучения и тестирования свойств STM32. Поэтому сливаем все данные по USB. По хардварному USB 2.0 full speed! Принцип работы очень простой — сначала разряжаем pull down транзистором, потом заряжаем через резистор 220 ом, 10 ком или 470 ком. Сохраняем 1024 сэмпла, и передаем их на компьютер. Математика очень простая. Берем метод наименьших квадратов и подгоняем коэффициэнты функции по минимуму среднеквадратичной ошибки. Изменение тока при разном напряжении компенсируем математикой

Начнем с простого, с измерения резистора 1 ом. Используем 220 ом pullup резистор.

Синий график, что намеряли. Красный график — апроксиммация. Тут никаких неожиданностей. Есть лишь небольшой шум в последних двух битах ADC амплитудой порядка 200-300 микровольт. Замкнем щупы и присмотримся к ним тщательнее.

0.02 ома — это не ошибка измерения, это сопротивление щупов. Так что таким способом можно довольно точно сопротивления мерять, что неудивительно. Теперь возмем конденсаторы, начиная с больших и постепенно уменьшая емкость.

Конденсатор емкостью 2200 мкф. Так как график крайне линейный, то сомневаться в достоверности данных не приходится. А метод наименьших квадратов в данном случае позволяет обойтись лишь одним циклом измерения. Обратите внимание — на измерение емкости конденсатора достаточно ДВУХ милисекунд времени.

Конденсатор емкостью 100 мкф — это вообще идеальный случай, так как и ESR у него достаточно высок чтобы не было особых ошибок измерения и емкость достаточна мала, чтобы он устел зарядиться до 300 милливольт за 2 милисекунды.

Конденсатор 1 мкф уже не получается измерить по нормальному с резистором 220 ом, слишком быстро он заряжается до 300 mV. ESR полностью зафейлился, емкость показало заниженную. Как показали дальнейшие тесты — заниженная емкость это не ошибка измерения. Электролитический конденсатор 1 мкф на частоте порядка 100 кгц действительно теряет половину своей емкости. Чтож включаем тогда pullup резистор на 10 ком.

Привожу лишь начало графика, чтобы было видно начальную ступеньку от ESR. Могу сказать, что измеритель на основе ATMega8 выдавал совсем неточные показания для такого конденсатора, ибо скорости ему катастрофически не хватало. Здесь же результат идеальный, все видно как на ладони.

Конденсатор 100 nf еще можно измерять с резистором 10 ком, но для более мелких конденсаторов включим pullup 470 ком. Обратите внимание — вначале достаточно приличное время идет нулевое плато. В реальности там немного отрицательное напряжение. Это каойто косяк в схемотехнике у меня, но к сожалению не до конца понимаю какой.
Для более мелких емкостей уже существенна входная емкость схемы. Всетаки pulldown полевой транзистор обладает большой внутренней емкостью. Запускаем измерять емкость просто разомкнув щупы.

Получаем отличный ровный график входной емкости. Тут мы уже подходим к краю точности прибора. Поэтому точность результата 740pf+-10pf. Начинают уже вовсю сказываться внешние помехи, скорости ADC начинает не хватать. Чтож, измеряем далее.

Конденсатор емкостью 910 pf. Здесь мы уже вычли 750 pf собственной емкости.

Конденсатор емкостью 15 pf. Здесь уже точность никакущая, может показать как 10 так и 25 пикофарад. Врочем сам факт измерения такой маленькой емкости напрямую при помощи ADC уже радует.
Результатами доволен. ADC встроенное в STM32 отличнейшее. Правда есть одно но. Низкое входное сопротивление. Более того — низкое входное ЕМКОСТНОЕ сопротивление от конденсаторов которые не полностью разрядились. Поэтому если подключить щупы осциллографа ко входу работающего ADC получится примерно такая картина.

Результаты взяты со входа ADC работающего на частоте 500 кгц и подключенного к земле через резистор в 1 ком. Выбросы в 20 mV. Так что если вы вдруг увидите на просторах интернета схему USB осциллографа на STM32 без входного операционного усилителя — знайте, измеряет она хрен знает что да еще и шумы на измеряемую схему дает.
На сладкое — попробовал использовать сей девайс в качестве USB звукового входа. Поставил резистор чтобы было смещение на 150 mV, разделительный конденсатор и подключил к плееру. Получилась читать поток лишь 44100 8 бит, дальше идет гдето затык по скорости передачи USB. Но результаты все равно неплохие (оцифрованный кусочек музыки в аттаче). Шумов на 8 бит совершенно нет, так как они в последних двух битах. Пробовал сливать и все 12 бит точности — если слушать тишину, то шум слышен, но ооочень тихо.
Недостатки и проблеммы.
Выше описывал все в достаточно положительном ключе, теперь опишу проблеммы. Как практические так и теоретические. Когда выключаем все pullup и pulldown резисторы — на входе образуется немного отрицательного напряжения. Порядка 300 микровольт. Так и не смог понять причину — возможно плату надо отмывать лучше, возможно в схемотехнике косяк. Это достаточно сильно влияет на результаты при использовании резистора в 470 ком.
Другая проблемма теоретическая. Смотрим на функцию которой мы приближаем наш конденсатор. Взяли специально случай, когда расхождения видны наиболее хорошо.

Смотрим на начало графика.

Расхождение на начальном этапе связано с тем, что емкость электролитического конденсатора зависит от частоты. Для сравнения ниже график металлокерамического конденсатора 0.47 мкф 275V.

Как видим аппроксимирующая функция идеально совпадает с измеренной. Но вернемся к графику резистора 1 мкф. При такой аппроксимации получается ESR порядка 20 ом, но если мы напрямую возмем значение с синего графика — то полуается ESR порядка 10 ом. Конечно эту проблемму можно "замести под ковер", но проблемма остается — емкость электролитов зависит от частоты и это не учитывается в формулах.
Осваиваем STM32 или ESR-метр на быстром ADC
Автор: Поскряков Дмитрий, balmer@inbox.ru
Опубликовано 14.08.2013
Создано при помощи КотоРед.
Доброго всем здоровья. Расскажу о своем переходе с ATmega8 на STM32, и немного затрону теорию и практику измерения ESR. Радиолюбитель я с одной стороны с давней историей, а с другой стороны начинающий. Потому как в молодости занимался паянием схемок всяких. Потом учеба, кризис. И вот год назад мне таки стало интересно, почему многие из схем в детстве не работали. И понеслось все по новой. Пока занимаюсь измерением разных параметров катушек индуктивности и конденсаторов. Сделал несколько схемок, спасибо этому сайту и замечательной статье Измеритель ESR/L/C/F/P/t на PIC16F876A.
Перво наперво руководствуясь заветами этой стати сделал измеритель ESR и LC. Правда вместо PIC16 поставил ATmega8, вместо MCP6022 поставил LM328, а вместо TL431 поставил стабилитрон на 3.3 v. Результаты получились не очень. Прибор безбожно врал на емкостях меньше 10 микрофарад. И если емкость он еще измерял правильно, то веры в ESR для маленьких конденсаторов не было никакой. Впрочем результат закономерен. LM328 тормоз еще тот. ADC ATMega8 имеет максимальную частоту в 10 кГц. Всего 10 КИЛОГЕРЦ. Почертыхавшись на такие параметры и потихоньку изучая современую базу увидел микроконтроллеры фирмы STM.
Вот возьмем STM32F102CBT6 который купил за 120 руб/шт. Это сравнимо с ценой Atmega8. Смотрим характеристики:
- ATMega8 — 2 кб RAM, 8 кб FLASH, 10 кгц 10 бит ADC. Частота ядра 16 Мгц
- STM32F102CBT6 — 16 кб RAM, 128 кб FLASH, 500 кгц 12 бит ADC и хардварный USB. Частота ядра 48 Мгц
Сначала не поверил такому. Может быть в наших краях нельзя купить? Может плату нельзя вытравить под него? Может ADC гавно хоть и быстрое? Может программировать эту штуку настолько сложно, что документацию пол года читать надо? Оказалось, что все хорошо и никаких проблемм нет.
Травим платку. Обычный ЛУТ. Фотки составляющих успеха.








Схема довольно простая. STM32 процессор по центру. Слева-сверху инвертор напряжения на ICL7660. Слева-посредине USB разъем чтобы к компьютеру подключать. Справа-сверху аналоговая часть, быстрый операционный усилитель AD825 , несколько pullup резисторов и один pull-down транзистор. Сравним с Измеритель ESR/L/C/F/P/t на PIC16F876A. Там два каскада усиления, у меня один. Два каскада усиления не стал делать, потому как понимаю — таких маленьких шумов не смогу обеспечить. С одним каскадом улиления в 10 раз уже получается 300 милливольт на входе, делим на 4096, получаем младший разряд 100 микровольт. Источник тока тоже не стал делать, потому как стабилитроны отнюдь не предназначенны на работы на высоких частотах, а 400 килогерц это уже довольно приличная частота и стабилитрон, особенно составной вроде TL431 может попортить нам картину на начале графика. pull-down транзистор взял маломощный, чтобы лишней емкости и утечек не было на входе.
Логика работы программы
Сначала хотел припаять LCD дисплей, но потом понял — от лукавого это все. Схемка ведь чисто для обучения и тестирования свойств STM32. Поэтому сливаем все данные по USB. По хардварному USB 2.0 full speed! Принцип работы очень простой — сначала разряжаем pull down транзистором, потом заряжаем через резистор 220 ом, 10 ком или 470 ком. Сохраняем 1024 сэмпла, и передаем их на компьютер. Математика очень простая. Берем метод наименьших квадратов и подгоняем коэффициэнты функции по минимуму среднеквадратичной ошибки. Изменение тока при разном напряжении компенсируем математикой

Начнем с простого, с измерения резистора 1 ом. Используем 220 ом pullup резистор.

Синий график, что намеряли. Красный график — апроксиммация. Тут никаких неожиданностей. Есть лишь небольшой шум в последних двух битах ADC амплитудой порядка 200-300 микровольт. Замкнем щупы и присмотримся к ним тщательнее.

0.02 ома — это не ошибка измерения, это сопротивление щупов. Так что таким способом можно довольно точно сопротивления мерять, что неудивительно. Теперь возмем конденсаторы, начиная с больших и постепенно уменьшая емкость.

Конденсатор емкостью 2200 мкф. Так как график крайне линейный, то сомневаться в достоверности данных не приходится. А метод наименьших квадратов в данном случае позволяет обойтись лишь одним циклом измерения. Обратите внимание — на измерение емкости конденсатора достаточно ДВУХ милисекунд времени.

Конденсатор емкостью 100 мкф — это вообще идеальный случай, так как и ESR у него достаточно высок чтобы не было особых ошибок измерения и емкость достаточна мала, чтобы он устел зарядиться до 300 милливольт за 2 милисекунды.

Конденсатор 1 мкф уже не получается измерить по нормальному с резистором 220 ом, слишком быстро он заряжается до 300 mV. ESR полностью зафейлился, емкость показало заниженную. Как показали дальнейшие тесты — заниженная емкость это не ошибка измерения. Электролитический конденсатор 1 мкф на частоте порядка 100 кгц действительно теряет половину своей емкости. Чтож включаем тогда pullup резистор на 10 ком.

Привожу лишь начало графика, чтобы было видно начальную ступеньку от ESR. Могу сказать, что измеритель на основе ATMega8 выдавал совсем неточные показания для такого конденсатора, ибо скорости ему катастрофически не хватало. Здесь же результат идеальный, все видно как на ладони.

Конденсатор 100 nf еще можно измерять с резистором 10 ком, но для более мелких конденсаторов включим pullup 470 ком. Обратите внимание — вначале достаточно приличное время идет нулевое плато. В реальности там немного отрицательное напряжение. Это каойто косяк в схемотехнике у меня, но к сожалению не до конца понимаю какой.
Для более мелких емкостей уже существенна входная емкость схемы. Всетаки pulldown полевой транзистор обладает большой внутренней емкостью. Запускаем измерять емкость просто разомкнув щупы.

Получаем отличный ровный график входной емкости. Тут мы уже подходим к краю точности прибора. Поэтому точность результата 740pf+-10pf. Начинают уже вовсю сказываться внешние помехи, скорости ADC начинает не хватать. Чтож, измеряем далее.

Конденсатор емкостью 910 pf. Здесь мы уже вычли 750 pf собственной емкости.

Конденсатор емкостью 15 pf. Здесь уже точность никакущая, может показать как 10 так и 25 пикофарад. Врочем сам факт измерения такой маленькой емкости напрямую при помощи ADC уже радует.
Результатами доволен. ADC встроенное в STM32 отличнейшее. Правда есть одно но. Низкое входное сопротивление. Более того — низкое входное ЕМКОСТНОЕ сопротивление от конденсаторов которые не полностью разрядились. Поэтому если подключить щупы осциллографа ко входу работающего ADC получится примерно такая картина.

Результаты взяты со входа ADC работающего на частоте 500 кгц и подключенного к земле через резистор в 1 ком. Выбросы в 20 mV. Так что если вы вдруг увидите на просторах интернета схему USB осциллографа на STM32 без входного операционного усилителя — знайте, измеряет она хрен знает что да еще и шумы на измеряемую схему дает.
На сладкое — попробовал использовать сей девайс в качестве USB звукового входа. Поставил резистор чтобы было смещение на 150 mV, разделительный конденсатор и подключил к плееру. Получилась читать поток лишь 44100 8 бит, дальше идет гдето затык по скорости передачи USB. Но результаты все равно неплохие (оцифрованный кусочек музыки в аттаче). Шумов на 8 бит совершенно нет, так как они в последних двух битах. Пробовал сливать и все 12 бит точности — если слушать тишину, то шум слышен, но ооочень тихо.
Недостатки и проблеммы.
Выше описывал все в достаточно положительном ключе, теперь опишу проблеммы. Как практические так и теоретические. Когда выключаем все pullup и pulldown резисторы — на входе образуется немного отрицательного напряжения. Порядка 300 микровольт. Так и не смог понять причину — возможно плату надо отмывать лучше, возможно в схемотехнике косяк. Это достаточно сильно влияет на результаты при использовании резистора в 470 ком.
Другая проблемма теоретическая. Смотрим на функцию которой мы приближаем наш конденсатор. Взяли специально случай, когда расхождения видны наиболее хорошо.

Смотрим на начало графика.

Расхождение на начальном этапе связано с тем, что емкость электролитического конденсатора зависит от частоты. Для сравнения ниже график металлокерамического конденсатора 0.47 мкф 275V.

Как видим аппроксимирующая функция идеально совпадает с измеренной. Но вернемся к графику резистора 1 мкф. При такой аппроксимации получается ESR порядка 20 ом, но если мы напрямую возмем значение с синего графика — то полуается ESR порядка 10 ом. Конечно эту проблемму можно "замести под ковер", но проблемма остается — емкость электролитов зависит от частоты и это не учитывается в формулах.


Я уже собирал несколько измерительных приборов, Частотомер, испытатель транзисторов.
Но, как говорится "наши руки, не для скуки" решил собрать Измеритель LCF. Схему и всю подноготную почерпнул с этой страницы LCF-метр на ATMEGA8 и LCD1602.
Данный прибор предназначен для измерения ёмкости конденсаторов, индуктивности и частоты.
Конденсаторы:
Диапазон измерений: 0,1 pF ÷ 10 000,0 uF.
Измерения проводятся в трех диапазонах, переключение диапазонов автоматическое.
В первом диапазоне измеряются емкости до 100 nF, во втором до 100 uF, в третьем выше 100 uF.
Индуктивность:
Диапазон измерений: 0,1 uH ÷ 100,0 H.
Частота:
Диапазон измерений: 1 Hz ÷ 4 MHz.
Выбор измеряемого параметра осуществляется кнопкой "Выбор" по кругу.
Если параметр выходи за пределы измерения на индикатор выводятся прочерки.
Схему и плату делал в ДипТрейс под свои компоненты.

Сначала собирал прибор в безкорнусном варианте на ATMega8(32). В моём архиве есть вариант этой платы.
Но побывав в магазине Чип и Дип обнаружил там много разных корпусов для РЭА
И сразу решил оформлять прибор в подходящий корпус.
Корпус G1204B 142.8×8, 5×38мм как нельзя лучше подходил для данного проекта. Тем более блок питания в корпусе я размещать не собирался. Место было много, я и не старался мельтешить.


Вот готовое устройство.





Что касаемо применяемых деталей, к точности номиналов никаких особых требований нет.
В прилагаемом архиве есть несколько прошивок, как на русском, так и на английской мове. Установите какую понравится, по функционалу разницы не заметил.
Фьюзы для ATMega8 будут
LOW= DE
HIGH= D9
После включения прибор начинает работать сразу, но прежде чем начать им пользоваться его следует его откалибровать. Привожу инструкцию автора по калибровке прибора.
Калибровка измерителя емкости.
1. Для калибровки следует выбрать режим измерения емкости и нажать на кнопку SET. В верхней строке дисплея появятся настроечные коэффициенты. Устанавливаемый параметр мигает. В нижней строке измеренная емкость.
2. К входным щупам не должно быть никаких подключений.
3. Нажать на кнопку PLUS или MINUS – произойдет настройка показаний емкости на 0. Коэффициент Z1 (Z2, Z3) установится автоматически. Если показания не стали нулевыми – операцию повторить.
4. Подключить к щупам образцовый конденсатор (для нижнего диапазона 1 nF ÷ 100 nF, для второго 100 nF ÷ 100 uF, для третьего 100 uF ÷ 10000 uF). Прибор автоматически выберет предел измерения.
5. Если показания емкости отличаются от номинала конденсатора – нажать на кнопку SET, начнет мигать параметр C1 (C2, C3).
6. Кнопками PLUS/MINUS установить требуемую емкость.
7. Повторить настройку, начиная с п.1.
8. Все диапазоны настраиваются аналогично. (В верхних диапазонах параметр Z2, Z2 как правило устанавливается в 0.)
9. Через 10 сек от последнего нажатия на кнопки прибор перейдет в основной режим, настройки запишутся в память.
10. Если из основного режима нажать на кнопки PLUS/MINUS, то произойдет установка коэффициентов Z1 (Z2, Z3).
Калибровка измерителя индуктивности.
1. Для калибровки следует выбрать режим измерения индуктивности и нажать на кнопку SET. В верхней строке дисплея появятся настроечные коэффициенты. Устанавливаемый параметр мигает. В нижней строке измеренная индуктивность.
2. Закоротить входные щупы.
3. Нажать на кнопку PLUS или MINUS – произойдет настройка показаний индуктивности на ноль. Параметр L0 устанавливается автоматически. Если показания не стали нулевыми – операцию повторить.
4. Подключить к щупам индуктивность известного номинала.
5. Если показания индуктивности отличаются от номинала – нажать на кнопку SET, начнет мигать параметр LC.
6. Кнопками PLUS/MINUS установить требуемую индуктивность.
7. Повторить настройку, начиная с п.1.
8. Через 10 сек от последнего нажатия на кнопки прибор перейдет в основной режим, настройки запишутся в память.
9. Если из основного режима нажать на кнопки PLUS/MINUS, то произойдет установка коэффициента L0 (настройка показаний на ноль, при этом щупы должны быть замкнуты).
Моя оценка работы прибора.
Начну с простого. Частоту прибор меряет достаточно точно и хорошая чувствительность, максимальное напряжение не мерил, щупы в розетку не совал.






