Artos5 0 1 мая, 2019 Опубликовано 1 мая, 2019 · Жалоба Добрый вечер уважаемые! Есть необходимость в реализации детектирование и определение сдвига фазы в колебательном контуре. Суть задачи : Есть некий опорный сигнал , генерируемый таймером при помощи ШИМ. И есть приемный узел , реализованный на АЦП. Запущено этот канал АЦП в инжектированном режиме на частоте: 12000000/7.5 Помимо этого канала есть еще два . Я их настроил на самую низкую частоту 12000000/239.5, они измеряют ток и напряжение системы. И теперь не совсем понятно на какой все же частоте будет работать первый канал? Теперь моя идея вычисления фазы заключалась в поиске перехода синуса через 0 (виртуальный , так как шкала синуса сдвинута в положительную область ). Это я определяю легко , когда отключаю генератор и на входе АЦП чистый половинный сигнал без синусоиды. Так вот когда я нашел этот сигнал виртуального 0 (он например 1000) и включил генератор. То я в калбек функции чтения АЦП постоянно ловлю значение таймера при АЦП равном 1000. Так вот постоянно сильно скачут значения ... Например идет 2200 три раза потом два раза 350 , как бы очень сильный разбег в показаниях... Пробовал более сложнее делать , к примеру делать захваты данных таймера при показаниях АЦП в 10 точках , и потом усреднять эти показания . Тоже получилась ерунда.. Пробовал еще вариант : создал массив в 25 байт 16 бит , и 25 раз за период считывал показания и копировал в этот массив , потом искал в массиве самое меньшее и самое большее значение сигнала и вычислял по номеру ячейки в массиве определял сдвиг фазы. Но это не устраивает , слишком низкая дискретность измерения. Как все же правильно определить сдвиг фазы ? Если бы это было прерывание МК или вход захвата , то я бы взял компаратор , воткнул его и измерял бы длительность между значением прерывания таймера где генерируется сигнал , и входом срабатывания прерывания от компаратора. Прямо тот же регистр счетчика считывал бы в прерывании и все. А тут , как то не ясно как решать эту задачу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 1 мая, 2019 Опубликовано 1 мая, 2019 · Жалоба Кхм, вч закалка что-ли? Сдвиг фазы можно контролировать миллионом прямых и косвенных вариантов. Вот только зачем? Проще сразу толкать колебательный контур в нужном направлении, а не насиловать его внешней частотой. И это делается аппаратно на двух транзисторах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 1 мая, 2019 Опубликовано 1 мая, 2019 · Жалоба Нет , металлодетекция . Какой способ применить определения фазы и как выгодно настроить АЦП? Важен один канал ацп . Два других не такие важные. Все сидят на ADC1 . Или лучше в данном случае сохранять "кадр" и его отфильтровывать , а при малейшем изменении его уже сигнализировать о том что есть цель? Но тут в любом случае нужно измерять фазу , чтобы можно было дискриминировать металлы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 1 мая, 2019 Опубликовано 1 мая, 2019 · Жалоба Ну тогда и мыслить нужно иначе. Для аналоговых схем сдвиг фазы очень легко фиксировать. Он там может быть в долях градуса, и аналог может его усилить. Но у вас цифра и измерить это время просто так не получится - это буквально 1-5 единиц таймера + дребезг. А вот управлять аналоговым коммутатором через таймер - значит выкинуть много корпусов жёсткой логики из аналоговой схемы. Без усилителя один фиг не получится. Есть вариант измерять затухание в катушке, ну или её нагрузку. Без сдвига фаз, без колебательных контуров - жёсткий меандр с контролем тока по тому-же таймеру. Если сдвинуть входной диапазон ацп на рабочую область захвата напряжений - то 12 бит должно хватить с лихвой. Там естественно всё будет в попугаях, но важно не напряжение - а скорость его изменения. И да, без акселя и гироскопа это будет очередная 100500 версия металлодетектора с али. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 17 1 мая, 2019 Опубликовано 1 мая, 2019 · Жалоба При известной частоте можно делать ДПФ и считать угол между векторами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 (изменено) · Жалоба 8 hours ago, amaora said: При известной частоте можно делать ДПФ Во, а можно подробнее? У меня частота генератора известна . Есть пример формулы? У меня есть буфер 24 байта, в который загружаются данные АЦП . Эти данные грузятся в калбек функции инжектированного режима , в этой функции проверяется значение счётчика таймера , в котором меандр формируется : If(tim2->cnt==0) buff[0] = Adc[1]; и т.д. Получается 24 семплов за период. Может ещё не оптимальное тут решение? И нужно в прерывании таймера запускать преобразование? И ещё, зачем гироскоп с акселем ? Помехи отсекать? Изменено 2 мая, 2019 пользователем Artos5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 7 минут назад, Artos5 сказал: If(tim2->cnt==0) Вы правда верите, что это будет работать? Вы в самом деле уверены, что пока пройдет реакция на прерывание, вызов обработчика неизвестной длины, из него функции обратного вызова, и вы после каждого измерения надеетесь точно попадать в момент, когда таймер равен нулю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 29 minutes ago, Сергей Борщ said: Вы правда верите, что это будет работать? Не уверен особо . Почему и спрашиваю. Лучше сделать связку таймер+ацп , и с прерывания таймера вызывать преобразование АЦП? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба Ещё вопрос: Правильно я понимаю , что если например выполнять выборки при помощи АЦП 20 раз за период входного сигнала , то максимальное разрешение сдвига фазы можно получить F/20 , 18°? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба Если нужно измерить фазовый сдвиг между двумя сигналами, можно попробовать вычислить кросс- корреляцию. Если это чистые синусы - просто перемножить и отфильтровать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 2 часа назад, Aleksandr Baranov сказал: можно попробовать вычислить кросс- корреляцию. ДПФ по сути и является вычислением взаимной корреляции входного и опорного синусидального сигналов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 (изменено) · Жалоба Не все так просто получается. Что сейчас у меня не получается: Не получается синхронно считывать данные с АЦП . Не пойму как на stm32f100c8 это реализовать... Есть таймер3 при помощи ШИМ формирует меандр с частотой от 1кгц до 30кгц . Задаётся это в настройках , путем загрузки значений в регистры из переменной. Настроил таймер1 на out event , и в калбеке читаю данные с АЦП в инжектированном режиме. Если ставлю 60 кГц частоту переполнения для таймера1 , то этот таймер сильно нагружает МК , и программа видно что тормозит. Каналов АЦП использую 3 . 1й 7й и 9й. Важен для меня 7й канал adc1 , как засинхронизировать таймер 1 с таймером 3 , чтобы преобразования АЦП выполнялись четко по тикам 3-го таймера ? Например так : TIM3->CNT=0 TIM3->CNT=100 TIM3->CNT=1000 И т.д. с максимальной производительностью. Повторюсь , важен канал 7 остальные два канала хоть 5 раз в секунду могут преобразования выполнять. Изменено 2 мая, 2019 пользователем Artos5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба On 5/1/2019 at 8:09 PM, Artos5 said: Есть некий опорный сигнал , генерируемый таймером при помощи ШИМ. И есть приемный узел , реализованный на АЦП. Запущено этот канал АЦП в инжектированном режиме на частоте: 12000000/7.5 ... Например идет 2200 три раза потом два раза 350 , как бы очень сильный разбег в показаниях... Вы бы по осциллографу проверили частоту преобразования АЦП - соотвествует ли период выдачи значений вашим желаниям. Например в прерывании АЦП переключать состояние вывода GPIO. А так же проверить, что частота преобразования АЦП больше частоты изверяемого им сигнала. Вы на вход АЦП случайно не ШИМ напрямую подаете ? Или на АЦП идет уже сглаженный сигнал ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 6 minutes ago, dimka76 said: Вы на вход АЦП случайно не ШИМ напрямую подаете ? На вход идёт сигнал с другой катушки через измерительную схему . Там может быть синус , а может вообще отсутствовать сигнал , нужно просто делать выборки и анализировать данные , но четко синхронные с таймером , который формирует меандр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 20 minutes ago, Artos5 said: но четко синхронные с таймером , который формирует меандр. У АЦП выбираете нужное вам событие для запуска битами JEXTSEL[2:0] в регистре ADC_CR2. А у таймера либо TRGO битами MMS в регистре CR2, либо соответствующий канал таймера настраиваете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться