Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 22.02.2012, 11:04  
Nik_UFO
Частый гость
 
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Nik_UFO на пути к лучшему
По умолчанию 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);
Реклама:
Nik_UFO вне форума  
Непрочитано 22.02.2012, 17:20  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: STM32 ADC + DMA в циклическом режиме

для начала пара вопросов:
какие параметры у измеряемого сигнала? (частота, размах)
как я понимаю, задающего генератора для съема отсчетов с ацп у вас нет?
и вроде полной настройки ацп тоже, кстати, нет?
Hives вне форума  
Непрочитано 24.02.2012, 16:14  
Nik_UFO
Частый гость
 
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Nik_UFO на пути к лучшему
По умолчанию Re: STM32 ADC + DMA в циклическом режиме

Сообщение от Hives Посмотреть сообщение
для начала пара вопросов:
какие параметры у измеряемого сигнала? (частота, размах)
как я понимаю, задающего генератора для съема отсчетов с ацп у вас нет?
и вроде полной настройки ацп тоже, кстати, нет?
1. Пытаюсь измерить параметры трехвазной цепи (экспериментирую, пока с одной фазой), измеряется только положительная полуволна, отрицательная отсекается, стоит делитель напряжения примерно 500 к 1, при максимальном значении напряжения, примерно 310 В, значение измеряемое АЦП состовляет примерно 23% от его диапазона.

2. Что за задающий генератор? Я так понимаю, он нужен для того, чтобы знать DMA момент получения значения АЦП, так? Я про это не нашел, но подумал что контроллер сам разберется, когда я включил DMA у АЦП:
Код:
/*Разрешение DMA*/
ADC_DMACmd(ADC1, ENABLE);
3. Чего не хватает? Буду очень счастлив если подскажите.
Напомню, что в нециклическом режиме DMA, все работает корректно.
Nik_UFO вне форума  
Непрочитано 24.02.2012, 17:16  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: STM32 ADC + DMA в циклическом режиме

1. написал много и ниочем, похоже сам не уверен что именно меряешь
2. генератор нужен чтобы точно знать с какой частотой идет выборка АЦП
пример - меряешь синусоиду 50Гц с частотой 50гц - получаешь прямую линию - удивляешься, что не работает
меряешь синусоиду 50Гц с частотой 5000гц - получаешь синусоиду - все ok
зы пересмотрел конфиг - вроде все на месте, первый раз наверно что то проглядел
Hives вне форума  
Сказали "Спасибо" Hives
Nik_UFO (24.02.2012)
Непрочитано 24.02.2012, 18:49  
Nik_UFO
Частый гость
 
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Nik_UFO на пути к лучшему
По умолчанию Re: STM32 ADC + DMA в циклическом режиме

Надо измерять напряжение и ток каждой фазы 3-х фазной сети, затем вычислять дейсствующие значения, активную и реактивную мощность.
Hives, спс за потраченное время. Буду думать дальше, если что, отпишусь.
Nik_UFO вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM8L152C6 DAC+DMA+SWTRIG dosikus Микроконтроллеры, АЦП, память и т.д 0 08.08.2011 18:14
DMA в ATxmega vav618 Микроконтроллеры, АЦП, память и т.д 1 03.04.2010 10:57
adc avr operator Proteus, KiCAD и другие ECAD 9 27.11.2009 09:21
Работаем каналом DMA процессора TMS320VC5402 на DSK 5402 aziz1971 Цифровые сигнальные процессоры 0 14.10.2008 21:18
С микрофона в ADC Vas2 Микроконтроллеры, АЦП, память и т.д 3 15.03.2008 11:05


Часовой пояс GMT +4, время: 22:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot