Jump to content

    

p_v

Участник
  • Content Count

    148
  • Joined

  • Last visited

Community Reputation

0 Обычный

About p_v

  • Rank
    Частый гость

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1707 profile views
  1. Помогите разобраться с обвязкой STM32G030F6P6. Там по сравнению с STM32F0 слегка подкрутили периферию. Из схем нашел только https://nathanpetersen.com/2020/12/31/open-thermo-customizable-thermostat-for-furnace-control/ Итак, вопросы: Обязательно ли (и зачем) на nRST вешать конденсатор (к земле)? Не очень понимаю, зачем он нужен, если внутри уже есть монитор питания и счетчик задержки. Обязательно ли выводить nRST на разъем SWD? или это имеет смысл только для раскирпичивания, когда кривыми руками зв прошивке запретили SWD? Надо ли boot (он же SWCLK) притягивать резистором на землю? С учетом того, что у меня SWD всегда разрешен. Мне не надо каких-то особых изысков. Обычная схема с заливкой-обновлением по SWD. Просто не люблю "лишние" детали, если в них нет нужды. Кто-нибудь уже собирал девайсы на этой серии? поделитесь опытом.
  2. @_pv Я взял CMSIS DSP, функцию arm_rfft_q31(...). Но под 512 точек почему-то внутри делаются 2 таблицы 8192 элементов Q31 (2 * 8192 * 4 => 64K). В память не влазит (У меня 32К только, если поменяю чип - 64К, но это не желательно). Это уже с опциями сборки, которые оставляют только нужные таблицы. Есть какой-то вариант FFT 512 с фиксированной точкой и без таких конских таблиц? В интернетах нашел KISS-FFT, SYLT-FFT, и т.п., но фик знает насколько им можно доверять и какие там особенности. Можете сориентировать куда копать?
  3. А, то есть, когда этот таймер будет генерить PWM на одном из каналов, то у него фронт начинается с нуля. И если на 4 канале "задержка", то она всегда будет одинаковая, какую бы я скважность не выбрал. Я правильно понял? И еще вопрос насчет оверсамплинга ADC. Эта опция "прозрачна" для внешнего наблюдателя? Если у меня запуск сканирования по триггеру, то ADC сам наберет нужное количество отсчетов оверсамплинга для каждого канала? Или будет по одному отсчету за каждый триггер собирать? Ни разу не пользовался этой фичей. Вроде общий смысл понятен, а нюансы не очень.
  4. Я в кубе смотрю. Там есть "Timer 3 trigger out event" "Timer 1 trigger out event 2" "Timer 1 capture compare 4 event" Не совсем понял два момента: Как таймер PWM заставить генерить trigger out event по фронту (и что номера в списке выше означают) Как таймер "задержки" заставить автоматически "перевзводиться" и ждать следующего события. Сорри за странные вопросы, просто ни разу так не конфигурировал периферию.
  5. STM32G030F6. Нужен одноканальный PWM, и чтобы после фронта, с задержкой в десяток микросекунд, запускался ADC, сканируя несколько каналов. Выливать ADC непрерывно через DMA я умею. Но тут надо чтобы он не сам гонял, а синхронно с PWM и небольшой задержкой после открытия ключа. Подскажите, как это лучше устроить. Если можно - сразу через CubeMX. Ну или на словах, какие таймеры как между собой стыковать.
  6. @_pv Ну главное что плюс-минус лапоть похоже. Все равно будет быстрее, чем отсчеты набегут. Пока остановился на том, чтобы тупо фигачить БПФ на 1024 точки, слегка похерив точность на низах. Подкупает простотой.
  7. Если быть точнее, там выпрямленное напряжение, поэтому 100 либо 120 герц, плюс конская вторая гармоника, и возможно приличные третяя-четвертая. Поэтому надо сурово резать от нуля до 400 - 480 герц. И учитывать от 600 герц. Чтобы такое разделить - это от десятого порядка фильтры. Без плавучки - либо каскады IIR либо очень длинный FIR. Можно, но пипец как грустно. Часто встречал такую оценку на этом форуме. А для каких она условий? Случайно не для аппаратной плавучки? https://community.st.com/s/question/0D50X00009XkhK9/fft-in-stm32f0 - тут в четветом ответе пишут для M0+ 600К циклов на 1024 точки для Q15 (мне возможно понадобится Q31, т.к. постоянная составляющая очень большая).
  8. @_pv Теперь понял, спасибо. С одной стороны, ваш график выглядит довольно убедительно. С другой, по предыдущему проекту мне показалось что производные на шумных сигналах довольно кривоваты. Плюс подсчет девиации - не самая дешевая штука. Скажем так, скорость самого БПФ на 1024 точки не самый критичный кусок. Там больше прижимает время набора отсчетов (1000/16000 => 0.0625 сек). Я пока попробую на БПФ, т.к. там предсказуемый результат, но если что-то пойдет не так - буду думать над вашим. PS. Ну и что скрывать, просто интересно БПФ поюзать.
  9. Я не понял, что это за магия, и почему она вдруг стала пропорциональна оборотам, а не погоде на марсе например. Так тоже можно наверное. Но по-моему это не улучшает более простой вариант - померить максимум на самых низких оборотах, и рубить все что меньше 70% (в текущих исходниках так и сделано). Либо я мог упустить какую-то важную мысль, тогда напишите пожалуйста точную формулу, что вы впредлагаете для порога.
  10. Задача: хочется определять обороты коллекторного двигателя по пульсациям тока, которые вызывает переключение обмоток. И чтобы математика на Cortex M0+ вписывалась в 0.1 сек за итерацию. Искомая частота - 600...6000 герц (450...45000 rpm для 8-полюсного коллекторника бормашинки). Желаемая точность измерений - 1% (относительно измеряемой частоты) В предыдущей теме я спрашивал про рекурсивные фильтры. В общем, полазал по интернетам, решил делать через БПФ, почистил код, и вопросы стали другие. Поэтому новая тема. Что имеем: https://github.com/speedcontrols/dc_sc_grinder/tree/scripts/scripts - исходники, с которыми экспериментирую (в бранчах есть полные дампы). Написал честный FIR-дециматор, и перегнал дампы на 16 килогерц (примерно как в реальном девайсе) Дампы и прочие выклопы нормализовал в целочисленные. Дамп на высоких оборотах Дамп на низких оборотах Спектр на высоких оборотах, 512 точек, обнулена постоянная составляющая (чтобы не портила масштаб). ~ 32 герца на точку. Нужен второй большой пик (который "троится"). ~ 4000 герц, похоже на правду (30000 rpm). Спектр на низких оборотах, 512 точек, обнулена постоянная составляющая. Тоже второй пик, ~ 600 герц (4500 rpm), сходится. С точностью на низах примерно понятно. Если видим что пик внизу - включаем ресамплер, и делаем FFT еще раз. Сетевые пульсации и гармоники в стороне от нужного диапазона - можно спокойно игнорировать. Правда, критично вырастает время выборки. Получается 0.8 сек при точности 1.3%. Терпимо. В крайнем случае похерю точность до 2%, приподняв частоту самплинга. Остались вопросы: Что все-таки смотреть после FFT, реальную часть или корень из суммы квадратов? Просто искать максимум или как-то проверять соседние отсчеты? Как определять "отсутствие" оборотов (или когда ниже допустимых, что актуально для старта). Ведь если PID/ADRC подхватит ложный пик - может не дать разогнаться. Мерить при калибровке амплитуду частоты на низах и ставить порог в половину? Есть ли смысл накладывать перед FFT оконную функцию? Может еще чего-то не знаю и пропустил?
  11. Надо 1% точности, да по корявому сигналу. На низко-порядковых фильтрах откровенно стремно. Есть вопросы По БПФ. Где можно посмотреть, как выбирать "разрядность" (Q15?) и сколько циклов займет на Cortex-M0+ 256 точек? По ресамплингу. Что использовать на МК для понижения частоты в 2^n раз? Децимация там тривиальная, но еще ведь фильтр нужен. По поводу точности. Если правильно понимаю, то для погрешности меньше 1% во всем диапазоне мне надо Constant-Q transform. Чтобы не мудрить с имплементацией, можно сделать в 2 фазы: Делаем БПФ на 32 точки, чтобы грубо определить искомый диапазон. Включаем нужный ресамплинг (отрезаем выше искомого диапазона), набираем новые данные и делаем БПФ по 128-256 точкам. Т.к. после ресамплинга искомый диапазон всегда окажется в верхней половине, точность определения частоты будет достаточной. Я в правильном направлении думаю?
  12. Вот графики из предыдущего поста, но с вырезанными 30 отсчетами в начале (отбрасываем 0-450 герц, чтобы не херили масштаб) hilda_250kHz_rpm_low.txt hilda_250kHz_rpm_high.txt Вроде нужные пики хорошо видны. На втором графике, правда, двоятся, но это не критично. А можно FFT как-то "ступенчато" считать? Сначала 32 точки, чтобы отбросить 0-400 герц и найти диапазон с пиком, а потом уже найденный диапазон просчитать точнее?
  13. Ну нема в контроллере флоатов, и тем паче даблов. А скриптами я эмулирую то, что потом в контроллере реально повторить. Хм... промахнулсо. Поправлю. Правда я дрюкал дамп _high (максимальные обороты), там ничего не задето. Но для low не прокатит, вы правы. Откачу на 400 герц, чтобы хотя бы первые 3 гармоники прибрать. Максимальная частота тогда получается 4-6 килогерц (30000-45000rpm). И еще, на дампах забыли тахометром обороты померить, так что я не знаю, какие на _low. Знакомый питал хильду с автотрансформатора через выпрямитель. Мог меньше выставить. Я плохо представляю, как сделать высокочастотный ШИМ без выпрямления. А если делать фазовую регулировку симистором, там спектр должен еще сильнее убиваться. Диаграммы снимали, мне с них сигнал совсем не понравился, поэтому даже не стал в репозиторий заливать. Переделал спектрограммы, без фильтрации. 250000/16384 => 15,2588 - шаг в герцах на 1 точку. hilda_250kHz_rpm_low.txt Виден пичок на ~ 600 герцах => 4500 rpm. охоже на правду hilda_250kHz_rpm_high.txt Группа пиков около 3600 Гц (возможно обороты слегка дрожат) => 27000 rpm. Тоже похоже на правду. Еще какой-то паразитный пик на 2800 Гц, фик знает почему. Может обмотки не симметричные. Я могу понять как это даст пики на 1/8 частоты от основной, но не понимаю откуда 3/4 берутся. @Самурай, проверьте, может ваш спектроанализатор хочет в качестве разделителя точку а не запятую. У вас очень странный результат выходит. Хочется определять обороты универсального двигаетеля (в бормашинке) по частоте колебаний тока. Через противо-ЭДС уже сделано, работает приемлимо, но хочется еще лучше. Судя по прикрепленным сонограммам, задача имеет решение. Но надо разобраться, возможно ли оно на чахлом контроллере. Текущая гипотеза - попробовать почистить сигнал и померить период через zero cross.
  14. Не понял. Я в спектр раскладываю предварительно фильтрованный сигнал. На последних графиках отрезано ниже 800 и выше 15000 герц. Иначе сетевые пульсации все забьют нафик. Соответственно, из за high-pass 800hz постоянная составляющая уходит. У бормашинки минимально возможные обороты 4500 rpm. При восьми полюсах это 1500 герц. Вроде параметры пред-фильтра адекватные, режут мусор но лишнего не задевают.
  15. Какая-то у вас ерунда со спектром. Наверное надо все-таки 100 герц и их гармоники сначала обкоцать. Еще в бренче "raw_data" лежат семплы на 250 килогерц. Лучше пока их юзать, чтобы не было всяких левых отражений. 50 килогерц я сделал простым прореживанием, это не совсем корректно. Вроде разобрался с FFT. Выборка 250 килогерц, 16К точек, на графиках первые 1024 точки abs(real) sqrt(real^2 + imaginery^2) Не знаю, по какому правильнее смотреть, вроде по первому? Ну какбэ фундаментальная частота видна довольно четко. Но т.к. полюсов коллектора восемь, они похоже суб-кратными частотами знатно подсирают в нижнем спектре (меньше фундаментальной частоты). Непонятно как это простыми IIR фильтрами надежно обкоцать.