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

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

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

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

Если не пытаться его приобрести, то он сам по себе никогда не появится.  :unknw:

2 часа назад, Arlleex сказал:

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

XMC4xxx умеет 200%  :wink:

Какой смысл не использовать его для такой задачи?

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


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

7 minutes ago, jcxz said:

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

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

 

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


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

On 7/31/2023 at 2:02 PM, Arlleex said:

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

Проверил на "иголках", по вашей методике, конечно, джиттер не обнаружен.  Теперь я уверен в обеспечении временных диаграмм. 

On 7/31/2023 at 2:30 PM, jcxz said:

XMC4xxx умеет 200%  :wink:

Какой смысл не использовать его для такой задачи?

XMC4xxx - хороший и развитый процессор.  Часто используется элементная база из предыдущих проектов - для унификации и стандартизации. 

Благодарю Всех за помощь и ценные советы.

 

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


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

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

Теперь я уверен в обеспечении временных диаграмм. 

Дело осталось за малым - доверить чтение регистра данных АЦП в память DMA-контроллеру и занять CPU действительно важными делами:wink:

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


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

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

Создал две регулярные группы, по единственному каналу в каждой, каждая группа работает на свой АЦП. Сконфигурировал АЦП1 и АЦП2 в Dual Mode, с тем, чтобы результат преобразования  из общего регистра CDR или регистров данных DR обоих АЦП через ПДП передавать в память. По окончании передачи блока по прерыванию от DMA_LISR_TCIF0, формируется флаг готовности данных для дальнейшей расчетной задачи.  При данных настройках данные в памяти переносятся только один раз. Если разрешаю прерывания по флагам EOC в АЦП, то прерывание отрабатывается также один раз. В чем тут дело? 

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


/*********************************************************************
 void ADC_DMA_Init (void)
*********************************************************************/
void ADC_DMA_Init(void)
{	
	SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);       	// DMA controller clock enable	
	
    HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);		// DMA interrupt init */
    HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); 				// DMA2_Stream0_IRQn interrupt configuration
  
    HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);		// DMA2_Stream2_IRQn interrupt configuration
    HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
  	
	DMA2_Stream0->PAR = (uint32_t)&(ADC1-> DR); 		// DMA stream x peripheral address register	
	DMA2_Stream0->NDTR = 256;   						// DMA stream x number of data register
	DMA2_Stream0->M0AR = (uint32_t)&ADC_FA;  			// ADC_FA.Buff [0]
	
	DMA2_Stream0-> CR = 0; 								// Clear CR
	DMA2_Stream0-> CR = DMA_SxCR_MINC | DMA_SxCR_TCIE | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_PL | DMA_SxCR_EN; // Inc Mem, 16bit | DMA_SxCR_TEIE 
	
	DMA2_Stream2->PAR = (uint32_t)&(ADC2-> DR); 							/*< DMA stream x peripheral address register */	
	DMA2_Stream2->NDTR = 256;   											/*!< DMA stream x number of data register     */
	DMA2_Stream2->M0AR = (uint32_t)&ADC_FA + 512;
	
	DMA2_Stream2-> CR = 0; 																		// Clear CR
	DMA2_Stream2-> CR = DMA_SxCR_CHSEL_0 | DMA_SxCR_MINC | DMA_SxCR_TCIE | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0  | DMA_SxCR_PL | DMA_SxCR_EN; // Inc Mem, 16bit | DMA_SxCR_TEIE
	
} //  ADC_DMA_Init(void)


/*********************************************************************
 void  Daul_ADC_DMA_Init(void)
*********************************************************************/
void Daul_ADC_DMA_Init(void)
{
	RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // разрешение тактирования АЦП 1
	RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; // разрешение тактирования АЦП 2

	NVIC_ADC_Init();  									// Инициализация вектора прерываний NVIC 
	
	ADC1->CR1 = 0;                			// Сброс в управляющих регистрах
	ADC1->CR2 = 0;
	ADC2->CR1 = 0;
	ADC2->CR2 = 0;	
 
	ADC1->SMPR2 = 0; 										// время выборки 3 цикла ADC_SAMPLETIME_3CYCLES	
	ADC2->SMPR2 = 0; 										// время выборки 3 цикла ADC_SAMPLETIME_3CYCLES
	
	ADC1->SQR1 = 0x00000000; //0b0000000000000100000000000000000;  // 
	ADC1->SQR3 = 0x00000002; //0b00000000000000000001100000000000; // канал 2 посл. рег. каналов АЦП1
	ADC2->SQR3 = 0x00000003; //0b00000000000001000000000000000000; // канал 3 посл. рег. каналов АЦП2

	ADC1->CR2 = ADC_CR2_EXTEN_0 | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_3 | ADC_CR2_CONT; //  источник запуска Timer 2 TRGO
	ADC2->CR2 = ADC_CR2_EXTEN_0 | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_3 | ADC_CR2_CONT; // источник запуска  Timer 2 TRGO 

	ADC123_COMMON->CCR = 0;													  // Очистка битов режимов
	ADC123_COMMON->CCR |= ADC_CCR_MULTI_1 | ADC_CCR_MULTI_2 | ADC_CCR_DMA_1;  // Dual Mode/ Режим совместной работы, одновременное преобразование 2-х регулярных каналов (00110)

//	ADC1->CR1 |= ADC_CR1_EOCIE;			// Разрешение от АЦП
//	ADC2->CR1 |= ADC_CR1_EOCIE;			// Разрешение от АЦП
	
    ADC_DMA_Init(); 

	ADC1->CR2 |= ADC_CR2_ADON; 			// Запуск каналов АЦП в непрерывном режиме
	ADC2->CR2 |= ADC_CR2_ADON; 			// Запуск каналов АЦП в непрерывном режиме

} // Daul_ADC_DMA_Init(void)

 

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


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

Здравствуйте, уважаемые коллеги, причина была в неверном выбранном источнике тактирования, нужен был TIM2 TRGO, а ставил TIMER2 CH2. Сейчас вроде все по задумке идет...

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


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

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

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

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

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

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

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

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

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

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