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

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

4 minutes ago, dimka76 said:

У таймера в регистре CR2 настраиваете биты MMS на нужно событие.

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

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

Сигнал нужно оцифровывать в 16 - 20 раз быстрее от формируемого меандра .

Вот картинка:Screenshot_2019-05-02-22-27-14-007_com_miui.gallery.thumb.png.9c7283c1b281eff880b88cb85f143d62.png

Желтый луч , исследуемый сигнал . Голубой луч формируемый меандр этим микроконтроллером. Вопрос :

как аппаратно оцифровывать сигнал синхронно с таймером 3?

и на частоте превышающей период счета таймера в 16-20 раз? При этом делать это 7-мым каналом АЦП1 , а 1й и 9й каналы АЦП1 уже в фоне так сказать, раз 5 в секунду могут оцифровывать сигналы , они имеют самый низкий приоритет .

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


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

Я вчера исследовал такой метод измерения:

Меандр формировался таймером3.

АЦП1 канал 7 в инжектированном режиме измерял сигнал поступающий на вход и складывал в буфер . А я уже юартом через ДМА смотрел этот буфер .

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

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

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


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

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

как аппаратно оцифровывать сигнал синхронно с таймером 3?

Запускать преобразование событием от таймера 3 (EXTSEL/JEXTSEL).

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

и на частоте превышающей период счета таймера в 16-20 раз?

Запускаете другой таймер на частоте в 16-20 раз выше,им запускаете АЦП и его переполнение используете для тактирования таймера 3.

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

Меандр формировался таймером3.

АЦП1 канал 7 в инжектированном режиме измерял сигнал поступающий на вход и складывал в буфер .

Зачем инжектированный режим и прерывание? Измеряйте основной сигнал в обычном режиме, результаты складывайте в буффер при помощи ПДП, обрабатывайте в прерываниях ПДП HTIF, TCIF. Остальные каналы оцифровываете тоже в основном режиме (если не жалко места в буфере) или в прерываниях ПДП запускаете остальные  каналы в инжектированном режиме.

 

 

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


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

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

Зачем инжектированный режим и прерывание? Измеряйте основной сигнал в обычном режиме, результаты складывайте в буффер при помощи ПДП, обрабатывайте в прерываниях ПДП HTIF, TCIF. Остальные каналы оцифровываете тоже в основном режиме (если не жалко места в буфере) или в прерываниях ПДП запускаете остальные  каналы в инжектированном режиме.

Спасибо что ответили!

Как пдп засинхронизировать с таймером 3 ? Как в пдп анализировать через равные промежутки только канал 7 АЦП1? А остальные 2 канала , 1 и 9 можно в любом другом режиме сканировать и более медленно.

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


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

40 minutes ago, Artos5 said:

Сигнал нужно оцифровывать в 16 - 20 раз быстрее от формируемого меандра .

как аппаратно оцифровывать сигнал синхронно с таймером 3?

и на частоте превышающей период счета таймера в 16-20 раз? 

Смотрите раздел Timer synchronization

image.png.325141ab0d0814f3742641030db0d3f4.png

Запустите еще один таймет, который будет синхронирован от TIM3, но работаеть в 15-20 раз быстрее, чем TIM3. А от него уже делайте запуск АЦП.

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


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

dimka76, спасибо за подсказку!  А ещё ламерский вопрос:

Мне adc1_7 настроить как инжектированный и выполнять преобразования от таймера синхронизированного от tim3

, А как быть с каналами adc1_1 и adc1_9 ? Преобразование то выполняется последовательно ? Они собьют синхронность опроса ацп1_7? Или нет?

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


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

12 minutes ago, Artos5 said:

, А как быть с каналами adc1_1 и adc1_9 ? Преобразование то выполняется последовательно ? Они собьют синхронность опроса ацп1_7? Или нет?

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

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


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

А реально запустить АЦП от таймера на частоте 180-600кГц и при этом чтобы в основном цикле не было тормозов?

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

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


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

2 minutes ago, Artos5 said:

А реально запустить АЦП от таймера на частоте 180-600кГц и при этом чтобы в основном цикле не было тормозов?

 

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

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


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

Из-за прерывания таймера наверное.. Или по дма выполнять преобразования и складывать в буфер? Что-то я уже запутался..))

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

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


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

19 minutes ago, Artos5 said:

Из-за прерывания таймера наверное.. Или по дма выполнять преобразования и складывать в буфер? Что-то я уже запутался..))

 

Скорее уж из-за прерывания АЦП.

По DMA складывайте нужное вам количество и по прерыванию от DMA обрабатывать результат.

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


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

настроил циркулярный режим , создал буфер 3 байта, настроил ДМА для АЦП , использую библиотеку HAL . Так вот как включаю модуль ДМА , основной цикл программы очень сильно тормозит (видимо из-за прерываний ДМА). Хотя я еще в прерывании даже ничего не делаю :)

Скорость преобразования АЦП стоит 13.5 циклов для всех трех каналов. Прерывания по ДМА включены , остальное все выключено. 

uint16_t buf_adc_rx1[3];
     HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &buf_adc_rx1,3); // DMA is ON

static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 3;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_7;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = ADC_REGULAR_RANK_3;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

static void MX_DMA_Init(void) 
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  /* DMA1_Channel3_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
  /* DMA1_Channel4_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);

}

 

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


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

ADC_SAMPLETIME_13CYCLES_5

Это не скорость преобразования, а время выборки.

Преобразования состоит из выборки сигнала и самого преобразования.

Вы бы хоть Reference manual почитали как все это работает, а не просто в кубике флажки расставлять.

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


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

7 часов назад, Artos5 сказал:

основной цикл программы очень сильно тормозит (видимо из-за прерываний ДМА). Хотя я еще в прерывании даже ничего не делаю :)

Полагаю, что тормозит именно из-за того, что ничего не делаете. Надо хотя бы сбросить флаг прерывания ПДП. Иначе послевыхода из обработчика вы снова попадете в него же (условие вызова обработчика не снято же) и на выполнение основного цикла времени просто не останется.

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


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

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

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

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

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

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

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

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

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

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