Нажмите для просмотра прикрепленного файла
Т.е. примерно через два периода получаю неверное значение напряжение. Ниже привожу инициализацию АЦП и DMA:
CODE
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN; //Тактирование АЦП1
ADC1->CR2|=ADC_CR2_CONT; //Режим преобразования - непрерывный
ADC1->CR1|=ADC_CR1_SCAN; //Режим сканирования последовательности каналов
ADC1->CR2|=ADC_CR2_DMA; //Включаем DMA
ADC1->CR2|=ADC_CR2_DDS;
ADC1->SQR1|=ADC_SQR1_L_3
|ADC_SQR1_L_1; //Сканируемая пос-ть каналов 0,1-10
ADC1->SQR3|=ADC_SQR3_SQ1_2
|ADC_SQR3_SQ1_1 /*Измеряем 1,5 В PA6 IN6*/
|ADC_SQR3_SQ2_3
|ADC_SQR3_SQ2_2
|ADC_SQR3_SQ2_0 /*Измеряем U_IN_VIPR_B PC3 IN13*/
|ADC_SQR3_SQ3_3
|ADC_SQR3_SQ3_1
|ADC_SQR3_SQ3_0 /*Измеряем U_IN_BPA PC1 IN11*/
|ADC_SQR3_SQ4_3
|ADC_SQR3_SQ4_2 /*Измеряем U_IN_VIPR_C PC2 IN12*/
|ADC_SQR3_SQ5_3
|ADC_SQR3_SQ5_1 /*Измеряем U_IN_BP_B PC0 IN10*/
|ADC_SQR3_SQ6_1; /*Измеряем I_OUT_INV_A PA2 IN2*/
ADC1->SQR2|=ADC_SQR2_SQ7_1
|ADC_SQR2_SQ7_0 /*Измеряем I_OUT_INV_B PA3 IN3*/
|ADC_SQR2_SQ8_0 /*Измеряем I_OUT_INV_C PA1 IN1*/
|ADC_SQR2_SQ9_2 /*Измеряем U_BAT PA4 IN4*/
|ADC_SQR2_SQ10_2
|ADC_SQR2_SQ10_0; /*Измеряем I_BAT PA5 IN5*/
/*Измеряем U_IN_VIPR_A PA0 IN0*/
ADC1->SMPR2|=ADC_SMPR2_SMP6
|ADC_SMPR2_SMP2
|ADC_SMPR2_SMP3
|ADC_SMPR2_SMP1
|ADC_SMPR2_SMP4
|ADC_SMPR2_SMP5
|ADC_SMPR2_SMP0; //Время конверсии 480 тактов
ADC1->SMPR1|=ADC_SMPR1_SMP13
|ADC_SMPR1_SMP11
|ADC_SMPR1_SMP12
|ADC_SMPR1_SMP10; //Время конверсии 480 тактов
ADC1->CR2|=ADC_CR2_ADON; //Включаем АЦП
ADC1->CR2|=ADC_CR2_SWSTART; //Старт преобразования
ДМА:
CODE
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 = 11;
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_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_Stream4, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream4, ENABLE);
Массив куда передаю:
Код
signed int ADC1Massiv[11];
Подскажите, что я делаю не так.
Сейчас упростил по максимуму - оставил один канал АЦП IN0, вот инициализация:
Код
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN; //Тактирование АЦП1
ADC1->CR2|=ADC_CR2_CONT; //Режим преобразования - непрерывный
ADC1->CR1|=ADC_CR1_SCAN; //Режим сканирования последовательности каналов
ADC1->CR2|=ADC_CR2_DMA; //Включаем DMA
ADC1->CR2|=ADC_CR2_DDS;
/*ADC1->SQR1|=ADC_SQR1_L_3
|ADC_SQR1_L_1;*/ //Сканируемая пос-ть каналов 0,1-10
/*Измеряем U_IN_VIPR_A PA0 IN0*/
ADC1->SMPR2|=ADC_SMPR2_SMP0; //Время конверсии 480 тактов
ADC1->CR2|=ADC_CR2_ADON; //Включаем АЦП
ADC1->CR2|=ADC_CR2_SWSTART; //Старт преобразования
ADC1->CR2|=ADC_CR2_CONT; //Режим преобразования - непрерывный
ADC1->CR1|=ADC_CR1_SCAN; //Режим сканирования последовательности каналов
ADC1->CR2|=ADC_CR2_DMA; //Включаем DMA
ADC1->CR2|=ADC_CR2_DDS;
/*ADC1->SQR1|=ADC_SQR1_L_3
|ADC_SQR1_L_1;*/ //Сканируемая пос-ть каналов 0,1-10
/*Измеряем U_IN_VIPR_A PA0 IN0*/
ADC1->SMPR2|=ADC_SMPR2_SMP0; //Время конверсии 480 тактов
ADC1->CR2|=ADC_CR2_ADON; //Включаем АЦП
ADC1->CR2|=ADC_CR2_SWSTART; //Старт преобразования
В инициализации DMA все также как и выше, за исключением, что теперь:
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disnable;
Но всеравно принимаю неправильные значения:
Нажмите для просмотра прикрепленного файла