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

 
 
> 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
Ответов
Сергей Борщ
сообщение Dec 12 2012, 07:24
Сообщение #2


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
RabidRabbit
сообщение Dec 12 2012, 15:51
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(Сергей Борщ @ Dec 12 2012, 11:24) *
Когда будете работать с PDC обратите внимание на такой момент - у вас АЦП стартует от таймера и отсчеты выдает независимо от того - успели вы перезарядить PDC на новый буфер или нет. Так вот, если вы будете перезаряжать PDC слишком долго и АЦП успеет сделать преобразование, у вас один отсчет потеряется и все остальнвые будут лежать в буфере со сдвигом, т.е левый и правый каналы перепутаются. Отследить такую ситуацию можно по флагу RXBUFF. К сожалению ни циклических пересылок, ни цепочек буферов в PDC SAM7 не предусмотрено.

Как же так? sm.gif Я думал, что тяжело не успеть обновить два регистра PDC за время, пока отработает половина буфера (а это будет одно преобразование только в случае если размер буфера == 1, что странно), ну если только программа совсем повиснет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 13 2012, 07:09
Сообщение #4


Гуру
******

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



QUOTE (RabidRabbit @ Dec 12 2012, 17:51) *
Как же так? sm.gif Я думал, что тяжело не успеть обновить два регистра PDC за время, пока отработает половина буфера
Обработка бывает разной. Кроме обработки могут быть и другие задачи. Если размер буфера недостаточен - можно и не успеть. Я описал ситуацию чтобы автор знал, куда копать в случае, если вдруг обнаружит что каналы путаются.


--------------------
На любой вопрос даю любой ответ
"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
|- - 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   ЦитатаТак вот, если вы будете перезаряжать PDC сли...   Dec 12 2012, 09:40
|- - Сергей Борщ   QUOTE (Jack_of_Shadows @ Dec 12 2012, 11...   Dec 12 2012, 14:30
- - 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 - 17:03
Рейтинг@Mail.ru


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