Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 (изменено) · Жалоба Здравствуйте, уважаемые коллеги, прошу высказать свое мнение или поделиться опытом по такому вопросу. Процессор STM32F722, генератор TXCO 50МГц, внутренняя частота ядра 216 МГц. Для фазометра сконфигурировал работу двух АЦП в сдвоенном режиме с одновременным запуском запуском от таймера 2. Приоритет при обработки прерываний от АЦП установил наивысший. Функция обработки прерывания вызывается из ОЗУ. Вовремя работы выводится сигнал для контроля частоты выборок. По сигналу тому наблюдается джиттер, т.е. при частоте выборок 1200 kS, джиттер порядка 48 ns. Все другие процессы остановлены. Планируется перенос данных из регистров в рабочий массив посредством ПДП, но понимаю, что джиттер отстанет. В чем может быть его причина и как свести его к минимуму? Заранее очень благодарен. // Инициализация АЦП1 и АЦП2 void Daul_ADC_DMA_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // разрешение тактирования АЦП 1 RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; // разрешение тактирования АЦП 2 IN_ADC_Init(); // Конфигурирование аналог. входов ADC1->CR1 = 0; // Сброс в управляющих регистрах ADC1->CR2 = 0; ADC2->CR1 = 0; ADC2->CR2 = 0; ADC1->SMPR2 &= ~ADC_SMPR2_SMP2; // время выборки 3 цикла ADC2->SMPR2 &= ~ADC_SMPR2_SMP3; // время выборки 3 цикла // выбор каналов ADC1->SQR3 = 0x0000; //0b00000000000000000000000000000010; // канал 2 посл. рег. каналов АЦП1 ADC2->SQR3 = 0x0001; //0b00000000000000000000000000000011; // канал 3 посл. рег. каналов АЦП2 ADC1->CR2 = ADC_CR2_EXTEN_0 | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_3;// | ADC_CR2_SWSTART; // источник запуска TIM2_CH2 / 1011: Timer 2 TRGO ADC2->CR2 = ADC_CR2_EXTEN_0 | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_3;// | ADC_CR2_SWSTART ; // источник запуска TIM2_CH2 / 1011: Timer 2 TRGO //ADC2->CR1 |= ADC_CR2_DMA; // Активация режима работы с DMA ADC123_COMMON->CCR &= ~ADC_CCR_MULTI; // Очистка битов режимов ADC123_COMMON->CCR |= ADC_CCR_MULTI_0 | ADC_CCR_MULTI_3; // Режим совместной работы, одновременное преобразование регулярных каналов (0101) // Разрешение работы нескольких каналов, однократное преобразование ADC1->CR1 |= ADC_CR1_SCAN; // разрешение режима сканирования ADC2->CR1 |= ADC_CR1_SCAN; // разрешение режима сканирования // DMA_Init(); ADC1->CR1 |= ADC_CR1_EOCIE; // Разрешение прерывания от АЦП1 ADC2->CR1 |= ADC_CR1_EOCIE; // Разрешение прерывания от АЦП2 ADC1->CR2 |= ADC_CR2_ADON; // Запуск каналов АЦП в непрерывном режиме ADC2->CR2 |= ADC_CR2_ADON; // Запуск каналов АЦП в непрерывном режиме } // Daul_ADC_DMA_Init(void) // Функция обработки прерывания АЦЦП volatile uint32_t Duble_ADC_Data_1 ,Duble_ADC_Data_2; __irq void ADC_IRQHandler(void) { if ((ADC123_COMMON->CSR & ADC_CSR_EOC1) && (ADC123_COMMON->CSR & ADC_CSR_EOC2)) { ADC1->SR &= ~ADC_SR_EOC; // Очистка линии запроса прерывания ADC2->SR &= ~ADC_SR_EOC; // Очистка линии запроса прерывания LED_Blank_ON; Duble_ADC_Data_1 = (uint16_t)ADC1->DR; // Read data A from ADC1 / Sighal Duble_ADC_Data_2 = (uint16_t)ADC2->DR; // Read data A from ADC1 / Sighal LED_Blank_OFF; } } // __irq ADC_IRQHandler () Изменено 1 августа, 2023 пользователем haker_fox Добавил модель микроконтроллера в названием темы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 33 минуты назад, Vladimir_T сказал: Во время работы выводится сигнал для контроля частоты выборок. Выведите этот же сигнал в прерывании таймера, прерывание АЦП пока запретите. Сравните. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 30 минут назад, Vladimir_T сказал: В чем может быть его причина и как свести его к минимуму? Например, в этом Цитата Во время работы выводится сигнал для контроля частоты выборок. (и далее код дергания лапой в прерывании АЦП), т.к. не изветсно, что подразумевается под Цитата Все другие процессы остановлены. Цитата Планируется перенос данных из регистров в рабочий массив посредством ПДП, но понимаю, что джиттер отстанет. Не останет, если так будете контролировать семплирование. Контроль запусков правильнее осуществлять с самого запускаемого таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 29 минут назад, Vladimir_T сказал: джиттер порядка 48 ns 10 тактов системной частоты. Ядро между прерываниями спит или все же выполняет какие-то (не всегда однотактовые) команды? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба А еще вот что вызовет джиттер И чем медленнее работает АЦП (т.е. частота его клоков ниже), тем джиттер будет больше, т.к. ресинхронизация доменов будет дольше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 33 minutes ago, Сергей Борщ said: 10 тактов системной частоты. Ядро между прерываниями спит или все же выполняет какие-то (не всегда однотактовые) команды? В основном цикле для контроля есть простое моргание светодиодом, как индикатор рабочего процесса, нет зацикливания или зависания. 27 minutes ago, Arlleex said: А еще вот что вызовет джиттер И чем медленнее работает АЦП (т.е. частота его клоков ниже), тем джиттер будет больше, т.к. ресинхронизация доменов будет дольше. На своем экземпляре заметил эту зависимость, частоту снижаю, а джиттер увеличивается. 49 minutes ago, Сергей Борщ said: Выведите этот же сигнал в прерывании таймера, прерывание АЦП пока запретите. Сравните. Попробую. Помню, что на STM32F405 прерывания с частотой выше 960 кГц не обрабатывались, процессор зацикливался... А так желательно обеспечить частоту дискретизации каждого канала 1200 kS синхронно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 41 минуту назад, Vladimir_T сказал: Помню, что на STM32F405 прерывания с частотой выше 960 кГц не обрабатывались, процессор зацикливался... Смотря что в них, в этих прерываниях. У меня прерывания обрабатываются и на бОльшей частоте на этом камне. 41 минуту назад, Vladimir_T сказал: На своем экземпляре заметил эту зависимость, частоту снижаю, а джиттер увеличивается. А какой режим тактирования и какая частота у АЦП? Кстати, от джиттера можно попробовать избавиться. Тактируйте АЦП и триггирующий таймер от когерентной и кратной частоты. Я сильно сомневаюсь, что задержка (указанная в даташите) будет прыгать от преобразования к другому. Она, скорее всего, останется постоянной. А это значит, что при когерентном тактировании джиттер ликвидируется и останется одна формальная задержка постоянной величины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 54 minutes ago, Arlleex said: А какой режим тактирования и какая частота у АЦП? Цепь тактирования : AHB2 = APB2 =216 MHz, APB2 / PCLK =108 MHz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба Ну пересадите триггер на другой таймер, который будет висеть на том же APB2, что и АЦП, и повторите измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 1 hour ago, Arlleex said: Смотря что в них, в этих прерываниях. У меня прерывания обрабатываются и на бОльшей частоте на этом камне. Стремлюсь, чтобы в прерываниях были простейшие функции. В моем случае: в прерывании от таймера, ставился бит (TCIE в SPI2->CR) разрешения передачи данных по SPI и запускался служебный таймер (формирование сигнала CS для обращения к периферии) . И далее передача данных по прерываниям от TC (данные переданы). На частоте прерываний выше 960 кГц не удалось поработать... 11 minutes ago, Arlleex said: Ну пересадите триггер на другой таймер, который будет висеть на том же APB2, что и АЦП, и повторите измерения. Благодарю. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 5 минут назад, Vladimir_T сказал: Стремлюсь, чтобы в прерываниях были простейшие функции. В моем случае: в прерывании от таймера, ставился бит (TCIE в SPI2->CR) разрешения передачи данных по SPI и запускался служебный таймер (формирование сигнала CS для обращения к периферии) . И далее передача данных по прерываниям от TC (данные переданы). На частоте прерываний выше 960 кГц не удалось поработать... Тогда только выбирать нормальный МК, умеющий 90% из этого аппаратно)) Да и опять же... Что мешало повесить SPI на DMA и вовсе забыть о прерываниях? DMA только для того и существует, чтобы разгрузить CPU от лишних телодвижений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 1 hour ago, Arlleex said: Да и опять же... Что мешало повесить SPI на DMA и вовсе забыть о прерываниях? Отсутствие опыта работы. с ПДП. Перевел запуск АЦП от TIM1, теперь и АЦП и сами таймеры тактируются от APB2, но джиттер не уменьшился. Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами. Но самое важное, что оба АЦП аппаратно были запущены одновременно. Может зря я затеял поиск надуманной причины и вас отвлекаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 176 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 14 минут назад, Vladimir_T сказал: Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами. Но самое важное, что оба АЦП аппаратно были запущены одновременно. Может зря я затеял поиск надуманной причины и вас отвлекаю? Тогда я бы для начала запустил один АЦП в обычном режиме и проверил теорию. И для максимально корректных результатов: сделайте (в отрыве от вашей схемы) последовательный входу АЦП резистор, на 1 кОм, например. Подключите его к +3.3 В и будете наблюдать "иголки" реальных семплирований. По ним можно будет засинхронизировать осциллограф и смотреть реальный джиттер. Все-таки, так, как Вы сейчас смотрите - это не правильный метод. Иначе надо высматривать ассемблерный листинг на наличие специфических инструкций, которые могут задержать выполнение обработчика прерывания, в котором дрыгается нога светодиода. Да и много еще всяких чудес под капотом может происходить, что будет спонтанно тормозить доступ CPU к шине (например, кэш данных - в Вашем МК он есть). Цитата Отсутствие опыта работы. с ПДП. В STM-ках, где на периферии разрабов жаба задушила поставить хоть какие-то FIFO, DMA нужно поднимать в одну из первых очередей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 21 минуту назад, Vladimir_T сказал: Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами. Не понимаю: Зачем генерить 2 прерывания от этих событий если они всегда идут вместе? Прерывание лучше генерить только от последнего, вычитывая в ISR оба. С DMA - аналогично (если периферия позволяет; не знаю как там в STM32 с этим обстоит дело). 5 часов назад, Vladimir_T сказал: Функция обработки прерывания вызывается из ОЗУ. Интересно - зачем? Вроде у такого МК должен быть (обязан) кеш. А значит - выполнение кода из него возможно будет быстрее, чем из ОЗУ. А таблицу прерываний - тоже в ОЗУ перенесли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 19 minutes ago, Arlleex said: Подключите его к +3.3 В и будете наблюдать "иголки" реальных семплирований. По ним можно будет засинхронизировать осциллограф и смотреть реальный джиттер. Великолепно! Так и сделаю, проверю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться