Эксперимент на чипе stm32f030 72МГц, идеальный вариант, на PB1 ШИМ, на A0 АЦП, сопротивление 200 Ом АЦП DMA кольцевой буфер, прерывание половинка и полный, расчет среднего в прерывании. Стабильные показания на частоте ШИМ 1000кГц, меандр, удалось получить только при 239_5 Cycles, хотя может он не успевает просчитывать.
чевой-то хваленый STM-овский АЦП шумит аж в трёх младших битах...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
С чего бы он был хваленым, такой же как и в Атмеги, только разрядность увеличили, а шумит он из-за емкости внутри. К примеру вот замеры какого-то стабилизированного питания с выхода БП на ТЛ494
ARV, продолжаем эксперимент, получил я идеальный вариант, подчеркиваю идеальный.
Увеличил скорость преобразования до 7_5Cycles, если не ошибаюсь, тактовая АЦП 14МГц, тактируется от какого-то собственного HSI генератора, в результате скорость преобразования составило 1,43мкс.
При тактовой CPU 72МГц у меня в прерывании вагон времени, учитывая на вычисление 64 битного корня (над функцией надо бы поработать, может полегче есть), само прерывание идет со скоростью 0,7мс, а весь расчет включая 64 битный корень 0,3мс судя по осциллографу, времени вагон получается.
Сам период измерения выбран 1,43(мкс)*512(половинка буфера)*700=512512мкс = ~0,5сек. Здесь можно как бы еще поиграться, уменьшить скорость преобразования до минимальной 1_5Cycles, что составит 1мкс, что позволит подняться выше 100кГц. Можно с самим периодом еще повозиться. В коде я обнулял младшие три бита, можно попробовать убрать. Но как бы не важно, я получил идеальный результат, цифра стоит как вкопанная, не колышется.
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Dimon456, Очень даже неплохо. Если выложишь hex, то можно сравнить. STM32F103 LCD_RS as sbit at GPIOA_ODR.PA0 LCD_EN as sbit at GPIOA_ODR.PA1 LCD_D4 as sbit at GPIOA_ODR.PA2 LCD_D5 as sbit at GPIOA_ODR.PA3 LCD_D6 as sbit at GPIOA_ODR.PA4 LCD_D7 as sbit at GPIOA_ODR.PA5 ADC - PA6 PC13 - переполнение ADC Первая строчка TRMS, вторая AVG. 2048 АЦП - ноль. 100 ед. АЦП - 1 вольт.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
, получил я идеальный вариант, подчеркиваю идеальный.
Никогда не говори никогда. Нет пределу совершенству. Попробуйте: 1. Не надо обнулять младшие биты, они тоже несут информацию. Сигнал, который идет на АЦП не идеальный, не надо гнаться за стабильными цифрами. А то так можно дойти до 5-битного сигнала, еще стабильней будет. Хотите уменьшить шум, усыпляйте МК на время оцифровки, разводите правильно цепи аналогового питания МК, озаботьтесь стабильностью опорного напряжения и т.д. 2. Сначала из суммы извлекайте корень, причем плавучий, только после этого нормализация, причем не к разрядности АЦП, она вам не нужна, а к реальным вольтам на входе с учетом делителя. 3. Не надо извлекать корень в прерывании, передайте его в основное тело, там извлечете без спешки, отфильтруете и отправите на индикацию. 4. Подберите период измерения кратным 20мс, для подавления неизбежных сетевых 50Гц. 5. Время семплирования не делайте меньше 7_5Cycles, возрастает шум. Кстати это не время преобразования. Время преобразования зависит от тактовой АЦП. 6. Импеданс входного сигнала должен быть не выше определенной величины, в даташите найдете таблицу. Вообще есть неплохая статья, как правильно "готовить" АЦП у STM: http://we.easyelectronics.ru/STM32/demo ... stm32.html
Делайте второй канал измерения тока. Получите достаточно точный измеритель мощности. Если правильно обработаете переменный (обоих полярностей) сигнал, то измеритель мощности легко посчитает активную и реактивную мощности, коэффициент мощности, энергию и т.д.
Вот когда он, стм, начинает прыгать между каналами - вот и возникает тот случай, который вы указали по ссылке. Если и делать второй канал, то только на тех стм, на которых есть второй реальный ацп.
Andrey_B писал(а):
то измеритель мощности легко посчитает активную и реактивную мощности, коэффициент мощности, энергию и т.д.
Для этого есть готовые электросчетчики, в которых установлены аппаратные специализированные чипы, а не какая-то программная хрень.
linkov1959 писал(а):
Если выложишь hex, то можно сравнить.
Ни когда hex от другого чипа не будет равен вашему.
Если и делать второй канал, то только на тех стм, на которых есть второй реальный ацп.
Либо F030 и 48МГц, либо F303 и 72МГц, либо у вас косяк. Кстати в STM32F303 аж 4 отдельных АЦП.
Dimon456 писал(а):
Для этого есть готовые электросчетчики, в которых установлены аппаратные специализированные чипы, а не какая-то программная хрень.
Готовые вольтметры TrueRMS тоже есть, однако смысл делать опыты с МК вы нашли. Это в простых электросчетчиках применяют дешевые, массовые, специализированные чипы, а вот многофункциональные счетчики с возможностью измерения кучи параметров, как правило, делают на МК.
Хотите уменьшить шум, усыпляйте МК на время оцифровки,
Проблема в том что оцифровка сигнала идет постоянна, когда же ему просыпаться?
Andrey_B писал(а):
причем не к разрядности АЦП, она вам не нужна, а к реальным вольтам на входе с учетом делителя.
вот тут уже интересней будет. Опускаем вывод AREF (или как он там правильно? VDDA) на источник опорного напряжения 2.048В что на выходе АЦП ровно даст значение в миллиВ, останется сдвинуть только на единицу в право.
Andrey_B писал(а):
Не надо извлекать корень в прерывании,
для того и кочегарю мк, что бы иметь возможность все расчеты выполнить в прерывании.
Andrey_B писал(а):
Подберите период измерения кратным 20мс, для подавления неизбежных сетевых 50Гц.
Это будет сложно сделать. При Тактовой АЦП 14МГц и 7_5Cycles формула (12,5+7,5)/14=1,43мкс. при 1_5Cycles = 1мкс при 71_5Cycles = 6мкс это то что на цело делится, остальное все дробное и период кратным 20мс не как не выжить, а на сколько мне известно сетевые 50Гц поддерживаются на довольно высоком уровне, а у stm32f030 АЦП 14МГц это HSI генератор, у которого 14МГц - это еще вопрос, а про стабильность - можно и не заикаться.
Andrey_B писал(а):
а вот многофункциональные счетчики с возможностью измерения кучи параметров, как правило, делают на МК.
Связующим звеном у них МК, мне больше попадались с Атмегой и Атюни, а вот для измерения как раз используются специализированные чипы. А также и со встроенной антенной на каком нибудь rf-модуле, встроенная spi-флешка на разъеме, часы реального времени, а еще блютуз и фай-фай. И за все это я должен заплатить. Еще и многотарифность. Вот скажи мне, на кой мне вот эти часы реального времени, косинусы синусы? По чему самое главное не показывает: напряжение и мощность? Старый счетчик хоть мощность показывал, а этот косинус с часами.
Проблема в том что оцифровка сигнала идет постоянна, когда же ему просыпаться?
Это компромисс, хотите малого шума - изыскивайте возможности. Хотя в данном случае усыплять МК скорее всего будет не целесообразно. При разгоне МК скорее всего, заявленные в даташите параметры АЦП выдержанны не будут, тем более в серии.
Опускаем вывод AREF (или как он там правильно? VDDA) на источник опорного напряжения 2.048В что на выходе АЦП ровно даст значение в миллиВ, останется сдвинуть только на единицу в право. ... это то что на цело делится, остальное все дробное и период кратным 20мс не как не выжить, а на сколько мне известно сетевые 50Гц поддерживаются на довольно высоком уровне, а у stm32f030 АЦП 14МГц это HSI генератор, у которого 14МГц - это еще вопрос, а про стабильность - можно и не заикаться.
Опускать опору не стоит, сильно проиграете на шумах. Зачем вам значение в вольтах на ноге АЦП, ведь будут какие-то входные цепи, сразу с их учетом и приводите значение. Не пытайтесь выбрать длину буфера степенью двойки, для замены деления сдвигом. Делить ведь в прерывании не надо, надо в основном теле умножать на плавучий коэффициент. Выбирайте длину буфера просто четным количеством отсчетов, так чтобы ровно уложиться в интервал, кратный 20мс. Прерывание МК будет оставлять достаточно временнЫх ресурсов для основного тела, т.к. в прерывании будут только накапливаться квадраты выборок половинок буфера и отмерятся интервал. После окончания интервала, конвейером передавайте накопленные данные из прерывания в основное тело. Квадратный корень в основном теле будет извлекаться один раз за время нескольких прерываний одного интервала, и времени на это будет с запасом. Измерения будут идти непрерывно, и для них хорошие результаты даст применение фильтра скользящего среднего. Если нестабильность внутреннего генератора АЦП будет сильно влиять, можно затактировать АЦП от кварцевого генератора. Вот еще к вопросу точности АЦП: http://we.easyelectronics.ru/STM32/test ... 2f100.html
Мне это не надо. Я за этот код больше не возьмусь.
Andrey_B писал(а):
Опускать опору не стоит, сильно проиграете на шумах.
Не думаю, при питании от батареи все нормально будет. И про какие шумы идет речь? Если не прыгать по каналам - то все ок.
Andrey_B писал(а):
уложиться в интервал, кратный 20мс.
Да не уложитесь вы ни когда в этот интервал, без синхронизации, для этого нужен какой нибудь сверх точный кварц с х.0000000001 в каком-то разряде.
Andrey_B писал(а):
Делить ведь в прерывании не надо
Andrey_B писал(а):
Квадратный корень в основном теле
Что вам мешает его в прерывании выполнять? Не пойму. 64битное число из прерывания вытаскивать против 32битного числа.
Andrey_B писал(а):
применение фильтра скользящего среднего
Для чего? За 0,5сек эта штука выполняет 358400 измерений, вы потом из всего этого среднее находите или квадратное. У МК ресурсов хватает все тащит в прерывании, за чем-то вытаскивать все из прерывания? Там еще половина времени остается. Вам прерывание все посчитает, +в volatile засунет, вам остается только на индикатор вывести.
linkov1959, таким способом, как у вас не возможно гарантировать, что на каждый ваш период 0.3сек будет тратится одинаковое количество тактов, если так делать, то надо на asm писать.
Для решения задачи есть два метода: 1 используют синхронизацию, бонусом получают частотомер 2 использовать какой-то период, неважно какой, можете в екселе посчитать, к примеру период сигнала пусть у вас 4 клетки, а период расчета 5 клеток, результат должен быть одинаков.
И так выбрали второй метод, дискретизация. Так же можно пойти двумя путями: 1 использование таймера, очень хорошо HSE генератор, кварц. 2 производитель stm гарантирует, что на одно преобразование ацп будет тратится одинаковое количество тактов, к примеру (12,5+7,5) = 20 тактов, не зависимо от результата преобразования. В F030 все очень плохо, АЦП висит на HSI генераторе который имеет стабильность 10-3, но все таки во много раз лучше, чем ваш способ.
Возможности stm позволяют довести весь процесс чуть ли не до аппаратного уровня.
Dimon456, у меня с синхронизацией проблем нет, могу уложиться в любое время измерения с точностью 1/100000. Среда разработки у меня специфическая, многие сложные вещи делаются легко, а простые сложно. Настройка DMA занимает целую страницу, на досуге разберусь.
Придется наверное собрать этот стенд, еще и индикатор прикрутить надо будет. Входной формирователь будет построен на диодном мосту и делителе, ни каких конденсаторов в цепи не будет, достаточно того который в stm имеется, думаю для теста пойдет где-то 33В к 3В, думаю достаточно будет, AREF опускать не буду, пусть сидит где сидит, 3,3В. Быстро не обещаю, сегодня ни как, завтра то же ни как, может после завтра.
Добавлено after 8 hours 21 minute 11 seconds: Собрал я этот х. стенд. 1 тест был 50Гц транс В екселе вот тут картинку считал
Далее тест БП ТЛ494 стабилизированное на выходе 10В.
Какие будут выводы, я у вас спрашиваю, у всех спрашиваю?
Работа внутренних частей МК неизбежно наводит помехи на АЦП, уровень этих помех не зависит от величины опоры, другими словами, чем опора больше, тем больше младший разряд АЦП, тем меньше будут сказываться помехи, проявляясь в зашумленности значений с АЦП.
Да не уложитесь вы ни когда в этот интервал, без синхронизации, для этого нужен какой нибудь сверх точный кварц с х.0000000001 в каком-то разряде.
Посчитаем. Типичный кварц ABM3-8.000MHZ имеет точность 50ppm, нестабильность в рабочем диапазоне температур 50ppm, и дрейф за годы 5ppm. 50ppm - это 0.005%, а в розетке по ГОСТ всего ±0,2 Гц.
Что вам мешает его в прерывании выполнять? Не пойму. 64битное число из прерывания вытаскивать против 32битного числа. ... У МК ресурсов хватает все тащит в прерывании, за чем-то вытаскивать все из прерывания?
Это позволит выполнять оцифровку на максимально доступной, высокой частоте непрерывно, не теряя вообще отсчеты, тогда и синхронизация не нужна будет, вы все отсчеты сможете учесть. Как их потом правильно интерпретировать и показать без мельтишения на дисплее, уже другой вопрос.
Dimon456 писал(а):
, сегодня ни как, завтра то же ни как, может после завтра. ... Добавлено after 8 hours 21 minute 11 seconds: Собрал я этот х. стенд. ... Какие будут выводы, я у вас спрашиваю, у всех спрашиваю?
от величины опоры зависит целочисленное деление. Как думаете на сколько будет выигрыш?
Код:
1. RESULT = ((ADCA*3300)/4096); 2. RESULT = ((ADCA*2048)/4096);
Andrey_B писал(а):
Если правильно сформировать сигнал для АЦП, переключение каналов ни как не сказывается на точности.
Не вы ли мне давали ссылку на какой-то сайт? Мы пытаемся оцифровать не понятно какой сигнал, не постоянный, не надо прыгать по каналам, тем более на высокой частоте сэмплирования, это может привести к непредсказуемым значениям.
Andrey_B писал(а):
Типичный кварц ABM3-8.000MHZ
Надо бы это проверить, разгоним до 72МГц, и выдадим ШИМ 4Гц, получается
Код:
Timer Prescaler :287; Preload = 62499; Actual Interrupt Time = 250 ms
DM-90A измеряет с точностью до 3 знака, 0.000, конечно возникает вопрос, насколько точно сам прибор откалиброван. Но как бы это не важно, можно примерно настроить +-, можно осциллографом глянуть, частотомером или еще чем.
Меня больше волнует целочисленное деление
Код:
avg_t /= ((ARRAYSIZE * dsp_count) / 2);
знаменатель должен быть кратен степени двойки, тогда операция деления выполнится сдвигами, а не километровыми участками кода.
Тем более, как я уже писал, ваши 50Гц остаются в розетке, дальше пошли импульсные источники питания и частотные преобразователи, а там далеко уже не 50Гц, и нет ни какого смысла гнаться к этому периоду. 50Гц - это частный случай.
от величины опоры зависит целочисленное деление. Как думаете на сколько будет выигрыш?
Код:
1. RESULT = ((ADCA*3300)/4096); 2. RESULT = ((ADCA*2048)/4096);
Если делать деление и извлечение корня в основном теле, это все не важно будет. Кстати, сопротивления масштабного делителя на входе тоже будете подбирать под степень двойки, чтоб делилось сдвигами ?
Dimon456 писал(а):
Не вы ли мне давали ссылку на какой-то сайт?
Вы ее читали ? Какая разница, с одной ножки подается сигнал на семплирующий конденсатор АЦП, или по очереди с разных ? Конденсатор все равно перезаряжается. Или вы думаете, что во время преобразования напряжение на нам остается неизменным ? Наверно при оцифровке сильно разных по уровню сигналов ему перезаряжаться нужно будет сильнее. Но если правильно выбрать частоту оцифровки и импеданс источника, результат будет не хуже, чем в даташите.
Dimon456 писал(а):
, это может привести к непредсказуемым значениям.
Любая непредсказуемость берется от незнания.
Dimon456 писал(а):
Тем более, как я уже писал, ваши 50Гц остаются в розетке, дальше пошли импульсные источники питания и частотные преобразователи, а там далеко уже не 50Гц, и нет ни какого смысла гнаться к этому периоду.
Ну если только в чистом поле, с питанием от аккума. 50Гц вокруг нас, можно на это забить, а можно спроектировать прибор из расчета воздействия самой вероятной помехи. Хорошие приборы потому и хорошие, что в них предусматривается плохое стечение условий работы.
Сейчас этот форум просматривают: HardWareMan и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения