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

 
 
> AT91SAM7xxxx, ADC, 2 канала и PDC
hd44780
сообщение Dec 10 2012, 13:17
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.

AT91SAM7S256 цифрует стереозвук встроенным АЦП (ADC7-левый, ADC6-правый канал) и далее обрабатывает эти выборки. Выборки сейчас по 512 байт.

Сейчас сделано "как в AVR" - запуск АЦП по сигналу TIOA1 ~24kHz, съём данных в прерывании АЦП. Каналы АЦП переключаются в прерывании.

Код
// Прерывание АЦП - один из каналов завершил преобразование
void ADC_IrqHandler(void)
{
    dword status;
    word wValue;
    
    status = ADC_GetStatus(AT91C_BASE_ADC);
    
    if ( (status & (1<<ADC_CHANNEL_LEFT) ) !=0  )
    { // левый канал закончил преобразование
      wValue = AT91C_BASE_ADC->ADC_CDR7;

      // Включить правый канал
      ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_RIGHT );
      ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_RIGHT );
      
      adcDataLeft [ dataPosLeft ] = wValue >> 2;
      dataPosLeft ++;
      if ( dataPosLeft == ADC_DATA_SIZE )
      {
        // останов преобразований
        StopConversion ( );
        conversionDone = 1;
      } // if
    } // if
  
    if ( (status & (1<<ADC_CHANNEL_RIGHT) ) !=0  )
    { // правый канал закончил преобразование
      // AT91C_BASE_ADC->ADC_CDR6 - регистр канала
      wValue = AT91C_BASE_ADC->ADC_CDR6;

      // Включить левый канал
      ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT );
      ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_LEFT );
      
      adcDataRight [ dataPosRight ] = wValue >> 2;
      dataPosRight ++;
      if ( dataPosRight == ADC_DATA_SIZE )
      {
        // останов преобразований
        StopConversion ( );
        conversionDone = 1;
      } // if
    } // if
} // ADC_IrqHandler


Процесс начинается с левого канала:
ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT );
ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_LEFT );

Это работает нормально. Результирующая частота дискретизации получается, конечно, в 2 раза меньше, но я сейчас не об этом.

Я где-то на форумах читал, что если написать
ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT | ADC_CHANNEL_RIGHT );
ADC_EnableIt ( AT91C_BASE_ADC, ( 1 << ADC_CHANNEL_LEFT ) | ( 1 << ADC_CHANNEL_RIGHT ) );
то он будет сам щёлкать каналы по очереди. Попробовал - не работает. Точнее сказать - работает только левый канал - ADC7. Условие для правого канала вообще никогда не срабатывает. Проверял по DBGU.
Может я неправильно включаю этот режим... Или чего-то недопонимаю...

Вопрос - может ли он сам переключать каналы? Ведь зачем-то в регистрах сделано по битику на канал (а на как в AVR-ах ADMUX=7 и 6 туда уже одновременно не запишешь)?

Вопрос особенно актуален, если задействовать PDC. Получать 512 байт сперва с одного, потом 512 с другого, да ещё и с задержками на перепрограммирование ADC/PDC - как-то "некошерно", необходима как можно большая синхронность в оцифровке каналов. А это - только оцифровка каналов по очереди.
Не считая установки 2-х независимых АЦП

Спасибо.

PS.
Замечания типа "Омар фигня, лобстер круче", где омар==AT91SAM7, лобстер==STM32 просьба не писать. Я прекрасно знаю, что в STM32 есть 2-3 независимых АЦП и прочие плюшки, но пока интересует исключительно AT91SAM7.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Jack_of_Shadows
сообщение Dec 12 2012, 09:40
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-10-10
Пользователь №: 60 513



Цитата
Так вот, если вы будете перезаряжать PDC слишком долго и АЦП успеет сделать преобразование, у вас один отсчет потеряется и все остальнвые будут лежать в буфере со сдвигом, т.е левый и правый каналы перепутаются

хотелось бы уточнить: в похожей ситуации я настраиваю PDC на работу с несколькими каналами, подсовываю ему буфер и включаю прерывания End of Receive Buffer и Receive Buffer Full. Я правильно понимаю, что когда прерывание срабатывает, я должен успеть:
передать PDC новый буфер до того, как пройдет хотя бы одно преобразование (чтобы нумерация каналов не сбилась)
обработать данные из буфера до того, как АЦП успеет заполнить следующий (чтобы данные не затерлись)
?

upd:
понял что я не прав. PDC подсовывается адреса двух буферов, RPR - куда читать сейчас, RNPR - куда читать когда закончится первый буфер. По прерыванию End of Receive Buffer мне нужно снова указывать буфер RNPR? Немного запутался, можно ли поподробнее рассказать про случай, который я процитировал вначале. У меня имеется уже готовая чужая программа, в которой периодически проявляются проблемы перепутывания каналов АЦП, читаемых через PDC.

upd:
пока никто не отвечает, кажется у меня очередное просветление: если программа чтения АЦП укажет при запуске два буфера RPR/RNPR и по прерыванию ENDRX будет своевременно их "перезаряжать" - все будет отлично. Если же программа затупит и в какой-то момент ни одного буфера не будет задано - все что в это время оцифровывает АЦП потеряется. При использовании нескольких каналов соответственно может потеряться часть из них, и нумерация собьется. Верно?

Сообщение отредактировал Jack_of_Shadows - Dec 12 2012, 12:55
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 12 2012, 14:30
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jack_of_Shadows @ Dec 12 2012, 11:40) *
Если же программа затупит и в какой-то момент ни одного буфера не будет задано - все что в это время оцифровывает АЦП потеряется. При использовании нескольких каналов соответственно может потеряться часть из них, и нумерация собьется.
Совершенно верно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hd44780   AT91SAM7xxxx, ADC, 2 канала и PDC   Dec 10 2012, 13:17
- - RabidRabbit   Цитата(hd44780 @ Dec 10 2012, 17:17) Я гд...   Dec 11 2012, 05:47
|- - hd44780   Цитата(RabidRabbit @ Dec 11 2012, 07:47) ...   Dec 11 2012, 07:32
- - hd44780   AT91C_BASE_ADC->ADC_CHER и AT91C_BASE_ADC->A...   Dec 11 2012, 18:08
- - RabidRabbit   Я думаю, с PDC разберётесь с полпинка, там всё про...   Dec 12 2012, 06:25
|- - hd44780   Цитата(RabidRabbit @ Dec 12 2012, 08:25) ...   Dec 12 2012, 07:03
- - Сергей Борщ   Когда будете работать с PDC обратите внимание на т...   Dec 12 2012, 07:24
|- - RabidRabbit   Цитата(Сергей Борщ @ Dec 12 2012, 11:24) ...   Dec 12 2012, 15:51
|- - Сергей Борщ   QUOTE (RabidRabbit @ Dec 12 2012, 17:51) ...   Dec 13 2012, 07:09
|- - RabidRabbit   Цитата(Сергей Борщ @ Dec 13 2012, 11:09) ...   Dec 14 2012, 07:28
|- - Сергей Борщ   QUOTE (RabidRabbit @ Dec 14 2012, 09:28) ...   Dec 14 2012, 09:59
- - hd44780   Спасибо, на будущее учту. Но пока преобразования ...   Dec 12 2012, 08:19
- - Jack_of_Shadows   Во время стационарной работы конечно такое маловер...   Dec 13 2012, 08:06
- - hd44780   Jack_of_Shadows, а Вы не запускайте шарманку во вр...   Dec 13 2012, 09:39
- - Jack_of_Shadows   hd44780, сейчас то, когда я разобрался, именно так...   Dec 13 2012, 10:01
- - hd44780   Народ, я не понял, зачем регистры RNPR (Receive Ne...   Dec 14 2012, 12:21
|- - Сергей Борщ   QUOTE (hd44780 @ Dec 14 2012, 14:21) Наро...   Dec 14 2012, 13:10
- - hd44780   Спасибо, примерно понял, но хочу уточнить. Если я...   Dec 14 2012, 13:28
|- - Сергей Борщ   QUOTE (hd44780 @ Dec 14 2012, 15:28) мне ...   Dec 14 2012, 14:29
- - hd44780   Сергей Борщ, спасибо. Понял. Пошёл доделывать   Dec 14 2012, 15:02
- - hd44780   Написал так: 1. Инициализация АЦП Кодvoid Config...   Dec 14 2012, 18:46
|- - RabidRabbit   Я немного не понимаю, инициализация указателей для...   Dec 15 2012, 07:35
|- - hd44780   Цитата(RabidRabbit @ Dec 15 2012, 09:35) ...   Dec 15 2012, 09:02
- - RabidRabbit   Я бы убрал вот это // Разрешить прерывания каналов...   Dec 15 2012, 13:19
- - hd44780   Поправил. Прерывания каналов вырубил, добавил AT...   Dec 15 2012, 15:34
- - Jack_of_Shadows   hd44780, памяти для буфера ацп в куче точно хватае...   Dec 17 2012, 10:23
- - hd44780   Jack_of_Shadows, у меня кучи и динамического распр...   Dec 17 2012, 10:51


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

 


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


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