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

 
 
> 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
Ответов
hd44780
сообщение Dec 17 2012, 10:51
Сообщение #2


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

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



Jack_of_Shadows, у меня кучи и динамического распределения нет, все буфера статические и фиксированные.

// Размер буфера одного канала
#define ADC_DATA_SIZE 512

// Буфер ADC PDC (размер под 2 канала)
static volatile byte ADCbuf [ADC_DATA_SIZE*2];
static volatile byte ADCbufNext [ADC_DATA_SIZE*2];

Регистры инициализирую так:

// Буфер данных
AT91C_BASE_ADC->ADC_RPR = (dword)ADCbuf;
AT91C_BASE_ADC->ADC_RNPR = (dword)ADCbufNext;

// Set receive counter register (number of transfers)
AT91C_BASE_ADC->ADC_RCR = sizeof ( ADCbuf );
AT91C_BASE_ADC->ADC_RNCR = sizeof ( ADCbuf );

byte == unsigned char (через typedef). Может ещё sizeof косячит - не проверял его ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
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   ЦитатаТак вот, если вы будете перезаряжать 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


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

 


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


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