Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f405rg + adc1 не хочет работать в scan mode
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
diwil
Уважаемые, столкнулся с такой проблеммой -
я хочу использовать ADC1 каналы 0-3 в режиме сканированя - т.е. за один запуска АЦП хочу получиьт значения напряжения на 4х ногах (14-17)
Для эксперемента к каждой ноге подключен средний вывод своего переменного резистора 50кОм, ну и 0.33 емкость.
Казалось бы, потенциалы на входах этих АЦП каналов не должны влиять друг на друга, т.е. если вращать ручку потенциометра 3его канала АЦП, то потенциал на первом канале АЦП (именно измеренное напряжение, а не значения регистра, которые читаются програмно) меняться не должен.

Однако, если проц в ресете и АЦП выключено, то так и есть - напряжения на входах можно менять независимо. Но как только я выставляю в 1 бит ADCON, так сразу напряжение на них _почти_ уравнивается, ну и, соответственно, примерное равные значения читаются из регистра данных АЦП.

Вопрос - как такое может быть?


Код такой -
CODE
#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C)

struct supl_s {
int16_t nrv, det, sql, rssi;
};

static struct supl_s adc1_data;

struct supl_s *
get_supinfo(void)
{
return &adc1_data;
}

void ADC1_CH_0_to_3_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &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);


ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 4;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channels 0, 1, 2 and 3 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_480Cycles);

ADC_Cmd(ADC1, ENABLE);

DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc1_data;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 4;
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_Medium;
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_Stream4, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream4, ENABLE);

ADC_DMACmd(ADC1, ENABLE);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
}

void ADC1_Start_Conv(void)
{
ADC_SoftwareStartConv(ADC1);
}


Залипух на плате нет. Переключив АЦП 1 на АЦП 2 получается тот же результат.
Памажите кто чем может, поожалуйста...
Заранее спасибо!
diwil
... ничего интересного - отгорели аналоговые ключи похоже. другой проц работает.
Игорь, пасиб, не знал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.