Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 4 minutes ago, dimka76 said: У таймера в регистре CR2 настраиваете биты MMS на нужно событие. У АЦП выбираете нужное вам событие для запуска битами JEXTSEL[2:0] в регистре ADC_CR2. А у таймера либо TRGO битами MMS в регистре CR2, либо соответствующий канал таймера настраиваете. Сигнал нужно оцифровывать в 16 - 20 раз быстрее от формируемого меандра . Вот картинка: Желтый луч , исследуемый сигнал . Голубой луч формируемый меандр этим микроконтроллером. Вопрос : как аппаратно оцифровывать сигнал синхронно с таймером 3? и на частоте превышающей период счета таймера в 16-20 раз? При этом делать это 7-мым каналом АЦП1 , а 1й и 9й каналы АЦП1 уже в фоне так сказать, раз 5 в секунду могут оцифровывать сигналы , они имеют самый низкий приоритет . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба Я вчера исследовал такой метод измерения: Меандр формировался таймером3. АЦП1 канал 7 в инжектированном режиме измерял сигнал поступающий на вход и складывал в буфер . А я уже юартом через ДМА смотрел этот буфер . Так вот , в принципе было все более менее сносно , по быстродействию и точности . Может не стоит заморачиваться таким способом измерять фазу , а измерять ее путем сравнения отдельных кусков буфера ? Но этот вариант тоже не очень , так как бывает что синус пропадает совсем . Это происходит если на катушку ничего не наводится . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 19 минут назад, Artos5 сказал: как аппаратно оцифровывать сигнал синхронно с таймером 3? Запускать преобразование событием от таймера 3 (EXTSEL/JEXTSEL). 20 минут назад, Artos5 сказал: и на частоте превышающей период счета таймера в 16-20 раз? Запускаете другой таймер на частоте в 16-20 раз выше,им запускаете АЦП и его переполнение используете для тактирования таймера 3. 4 минуты назад, Artos5 сказал: Меандр формировался таймером3. АЦП1 канал 7 в инжектированном режиме измерял сигнал поступающий на вход и складывал в буфер . Зачем инжектированный режим и прерывание? Измеряйте основной сигнал в обычном режиме, результаты складывайте в буффер при помощи ПДП, обрабатывайте в прерываниях ПДП HTIF, TCIF. Остальные каналы оцифровываете тоже в основном режиме (если не жалко места в буфере) или в прерываниях ПДП запускаете остальные каналы в инжектированном режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 2 minutes ago, Сергей Борщ said: Зачем инжектированный режим и прерывание? Измеряйте основной сигнал в обычном режиме, результаты складывайте в буффер при помощи ПДП, обрабатывайте в прерываниях ПДП HTIF, TCIF. Остальные каналы оцифровываете тоже в основном режиме (если не жалко места в буфере) или в прерываниях ПДП запускаете остальные каналы в инжектированном режиме. Спасибо что ответили! Как пдп засинхронизировать с таймером 3 ? Как в пдп анализировать через равные промежутки только канал 7 АЦП1? А остальные 2 канала , 1 и 9 можно в любом другом режиме сканировать и более медленно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 40 minutes ago, Artos5 said: Сигнал нужно оцифровывать в 16 - 20 раз быстрее от формируемого меандра . как аппаратно оцифровывать сигнал синхронно с таймером 3? и на частоте превышающей период счета таймера в 16-20 раз? Смотрите раздел Timer synchronization Запустите еще один таймет, который будет синхронирован от TIM3, но работаеть в 15-20 раз быстрее, чем TIM3. А от него уже делайте запуск АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба dimka76, спасибо за подсказку! А ещё ламерский вопрос: Мне adc1_7 настроить как инжектированный и выполнять преобразования от таймера синхронизированного от tim3 , А как быть с каналами adc1_1 и adc1_9 ? Преобразование то выполняется последовательно ? Они собьют синхронность опроса ацп1_7? Или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 12 minutes ago, Artos5 said: , А как быть с каналами adc1_1 и adc1_9 ? Преобразование то выполняется последовательно ? Они собьют синхронность опроса ацп1_7? Или нет? Повысьте частоту преобразования в 3 раза и опрашивайте все три канала последовательно за один запуск от таймера. Лишние выборки можно игнорировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 (изменено) · Жалоба А реально запустить АЦП от таймера на частоте 180-600кГц и при этом чтобы в основном цикле не было тормозов? Изменено 2 мая, 2019 пользователем Artos5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 2 minutes ago, Artos5 said: А реально запустить АЦП от таймера на частоте 180-600кГц и при этом чтобы в основном цикле не было тормозов? Все преобразования выполняются аппаратно, откуда в основном цикле программы возникнут тормоза ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 (изменено) · Жалоба Из-за прерывания таймера наверное.. Или по дма выполнять преобразования и складывать в буфер? Что-то я уже запутался..)) Изменено 2 мая, 2019 пользователем Artos5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба 19 minutes ago, Artos5 said: Из-за прерывания таймера наверное.. Или по дма выполнять преобразования и складывать в буфер? Что-то я уже запутался..)) Скорее уж из-за прерывания АЦП. По DMA складывайте нужное вам количество и по прерыванию от DMA обрабатывать результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба настроил циркулярный режим , создал буфер 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artos5 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба Настроил 55.5 циклов преобразования ,и попустило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба ADC_SAMPLETIME_13CYCLES_5 Это не скорость преобразования, а время выборки. Преобразования состоит из выборки сигнала и самого преобразования. Вы бы хоть Reference manual почитали как все это работает, а не просто в кубике флажки расставлять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 7 часов назад, Artos5 сказал: основной цикл программы очень сильно тормозит (видимо из-за прерываний ДМА). Хотя я еще в прерывании даже ничего не делаю :) Полагаю, что тормозит именно из-за того, что ничего не делаете. Надо хотя бы сбросить флаг прерывания ПДП. Иначе послевыхода из обработчика вы снова попадете в него же (условие вызова обработчика не снято же) и на выполнение основного цикла времени просто не останется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться