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

Вопрос о работе АЦП в Dual Mode STM32F722

Здравствуйте, уважаемые коллеги, прошу высказать свое мнение или поделиться опытом по такому вопросу.

Процессор 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 ()

 

Изменено пользователем haker_fox
Добавил модель микроконтроллера в названием темы

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


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

33 минуты назад, Vladimir_T сказал:

Во время работы выводится  сигнал для контроля частоты выборок.

Выведите этот же сигнал в прерывании таймера, прерывание АЦП пока запретите. Сравните.

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


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

30 минут назад, Vladimir_T сказал:

В чем может быть его  причина и как свести его к минимуму?

Например, в этом

Цитата

Во время работы выводится сигнал для контроля частоты выборок.

(и далее код дергания лапой в прерывании АЦП), т.к. не изветсно, что подразумевается под

Цитата

Все другие процессы остановлены.

 

Цитата

Планируется перенос данных из регистров в рабочий массив посредством ПДП, но понимаю, что джиттер отстанет.

Не останет, если так будете контролировать семплирование. Контроль запусков правильнее осуществлять с самого запускаемого таймера.

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


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

29 минут назад, Vladimir_T сказал:

джиттер порядка 48 ns

10 тактов системной частоты. Ядро между прерываниями спит или все же выполняет какие-то (не всегда однотактовые) команды?

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


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

А еще вот что вызовет джиттер

image.thumb.png.e5f877edb05088b7000a640394223969.png


И чем медленнее работает АЦП (т.е. частота его клоков ниже), тем джиттер будет больше, т.к. ресинхронизация доменов будет дольше.

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


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

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

10 тактов системной частоты. Ядро между прерываниями спит или все же выполняет какие-то (не всегда однотактовые) команды?

В основном цикле для контроля есть простое моргание светодиодом, как индикатор рабочего процесса, нет зацикливания или зависания.

 

27 minutes ago, Arlleex said:

А еще вот что вызовет джиттер

image.thumb.png.e5f877edb05088b7000a640394223969.png


И чем медленнее работает АЦП (т.е. частота его клоков ниже), тем джиттер будет больше, т.к. ресинхронизация доменов будет дольше.

  На своем экземпляре заметил эту зависимость, частоту снижаю, а джиттер увеличивается. 

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

Выведите этот же сигнал в прерывании таймера, прерывание АЦП пока запретите. Сравните.

Попробую. Помню, что на STM32F405 прерывания с частотой выше 960 кГц не обрабатывались, процессор зацикливался... 

А так желательно обеспечить частоту дискретизации каждого канала 1200 kS синхронно.

 

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


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

41 минуту назад, Vladimir_T сказал:

Помню, что на STM32F405 прерывания с частотой выше 960 кГц не обрабатывались, процессор зацикливался...

Смотря что в них, в этих прерываниях. У меня прерывания обрабатываются и на бОльшей частоте на этом камне.
 

41 минуту назад, Vladimir_T сказал:

На своем экземпляре заметил эту зависимость, частоту снижаю, а джиттер увеличивается. 

А какой режим тактирования и какая частота у АЦП?

Кстати, от джиттера можно попробовать избавиться. Тактируйте АЦП и триггирующий таймер от когерентной и кратной частоты. Я сильно сомневаюсь, что задержка (указанная в даташите) будет прыгать от преобразования к другому. Она, скорее всего, останется постоянной. А это значит, что при когерентном тактировании джиттер ликвидируется и останется одна формальная задержка постоянной величины.

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


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

54 minutes ago, Arlleex said:

А какой режим тактирования и какая частота у АЦП?

Цепь тактирования : AHB2 = APB2 =216 MHz,  APB2 / PCLK =108 MHz

 

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


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

Ну пересадите триггер на другой таймер, который будет висеть на том же APB2, что и АЦП, и повторите измерения.

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


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

1 hour ago, Arlleex said:

Смотря что в них, в этих прерываниях. У меня прерывания обрабатываются и на бОльшей частоте на этом камне.

Стремлюсь, чтобы в прерываниях были простейшие функции. В моем случае: в прерывании от таймера, ставился бит (TCIE в SPI2->CR)  разрешения передачи данных по SPI и запускался служебный таймер (формирование сигнала CS  для обращения к периферии) .  И далее передача данных по прерываниям от TC (данные переданы).  На частоте прерываний  выше 960 кГц не удалось поработать...

11 minutes ago, Arlleex said:

Ну пересадите триггер на другой таймер, который будет висеть на том же APB2, что и АЦП, и повторите измерения.

Благодарю. Попробую.

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


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

5 минут назад, Vladimir_T сказал:

Стремлюсь, чтобы в прерываниях были простейшие функции. В моем случае: в прерывании от таймера, ставился бит (TCIE в SPI2->CR)  разрешения передачи данных по SPI и запускался служебный таймер (формирование сигнала CS  для обращения к периферии) .  И далее передача данных по прерываниям от TC (данные переданы).  На частоте прерываний  выше 960 кГц не удалось поработать...

Тогда только выбирать нормальный МК, умеющий 90% из этого аппаратно))

Да и опять же... Что мешало повесить SPI на DMA и вовсе забыть о прерываниях?

DMA только для того и существует, чтобы разгрузить CPU от лишних телодвижений.

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


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

1 hour ago, Arlleex said:

Да и опять же... Что мешало повесить SPI на DMA и вовсе забыть о прерываниях?

Отсутствие опыта работы. с ПДП.

Перевел запуск АЦП от TIM1,  теперь и АЦП и сами таймеры тактируются от APB2, но джиттер не уменьшился.

Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами. Но самое важное, что оба АЦП аппаратно были запущены одновременно. Может зря я затеял поиск надуманной  причины и вас отвлекаю?

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


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

14 минут назад, Vladimir_T сказал:

Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами. Но самое важное, что оба АЦП аппаратно были запущены одновременно. Может зря я затеял поиск надуманной  причины и вас отвлекаю?

Тогда я бы для начала запустил один АЦП в обычном режиме и проверил теорию. И для максимально корректных результатов: сделайте (в отрыве от вашей схемы) последовательный входу АЦП резистор, на 1 кОм, например. Подключите его к +3.3 В и будете наблюдать "иголки" реальных семплирований. По ним можно будет засинхронизировать осциллограф и смотреть реальный джиттер. Все-таки, так, как Вы сейчас смотрите - это не правильный метод. Иначе надо высматривать ассемблерный листинг на наличие специфических инструкций, которые могут задержать выполнение обработчика прерывания, в котором дрыгается нога светодиода. Да и много еще всяких чудес под капотом может происходить, что будет спонтанно тормозить доступ CPU к шине (например, кэш данных - в Вашем МК он есть).
 

Цитата

Отсутствие опыта работы. с ПДП.

В STM-ках, где на периферии разрабов жаба задушила поставить хоть какие-то FIFO, DMA нужно поднимать в одну из первых очередей:wink:

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


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

21 минуту назад, Vladimir_T сказал:

Про режим Dual ADC. Пусть выбраны независимых АЦП а МК, которые запускаются гарантировано по фронту TIM1, по окончании преобразования получим два флага EOC1 и EOC2 в комплексном регистре CCSR, вызывается прерывание от этих флагов, которое может из-за аппаратных лабиринтов отрабатываться с разными временами.

Не понимаю: Зачем генерить 2 прерывания от этих событий если они всегда идут вместе? Прерывание лучше генерить только от последнего, вычитывая в ISR оба.

С DMA - аналогично (если периферия позволяет; не знаю как там в STM32 с этим обстоит дело).

5 часов назад, Vladimir_T сказал:

Функция обработки прерывания вызывается из ОЗУ.

Интересно - зачем? Вроде у такого МК должен быть (обязан) кеш. А значит - выполнение кода из него возможно будет быстрее, чем из ОЗУ.

А таблицу прерываний - тоже в ОЗУ перенесли?  :wink:

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


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

19 minutes ago, Arlleex said:

Подключите его к +3.3 В и будете наблюдать "иголки" реальных семплирований. По ним можно будет засинхронизировать осциллограф и смотреть реальный джиттер. 

Великолепно! Так и сделаю, проверю! 

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


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

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

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

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

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

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

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

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

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

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