Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

DMA ADC DSPIC33

Чт окт 08, 2020 20:42:02

Всем добрый день! Хочется реализовать обработку звуковых данных на dspic33ep256gp506. Никак не пойму как настроить DMA так,чтобы с 1 канала АЦП циклично в буфер считывать 512 или 1024 значения.
А также непонятно,как реализовать вывод из памяти через DMA данные на порт ввода/вывода. Буду рад любой помощи.
Компилятор XC16.

Re: DMA ADC DSPIC33

Сб окт 10, 2020 16:16:19

Для начала расскажите какого рода обработку звукового потока вы желаете сделать. А потом я расскажу вам как настроить ДМА с АЦП.
Есть смутное подозрение, что вы пытаетесь сесть не в ту телегу...

Re: DMA ADC DSPIC33

Сб окт 10, 2020 16:37:15

Хочется пощупать всякого рода фильтры и преобразования Фурье. Для начала хотя бы с 1 каналом и частотой выборок 10 килогерц. Потом может получится сделать что-то вроде sdr хотя бы на 1 вид модуляции и с выводом спектра в небольшом диапазоне. Может потом через пару лет получится оформить в качестве курсача). А про вид МК - взял их 8 штук по низкой цене,тк раньше с ними работал,но без dma и dsp

Re: DMA ADC DSPIC33

Сб окт 10, 2020 19:45:32

Код:
int16_t    bufferDMA[<размер буфера>];
...................
...................
// init DMA0
DMA0CON = 0;
DMA0CONbits.MODE = 0b00; //Continuous - после завершения пакета авт. перезапуск
// или:
//DMA0CONbits.MODE = 0b01; //One-Shot - после завершения пакета выключение канала
DMA0CONbits.AMODE = 0b00; //Register Indirect with Post-Increment mode
DMA0CONbits.DIR = 0b00; //Reads from peripheral address, writes to RAM address
DMA0CONbits.SIZE = 0; //Word
DMA0REQ = 0b1101; // request from ADC1
DMA0STA = (uint16_t)&bufferDMA;
DMA0PAD = (uint24_t)&ADC1BUF0;
DMA0CNT = <размер буфера>-1;
// init ADC with DMA
AD1CON4bits.ADDMAEN = 1;
...................
...................
// где нужно запускаем DMA:
DMA0CONbits.CHEN = 1;

Могу ошибаться в синтаксисе uint24_t , нужно посмотреть в хедере stdint.h
Настройку самого АЦП я не привел. Это зависит от конкретной реализации. Там же нужно указать источник запусков АЦП.
Учтите, что DSP обработка с помощью библиотек самого XC16 не слишком эффективна по скорости. Лучше писать АСМ-вставки или АСМ-функции.
При семплировании АЦП 10 кспс верхняя частота сигнала составит максимум 2,5...3 кГц (с учетом антиалиасинга).
Реально сделать SDR с АМ модуляцией примерно до 50 кГц несущей. Выше не хватит производительности МК.
Бабочка БПФ - это минимум НЕТТО 23 инструкции. Брутто добавятся вызовы бабочки и адресация данных и коэффициентов. То есть это контроллер не для потокового звука. Звук - это очень серьезно. Эквалайзер на звук - уровень топовых DSP от Техаса примерно за 20...30 баксов за кристалл.
ЗЫ. Не очень понял зачем вам выводить через DMA в порт?
Последний раз редактировалось КРАМ Сб окт 10, 2020 20:37:53, всего редактировалось 1 раз.

Re: DMA ADC DSPIC33

Сб окт 10, 2020 20:37:35

Спасибо огромное.
Хотел прицепить к порту ЦАП чтобы выводить звук обратно). Но потом погуглил более внимательно и решил на SPI прицепить что-то типа tda1543 чтобы не возится с мастер клоком.
По идее там же можно не парится с переключением каналов левый/правый,т.к. всего 1 канал, и поэтому,если не ошибаюсь, spi и i2s не отличаются.

Re: DMA ADC DSPIC33

Сб окт 10, 2020 20:42:48

Всегда нужно отдавать себе отчет в назначении конкретного семейства МК. dsPIC33 более всего заточен под моторно-питающие приложения, а так же отлично работает в обнаружителях сигналов с несущей до 150..250 кГц. Обнаружитель не требует потоковой обработки. Накопил сигнал - обработал. Пауза между накоплениями массивов определяется скоростью обнаружения, а не целостностью непрерывного сигнала на выходе.
Ответить