Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 АЦП и DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sidy
В проекте использую 14 регулярных каналов АЦП. Для переноса значений АЦП в массив использую DMA. Запуск преобразования АЦП осуществляю с помощью таймера, считающего с частотой 18 кГц установкой ADC1->CR2|=ADC_CR2_SWSTART. Столкнулся со следующей проблемой: В одном из каналов измеряется постоянное напряжение. В отсчетах АЦП составляет примерно 2700 отсчетов. Но после работы программы в течении 20-30 секунд в этом канале получаю единичный выброс равный 3100 отсчетам. При этом измеряемое напряжение не меняется. На помеху тоже не грешу, поскольку появляется этот неверный отсчет постоянно, через определенный интервал времени 20-30 сек.

Ниже привожу код инициализации АЦП и DMA. Подскажите что я делаю не так.
CODE

//Инициализация АЦП----------------------------------------------------------------------
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN; //Тактирование АЦП3
// ADC1->CR2|=ADC_CR2_CONT; //Режим преобразования - непрерывный

ADC1->CR1|=ADC_CR1_SCAN; //Режим сканирования последовательности каналов

ADC1->CR2|=ADC_CR2_DMA; //Включаем DMA
ADC1->CR2|=ADC_CR2_DDS;

ADC->CCR|=ADC_CCR_ADCPRE_1;

ADC1->SQR1|=ADC_SQR1_L_3
|ADC_SQR1_L_2
|ADC_SQR1_L_0; //Сканируемая пос-ть каналов 0,1-13

ADC1->SQR3|=ADC_SQR3_SQ1_3
|ADC_SQR3_SQ1_0 /*Измеряем инвертор UInvOut PB1 IN9 0*/

|ADC_SQR3_SQ2_3 /*Измеряем инвертор +U PB0 IN8 1*/

|ADC_SQR3_SQ3_3
|ADC_SQR3_SQ3_2
|ADC_SQR3_SQ3_1 /*Измеряем инветор -U PC4 IN14 2*/

|ADC_SQR3_SQ4_3
|ADC_SQR3_SQ4_2
|ADC_SQR3_SQ4_1
|ADC_SQR3_SQ4_0 /*Измеряем инвертор Iнагр PC5 IN15 3*/

|ADC_SQR3_SQ5_2
|ADC_SQR3_SQ5_1 /*Измеряем инвертор Ucap PA6 IN6 4*/

|ADC_SQR3_SQ6_2
|ADC_SQR3_SQ6_0; /*Измеряем ККМ UKkmMain PA5 IN5 5*/

ADC1->SQR2|=ADC_SQR2_SQ7_0 /*Измеряем ККМ UKkmDross PA1 IN1*/

|ADC_SQR2_SQ8_2 /*Измеряем ККМ +U PA4 IN4*/

|ADC_SQR2_SQ9_1 /*Измеряем ККМ -U PA2 IN2*/

|ADC_SQR2_SQ10_1
|ADC_SQR2_SQ10_0 /*Измеряем ККМ Idros PA3 IN3*/

/*Измеряем ППН Ippn PA0 IN0*/

|ADC_SQR2_SQ12_3
|ADC_SQR2_SQ12_1; /*Измеряем ППН +U PC0 IN10*/

ADC1->SQR1|=ADC_SQR1_SQ13_3
|ADC_SQR1_SQ13_2
|ADC_SQR1_SQ13_0 /*Измеряем ППН -U PC3 IN13*/

|ADC_SQR1_SQ14_3
|ADC_SQR1_SQ14_1
|ADC_SQR1_SQ14_0; /*Измеряем ППН Ubattery PC1 IN11*/


ADC1->CR2|=ADC_CR2_ADON; //Включаем АЦП
ADC1->CR2|=ADC_CR2_SWSTART; //Старт преобразования



CODE

void DMA_ADC1(void){
DMA_InitTypeDef DMA_InitStructure;

RCC->AHB1ENR|=RCC_AHB1ENR_DMA2EN;

DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&ADC1->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)&ADC1Massiv;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 14;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
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);
}
sidy
Предыдущий вопрос снимается. Дело было не в коде)
Возникла еще одна проблема - не запускается АЦП от TIM3 CC1 event
Добавил в инициализацию АЦП строчки
ADC1->CR2|=ADC_CR2_EXTSEL_2|ADC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_0; //TIM3 CC1 event
ADC1->CR2|=ADC_CR2_EXTEN_1; //Trigger on falling edge
Таймер TIM3 инициализируется следующим образом
Код
    RCC->APB1ENR|=RCC_APB1ENR_TIM3EN;                //Тактирование TIM3
    TIM3->ARR=(CPU_CLOCK/2)/18000;                    //Значение до которого считаем
    TIM3->CCR2=TIM3->ARR;                                //Значение CCR2
    TIM3->CCER|=TIM_CCER_CC1E;                        //Capture/compare 1 output enable
    TIM3->CCER|=TIM_CCER_CC2E;                        //Capture/compare 1 output enable
    TIM3->CCMR1|=TIM_CCMR1_OC2M_2
                |TIM_CCMR1_OC2M_1;                //PWM mode 1 CH2
    TIM3->CCMR1|=TIM_CCMR1_OC1M_2
                |TIM_CCMR1_OC1M_1;                //PWM mode 1 CH1
    TIM3->CR2|= TIM_CR2_MMS_2;                                        
    TIM3->DIER|=TIM_DIER_UIE;                        //Разрешаем прерывания по UIE
    NVIC_SetPriority(TIM3_IRQn, 2);                            //Приоритет прерывания TIM2
    NVIC_EnableIRQ (TIM3_IRQn);                        //Разрешаем прерывание TIM2
    TIM3->CCR1=0;
    TIM3->CCR2=0;
    TIM3->CNT=0;
    TIM3->CR1|=TIM_CR1_CEN;                        //Разрешаем счет TIM3

Что я еще не указал чтобы АЦП запускался от TIM3 CC1 event?
sidy
Предыдущий вопрос снимается - разобрался сам)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.