Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 22:21

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 01:34 
Только пришел

Зарегистрирован: 08 июн 2012, 01:03
Сообщения: 10
Делал генератор импульсов по примеру из блога zib, не получается использовать два канала dma в качестве источника для двух DAC.
Помогите, пожалуйста, понять, что я делаю неправильно.

Проблема такая, ниже код инициализации dma, так работает только один канал (второй, инициализированный последним), на первом канале осциллограф показывает нечто невнятное. Если закомментировать инициализацию второго канала, первый начинает работать.

Код:
      DMA_DeInit(DMA1_Channel3);   //dma channel 1
      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R1;
      DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&voidWaveLeft;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
      DMA_InitStructure.DMA_BufferSize = ARRAY_LENGHT(voidWaveLeft);
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_Init(DMA1_Channel3, &DMA_InitStructure);
      DMA_Cmd(DMA1_Channel3, ENABLE);
      DAC_Cmd(DAC_Channel_1, ENABLE);   //PA.04 is automatically connected to the DAC1
      DAC_DMACmd(DAC_Channel_1, ENABLE);   //Enable DMA for DAC Channel1

      DMA_DeInit(DMA1_Channel4);   //dma channel 2
      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R2;
      DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&voidWaveRight;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
      DMA_InitStructure.DMA_BufferSize = ARRAY_LENGHT(voidWaveRight);
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_Init(DMA1_Channel4, &DMA_InitStructure);
      DMA_Cmd(DMA1_Channel4, ENABLE);
      DAC_Cmd(DAC_Channel_2, ENABLE);   //PA.05 is automatically connected to the DAC2
      DAC_DMACmd(DAC_Channel_2, ENABLE);   //Enable DMA for DAC Channel2 */


Полный код здесь http://pastebin.com/K71ujVc1, если понадобится выложу проект для CooCox
Спасибо.
upd. убрал voidWave и сделал круговой буфер для dma


Последний раз редактировалось scythian 08 июн 2012, 16:41, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 11:56 
Старожил

Зарегистрирован: 31 янв 2011, 19:17
Сообщения: 437
Откуда: Москва
Есть подозрение, что не хватает частоты проца из-за чего нормально успевает отработать только 1 канал, а второй по остаточному принципу.

А вообще не лучше ли об этом спросить автора исходной статьи раз вы даже код оттуда взяли без изменений?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 14:25 
Только пришел

Зарегистрирован: 08 июн 2012, 01:03
Сообщения: 10
Думал о том, что не хватает процессора, но картинка на осциллографе качественно не меняется при установке для всех таймеров
TIM_Period = 25000 //в 50 раз медленнее

Код я брал не совсем оттуда, дописывал стандартний пример coocox, автора тоже спрошу, спасибо.
Просто хотелось узнать, может есть какие-то ограничения оборудования - например, я правильно понял что каналы DMA работают последовательно и как это может влиять?
Или я неправильно написал инициализацию - но вроде все проверил, и не знаю в каком направлении (кроме пошаговой отладки и изучения состояния регистров) двигаться дальше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 15:03 
Старожил

Зарегистрирован: 31 янв 2011, 19:17
Сообщения: 437
Откуда: Москва
Картинку в студию, ща глянем :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 15:50 
Старожил
Аватара пользователя

Зарегистрирован: 05 сен 2010, 07:23
Сообщения: 575
Откуда: Томск
1) детально не смотрел, вы запустите хотя бы в цикличном режиме для проверки
2) откуда вы берете данные ? что за "voidWaveLeft" ? где вы его инициализируете ?

_________________
ZiBlog.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 16:10 
Только пришел

Зарегистрирован: 08 июн 2012, 01:03
Сообщения: 10
Слева направо:
второй канал,
первый канал при включенном втором
первый канал при отключенном втором

Изображение

извиняюсь за качество и ноль (он где-то сверху)

Update.
DMA_Mode_Circular картину происходящего не меняет, на средней картинке "шум" тот же, на остальных как и должна быть - корректная синусоида

Update 2.
voidWave - это остатки попытки менять буфер по прерыванию, убрал
обновил код http://pastebin.com/K71ujVc1
стало лучше, теперь на выходе первого канала практически ноль


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 16:53 
Старожил
Аватара пользователя

Зарегистрирован: 05 сен 2010, 07:23
Сообщения: 575
Откуда: Томск
Ни чего не понял )
Что стало "лучше", теперь все работает проблема решена? или ещё остались вопросы ?

_________________
ZiBlog.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 17:05 
Старожил
Аватара пользователя

Зарегистрирован: 05 сен 2010, 07:23
Сообщения: 575
Откуда: Томск
Хотел ещё добавить. Приведённый мною код это то как нельзя делать
оптимальный вариант для этой задачи обновлять массив с данными
а не перезапускать с новыми параметрами

_________________
ZiBlog.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 17:46 
Только пришел

Зарегистрирован: 08 июн 2012, 01:03
Сообщения: 10
Нет, не работает.
Первый канал все еще выключается при включении второго, но теперь без шума.

Мне не хочется использовать dual mode (с ним все в порядке), так как хотел импульсы, не синхронизированные по времени с произвольным расстоянием между ними...
Спасибо, я подумаю над обновлением массива данных (с круговым буфером), но это придется успевать делать вовремя. С обычным режимом dma проще, так как после конца буфера dma на выходе dac остается последнее значение из регистра.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 20:21 
Старожил
Аватара пользователя

Зарегистрирован: 05 сен 2010, 07:23
Сообщения: 575
Откуда: Томск
Посмотрел внимательнее...
1) пишите четко, сделал то-то, получил то-то.
2) мне кажется у вас в массиве первое число не корректно 2047, должно быть 2447.
3) за комментируйте код в прерывании
Код:
buffer_change(0);       //play left
buffer_change(1);       //play right

проверьте получите ли сигналы на обоих каналах ЦАП. (проблем не вижу в коде, должно работать)
4) понятно почему у вас канал первый не работает, вы в buffer_change инициализируете только
часть структуры и забыли менять у нее назначение DMA_InitStructure.DMA_PeripheralBaseAddr ?
5) и не понятно, что вы ей (buffer_change) пытаетесь сделать, ведь вы ни чего не меняете?

_________________
ZiBlog.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DAC + DMA + Vldiscovery
СообщениеДобавлено: 08 июн 2012, 20:45 
Только пришел

Зарегистрирован: 08 июн 2012, 01:03
Сообщения: 10
Cпасибо огромное, всё заработало!

2) Опечатка, исправил.
3) Сигнал на обоих каналах был (после исправлений c voidWave).
4) Спасибо, добавление DMA_InitStructure.DMA_PeripheralBaseAddr помогло. Не заметил, что испортил структуру.
5) Меняю. При режиме DMA_Mode_Normal, когда данные пришедшие от dma заканчиваются, dac остается с последним "нулевым" значением, вплоть до повторной инициализации - которая происходит в buffer_change по таймеру TIM3 - начинается воспроизведение импульса с начала.

Работоспособный код (потомкам):
http://pastebin.com/4QudWbKv


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB