реклама на сайте
подробности

 
 
> ADC+DMA STM32F407, Как определить время преобразования?
Haamu
сообщение Jan 13 2014, 08:40
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Необходимо измерить сигнал с нескольких каналов последовательно, сохраняя данные в память через DMA. Измерять надо крайне быстро. Действую таким образом: выбираю канал, запускаю АЦП. Вот кусок кода:
Код
if(ModeStruct.Discreteness_hall) {
    if ((step_counter % ModeStruct.Discreteness_hall) == 0) {
        ADC1->SQR3 = ADC_Channel_0;
        ADC1->CR2 |= ADC_CR2_SWSTART;    //Start ADC
    }
}
if (ModeStruct.Discreteness_l) {
    if ((step_counter % ModeStruct.Discreteness_l) == 0) {
        ADC1->SQR3 = ADC_Channel_1;
        ADC1->CR2 |= ADC_CR2_SWSTART;    //Start ADC
    }
}
if (ModeStruct.Discreteness_diff) {
    if ((step_counter % ModeStruct.Discreteness_diff) == 0) {
        ADC1->SQR3 = ADC_Channel_2;
        ADC1->CR2 |= ADC_CR2_SWSTART;    //Start ADC
    }
}

Вот инициализация (тоже кусок):
Код
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStruct);

Столкнулся с такой проблемой, что в какой-то момент очередное преобразование АЦП запускается до того, как завершилось предыдущее, после чего отключается DMA.
Подскажите, как максимально быстро можно проверить, завершилось ли предыдущее преобразование, можно ли запускать следующее?
Пробовал проверять таким вот образом:
Код
ADC1->SQR3 = ADC_Channel_0;
ADC1->CR2 |= ADC_CR2_SWSTART;    //Start ADC
while(!(ADC1->SR & (uint32_t)ADC_FLAG_EOC)) {}
ADC1->SR &= ~((uint32_t)ADC_FLAG_EOC);

Без DMA такой способ работает. Но когда включаю DMA, то флаг окончания преобразования не поднимается, видимо его DMA раньше перехватывает и сам сбрасывает.
Была мысль делать небольшую задержку после запуска преобразования, но что-то я запутался, как рассчитать время, необходимое для завершения перобразования. А конкретно, как определить часосту тактирования АЦП? Частота ядра в моем случае 168МГц, соответстсвенно шина APB2 работает на частоте 84МГц. Значит и частота АЦП 84МГц, или есть еще какие-то предделители? Вводит в заблуждение предделитель в ADC common control register. Учитывается ли этот регистр при работе с одним АЦП или используется только когда запускаю 2 или 3 АЦП одновременно?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
HardEgor
сообщение Jan 16 2014, 16:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Haamu @ Jan 13 2014, 15:40) *
Была мысль делать небольшую задержку после запуска преобразования, но что-то я запутался, как рассчитать время, необходимое для завершения перобразования. А конкретно, как определить часосту тактирования АЦП? Частота ядра в моем случае 168МГц, соответстсвенно шина APB2 работает на частоте 84МГц. Значит и частота АЦП 84МГц, или есть еще какие-то предделители? Вводит в заблуждение предделитель в ADC common control register. Учитывается ли этот регистр при работе с одним АЦП или используется только когда запускаю 2 или 3 АЦП одновременно?


Вы немного не понимаете как всё работает, смотрим в даташит и видим что максимальная частота работы АЦП 36МГц при питании выше 2.4В, большую частоту на него подавать нельзя - никто не гарантирует что он будет правильно работать. Следовательно предделитель синхронизации АЦП надо выставлять так чтобы частота не была превышена.
Т.е. если на APB2 84MHz, тогда надо ставить предделитель 3 и получаем 28МГц, а если поставим 2 - получим 42МГц - превышение. Дальше, в даташите написано что максимальное количество выборок которое сможет сделать АЦП - 2 мегасэмпла.Вот это ваш предел оцифровки, с такой скоростью идут данные от АЦП. Еще есть вариант когда включается Interleave Dual или Triple, тогда можно достичь 6 мегасэмплов.
А ДМА не ошибается, возможно как раз была превышена частота.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Haamu   ADC+DMA STM32F407   Jan 13 2014, 08:40
- - MiklPolikov   Вы неправильно подходите к задаче. 1)Зачем запуска...   Jan 16 2014, 02:36
|- - Haamu   Цитата(MiklPolikov @ Jan 16 2014, 06:36) ...   Jan 16 2014, 11:54
|- - MiklPolikov   Цитата(Haamu @ Jan 16 2014, 15:54) Какой ...   Jan 16 2014, 12:35
|- - Сергей Борщ   Цитата(Haamu @ Jan 16 2014, 13:54) Я расс...   Jan 17 2014, 12:16
|- - HardEgor   Product Specifications Table 67. ADC characteristi...   Jan 17 2014, 18:24
|- - Haamu   Цитата(HardEgor @ Jan 17 2014, 22:24) Pro...   Jan 20 2014, 12:55
|- - HardEgor   Ну так можно снизить системную частоту и подобрать...   Jan 20 2014, 15:34
|- - Falkon_99   В тему про АЦП, у меня STM32F207 Настроил преобра...   Feb 22 2014, 20:59
|- - ViKo   Цитата(Falkon_99 @ Feb 22 2014, 23:59) На...   Feb 23 2014, 15:31
|- - Falkon_99   я прозрел! От частоты АЦП зависят результвты п...   Feb 23 2014, 17:08
|- - scifi   Цитата(Falkon_99 @ Feb 23 2014, 21:08) В ...   Feb 23 2014, 18:00
|- - Falkon_99   TS_temp ADC sampling time when reading the tempera...   Feb 24 2014, 07:52
|- - Haamu   HardEgor, подскажите пожалуйста, где именно в дата...   Jan 17 2014, 11:42
- - vlad_new   Проверте не попадаете ли Вы под еррату с Vbat (Bat...   Feb 24 2014, 13:14


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 19:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016