Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 03.06.2014, 12:41  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Tim19 -> DMA -> значение ADC в memory

План такой. ADC работает в непрерывном режиме тоесть в регистре данных ADC постоянно обновляется значение. Таймер (tim19 compare1) пинает DMA (dma1 канал1) а DMA перекладывает значение ADC в массив.

Код:
void TIM19_init(void) {
  TIM_OCInitTypeDef TIM_OCInitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  /* Enable TIM19 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);

  /* TIM19 Configuration */
  TIM_DeInit(TIM19);

  /* Fills each TIM_TimeBaseInitStruct member with its default value */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  /* Time base configuration*/
  TIM_TimeBaseStructure.TIM_Period = 50-1;
  TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 (OC1) */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 1;                        // !!               // в примере из интернета здесь "1"
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //!!                // в примере из интернета этой стоки вообще нет
  TIM_OC1Init(TIM19, &TIM_OCInitStructure);
  
  /* TIM1 Update DMA Request enable */
  TIM_DMACmd(TIM19, TIM_DMA_CC1, ENABLE);
  
  /* Enable TIM19 counter */
  TIM_Cmd(TIM19, ENABLE);   
}
Код:
void    DMA_init(void) {
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  DMA_InitTypeDef DMA_InitStructure;
  
// DMA1 канал 1 - сигма-дельта АЦП
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDADC1-›JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ex[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                              // направление от периферии к памяти
DMA_InitStructure.DMA_BufferSize = 100;                                         // длинна буфера = ARRAY_LENGHT(mas1)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                // инкримент периферии отключен
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                         // инкремент в памяти - включен
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;         // размер данных в периферии 32 бита
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                 // размер данных в памяти 32 бита
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                   // режим DMA - обычный, не круговой
DMA_InitStructure.DMA_Priority = DMA_Priority_High;                             // поскольку DMA задействовано одно - его приоритет не имеет смысла
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                    // Memory-to-memory Disable
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
DMA_Cmd(DMA1_Channel1, ENABLE);
}
инициализацию АЦП не привожу, оно точно работает, в регистре SDADC1-›JDATAR правильные данные. DMA массив не заполняет. предполанаю что я неправильно запускаю DMA таймером. связка ADC -› DMA - работает (стартовать ADC каждый раз не надо, оно запускается один раз, при инициализации и непрерывно измеряет), массив заполняется.
Реклама:
__________________
Kvsrk85(Андрей)

Последний раз редактировалось kvark85; 03.06.2014 в 13:38.
kvark85 вне форума  
Непрочитано 03.06.2014, 12:47  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

АЦП не правильно настроен. Процессор какой?
Impartial вне форума  
Непрочитано 03.06.2014, 13:09  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Сообщение от Impartial Посмотреть сообщение
АЦП не правильно настроен. Процессор какой?
с чего это? я же говорю, оно работает, я могу свободно в любой момент считывать с него значения и эти значения правильные. процессор
STM32F373. а в той связке что я хочу реализовать АЦП с DMA никак не связано
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 03.06.2014, 13:25  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Цитата:
в регистре SDADC1-›JDATAR правильные данные.
Судя по этой фразе АЦП использует инжекторный режим. Он работает по другому.
Impartial вне форума  
Непрочитано 03.06.2014, 13:39  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

поясните. то есть результаты инжекторной группы нельзя передавать с помощью DMA при условии что DMA запускается таймером? Потому что как я уже писал у меня получается эти же данные передавать с помощью DMA если DMA настроено брать данные по завершению преобразования SDADC.
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 03.06.2014, 13:55  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

В инжекторной группе 4 регистра. Какой из них указан в CPAR?
Impartial вне форума  
Непрочитано 03.06.2014, 15:00  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Разобрался и заработало. Ошибка в даташите. На странице 172 на картинке показано что DMA1 канал1 может запускаться tim19_ch1, а на странице ниже (173-й) в таблице указано что DMA1 канал1 может запускаться tim19_ch3, tim19_ch4. Поменял настройку таймера на 3-й канал и заработало как и ожидалось.
Миниатюры:
Нажмите на изображение для увеличения
Название: 33333.png
Просмотров: 64
Размер:	108.1 Кб
ID:	65165  
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 8 08.08.2016 14:35
STM32 ADC + DMA в циклическом режиме Nik_UFO Микроконтроллеры, АЦП, память и т.д 4 24.02.2012 18:49


Часовой пояс GMT +4, время: 21:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot