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

 
 
> ADC+DMA в STM32F107, Глюк DMA??
pr0m
сообщение Jan 31 2011, 11:36
Сообщение #1


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

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Всем привет.

Играюсь со слегка модицицированным примером для STM32F10x "RegSimul_DualMode" для ADC (из стандартной STM32F10xFWLib).
Там используются 2 ADC в режиме DualMode, 2 группы по 2 канала, после окончания конверсии каждой пары 32-битный результат складывается посредством DMA1 в буфер в ОЗУ. Так вот, я его переделал в том смысле, что зациклил процесс опроса (а не однократный опрос, как в оригинальном примере), после чего обнаружил несколько шокирующую картину - положение данных опроса в ОЗУ меняется от опроса к опросу, т.е. в том месте, где я ожидаю увидеть результат от каналов 1,2 через раз оказываются данные каналов 3,4, и наоборот.
Что это??? Только бы не глюк контроллера.... Собираюсь использовать его именно в режиме циклического опроса регулярной группы каналов АЦП.
Прилагаю кейловский проект.
Прикрепленные файлы
Прикрепленный файл  Project.rar ( 25.63 килобайт ) Кол-во скачиваний: 29
 


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Jan 31 2011, 11:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Разбираться времени нет. Прикладываю свой модуль АЦП, он сканирует каналы 0..9 по кругу, складывая в буфер. Может быть, пригодится.
Прикрепленные файлы
Прикрепленный файл  adc.txt ( 2.41 килобайт ) Кол-во скачиваний: 230
 
Go to the top of the page
 
+Quote Post
pr0m
сообщение Jan 31 2011, 20:03
Сообщение #3


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

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Цитата(scifi @ Jan 31 2011, 14:42) *
Разбираться времени нет. Прикладываю свой модуль АЦП, он сканирует каналы 0..9 по кругу, складывая в буфер. Может быть, пригодится.

Спасибо, пока остановился на чём-то похожем. Дальше я эти наборчики отсчётов в прерывании таймера (частота дискретизации) накапливаю в буфер порядка 1К и передаю по ethernet-у. При таком подходе этот буферочек для 10 каналов представляет своего рода ящик, куда можно в любой момент за ними обратиться - уже готовенькие.

Я сначала по другому пути пошёл:
1. АЦП запустил в SCAN-mode, CONT=0 (по идее, остановка после конверсии группы регулярных каналов), аппаратный запуск от таймера (запускает с частотой дискретизации), DMA (кол-во передач=кол-во каналов), начальный адрес DMA - начало моего накопительного буфера (т.е. хотелось бы сразу кидать отсчёты в нужное место).
2. В прерывании по окончании DMA-передачи (предполагается, что DMA-передача заканчивается раньше очередного запуска АЦП от таймера) DMA отключал, обновлял счётчик передач и перенацеливал DMA на следующую позицию (+10 слов) в накопительном буфере, включал DMA. Приоритет обработчика прерываний DMA выше других.

Вот при таком подходе у меня и начиналась каша внутри 10-байтовых отрезков со сменой порядка отсчётов, причём сдвиг по кругу на произвольное и непостоянное число. Первая мысль была, что перезапуск АЦП от таймера происходил раньше окончания DMA-передачи. Но увеличение периода таймера до заведомо намного превышающей общее время конверсии группы каналов величины ситуации не поменяло. Тут-то мысль и остановилась. В чём порочность подхода?
Вобщем, пошёл пока по предложенному Вами пути.

Цитата(akimych @ Jan 31 2011, 19:01) *
Вот что мне не нравится в этом проекте, так это как организована работа с дма.
АЦП судя по настройкам непрерывно работает, а мы ему то включаем, то отключаем дма.
Я бы сделал иначе.
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
А в цикле надо ловить флаги DMA1_FLAG_HT1 и DMA1_FLAG_TC1 и обрабатывать буфер по половинке.

Да, Вы правы, примерчик неудачный, я его поправил - сделал так:

...
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
...
while(1)
{
/* Test on DMA1 channel1 transfer complete flag */
while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
/* Clear DMA1 channel1 transfer complete flag */
DMA_ClearFlag(DMA1_FLAG_TC1);


/* Disable DMA channel1 */
DMA1_Channel1->CCR &= 0xFFFFFFFE;

/* Update the Number of DMA transfer */
DMA1_Channel1->CNDTR = 2;
DMA1_Channel1->CMAR = (u32)ADC_DualConvertedValueTab;
DMA1_Channel1->CCR |= 0x00000001;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

И стало как дОлжно. Всё равно у меня в тылу остался вопрос, предыдущий пост.

Сообщение отредактировал pr0m - Jan 31 2011, 20:10


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pr0m   ADC+DMA в STM32F107   Jan 31 2011, 11:36
- - akimych   ЦитатаПрилагаю кейловский проект. Вот что мне не н...   Jan 31 2011, 16:01
- - akimych   ЦитатаВсё равно у меня в тылу остался вопрос, пред...   Feb 1 2011, 17:16
|- - pr0m   Цитата(akimych @ Feb 1 2011, 20:16) Не мо...   Feb 1 2011, 20:19
- - akimych   ЦитатаРазве такое возможно? Сложно сказать. Я не д...   Feb 1 2011, 22:23
|- - pr0m   Цитата(akimych @ Feb 2 2011, 01:23) Хм, а...   Feb 2 2011, 09:48
- - akimych   Правильно, я что-то стормозил, счетчик же к нулю с...   Feb 2 2011, 20:13
- - kan35   Во первых размер буфера посчитан не верно: КодDMA_...   Feb 12 2011, 05:14
|- - pr0m   Цитата(kan35 @ Feb 12 2011, 08:14) Во пер...   Feb 12 2011, 11:43
- - kan35   да, то, что идет работа синхронно 2 каналов я не у...   Feb 12 2011, 17:52
|- - pr0m   Цитата(kan35 @ Feb 12 2011, 20:52) да, то...   Feb 12 2011, 19:00
- - akimych   ЦитатаУже решил задачу, но посмотреть как другие д...   Feb 12 2011, 20:35
|- - pr0m   Цитата(akimych @ Feb 12 2011, 23:35) В че...   Feb 13 2011, 07:56
- - akimych   Да не, я пока разбирался, вдруг заметил, что если ...   Feb 13 2011, 11:26
|- - pr0m   Цитата(akimych @ Feb 13 2011, 14:26) Да н...   Feb 13 2011, 16:20
- - kan35   Работа ADC1 через HT и FT прерывания. Оцифровка 3 ...   Feb 14 2011, 06:19
- - akimych   ЦитатаТогда для эксперименту одновременно в DualMo...   Feb 15 2011, 11:05


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

 


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


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