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

 
 
> STM32 DAC, организация DDS
dimka76
сообщение Jul 13 2011, 12:49
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Не поможите с идеей как на STM32 с помощью встроенного DAC и возможно DMA организовать DDS.
Нужно получить синусоиду с плавно перестраиваемой частотой в диапозоне от 5 до 20000 Гц.
Частота дискретизации предпологается быть фиксированной и равняться 200 кГц. Частота ядра 20 МГц (0 wait state).

Если решать задачу в лоб без применения DMA с таблицей значений DAC, то для формировании нового номера ячейки этой таблицы в прерывании таймера уйдет достаточно большое время. Прерывание таймера будут каждые 100 тактов из них 24 это вход и выход из прерывания плюс какие-то действия в нем.
Если с DMA, то непонятно как должна быть организована таблица. Если ее формировать в после принятия команды смены частоты и переключать DMA на нее, то в худшем случе при требуемой частоте синуса в 5 Гц надо будет 40000 байт (для 8-ми битного ЦАП), а у меня нет столько памяти.

Нужет какой-то хитрый приемчик.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dimka76
сообщение Jul 15 2011, 06:48
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Все замечательно получилось. Спасибо за идею.
Код в прерывании DMA
Код
#define DMA_BUF_SZ    (512UL)

void DMA1_Channel3_IRQHandler(void)
{
    uint32_t i, pos;
    uint32_t isr_status = DMA1->ISR;

    if( (isr_status & DMA_ISR_HTIF3) || (isr_status & DMA_ISR_TCIF3) )
    {
        GPIOA->ODR |= (1<<11);
        if(isr_status & DMA_ISR_HTIF3) /* half buffer */
        {
            pos = 0;
            DMA1->IFCR = DMA_IFCR_CHTIF3;
        }
        if(isr_status & DMA_ISR_TCIF3) /* full buffer */
        {
            pos = DMA_BUF_SZ/2;

            DMA1->IFCR = DMA_IFCR_CTCIF3;
        }
        for(i=0; i<(DMA_BUF_SZ/2); ++i)
        {
            DMA_buf[pos] = 127+sin_table[table_index >> 23]/amp;
            table_index += delta;
            ++pos;
        }
        GPIOA->ODR &= ~(1<<11);
    }
}


Компилятор GCC, оптимизация O3, получилось в прерывании находится 12.2% времени, т.е. сквжность по ножке PA11 составляет 12.2%


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 15 2011, 08:48
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



я тоже собираюсь делать похожее на dds но както у меня по другому идея складывается..

1. заполняем dma буффер период высококачественного 12 битного синуса с числом отсчетов = 2байта * максимальный допустимый размер буфера под синус в вашей задачи
2. говорим DMA источник - буфер в памяти, назначение - ЦАП, режим циклический с инкрементом адреса
таким образом дма будет по кругу лазить по периоду синуса и заряжать цап его отсчетами.
3, теперь про период синуса - говрим dma что он тригируется от таймера - таким образом , dma будет выпонтяь выборку из таблицы и запись в цап по сигналу с таймера.
4, заряжаем таймер на время равное преиод требуемого синуса * число отсчетов в таблице.

все будет работать. у ST есть appnotes как это деать http://www.st.com/internet/com/TECHNICAL_R.../CD00259245.pdf

тут же можно разом делать с двух каналов ЦАП квадратуры
тутже на лету меня период таймера можно делать частотную модуляцию/манипуляцию, а фазовую только модуляцию
для фазовой манипуляции прйдется остановить dma , переставить счетк позиции чтения и заново включить.

квадратуры у меня генерятся но менять на непрерывно на лету частоту я не пробывал - могу поробывать

никаких прерываний ненадо! это если только более сложноая модуляция или вообще случайный сигнал - тогда - половинки буфера, с одной читается, другая апдейтится.
для генерации синуса цап еще както сам умеет его генерить - у него такой режим есть, тогда нада наверно только таймер для задания интервала отсчетов и сам цап без ДМА. но это нада проверять я не включал его так

товарищи которые рекомендуют tiny могут идти тудаже куда они арм послали... тоест в кружок пиоНЭров ! серьезных людей нечего баламутить. я даже более скажу - работал в коллективе где ВСЕ делали на мегах, неважно - по задаче инструмент или нет. в результате были монстры на 4-5 мегах + горы глюков и внутренней жизни. на вопрос что давайте поставим один мелкий армик
- неееетт!!!! мы не сможем проконтролировать что ты там сделал ! а если ты уйдеш от нас???
- ну дык давайте вместе со мной изучим новую элементную базу...
- !!???###%%% ...нах

в результате я ушел, а старые деды у котрых моск засох остались, задачи со временем меняются а методы работы и решения остались там прежние по сей день.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dimka76   STM32 DAC   Jul 13 2011, 12:49
- - scifi   Есть предложение: зациклить DMA по таблице, покрыв...   Jul 13 2011, 13:00
- - ukpyr   ЦитатаЕсли с DMA, то непонятно как должна быть орг...   Jul 13 2011, 13:10
- - SSerge   DMA у STM умеет выдавать прерывание на каждую поло...   Jul 13 2011, 14:06
- - dimka76   Спасибо всем принявшим участие ))) Мне понрвилась...   Jul 14 2011, 04:14
|- - AHTOXA   А как будет при работе с DMA обеспечиваться частот...   Jul 14 2011, 05:41
|- - dimka76   Цитата(AHTOXA @ Jul 14 2011, 09:41) А как...   Jul 14 2011, 09:00
- - muravei   Цитата(dimka76 @ Jul 13 2011, 15:49) Нужн...   Jul 14 2011, 07:36
|- - dimka76   Цитата(klen @ Jul 15 2011, 12:48) 4, заря...   Jul 15 2011, 11:01
||- - klen   Цитата(dimka76 @ Jul 15 2011, 15:01) В эт...   Jul 16 2011, 05:20
|- - muravei   Цитата(klen @ Jul 15 2011, 12:48) товарищ...   Jul 16 2011, 07:57
|- - klen   Цитата(muravei @ Jul 16 2011, 11:57) А по...   Jul 16 2011, 16:17
- - IgorKossak   Давайте договоримся, господа, что раз уж тема поме...   Jul 16 2011, 17:04
- - muravei   Цитата(klen @ Jul 16 2011, 20:17) шестое ...   Jul 17 2011, 09:04


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

 


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


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