Перейти к содержанию
    

STM32F100 ADC и детектирование сдвига фазы .

Добрый вечер уважаемые! Есть необходимость в реализации детектирование и определение сдвига фазы в колебательном контуре.
 Суть задачи :

Есть некий опорный сигнал , генерируемый таймером при помощи ШИМ. И есть приемный узел , реализованный на АЦП. Запущено этот канал АЦП в инжектированном режиме на частоте: 12000000/7.5

Помимо этого канала есть еще два . Я их настроил на самую низкую частоту 12000000/239.5, они измеряют ток и напряжение системы. И теперь не совсем понятно на какой все же частоте будет работать первый канал?
Теперь моя идея вычисления фазы заключалась в поиске перехода синуса через 0 (виртуальный , так как шкала синуса сдвинута в положительную область ). Это я определяю легко , когда отключаю генератор и на входе АЦП чистый половинный сигнал без синусоиды. Так вот когда я нашел этот сигнал виртуального 0 (он например 1000) и включил генератор. То я в калбек функции чтения АЦП постоянно ловлю значение таймера при АЦП равном 1000. Так вот постоянно сильно скачут значения  ... Например идет 2200 три раза потом два раза 350 , как бы очень сильный разбег в показаниях... 
Пробовал более сложнее делать , к примеру делать захваты данных таймера при показаниях АЦП в 10 точках , и потом усреднять эти показания . Тоже получилась ерунда..

 

Пробовал еще вариант : создал массив в 25 байт 16 бит , и 25 раз за период считывал показания и копировал в этот массив , потом искал в массиве самое меньшее и самое большее значение сигнала и вычислял по номеру ячейки в массиве определял сдвиг фазы. Но это не устраивает , слишком низкая дискретность измерения.

Как все же правильно определить сдвиг фазы ? Если бы это было прерывание  МК или вход захвата , то я бы взял компаратор , воткнул его и измерял бы длительность между значением прерывания таймера где генерируется сигнал , и входом срабатывания прерывания от компаратора. Прямо тот же регистр счетчика считывал бы в прерывании и все. А тут , как то не ясно как решать эту задачу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кхм, вч закалка что-ли?

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет , металлодетекция . Какой способ применить определения фазы и как выгодно настроить АЦП?

Важен один канал ацп . Два других не такие важные. Все сидят на ADC1 .

Или лучше в данном случае сохранять "кадр" и его отфильтровывать , а при малейшем изменении его уже сигнализировать о том что есть цель? Но тут в любом случае нужно измерять фазу , чтобы можно было дискриминировать металлы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тогда и мыслить нужно иначе.

Для аналоговых схем сдвиг фазы очень легко фиксировать. Он там может быть в долях градуса, и аналог может его усилить. Но у вас цифра и измерить это время просто так не получится - это буквально 1-5 единиц таймера + дребезг. А вот управлять аналоговым коммутатором через таймер - значит выкинуть много корпусов жёсткой логики из аналоговой схемы. Без усилителя один фиг не получится.

Есть вариант измерять затухание в катушке, ну или её нагрузку. Без сдвига фаз, без колебательных контуров - жёсткий меандр с контролем тока по тому-же таймеру. Если сдвинуть входной диапазон ацп на рабочую область захвата напряжений - то 12 бит должно хватить с лихвой. Там естественно всё будет в попугаях, но важно не напряжение - а скорость его изменения.

И да, без акселя и гироскопа это будет очередная 100500 версия металлодетектора с али. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, amaora said:

При известной частоте можно делать ДПФ 

Во, а можно подробнее? У меня частота генератора известна . Есть пример формулы?

У меня есть буфер 24 байта, в который загружаются данные АЦП . Эти данные грузятся в калбек функции инжектированного режима , в этой функции проверяется значение счётчика таймера , в котором меандр формируется :

If(tim2->cnt==0) buff[0] = Adc[1];  и т.д.

 

Получается 24 семплов за период.

Может ещё не оптимальное тут решение? И нужно в прерывании таймера запускать преобразование?

И ещё, зачем гироскоп с акселем ?

Помехи отсекать?

 

 

Изменено пользователем Artos5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Artos5 сказал:

If(tim2->cnt==0)

Вы правда верите, что это будет работать? Вы в самом деле уверены, что пока пройдет реакция на прерывание, вызов обработчика неизвестной длины, из него функции обратного вызова, и вы после каждого измерения надеетесь точно попадать в момент, когда таймер равен нулю?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 minutes ago, Сергей Борщ said:

Вы правда верите, что это будет работать? 

Не уверен особо . Почему и спрашиваю.

Лучше сделать связку таймер+ацп , и с прерывания таймера вызывать преобразование АЦП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё вопрос:

Правильно я понимаю , что если например выполнять выборки при помощи АЦП 20 раз за период входного сигнала , то максимальное разрешение сдвига фазы можно получить F/20 , 18°?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужно измерить фазовый сдвиг между двумя сигналами, можно попробовать вычислить кросс- корреляцию. Если это чистые синусы - просто перемножить и отфильтровать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Aleksandr Baranov сказал:

можно попробовать вычислить кросс- корреляцию.

ДПФ по сути и является вычислением взаимной корреляции входного и опорного синусидального сигналов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не все так просто получается.

Что сейчас у меня не получается:

Не получается синхронно считывать данные с АЦП . Не пойму как на 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 раз в секунду могут преобразования выполнять.

Изменено пользователем Artos5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/1/2019 at 8:09 PM, Artos5 said:

Есть некий опорный сигнал , генерируемый таймером при помощи ШИМ. И есть приемный узел , реализованный на АЦП. Запущено этот канал АЦП в инжектированном режиме на частоте: 12000000/7.5

...

Например идет 2200 три раза потом два раза 350 , как бы очень сильный разбег в показаниях... 

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

А так же проверить, что частота преобразования АЦП больше частоты изверяемого им сигнала.

Вы на вход АЦП случайно не ШИМ напрямую подаете ? Или на АЦП идет уже сглаженный сигнал ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, dimka76 said:

Вы на вход АЦП случайно не ШИМ напрямую подаете ?

На вход идёт сигнал с другой катушки через измерительную схему . Там может быть синус , а может вообще отсутствовать сигнал , нужно просто делать выборки и анализировать данные , но четко синхронные с таймером , который формирует меандр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Artos5 said:

но четко синхронные с таймером , который формирует меандр.

У АЦП выбираете нужное вам событие для запуска битами JEXTSEL[2:0] в регистре ADC_CR2.

А у таймера либо TRGO битами MMS в регистре CR2, либо соответствующий канал таймера настраиваете.

image.png.dc836bfff9c9393df61b18cb6f4c86f6.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...