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

 
 
> ADC3 в режиме сканирования и DMA2, Необъяснимые "лишние" данные и рассинхронизация
KnightIgor
сообщение Jul 21 2014, 12:04
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Здравствуйте, коллеги.

Не побеждается ADC3.

Имеем:
- STM32F103VC на 24MHz (не 72 для уменьшения потребления, т.к. есть back up на аккумуляторе),
- ADC3 в режиме сканирования трех каналов (11, 12 и 13), ADC тактируется 12MHz.
- естественно DMA2, канал 5, который складывает оцифрованное в буфер U16 длиной 32 триплета - всего 96 слов; таких буферов, конечно, два: один заполняем, из другого читаем.
- таймер 8, который с частотой 100Hz (замеряно) пихает ADC3 своим событием обновления (TRGO).
- прерывание от завершения передач DMA (по флагу TC), которое устанавливает флаг готовности буфера, переключает буферы и перегружает DMA канал.

В принципе, вся кухня работает. Но.
После рестарта может случиться, что данные оказываются смещенными в буфере: например, на месте канала 11 будут данные из канала 12, на месте 12 - из 13, ну а на месте 13 - из 11. Может случиться и сдвиг более дальнего порядка - в 11 - из 13, ну и так далее, по кругу. Причем этот сдвиг случается один раз при старте системы, а в процессе работы все остается фиксированно, без перескоков.

Я тщательно проанализировал последовательность инициализации и попытался в прерывании DMA сбрасывать бит STRT в ADC3->SR и "прочищать" ADC3->DR (чтением) перед тем как перегрузить DMA. Тем не менее в прерывании я мог всегда(!) поймать ситуацию при самом _первом_ вхождении, когда после перегрузки DMA его счетчик тут же уменьшался на единицу, словно ADC3 припрятал запрос к DMA несмотря на "прочистку".
Последнее, что я сделал, - поднял приоритет DMA до "kill 'em all", а в прерывании - выключал бит DMA в ADC3->CR2, делал прочистку ADC и перегрузку DMA и включал ADC3->CR2 снова. На моей плате это вроде привело к успеху (счетчик DMA не уменьшался сразу), а вот у коллеги - нет.

Идеи?
Заранее благодарен.

Сообщение отредактировал KnightIgor - Jul 21 2014, 12:44
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlHakim
сообщение Jul 21 2014, 13:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474



Цитата(KnightIgor @ Jul 21 2014, 18:04) *
В принципе, вся кухня работает. Но.
После рестарта может случиться, что данные оказываются смещенными в буфере: например, на месте канала 11 будут данные из канала 12, на месте 12 - из 13, ну а на месте 13 - из 11. Может случиться и сдвиг более дальнего порядка - в 11 - из 13, ну и так далее, по кругу. Причем этот сдвиг случается один раз при старте системы, а в процессе работы все остается фиксированно, без перескоков.

вот недавно сам столкнулся с таким же. Нашел решение на этом же форуме. А именно сбрасывать регулярные каналы. И все заработал
вот мой код
Код

//=== Прерывания DMA ADC1 ===//
void DMA1_Channel1_IRQHandler(void)
{
    ADC1->CR2 &= ~ADC_CR2_DMA;// | ADC_CR2_ADON);        // выключаем DMA запросы АЦП
    ADC1->SR &= ~(ADC_SR_STRT);           // сброс флага Overrun и старта преобразования
    ADC1->SQR1 &= ~ADC_SQR1_L;            // сброс количества последовательных преобразований  [сброс указателя канала]
    DMA1_Channel1->CCR &= ~ (DMA_CCR_EN |DMA_CCR_TCIE);   //// деактивация 1го потока DMA1

    if(DMA1->ISR & DMA_ISR_TCIF1) EventFlags.Bit.ADCConvFinish = 1;    // проверяем прерывание по завершению передачи блока
    DMA1->IFCR=DMA_IFCR_CGIF1|DMA_IFCR_CTCIF1|DMA_IFCR_CHTIF1|DMA_IFCR_CTEIF1;  //снимаем биты в  DMA1->ISR (пока все)
}

//=== Прерывания TMR2 ===//
void TIM2_IRQHandler(void){   // Период - 160 мксек при частоте сети 50 Гц.
vu32 aa, cosa, cosb, cosc;
vu8 i;

  TIM2->SR &= ~TIM_SR_UIF;    // Снять флаг прерывания.

  DMA1_Channel1->CNDTR = 18;                  // указываем число пересылаемых данных 3 канала по 6-и перобразовании
  DMA1_Channel1->CCR |=  DMA_CCR_EN | DMA_CCR_TCIE;// запустили очередное преобразование ADC (должны успеть,ааа)

Go to the top of the page
 
+Quote Post



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

 


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


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