реклама на сайте
подробности

 
 
> STM32 ADC, Как сэмплировать два канала?
uriy
сообщение Mar 1 2012, 13:30
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Не могу понять как получать данные с двух каналов АЦП. Интересует ADC1. Регистр данных всего лишь один, хочу использовать regular режим. С одним каналом сейчас все работает, снимаю данные по таймеру. Где-то встречал упоминание что можно настроить DMA на работу с несколькими каналами АЦП. При этом определяется несколько буферов по количеству опрашиваемых каналов. Дальше АЦП (или DMA) как-то сам складывает семплы в свой буфер и генерит прерывание по заполнению буфера. Такой вариант был бы для меня идеальным. Может быть есть у кого примеры кода?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
spasbyspas
сообщение Jun 12 2012, 09:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 31-08-08
Пользователь №: 39 908



Для STM32L151 с "injected channels" можно так:
CODE
void ADC_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStruct;

//+ Enable The HSI (16Mhz)
RCC_HSICmd(ENABLE);
//+ Check that HSI oscillator is ready
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

//+ Enable the GPIOB Clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//+ Configure PB.0 PB.1(ADC Channel8 and 9) in analog mode
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* ADC1 Configuration ------------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* ADC1 DeInit */
ADC_DeInit(ADC1);

ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStruct);

/* ADC1 Configuration of channel8 and channel9 */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 2;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_InjectedSequencerLengthConfig(ADC1, 2);
//+ ADC1 Injected Channel Config
ADC_InjectedChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_24Cycles);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_24Cycles);

//+ Enables the ADC1 Power Down during Delay
ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);
//+ Delay until the converted data has been read
ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_None);

//+ Enable ADC1
ADC_Cmd(ADC1, ENABLE);

//+ Wait until the ADC1 is ready
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET);
}


.....................
//запускаем преобразование "injected" каналов
while(ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1) == SET);
ADC_SoftwareStartInjectedConv(ADC1);

//+ Wait until ADC Channel 8 end of conversion
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC) == RESET);

adc_ch0 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
adc_ch1 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);

.....................


Сообщение отредактировал spasbyspas - Jun 12 2012, 09:19
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jun 14 2012, 18:33
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702




spasbyspas , спасибо !

Заменил в своём коде
ADC1->CR1|=ADC_CR1_JDISCEN;
на
ADC1->CR1|=ADC_CR1_SCAN;

и всё заработало как я хотел ! Семплирую два injectid канала программным тригером, получаю за раз два значения в регистрах
JDR1 JDR2 , и одновременно с этим regular канал работает непрерывно с запросами DMA и одно другому не мешает !


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016