Управляем генератором или борьба с АЦП в STM32F030

    У меня как-то исторически не сложилось с семейством STM32F030, лет 5 назад попробовал поработать с ними и долго удивлялся корявости работы большей части периферии, а потом забил на них. И вот на днях мне все таки пришлось вернуться к данной серии, нужно было измерять за минимальные деньги постоянное напряжение на свинцовом АКБ (или сборке до 4 штук последовательно) от 8 до 60В с точностью не хуже ±0.1В с небольшой частотой опроса.

    Решение задачи «в лоб» позволило достаточно точно измерять напряжение только когда на входе АЦП значение больше 1,5...1,6В, то есть только во второй половине диапазона, что для меня означало 30...60В вместо требуемых 8...60В. Основная проблема была в интервале 0...1.6В, выглядело это все как будто у меня делитель напряжения «плавал» или опорное напряжение для АЦП (Vref) было крайне нестабильным.

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



    Суть задачи


    Вообще я за такую мелочь давно старюсь не браться, но тут ко мне обратился родственник, а по совместительству хороший человек, который еще и работает в близкой мне тематике — собирает где-то в в Подмосковье небольшие СЭС. Отказывать не хотелось, да и в тот момент эта задача мне казалась «пара часов железо + пара часов код». Проект в Altium Designer и правда занял у меня пару часов, а вот борьба с АЦП съела весь вечер, поэтому решил поделиться информацией, чтобы другие не тратили время.

    Само устройство крайне простое, алгоритм работы следующий:

    • измеряем напряжение на сборке из 1...4 последовательно включенных свинцовых АКБ;
    • если напряжение меньше «нижнего порога», то замыкаем реле и оно включает генератор, который заряжает наши АКБ;
    • если напряжение поднялось выше «нижнего порога + гистерезис», то есть АКБ зарядились до установленного порога, тогда выключаем генератор;
    • если напряжение выше «верхнего порога», то запрещаем на всякий случай включать генератор.

    Все! Пример: есть один АКБ на 12В и от него питается инвертор. Если напряжение упало ниже «нижнего порога», по умолчанию 10.2В, то включаем генератор. Если напряжение на АКБ выросло до «нижнего порога + гистерезиса», то выключаем. По умолчанию гистерезис установлен 2В и нужен для того, чтобы бензиновый генератор не вырубался сразу как только чуть зарядил АКБ до 10.3В. От постоянного вкл/выкл генератор просто умрет. Ну и на всякий случай защита: если напряжение на АКБ выше 14.4В, то генератор точно не включать.

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

    Изначально в компании, где работает родственник, использовали китайское устройство со схожим функционалом. Из мелких минусов — нельзя было изменять гистерезис, для питания нужен был дополнительный источник на 5В и измерение всего до 30В, то есть для 1 или 2 АКБ. Из больших минусов — китайское устройство иногда зависало и перезагружалось в момент запуска бензинового генератора, которым управляло. Последняя «особенность» как раз и стала причиной попытки отказаться от китайского решения.

    От меня хотели устранения всех этих минусов и чтобы цена устройства была как у китайского, то есть 10$. «Дьявольской мелочью» в данном случае было то, что они хотели покупать у меня готовое устройство за 10$ партиями всего по 20-30 штук, правда стабильно и достаточно часто. То есть мне надо было в мелкой серии сделать устройство сильно лучше и очень сильно дешевле китайцев, заработать то тоже надо в перспективе. Ага, мне тоже было смешно в первые 10 минут, но к моменту осознания сей ситуации я уже сказал «ДА», то есть за Волгой для меня земли уже не было…

    Решение железных проблем


    Как я выше писал, основной проблемой является нестабильная работа устройства во время запуска генератора. В итоге было куплено китайское устройство с алиэкспресс для тестирования и исследования. Основная причина «сноса башки» оказалась не в генераторе, а в реле :)) В момент переключения по питанию в шине 3.3В проходил импульс с амплитудой около 25В, что как бы намекало… Так же помехи шли и на сигнальные цепи. В китайской схеме для борьбы с такой проблемой стояли диоды LL4148, которые типа преграждали путь помехам. Этого достаточно оказалось, чтобы устройство работало нормально на столе, но не в условиях кучи внешних дополнительных помех типа генератора и прочего оборудования. Чтобы навсегда избавиться от выше описанного я решил применить гальваническую развязку через связку «оптрон + dc/dc», что позволило полностью исключить электрический контакт и путь прохождения помех между управляющей обмоткой реле и остальной схемой.



    Альтернативой такому решению было применение защитных TVS диодов вместе с синфазным дросселем, а так же усложнение фильтра по питанию. Но зачем такой колхоз? Поставить dc/dc проще, а на практике оказалось даже дешевле — китайский модуль Mornsun B0505S-1WR2 обошелся мне в 0,4$ при стоимость одного синфазного дросселя на мелкой партии около 0,32$.

    В итоге после такого решения и тестирования прототипов устройство начало работать как автомат Калашникова и проблемы с перезагрузкой ушли. Вообще я немного удивлен, что реле + чутка генератор все таки заставляли перезагружаться stm-ку, китайские разработчики в принципе сделали все неплохо: 10 кОм + 0.1 мкФ на reset, блокирующие конденсаторы по питанию, ферритовые бусинки, все было, но этого все равно оказалось мало.

    Второй минус «китайцев» был в необходимости дополнительного питания, сэкономили видимо на dc/dc. Я решил проблему в лоб — взял питание с входного сигнала, прямо с одного разъема. Для этого надо было просто поставить dc/dc, который переварит минимум 4 * 14.4В, то есть 57,6В. Мой выбор пал на LMR16010PDDAR. Во-первых, это Texas и этим все сказано. Во-вторых, мне данную микросхему азиатские товарищи предложили таскать очень дешево.

    Предыдущий пункт комплексно решил третий минус — возможность подключать до 4-х АКБ последовательно. DC/DC легко переваривает 60В, начинает пытаться сгореть только при 72...73В, так что максимальные 57.6В ему точно не страшны. Делителю напряжения вообще все равно сколько на входе, поэтому все решилось с минимальными усилиями.

    Посмотреть как все это реализовано на схеме вы можете тут — PDF. Схема достаточно большая, поэтому картинкой не стал заливать. Кстати, в pdf-ке вы можете увидеть еще и габариты с печатной платой, но там ничего сверхестественного.

    В итоге для первой пробно-тестовой партии было заказано компонентов на 10 устройств, а после сборки получилось вот так:



    Без происшествий не обошлось — когда создавал компонент для dc/dc модуля перепутал 1 и 2 ногу местами, пришлось немного наколхозить. Хотя на последующих платах сделал аккуратнее, чтобы никто не заметил, а плата на фото осталась у меня в качество отладки на всякий случай или для доработок по софту, если заказчик чего придумает во время тестирования.

    Борьба с точностью АЦП


    Теперь перейдем к основной части статьи. Как писал в начале статьи — АЦП у F030 оказался неточным, то есть до напряжения 30...32В на входе устройства показания плавали с отклонением до 15...20%, а затем ошибка плавно сходила на нет. Одно меня радовало — на первый взгляд отклонения имели какую-то закономерность, а значит это не рандомная ошибка и ее можно отследить и попытаться скорректировать.

    Давайте чуть подробнее об ошибке… АЦП после завершения преобразования отдает сырые данные в регистр DR, который содержит значение от 0 до 4095 (212). Чтобы пересчитать данное значение в напряжение нужно умножить его на шаг квантования. В моем случае напряжение на выводе VDDA, с которого АЦП берет опору, составляло 3,3072В и соответственно шаг равен 3,3072В / 4096 = 0,000807В, я его округлил до 0,0008. Чтобы получить напряжение на входе устройства, полученное напряжение нужно умножить на коэффициент делителя напряжения, в моем случае резистор в верхнем плече 100 кОм, а в нижнем 4,7 кОм, что дает делитель 22,2765. Исходя из этого напряжение на входе устройства, то есть напряжение АКБ, находится с помощью формулы:

    float voltageReference = 0.0008;
    float voltageDivider = 22.2765;
    
    adcVoltageResult = (float)adcData * voltageReference * voltageDivider;
    

    Получается, что после считывания данных ADC1->DR, они приводится к типу float и просто умножаются на коэффициенты, которые константы, и получаем результат в привычных вольтах. На практике оказалось, что все сильно плохо с точностью.

    Вспомнив о бритве Хэнлона, я начал искать место где совершил ошибку. Сначала проверил напряжение на ноге VDDA, думал что оно как-то плавает и зависит от входного напряжения, например, LDO неисправный. Вооружившись настольным мультиметром следил за напряжением на VDDA и изменял напряжение на входе от 8 до 60В, при этом напряжение на ноге VDDA мертво держалось на отметке 3,3072В плавали только следующие 2 знака, что очень хорошо для линейника за 10 центов.

    Следующим местом потенциальной ошибки был делитель напряжения. Хотя мне показалось странно, что резисторы от Bourns на ±0.1% плавают так, что данные имеют ошибку до 20% и эта ошибка имеет нелинейный характер. Провел такой же эксперимент: мультиметром измерял напряжение после делителя, а входное напряжение изменял с шагом 0.5В и в итоге коэффициент делителя был так же намертво зафиксирован на уровне 22,2768.

    В этот момент начало становиться интересно. Оставался один компоненты в котором я мог сомневаться — это операционный усилитель LMV611MFX. Включен данный ОУ как повторитель напряжения. Напряжение ДО и ПОСЛЕ него было одинаковым до 4-х знаков после запятой. Странно… По даташиту он неплох и это все тот же TI, сомневался, но решил проверить, т.к. именно этот ОУ никогда не использовал. На всякий случай впаял на его место мой любимый и проверенный в куче проектов OPA320, который у меня лежит в катушках и он показал такой же результат.

    Оставался последний компонент — МК, а именно его АЦП. За годы применения STM я привык доверять их продукции, тем более беру только оригиналы, поэтому на МК подумал в последнюю очередь. Первым делом подумал, что забыл сделать калибровку или сделал неправильно. Полез в reference manual, там требовали не только вырубить АЦП записью нуля в бит ADEN, но и выставить 1 в бит ADDIS и 0 в бит DMAEN. Последние 2 шага не были сделаны, обычно я вырубаю АЦП и все работает хорошо, в итоге поправил кусок кода с калибровкой:

        /* disable ADC */
        if (ADC1->CR & ADC_CR_ADEN) {
            ADC1->CR |= ADC_CR_ADDIS;
            while (ADC1->CR & ADC_CR_ADEN) {}
        }
        
        /* calibrate ADC */
        ADC1->CR |= ADC_CR_ADCAL;
        while(ADC1->CR & ADC_CR_ADCAL) {}
        
        /* reset configuration */
        ADC1->CFGR2 = 0;
        /* enable device */
        ADC1->CR = ADC_CR_ADEN;
        while(!(ADC1->ISR & ADC_ISR_ADRDY));
    

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



    Как видите теоретический график имеет отличную линейность, т.к. не привязан к железу. График, построенный по реальным данным, тоже практически линейный с минимальными отклонениями. По сути график с реальными данными может быть совмещен с теоретическим графиком путем параллельного переноса на некоторую константу. Если говорить языком электроники — у АЦП имеется смещение!

    По данным, на основе которых строились графики, я выяснил, что АЦП имеет смещение в разных точках 71...73 шага. В этом и была проблема, а «нелинейность» мне почудилась потому, что смещение в 71 шаг при 10В это около 14%, а при 30В уже 4%. То есть если построить график отклонений в %, то зависимость будет иметь экспоненциальный вид, но такой график не интересен.

    Было решено, что для уточнения результатов, попробовать ввести в формулу еще одну переменную, которая будет смещать мои значения вверх и иметь следующий вид:

    uint16_t offsetVoltage = 72;
    float voltageReference = 0.0008;
    float voltageDivider = 22.2765;
    
    adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider;
    

    После этих несложных манипуляций мое устройство начало точно измерять напряжение и данные перестали плавать. До этого же момента оно врало на 72 * 0,0008В * 22,2768 = 1,28В, что в случае контроля одного АКБ очень критично. Свинцовый АКБ конечно не взрывается как Li-ion, но все равно быстро выходит из строя, особенно если его разряжать постоянно не до 10.2В, а до 8,92В.

    Вот такая небольшая история о небольшой железке. Надеюсь кому-то данный материал станет полезным или хотя бы будет просто интересным для чтения. Будьте внимательны со всякими этими АЦП и прочими гадостями :))

    UPD. olartamonov очень усердно просит не дурить народ и использовать код калибровки из reference manual — внес изменение с удовольствием. К сожалению, в моем случае это не изменило ситуацию и смещение никуда не делось. Вероятно, проблема в самом чипе. по указанию из госдепа подкинули контрафактную продукцию

    Конкурс


    У товарищей из PCBway проходит конкурс среди технических проектов, поучаствовать может любой желающий. Правила простые. Печатные платы для вашего проекта сделают бесплатно. И самое главное призы! Это несколько зеленых бумажек с американскими джентльменами на ваш paypal + виртуальная валю на которую вы сможете заказать печатные платы + почет и уважение + возможность получить предложение о работе где-то за пределами СНГ :)) Особенно рекомендую поучаствовать студентам, техническая планка там не слишком высокая, хотя по опыту прошлых конкурсов есть очень сильные проекты, поэтому попасть в призеры легко может «крепкий» DIY-щик!
    Поддержать автора
    Поделиться публикацией

    Похожие публикации

    Комментарии 96

      0
      Недавно «окультуривал» свой зарадник свинцовых АКБ, обновил софт, добавил фишки и изменил калибровки АЦП.
      Устройство на Ардуине нано т.е мега 328.
      Задействован внутренний опорник 1,1в стабилизирован внешним танталом.
      Все работает отлично, никаких проблем и плясок с бубном. Точность измерений 0,02в что очень достаточно.
      Для повышения точности можно мерить несколько раз с паузой м-у измерениями и усреднять результат. Против «шума» хорошо помогает.
        +1
        Вот только 328 стоит порядка 70 рублей, а STM32F030 35-39 рублей.
        Это при учёте доставки и партии в 20 шт.
          +1
          С точностью тут все прекрасно, все таки 12 бит это 12 бит, проблема была в смещение именно. В итоге победить проблему можно в 2 строчки кода и это сэкономило мне 0,5$ просто на одной позиции.
          Ардуино это дорого и колхозно, не буду же я ее лепить вторым этажом на плату :))
            0
            Для серии да дорого. Зато программить быстро.
            Если нужно хоть какой нибудь ШИМ, быстродействие, то друйню уже не использую тут она не рулит. И контроллер можно взять проще и оптимальнее.

            Тут как-то случайно упалил кетайскую плазменную зажигалку. Так взял 8 ногую тини и ради прикола написал софт еще лучше родного :)
              +1
              Что только не делают на тини13 :)) Еще одно время смотрел на STM8, китайцы их любят и стоят они еще дешевле, но как-то мне они не зашли. На них тоже много чего делают в Азии, начиная от вейпов и заканчивая плавильными печами.
                +1
                Сейчас ST выпостила новую серию STM32G, младшие чипы есть в 8-выводном корпусе
                +1
                Если какую-то ерунду программить — то ок, но если программить что-то серьезное — то у меня уже куча отработанных библиотек есть, из которых я на нужной мне платформе соберу в разы быстрее и на порядок надежнее, чем на этой вашей ардуине.
            +3
            Много раз использовал АЦП в F0 (F042, F051, F070). Нет у них никакого врождённого смещения такой гигантской величины.
              +3
              ADC1->CR &= ~ADC_CR_ADEN; // Выключили АЦП
              ADC1->CR |= ADC_CR_ADDIS; // И еще раз выключили


              Собственно, тут ошибка, ADC перед калибровкой выключается некорректно — битом ADEN его можно включить, но не выключить.

              Надо:
              1) проверить ADSTART, если 1 (конверсия в процессе), то поставить в 1 ADSTP и подождать, пока ADSTART станет 0

              2) записать единицу в ADDIS

              3) подождать, пока ADEN станет равен 0

              4) калибровать
                0
                Такой вариант калибровки видел на гитхабе, попробовал — к проблеме смещения добавился еще косяк в виде излома характеристики. То есть до 1В надо плюсовать +72, а после 1В уже надо резко +83.

                С F042, F051 у меня тоже все хорошо было. Это линейки несколько современнее древних F030, которые были одними из первых и содержат кучу мелких болячек.
                  0
                  Его не надо видеть на гитхабе, это процедура выключения АЦП, общая для всех F0 и чёрным по белому совершенно однозначно описанная в даташите.
                    0
                    Вот только в проекте с F051 все работает нормально, а тот же код в F030 уже нет. То, что CMSIS одинаковый я и так в курсе))
                      0
                      Илья, значит, этот код не тот же. Не бывает в природе такого — фатальная, легко заметная и неустранимая ошибка в АЦП, которая случайно обнаруживается через 7 лет после выпуска процессора (нет, F030 — не очень старый, младшие модели F2 и L1 старше) в ходе написания простенького weekend project.
                        –1
                        Так в F030 и лет назад была куча проблем)) Не, ну серьезно, инициализация АЦП взята просто с другого проекта на F051, где все прекрасно и начинается проблема. При чем сия проблема не только у меня возникала, вот только народу лень писать, разве что на форумы вопросы «шеф, все пропало, что делать?». Я могу лишь предположить, что мне попались чипы из совсем старых партий, что в принципе не исключено.

                        Что касается ошибок и 7 лет… ST болт клали на все, я им несколько раз писал репорты на хардверные проблемы (правда не с МК, а с драйверами) и годами они висят без исправления. При этом к ним стабильно приходят на форум и плачутся с аналогичными проблемами. Репорты разработчиков из других стран так же никто не спешит править. Поэтому лично для меня не удивительно наличие проблем спустя столько лет.
                          +2
                          (вздохнув) Нашёл на шкафу Nucleo-F030R8

                          Подключил многооборотный переменник 20К на PA0, землю и 3,3 В. Проверил.

                          Некалиброванный АЦП — дикое смещение, 2-3 отсчёта показывает на 54 мВ, т.е. сдвиг порядка 65 отсчётов.

                          Калибруем АЦП — тут же на том же положении резистора получаем честные 65 отсчётов.

                          Код:

                          /* disable ADC */
                              if (ADC1->CR & ADC_CR_ADEN) {
                                  ADC1->CR |= ADC_CR_ADDIS;
                                  while (ADC1->CR & ADC_CR_ADEN) {}
                              }
                              
                              /* calibrate ADC */
                              ADC1->CR |= ADC_CR_ADCAL;
                              while(ADC1->CR & ADC_CR_ADCAL) {}
                              
                              /* reset configuration */
                              ADC1->CFGR2 = 0;
                              /* enable device */
                              ADC1->CR = ADC_CR_ADEN;
                              while(!(ADC1->ISR & ADC_ISR_ADRDY));
                          


                          Можете, конечно, спорить дальше, что кто-то «стабильно» приходит на форум с «аналогичными проблемами», но лучше код у себя поправьте. И статью тут.

                          Нет в STM32F030 этой проблемы и никогда не было.

                          P.S. Nothing personal, дурацкие ошибки бывают абсолютно у всех. Я вот благодаря вам обнаружил, что в штатном драйвере АЦП STM32F0 в RIOT OS вообще про калибровку не думают.
                            –1
                            Спасибо за кусочек кода с RM, заменил, убрал константу со смещением иииии… опять показывает +-1.5В где-то. Не, ну серьезно, я бы стал строчить портянку текста, если бы не попробовал пример из документации? Мне конечно иногда нечего делать, но не на столько))

                            Nothing personal, дурацкие ошибки бывают абсолютно у всех
                            Конечно, я вроде не претендую на позицию далай-ламы от эмбеда, просто перед тем как написать проверил наиболее очевидные для ошибки места.
                              +1
                              Я не знаю, мне видео заснять, как игнорирование калибровки АЦП на STM32F030 даёт сдвиг в -65 отсчётов, а калибровка его немедленно снижает до около нуля?

                              У меня другие дела есть.

                              Или взять за вас ваш код и найти в нём ошибку?

                              Это, конечно, возможно, но не бесплатно.

                              Или оставить вас верить в то, что вы за семь лет стали первым, кто нашёл такой громадный баг в АЦП F0, потратив на это пару часов свободным вечером?

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

                              Не, ну серьезно, я бы стал строчить портянку текста, если бы не попробовал пример из документации?


                              Это пишет человек, у которого в коде прямо в этой портянке текста грубая ошибка ровно в месте, которое в документации описано буквально по шагам, нумерованным списком.
                                0
                                Я не знаю, мне видео заснять
                                Я вроде пруфов не просил, доказывать мне тоже ничего не нужно, тем более платно. Ваше мнение я услышал и к нему отношусь всегда как к компетентному. Просто вы меня услышать не можете — «я сделал калибровку по RM, то есть тот кусок кода что вы скинули и он не решил мою проблему». Возможно дело именно в МК, брак партии или еще чего.

                                но мне же других читателей жалко
                                Ну вы любите писать статьи-разоблачения, что мешает в этот раз? Спасите читателей.
                                  0
                                  Я вообще вполне искренне хочу не утопить вас и лишить пары-тройки клиентов, а помочь вам исправить ошибку.

                                  Но судя по тому, что вы до сих пор хотя бы

                                  ADC1->CR &= ~ADC_CR_ADEN;    // Выключили АЦП
                                  ADC1->CR |=  ADC_CR_ADDIS;    // И еще раз выключили
                                  ADC1->CFGR1 &= ~ADC_CFGR1_DMAEN;    // И еще раз, но уже DMA
                                  ADC1->CR |= ADC_CR_ADCAL;    // Теперь нас благословили на калибровку
                                  while (!(ADC1->CR & ADC_CR_ADCAL));   // Ждем божьей милости и окончания действа


                                  в статье не поправили (а в этом отрывке две ошибки), вам самому это не очень нужно.
                                    0
                                    вам самому это не очень нужно
                                    по моему оно вам нужно больше, чем мне, судя по напору)) Но я вас услышал, поправил в статье сам код и добавил вашу рекомендацию, предупредив читателей, чтобы с опаской относились к материалу.

                                    У меня нет задачи доказать, что ST не правы, или ST плохие. Цель моя весьма прозрачна — рассказать читателю, что бывает такая фича. Судя по вашим тестам она не поголовно в каждом камне идет, но вот мне попалась и повторюсь — правка калибровки на ваш варианта не решила мою проблему.
                                      +2
                                      Цель моя весьма прозрачна — рассказать читателю, что бывает такая фича


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

                                      Мы все с удовольствием возьмём и проверим.

                                      Пока что всё это выглядит как «я за пару часов нашёл огромную ошибку, которую вообще никто не замечал 7 лет подряд, показал вам пять строчек кода с двумя ошибками, а вы должны мне на слово поверить, что в остальных пятиста строках проекта ошибок нет».

                                      Нет, это так не работает.
                                        +1
                                        я за пару часов нашёл огромную ошибку, которую вообще никто не замечал 7 лет подряд
                                        Ну и нафантизировали вы себе…

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

                                        Мы все с удовольствием возьмём и проверим.
                                        А пивка холодненького не принести? То есть вы себе выдумали сначала про ошибку, которую якобы кроме меня за 7 лет никто не нашел, а теперь пытаетесь заставить удовлетворить ваше любопытство? Я эти пол часа времени с большим удовольствием просто полежу ничего не делая, чем буду пытаться кому-то что-то доказывать.

                                        P.S. я свои наблюдением в статье поделился, мне этого достаточно. Обращать на него внимание или нет — это уже выбор каждого. Если вашему ЧСВ так важно что-то доказать, то доказывайте, напишите там статью что ли или как оно обычно бывает.
                                          +1
                                          Ну и нафантизировали вы себе…


                                          Доступный любому из присутствующих здесь поиск в гугле позволяет без труда установить, что никаких «регулярных жалоб на форумах» нет. То есть — никто до вас эту проблему не обнаруживал.

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


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

                                          При этом как раз ваше огромное ЧСВ очень мешает вам заметить, что вся ситуация выглядит очень странно.
                                            0
                                            Простите что встреваю, но Вам же ответили, что Ваши примеры и рекомендации были применены и проверены а итог тот же. Зачем упорно и слепо настаивать на своей правоте?
                                              +2
                                              Они были применены и проверены в неизвестном мне коде человеком, который навалял кучу элементарных ошибок даже в тех немногих строках кода, которые были прямо в этой статье.

                                              Лично вы готовы подписаться под тем, что в этом коде — полагаю, вы его тоже не изучали — ровно после моих примеров и рекомендаций нет одной-единственной дурацкой строчки с глупой ошибкой, на которой калибровка АЦП слетает обратно?
                                            +1
                                            Оставлю это здесь с позволения благородных донов:
                                            Демоны в АЦП STM32 — от Леонида Ивановича.
                                            Если окажется, что дело в этом — то можно попробовать ввести R14 внутрь петли ОС по постоянному току (с добавкой небольшого конденсатора с выхода ОУ на инвертирующий вход — как в рекомендациях по питанию ёмкостных нагрузок от ОУ).

                                            Сам я — склонен рассмотреть в первую очередь предложенную далее версию о падении напряжения на bonding wire's от тока индикатора. Оптрон и его индикатор ведь непостоянно включены…
                                              +1
                                              Там по схеме 100 Ом резистор последовательно с входом АЦП, не должно быть такого эффекта. Эффект есть, когда люди пытаются низкочастотный фильтр сделать, с большим резистором и большой ёмкостью одновременно.

                                              Ток через землю — ну тоже, если бы там сопротивление ног такое было бы (явно не меньше 1 Ом), собственное потребление контроллера заметно влияло бы на показания АЦП. Либо земля как-то адски неаккуратно должна быть разведена.
                                              +1
                                              NordicEnergy Илья, подарите Олегу один образец сего капризного механизма! В расчёте получить кошерное решение, не противоречащее даташиту) Само собой под условие опубликовать итоги!
                    +1
                    Тоже с таким не сталкивался, есть отклонения, конечно, причем не очень линейные, но на уровне одного-двух разрядов. Не знаю, что там у автора не срослось.
                      +3
                      То, что первый взятый STM32F030 без калибровки АЦП с первой попытки выдал смещение нуля, очень похожее по величине на имеющееся у автора (65 vs 71), как бы говорит нам.

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

                      Но в существование такой ошибки, которую 7 лет никто не замечал, верится слабо. Либо у автора ошибка в коде, либо это какое-то редкое состояние АЦП, возникающее в конкретных и нечасто встречающихся обстоятельствах.
                    +1
                    Вообще-то я не очень понимаю такой именно способ измерения АЦП. На самом деле в каждой stm-е есть эталонный источник напряжения. Данные на нем тарируются на заводе в процессе изготовления и доступны (для серии f0xx) по адресу 0x1FFF F7BA — 0x1FFF F7BB — это значение при 3.3 вольта питания, рекомендуемая даташитом формула V DDA = 3.3 V x VREFINT_CAL / VREFINT_DATA. Какой смысл надеяться на стабильность питания на Vdda — непонятно.
                    Процесс же измерения обычно организуют так, чтобы мерять Vref одновременно (ну в той же выборке), что и остальные значения. После этого вычисляем результат — уверяю, никаких смещений и т.д. там не будет… Ну разве что шум — ну тут есть свои методы :)
                      0
                      От ошибок смещения такой подход не срабатывает.
                        0
                        В общем случае — смещение учитывается как раз при калибровке в начале работы. Но тут да, надо быть уверенным в 0 на входе (это достигается соответственно отключением в ходе калибровки входов — в даташите так и указано — отключать!).
                        Я сам всегда пользуюсь HAL для инициализации — там все ошибки уже учтены, лучше не сделать. Это потом и в критических местах HAL плох, а вот инициализацию лучше доверить ему.
                        0
                        Ага, это прекрасно, только в таком случае добавляется еще один «черный ящик». Сколько вольт на VDDA я могу измерить очень точно, а сколько вольт внутри на Vref загадка и остается только надеяться на 100% работоспособность. В данном случае я откинул все лишнее и провел тест с участием только АЦП. После поиска ошибки никто не запрещает переключиться на внутренний ИОН.
                          0
                          Что-то я не пойму — как у вас получается еще один черный ящик. Напряжение Vref не загадка — оно точно определено и измерено для каждого экземпляра (ну вы же сами пишите, что используете хорошие чипы), по отношению текущего значения к контрольному устанавливается масштабирующий множитель для АЦП (ну а больше-то там нечему глючить, нелинейность определена в даташите).
                          В том-то и дело, что у ST все очень продумано четко — при калибровке обнуляется сдвиг, а при одновременном измерении Vref и канала устраняется масштабирование. Все по формуле из даташита…
                            0
                            оно точно определено и измерено для каждого экземпляра
                            После ни где не задокументированного смещения у меня нет такой категорично уверенности, как у вас, что напряжение Vref точно определено и измерено. По крайней мере уверенности нет относительно серии F030.

                            К тому же не совсем понятно с чего вы взяли, что я остался на VDDA. Я это напряжение лишь использовать чтобы исключить дополнительный потенциальный источник ошибки. После перехода на ИОН внутренний, кстати, ничего глобально не поменялось.
                              0
                              АЦП всегда работает с VDDA, его никак у ST нельзя никуда переключить, только дать прецизионное напряжение на VDDA. Но ИОН всегда — ну так мне инженеры их втирал — типа by design работает как описано в даташите… Вот только для серии F030 я встречался с такой проблемой — если частота не 48 МГц, то АЦП может вести себя странно. Но такое я встречал всего несколько раз — не знаю, может партия такая… На всякий случай для этой серии всегда теперь использую 48 МГц :)
                                –1
                                Все жалуются на F030, знакомые многие сказали, что не могли добиться нормальной точности от АЦП. Для себя решил по возможности к ним больше не возвращаться :)) Посмотрим, что будет с ценами на новые STM32G0, на digikey они дешеве, но на LCSC еще не завезли.
                                  +2
                                  Вот только для серии F030 я встречался с такой проблемой — если частота не 48 МГц, то АЦП может вести себя странно


                                  Тут надо помнить, что у АЦП там своё тактирование — от HSI через свой делитель.
                                  0
                                  После ни где не задокументированного смещения у меня нет такой категорично уверенности, как у вас, что напряжение Vref точно определено и измерено


                                  Судя по всему, у вас просто не проходит калибровка АЦП.

                                  Нет у F030 никакого смещения за пределами нескольких LSB, как указано в даташите. Да и даже если бы было, заглушка в коде «а давайте добавим измеренное на одном экземпляре магическое число» — это худший вариант, какой можно придумать.
                                    +1
                                    Нет у F030 никакого смещения за пределами нескольких LSB, как указано в даташите
                                    Ага, в даташите много чего указано, только прелестей там хватает, например, по мимо АЦП коряво работают таймеры в режиме захвата, еще spi slave. Про это в документации тоже ни слова.

                                    а давайте добавим измеренное на одном экземпляре магическое число
                                    При этом данное «магическое число» оказалось постоянным для 10 устройств в одной партии и еще на парочке F030 из разных магазинов. Совпадение? Не думаю.
                                      +3
                                      Приходилаось сталкиваться с похожей проблемой для МК от Silabs
                                      Там проблема была в падении напряжения на bonding wire внутри чипа.
                                      Если через МК протекает заметный ток то падение напряжения на втнренней разводке микросхемы «приподнимает» потенциал GND на кристалле относительно платы. В таком случае AЦП измеряет заниженное входное напряжение.
                                      По Вашей схеме через МК идет примерно 10мА тока индикаторов.
                                      Попробуйте временно отключите индикатор и проверьте сохранилось ли смещение АЦП
                                        0
                                        Хм, вот это уже интересное заявление, на самом деле ток даже чуть выше, там оптрон еще кушает сколько-то. Через пару часов проверю ваш предположение, по мне оно не очень очевидное))
                                        +2
                                        Ага, в даташите много чего указано, только прелестей там хватает, например, по мимо АЦП коряво работают таймеры в режиме захвата, еще spi slave. Про это в документации тоже ни слова.


                                        Как мы уже выяснили опытным путём, даташит в данном случае оказался прав.

                                        При этом данное «магическое число» оказалось постоянным для 10 устройств в одной партии и еще на парочке F030 из разных магазинов. Совпадение?


                                        По секрету вам скажу, что у меня на столе прямо сейчас лежит F030 со смещением некалиброванного АЦП в 65 отсчётов.

                                        Оно небось ещё и от температуры и напряжения питания зависит.
                                          0
                                          f030 не с алиэкспресса? Често подписывали бумагу, что его ни-ни в наш военпром?
                                          Это я к тому, что в али могут быть и сливы би-стока, и подделки.
                                          Даже нормальные поставщики нет-нет, да и поставят катушку брака.
                                            0
                                            Заказывал с LCSC, там оригиналы или если не оригиналы, то пишут честно. Документы на партии от 100 камней кладут, а вот на 10 штук нет и в теории конечно брак вероятен. Несколько лет назад и от ПМ электроник на брак нарывались, хотя казалось бы официальный дистрибьютор маузера.
                                              0
                                              Может немного покритикую, но есть замечания, некоторые из них весьма серьезные:
                                              1) более ранний коммент про фильтрацию питания АЦП остался без ответа, дроссель в проходе питания АЦП, при таких требованиях к точности весьма показан.
                                              2) Возможно, еще по земле идет звон, отсюда враки нуля. Обычно землю разводят отдельно и в одной точке соединяют с заливкой. Вижу конденсаторы одной ногой в заливке. Аналоговая техника такого не любит. Для аналогового тракта вообще нужна отдельная земля, делается легко, голова потом не болит.
                                              3) при таких требованиях к точности и таком гейне противопоказана динамическая индикация. Ну, или отвязывать её отдельным буфером с тщательной фильтрацией его питания.
                                              4) Повторитель на ОУ включен в общую шину питания без развязки. Весь звон динамической индикации и прочий шум от МК летит прямо в него.
                                              5) не понял, откуда идут 5 вольт. Главное, чтобы не от USB.

                                              Имеет смысл откатиться назад попробовать АЦП на коленке — платке вида blue pill / иной фирменной девборде, а результаты слать в UART, возможно, после накопления в буфере.

                                              В 030 АЦП, на мой взгляд, чуть более капризный, чем на старичке 103, но когда нету гонки по частоте дискретизации, он достаточно точен.
                                                0
                                                дроссель в проходе питания АЦП, при таких требованиях к точности весьма показан
                                                Согласен, но тут экономил реально на всем, в принципе точность 0.1В мне показалась не супер критичной, т.к. 1 шаг АЦП эквивалентен около 15 мВ.

                                                аналогового тракта вообще нужна отдельная земля
                                                Вот тут да, схалтурил, не думал что в данной задаче будет критично. Правда залитого кондера не увидел с ходу, вроде в настройках полигона для всего термопад назначен.

                                                не понял, откуда идут 5 вольт
                                                А сразу после dc/dc, микросхема D5.
                                  0
                                  Я тоже всегда так делаю
                                    0
                                    del
                                      0
                                      это значение при 3.3 вольта питания


                                      Какие-то серии (L0?), кстати, калибруются при 3,0 В, поэтому стоит смотреть в даташите. Плюс в старых L1 (по STM32L151CB-A включительно) калибровочные значения недоступны из-за ошибки в кристалле.
                                        0
                                        Вот, кстати, да — у всех по разному… у f1xx вообще приведен в даташите значение в 1.25 В, а в памяти ничего не хранится. Но все равно принцип измерений один и тот же — сначала устанавливаем, какой был потенциал на Vdda, а затем считаем — это все из-за того, что АЦП — SAR. Раньше я ставил LC цепочку на Vdda, потом перестал ставить L — достаточно, чтобы потенциал удерживался на время захвата. И в этом отношении чипы с двумя АЦП интереснее — один берет саму измеряемую величину, а второй — Vref. Получается одновременно.
                                          0
                                          Ну F1 — это древность, его уже забыть можно.

                                          Калибровочные значения сделали на следующем поколении кристаллов, и то, как видим, не сразу (в эррате значится «могут быть недоступны или неверны», но лично я не видел L151CB/CB-A, которые не высыпались бы в BusFault при обращении к адресам калибровочных значений).

                                          А с измерением — ну да, всё так.
                                            +1
                                            Ну как древность — а как же F103? Это ж… святое! Да по цене такой набор всего на борту является уникальным, пожалуй. Я вот даже не знаю, чем его заменить, может кто подскажет? А есть еще f107 — тут, когда нужен Eth MAC и малая цена, сложно было чем-то заменить. Теперь вот думаю заменять на H750…
                                              +1
                                              Заменить в чём? У нас вот ни одного изделия на F1 нет — везде либо эльки, либо F0 (F042 в TSSOP20 и с безкристальным USB — это ж сказка).
                                                0
                                                Все так… но вот есть некоторая проблема — мне как раз нужен часто FPU и 2-3 АЦП. А вот за деньги f103 такого я не смог подобрать… На 103 реально цена неадекватная — один раз удалось купить партию за… 5 рублей за штуку. При таких ценах у меня схемотехника начинает кардинально меняться — вместо всего я смело ставлю много штук 103 (и часто самая большая цена — это микросхемы электрической развязки сигналов — ну тут пока hcpl817 обхожусь по цена 4 рубля за штуку) — вот просто буквально вместо всего…
                                                0
                                                Цена у F103 хорошая только при условии закупки в Китае, у взрослых дистрибьютеров цена на них выше, чем на некоторые F4))
                                                  0
                                                  Была у меня такая история… Так то я частенько закупаюсь в elitan, но тут… по некоторым позициям удалось выяснить, как устроены линии закупки — и оказалось, что все сходятся к одной и той же компании — естественно из Китая. Но вот разница цен… В общем взрослые накручивали по 200-300%, каждый… Особенно радовали компании из Европы (всего было 5-8 компаний в каждой линии поставки). Жалко, что не всегда удается найти прямого поставщика.
                                                  Иногда еще более удивительные случаи бывают — некоторое время назад столкнулся с ситуацией, когда на лазеры определенной длины волны цены в мире (!) заставляла завышать небольшая компания из подмосковья, заже точнее — устраивала запреты на продажу… Такая вот коммерция бывает…
                                                    0
                                                    В РФ и СНГ вообще нет взрослых дистрибьюетров, у нас одни барыги типа Компэлов, ПМ электрониксов и прочих шараг, с внушительной накруткой. Взрослые дяди сидят таки в Китае и Штатах в основном, а там в мелкой партии F1 может стоить около 4$, когда какой-нибудь F401/410 стоит в 2 раза дешевле и в более удобном QFN))
                                        0
                                        (del)
                                          0
                                          У вас R17 в цепи ОС операционного усилителя 100 ком. Зачем такое большое? Из-за него могут быть доп. шумы, смещение и, главное, вместе с входной емкостью (5пф) давать искажение частотной характеристики чувствительность к шумам.
                                            0
                                            Я взял дубовый кусок схемы с другого проекта, где никаких проблем не было. Частотная характеристика не критична, измерения идут с частотой 10 Гц. В принципе замена R17 на перемычку в данном случае ничего не исправила. Но вообще замечание верное, только в задачах где АЦП работает несколько быстрее))
                                            0
                                            И вот, кстати, сейчас вожусь с серией L4хх — понадобилось сочетание низкого потребления, FPU (из-за расчетов БПФ) и АЦП получше, ну и USB. А у серии L432 все это есть, и АЦП имеет встроенную возможность усреднять измерения (до 256, делаю таким образом из 12-битного 20-битный :). И что сказать — очень приличный чип и по цене не сильно много — $2.1.
                                            В схеме применяется ОУ OPA2333 в виде предусилителя и активного фильтра, общий gain 20000 — приходится мерять входное значение около 0.5 мкв…
                                            Так вот — при усреднении по 16 значений измеренная точность вполне отличная — шумы на уровне 2%, АЦП очень быстрый и точный, очень удобно работать.
                                              0
                                              Я насколько помню в серии F3 есть МК с АЦП повышенной разрядности, там как бы не сигма-дельта стоит, хотя могу ошибаться. Там тоже ценник интересный, хотя потребление будет явно больше, чем у L4.
                                                0
                                                Немного не в тему, но раз пошла такая пьянка… Осваиваю чудо-чип STM32H750 — это просто чудо какое-то! И 400 Мгц, и дельта-сигма, и джипег, и HRTIM, и M7, и 1M ОЗУ, и… цена!!! ну реально дешевый! Планирую теперь более-менее сложное на него переносить, в первую очередь порт для Ada (Ada — это реально язык для микроконтроллеров, как я убедился).
                                                  0
                                                  Я работал с H753 и HRTIM, движками управлять реально удобно, а математику на 400 МГц и FPU вертеть одно удовольствием. Правда без ложки дегтя не вышло как обычно — проблемы с кешэм, часть каналов DMA не может работать когда работает кэш. Если отключить кэш, то производительность МК даже с 400 МГц падает до уровня F4 младших. Еще были проблемы запуска SDRAM на 166 МГц, нормально с работающим кэшем доступно только 84 МГц. Правда за пол года может чего и поправили, но пока остался на stm32f334 в основном. Цена на H7 реально приятная, у st вообще новые более жирные камни всегда стоят дешевле предыдущих поколений.
                                                0
                                                Я тоже сейчас запустил проект на STM32L433RCT6P, нужны были некоторые его навороты, в частности интерфейс работы с SD картой. Камешек отличный, но он и денег стоит однако.
                                                0
                                                А вы не пробовали смотреть осциллографом непосредственно на ножке АЦП МК? Возможно у вас наводится синхронная с частотой измерения помеха от другой периферии на плате (индикатор и т.д.).
                                                +1
                                                Спасибо за статью, очень интересно! А какие еще программные способы повышения точности можно применять??
                                                  0
                                                  Можно, например, увеличить частоту выборки и делать не 10 измерений в секунду как у меня, а 10000 измерений. Потом полученные данные фильтровать, банально взять среднее арифметическое, уже будет точнее. Так же можно применять более сложные способы фильтрации, например, фильтр Калмана и прочие алгоритмы. В принципе вариантов много и каждый заслуживает отдельной статьи, хотя по Калману уже на хабре видел информацию, можешь найти ее. Там, насколько помню, было неплохо описано на примере топливной системы.
                                                0

                                                Глянул схему, все вроде нормально, но не видно нормальной питашки аналоговой части МК. LC цепочку сэкономили. И для повторителя тоже. Лучше бы С19 не ставили, все равно шум медианой уберется. Ну и про постоянную составляющую слабо верится, немного лень читать рейлы выбранного ОУ, а они хоть маленькие, но должны быть.

                                                  0
                                                  Для тех кто планирует сделать заказ автору статьи, на разработку какого либо электронного устройства:

                                                  electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=149794&page=1
                                                  Будьте внимательны!
                                                    +1
                                                    там кстати ещё схемка 5-ой странице несколько киловаттного девайса, интересно было посмотреть
                                                      0
                                                      А ещё этот подозрительный тип писал «туториалы» с тучей опечаток и рекламой-продажей 50-ти наборов плат под ником R4ABI, интересно скольких кинул:
                                                      toster.ru/q/275846
                                                      habr.com/ru/post/390699

                                                      habr.com/ru/post/430908/#comment_19415584
                                                      «Я такой же веб-программист) Ни образования, ни опыта нормального, но задачи мелкие решать надо да и интересно, поэтому прекрасно понимаю ценность статей базовых и стараюсь писать почаще.»
                                                      0
                                                      А зачем на платах в местах гальванической развязки удалять паяльную маску?
                                                        0
                                                        Немного увеличивается напряжение пробоя, он же в основном по поверхности идет. Совсем круто — сделать фрезеровку под dc/dc и оптроном, но в данном случае тут это не нужно, т.к. развязка нужна в данной железке не для защиты, а чтобы сигнальную часть отвязать от источника помех.
                                                          0
                                                          Немного увеличивается напряжение пробоя

                                                          Спорное утверждение. На просторах интернета не нашёл подтверждение этому. Буду рад если поделитесь ссылкой на какое нибудь исследование.
                                                          он же в основном по поверхности идет

                                                          А куда эта поверхность пропадает? Текстолит же остаётся. Слой маски примерно 250мкМ.

                                                            0
                                                            Поверхность никуда не пропадает, просто пробой по маске имеет порог напряжения ниже. Это не в интернете пишут, а в стандартах IPC, номер к сожалению не вспомню с ходу.
                                                              +1
                                                              Нет, в стандартах пишут совершенно другое. IPC-2221B, раздел 6.3:

                                                              B1 — Internal Conductors
                                                              B2 — External Conductors, Uncoated, Sea Level to 3050 m
                                                              B3 — External Conductors, Uncoated, Over 3050 m
                                                              B4 — External Conductors, with Permanent Polymer Coating (Any Elevation)

                                                                0
                                                                Так это касается зазоров между медными проводниками, а не пустого барьера и ни слова о паре «маска-текстолит». Эта таблица уже стала по ходу попсой в комментах под статьями моими :))
                                                                  0
                                                                  а) пустой барьер у вас между чем и чем, если не между проводниками?
                                                                  б) permanent polymer coating, то есть маска, по-вашему, тут на что нанесена, если не на текстолит?
                                                        0
                                                        del
                                                          +2
                                                          Давным давно, в одной далекой Галактике на Mega у меня был подобный сдвиг измеряемого напряжения вверх и вызван он был подключенным резистором подтяжки к питания — это не Ваш случай? Причем измеряемое на ножке МК напряжение было абсолютно правильным.

                                                          И, конечно, извините, но что за фигня
                                                          float voltageReference = 0.0008;
                                                          float voltageDivider = 22.2765;
                                                          вместо нормального и вменяемого
                                                          float voltageReference = 3,3072 / 4095;
                                                          float voltageDivider =(100.0+4.7) / 4.7;


                                                          Ну и напоследок — надеяться получить точность в 0,1/60=0,16% при резисторах точностью 0,1%, ошибке преобразования 1/4095*3=0,07% и точности задания опоры 0,04/0,75=0,5% несколько самонадеяно, воут?
                                                            0
                                                            Хы, не, нога настроена на вход без подтяжек) Хотя на этот момент тоже думал, когда тыкнулся в итоге мультиком в ногу, а там все как надо + никаких помех.
                                                              0
                                                              Так на ноге все было нормально, набегало где-то внутри корпуса.
                                                                0
                                                                Внутри подтяжка отключена, но вот набегать может конечно, вопрос только от чего. В устройстве 2 кнопки и дисплей только работали в момент тестов. Выше высказывали вполне интересную мысль, что из-за питания индикатора без драйвера МК грузится большим током и внутри падение напряжения двигает опору АЦП. Вообще надо будет еще поковыряться с данной железкой, хоть уже и лень конечно))
                                                              +2
                                                              float voltageReference = 3,3072 / 4095;


                                                              На самом деле нормальное тут «float voltageReference = 3,3 / 4095», а совсем нормальное — таки измерять Vdda по калиброванному значению Vref, как было сказано выше.

                                                              Ибо надеяться на точность в четыре знака после запятой у грошовой LDO'шки с суммарной погрешностью в районе ±1,5 %…
                                                              +1
                                                              Я вот тоже склоняюсь к какой-нибудь неочевидной петле, из-за которой на земле появляется потенциал. Да, когда нам нужно было повысить точность, то схема с компенсацией смещения изначально закладывалась: подать 0 на вход и измерить смещение.
                                                                0
                                                                Автор (предусмотрительно?) не раскрывает схемотехнику полностью, но на приведенной им фотографии, например, видно, что с обратной стороны модуля установлен CL3631BH (похожий компонент) — трехпозиционный семисегментый (итого 24-е светодиода) индикатор с индивидуальными (попозиционными) общими анодами и групповыми катодами сегментов (то есть управляется это все динамически = повышенными токами).

                                                                Ограничивающие резисторы (три штуки, R4, R6, R7, расположены на верхней стороне у попозиционных общих анодов) подключены к анодам — наверное, автор сэкономил, так как по классическим правилам индивидуальный резистор должен быть у группового катода каждого сегмента (ведь светодиод нелинейный элемент и светодиод светодиоду рознь, даже в одной конструктивной группе).

                                                                Подключено все это (и резисторы анодов, и катоды), насколько можно судить по картинке, напрямую к ножкам микроконтроллера. Ток питания втекает по линиям VDD в микроконтроллер, через порты вывода (drive high), подключенные к резисторам анода, вытекает в ССИ, через порты вывода (drive low), подключенные в катодам, снова втекает в микроконтроллер, и через линии GND снова вытекает из контроллера на землю.

                                                                Вполне себе петля, которая может не только поднять потенциал GND внутри МК по отношению к земле питания, но и (наверное, пропорционально) опустить потенциал VDD внутри МК по отношению к уровню питания. Так что автор, вполне вероятно, ловит не только отрицательное смещение нуля, но и снижение коэффициента передачи.

                                                                Так что Ваша гипотеза про петлю, скорее всего, верна…
                                                                  +1
                                                                  Автор (предусмотрительно?) не раскрывает схемотехнику полностью
                                                                  Вы зря так нам меня, в тексте (в конце части про железо) есть ссылка на PDF с полной схемой.

                                                                  то есть управляется это все динамически = повышенными токами
                                                                  При динамической индикации ток средний получается как будто постоянно горит один знак полностью, то есть 7 сегментов + точка, итого 8 светодиодов. При статическом управление ток даже, хотя нагрузка на ногу остается такая же, только ног больше тратится.

                                                                  наверное, автор сэкономил, так как по классическим правилам индивидуальный резистор должен быть у группового катода каждого сегмента
                                                                  Вы правы, -4 резистора и -8 точек пайки. Тут вообще сэкономлено на всем, разве что ОУ еще выкинуть и измерять напрямую через делитель просто.

                                                                  На выходных планирую еще помучить ради интереса сию железку, про отключению дисплея уже пару раз писали, крайне вероятно или петля или из-за достаточно высокого тока на порту просто садится питание внутри самого МК.

                                                                    0
                                                                    Извините, ссылку на схему пропустил. Действительно есть. При резисторах 1 кОм, версия с просадкой из-за индикатора отметается.

                                                                    Вы правы, -4 резистора и -8 точек пайки.
                                                                    А где (у индикатора) четвертый резистор? На схеме, вроде бы, только три?

                                                                    Опять же, на правах догадки. В даташите на МК пишут, что к росту погрешности АЦП может приводить высокая паразитная емкость на входе АЦП (Cparasitic) и высокое сопротивление между источником сигнала и входом АЦП (Rain). В связи с этим, не играет ли роль С19 роль такой паразитной емкости? И точно ли на плате установлен именно 100-омный R14? (а то рядом много 100-килоомных, мало ли, спутать 100R и 100k не так-то и сложно.)

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                              Самое читаемое