|
STM32 ADC, Как сэмплировать два канала? |
|
|
|
 |
Ответов
|
Apr 9 2012, 14:57
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Цитата Ну а если хочется через DMA, то вот пример кода: Я попробовал повторить это через библиотечные вызовы, получилось что один канал ацп влияет на другой. Почему так происходит? Т.е. если читать один канал, он начитывает ~49000, если два канала, то в первом ~43000 во втором ~5000. А так все почти работает) CODE void APADC_Init( void ){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC3, DMA2 and GPIO clocks ****************************************/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* DMA2 Stream0 channel2 configuration **************************************/ DMA_InitStructure.DMA_Channel = DMA_Channel_2; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValues; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); DMA_Cmd(DMA2_Stream0, ENABLE);
/* Configure ADC3 Channel7 pin as analog input ******************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure);
/* ADC Common Init **********************************************************/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 Init ****************************************************************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 2; //ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 regular channel7 configuration *************************************/ ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 2, ADC_SampleTime_3Cycles);
/* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* Enable ADC3 DMA */ ADC_DMACmd(ADC3, ENABLE);
/* Enable ADC3 */ ADC_Cmd(ADC3, ENABLE); ADC_SoftwareStartConv(ADC3); }
Сообщение отредактировал Vladimir Prokofiev - Apr 9 2012, 14:59
|
|
|
|
|
Apr 9 2012, 17:10
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(Vladimir Prokofiev @ Apr 9 2012, 18:57)  Я попробовал повторить это через библиотечные вызовы, получилось что один канал ацп влияет на другой. Почему так происходит? Т.е. если читать один канал, он начитывает ~49000, если два канала, то в первом ~43000 во втором ~5000. А так все почти работает) Нужно снизить выходное сопротивление источников сигнала, поставить конденсаторы на землю. Или увеличить время выборки АЦП. Вход АЦП - конденсатор около 6 пф, который подключается по очереди к выходам двух источников сигнала, и при этом на себе переносит заряд из одного в другой. Чем больше частота переключения каналов тем больше средний результирующий ток и больше погрешность.
|
|
|
|
|
Apr 10 2012, 07:35
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Цитата(maksimp @ Apr 9 2012, 21:10)  Нужно снизить выходное сопротивление источников сигнала, поставить конденсаторы на землю. Или увеличить время выборки АЦП. Вход АЦП - конденсатор около 6 пф, который подключается по очереди к выходам двух источников сигнала, и при этом на себе переносит заряд из одного в другой. Чем больше частота переключения каналов тем больше средний результирующий ток и больше погрешность. Круто, спасибо, помогло!
|
|
|
|
Сообщений в этой теме
uriy STM32 ADC Mar 1 2012, 13:30 Сергей Борщ QUOTE (uriy @ Mar 1 2012, 15:30) Где-то в... Mar 1 2012, 14:27 scifi Для таких целей я включаю режим continuous mode + ... Mar 1 2012, 14:31 Сергей Борщ QUOTE (scifi @ Mar 1 2012, 16:31) Для так... Mar 1 2012, 18:23 uriy Жаль что не получится загнать в DMA. Придется дела... Mar 2 2012, 05:27 Сергей Борщ QUOTE (uriy @ Mar 2 2012, 07:27) Жаль что... Mar 2 2012, 07:00     MiklPolikov Колеги, помогите разобратся с injected каналами в ... Jun 12 2012, 00:21 spasbyspas Для STM32L151 с "injected channels" можн... Jun 12 2012, 09:08 MiklPolikov spasbyspas , спасибо !
Заменил в своём коде... Jun 14 2012, 18:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|