Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.02.2012, 11:04
|
|
Частый гость
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
STM32 ADC + DMA в циклическом режиме
Всем добрый день.
Измеряю синусоиду, настроил DMA в циклическом режиме, ADC, входы, но данные получаю, как попало, например, сигнал нарастает, и в какой то момент резко спадает. Ощущение, что DMA данные теряет. Когда использую DMA не в циклическом режиме, данные приходят корректно.
Кто-то сталкивался с такой проблемой?
Как повторно запустить DMA, если режим нециклический?
Вот код инициализации:
Код:
|
/*тактирование нужных модулей*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /*DMA*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /*АЦП*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Конфигурация ПВВ. PA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 /*| GPIO_Pin_1 | GPIO_Pin_2*/;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*Конфигурация DMA*/
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)& ADC1-›DR; /*источник данных. DR - регистр сохранения результатов преобразования*/
DMA_InitStructure.DMA_MemoryBaseAddr = &bufer; /*приёмник данных*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 3000;
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_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/*Разрешение прерываний*/
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
/*Получить значение счётчика канала до начала передачи*/
/* Разрешить передачу DMA1 Channel1*/
DMA_Cmd(DMA1_Channel1, ENABLE);
/*Конфигурация АЦП*/
/*Установка предварительного делителя*/
RCC-›CFGR &= ~RCC_CFGR_ADCPRE;
RCC-›CFGR |= RCC_CFGR_ADCPRE_DIV2; /*Работа на частоте 12MHz*/
/*Инициализация АЦП*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=DISABLE; // Одноканальный режим.
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // Продолжительный режим. ADC_InitStructure.ADC_ExternalTrigConv=ADC_Externa lTrigConv_None;/*!!!!!!! таймер 1 по захвату-сравнению? Почитать*/
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Righ t;
ADC_InitStructure.ADC_NbrOfChannel = 1; /*кол-во каналов АЦП */
ADC_Init(ADC1, &ADC_InitStructure);
/*Разрешение DMA*/
ADC_DMACmd(ADC1, ENABLE);
/*Разрешение на прерывание по окончанию преобразования*/
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
/*Настройка каналов*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*Калибровка АЦП*/
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while (ADC_GetCalibrationStatus(ADC1));
/*Программный запуск преобразования регулирной группы*/
ADC_SoftwareStartConvCmd(ADC1,ENABLE); |
|
|
|
|
22.02.2012, 17:20
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 ADC + DMA в циклическом режиме
для начала пара вопросов:
какие параметры у измеряемого сигнала? (частота, размах)
как я понимаю, задающего генератора для съема отсчетов с ацп у вас нет?
и вроде полной настройки ацп тоже, кстати, нет?
|
|
|
|
24.02.2012, 16:14
|
|
Частый гость
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: STM32 ADC + DMA в циклическом режиме
Сообщение от Hives
|
для начала пара вопросов:
какие параметры у измеряемого сигнала? (частота, размах)
как я понимаю, задающего генератора для съема отсчетов с ацп у вас нет?
и вроде полной настройки ацп тоже, кстати, нет?
|
1. Пытаюсь измерить параметры трехвазной цепи (экспериментирую, пока с одной фазой), измеряется только положительная полуволна, отрицательная отсекается, стоит делитель напряжения примерно 500 к 1, при максимальном значении напряжения, примерно 310 В, значение измеряемое АЦП состовляет примерно 23% от его диапазона.
2. Что за задающий генератор? Я так понимаю, он нужен для того, чтобы знать DMA момент получения значения АЦП, так? Я про это не нашел, но подумал что контроллер сам разберется, когда я включил DMA у АЦП:
Код:
|
/*Разрешение DMA*/
ADC_DMACmd(ADC1, ENABLE); |
3. Чего не хватает? Буду очень счастлив если подскажите.
Напомню, что в нециклическом режиме DMA, все работает корректно.
|
|
|
|
24.02.2012, 17:16
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 ADC + DMA в циклическом режиме
1. написал много и ниочем, похоже сам не уверен что именно меряешь
2. генератор нужен чтобы точно знать с какой частотой идет выборка АЦП
пример - меряешь синусоиду 50Гц с частотой 50гц - получаешь прямую линию - удивляешься, что не работает
меряешь синусоиду 50Гц с частотой 5000гц - получаешь синусоиду - все ok
зы пересмотрел конфиг - вроде все на месте, первый раз наверно что то проглядел
|
|
|
|
24.02.2012, 18:49
|
|
Частый гость
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: STM32 ADC + DMA в циклическом режиме
Надо измерять напряжение и ток каждой фазы 3-х фазной сети, затем вычислять дейсствующие значения, активную и реактивную мощность.
Hives, спс за потраченное время. Буду думать дальше, если что, отпишусь.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:02.
|
|