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

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

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

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

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

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


 
Опции темы
Непрочитано 23.10.2015, 10:39  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
1. Нет максимального быстродействия АЦП (5 MIPS)
Частота AHB 72 МГц (контролируется)
- в простом цикле:
for (i=0 ; i ‹ BLOCK_ADC ; i++)
{
// while ((ADC1-›ISR & ADC_ISR_EOC) == 0){} ;
ADC_array[i] = ADC1-›DR & ADC_DR_RDATA ;
}
Время преобразования АЦП 0,5 мкс
Вероятно так и должно быть, это время цикла for а не быстродействие АЦП.
С раскоментированным while это время ~0,67 мкс
Но при включении ПДП (DMA) время преобразования АЦП становится ›3 мкс
Игрался и с синхронным клоком
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //подаем тактирование АЦП
ADC1_2_COMMON-›CCR |= ADC12_CCR_CKMODE_0; // | ADC12_CCR_CKMODE_1;
и с асинхронным
RCC-›CFGR2 |= RCC_CFGR2_ADCPRE12_DIV1; // при RCC-›CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //Без этой инициализации АЦП не заводится
ADC1_2_COMMON-›CCR &= ~(ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1);
Простой for 0,5 мкс
ПДП (DMA) ›3 мкс
Где-то я крепко лопухнуля...
Код:
//===============Настройка DMA=============
void InitADC_DMA(void)
{
RCC-›AHBENR |= RCC_AHBENR_DMA1EN; //Тактирование ПДП
DMA1_Channel1-›CPAR = (uint32_t) (&(ADC1-›DR)); // Источник данных АЦП
DMA1_Channel1-›CMAR = (uint32_t)(ADC_array); // Куда грузить
DMA1_Channel1-›CNDTR = BLOCK_ADC; // Сколько грузить
DMA1_Channel1-›CCR |= DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 ;//MSIZE_0 и PSIZE_0 это 16 бит
DMA1_Channel1-›CCR |= DMA_CCR_CIRC; //Периодическая перезапись буфера ПДП
DMA1_Channel1-›CCR |= DMA_CCR_TEIE | DMA_CCR_TCIE ; // Разрешить прерывание
DMA1_Channel1-›CCR |= DMA_CCR_EN; // Разрешить ПДП
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn,1);
}
//===============Настройка АЦП=============
void AdcInit(void)
{
RCC-›AHBENR |= RCC_AHBENR_GPIOAEN; // Разрешить тактирование порта PORTA
GPIOA-›MODER |= GPIO_MODER_MODER1; //Аналоговый вход PA1/*

RCC-›CFGR2 |= RCC_CFGR2_ADCPRE12_DIV1;
delay_us (20);
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //подаем тактирование АЦП
ADC1_2_COMMON-›CCR &= ~(ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1);
ADC1_2_COMMON-›CCR |= ADC12_CCR_CKMODE_0;
ADC1-›CR = 0; // На всякий случай
ADC1-›CR &= ~ADC_CR_ADVREGEN; //Это вроде как выключение регулятора напряжения
ADC1-›CR |= ADC_CR_ADVREGEN_0; // | ADC_CR_ADVREGEN_1;
delay_us (20);
ADC1-›CR |= ADC_CR_ADCAL; //Запуск калибровки
while ((ADC1-›CR & ADC_CR_ADCAL) != 0) {}; //Ожидание ее конца
ADC1-›CR |= ADC_CR_ADEN; //включить АЦП
SinchTime=ADC1-›CALFACT & ADC_CALFACT_CALFACT_S;
send_pac(0xCA); // Отправка пакета
while ((ADC1-›ISR & ADC_ISR_ADRD) == 0) {}; //Ожидание готовности АЦП
send_pac(0xDA); // Отправка пакета
ADC1-›SQR1 |= 1‹‹7; //ADC_SQR1_SQ1_0 //выбор канала PA1
ADC1-›CFGR |= ADC_CFGR_OVRMOD; // Незнаю зачем
ADC1-›CFGR |= ADC_CFGR_CONT; // | (1 ‹‹ 26) | ADC_CFGR_AWDEN | ADC_CFGR_AWDSGL;
// ADC1-›CFGR |= ADC_CFGR_DMAEN | ADC_CFGR_DMACFG; // включаю/выключаю ПДП для АЦП
}
На 103-их и 051-ых кристаллах проблем не возникало, но там 1 мкс...
Реклама:
__________________
Будь проще, дойдет и до синтеза.
marera вне форума  
Непрочитано 24.10.2015, 09:30  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Господа, вопрос снят!
Сам виноват - некорректная обработка прерывания ПДП.
Нужно было внимательнее смотреть флаги и...
Обязательно(!) стопорить ПДП АЦП.
Тему решил продолжить, может кому и пригодится, а может и совета дождусь...
Немогу пока объяснить себе следующее:
Прерывание от AWD1 (аналоговый компаратор 1)
На вход АЦП подаю одиночный импульс -› АЦП схватывает и... обрабатывает событие
Код:
void ADC1_2_IRQHandler(void)
{volatile uint8_t AdrDMA;
SinchTime=TIM2-›CNT;//Запоминаю время вызова
AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR )) ;//считываю регистр текущего счетчика данных DMA
ADC1-›IER &= ~ADC_IER_AWD1;// Запрет прерывания от AWD
ADC1-›ISR |= ADC_ISR_AWD1; //Очистка флага AWD
//Этот способ работает c редкими исключениями - зависает, в while (AdrDMA... и понятно почему!!!!!!!!!!
// AdrDMA -= 10; //все-таки здесь нужно еще подумать
// while (AdrDMA != (uint8_t) (DMA1_Channel1-›CNDTR)){};
delay_us (5);//Считаю такой метод некорректным, но как-то работает!!!!!
ADC1-›CFGR &= ~ADC_CFGR_DMAEN; //Остановил DMA ADC
ADC1-›CR |= ADC_CR_ADSTP; //остановить АЦП
ADC_array[AdrDMA] = 0x2000;//Метка в массиве - когда сработал AWD
send_dat();//Передача данных на комп для анализа
ADC1-›ISR |= ADC_ISR_EOC;//Сбросить флаг преобразования
ADC1-›CFGR |= ADC_CFGR_DMAEN ; //Разрешил DMA =========================
ADC1-›IER = ADC_IER_AWD1;// Разрешить прерывания от AWD
// NVIC_EnableIRQ(ADC1_2_IRQn);// =================================
ADC1-›CR |= ADC_CR_ADSTART; //Снова запустить процес преобразования
}
Загвоздка в том, что AdrDMA получает значения совершенно не связанные с фронтом приходящего импульса.
Понимаю, что при времени преобразования 0,2 мкс две команды это ощутимо "долго" и DMA при этом щелкал, но синхронизаци отсутствует напрочь (см. рисунок)
На рисунке три асинхронных записи.
В надежде на толкование и помощь...
P.S. Поправка - импульс на рисунке длителность 2 мкс (не 1 мкс, как указано). Длительность цикла записи буфера (127 слов) около 25 мкс.
Миниатюры:
Нажмите на изображение для увеличения
Название: AWD_DMA.GIF
Просмотров: 92
Размер:	10.9 Кб
ID:	84190  
__________________
Будь проще, дойдет и до синтеза.

Последний раз редактировалось marera; 25.10.2015 в 17:12.
marera вне форума  
Непрочитано 06.02.2016, 01:30  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Сообщение от marera Посмотреть сообщение
Попрежнемему немогу пока объяснить описанное в перд. посте
Пояснения:

AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR )) ;//считываю регистр текущего счетчика данных DMA
Эта строка просто считывает текущее значение счетчика регистра данных DMA1_Channel1-›CNDTR
Далее - пишу в массив по адресу словленного счетчика DMA значение вдвое больше допустимого от АЦП
ADC_array[AdrDMA] = 0x2000;//Метка в массиве - когда сработал AWD
send_dat();//Передача данных на комп для анализа

Загвоздка так и осталась - метка срабатывания AWD1 (AdrDMA) почему-то получает значения совершенно не связанные с фронтом импульса, который его (срабатывание) вызвал.
Время преобразования 0,2 мкс АЦП и ощутимо для считывания DMA1_Channel1-›CNDTR, но выяснить причину моего непонимания очень хочется.
(В работе-то все прошло, работает как должно, но непонятка осталась)
__________________
Будь проще, дойдет и до синтеза.
marera вне форума  
Непрочитано 03.04.2016, 23:18  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
__________________
Будь проще, дойдет и до синтеза.
marera вне форума  
Непрочитано 04.04.2016, 00:05  
andries5
Почётный гражданин KAZUS.RU
 
Регистрация: 19.02.2008
Сообщений: 1,812
Сказал спасибо: 125
Сказали Спасибо 605 раз(а) в 422 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Почему? Использовал, пробовал. Сверхскорость не нужна была. Все работает.
andries5 вне форума  
Непрочитано 04.04.2016, 00:44  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Сообщение от marera Посмотреть сообщение
AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR ))
А что, в 303 счетчик в дма 8 битный?
Impartial вне форума  
Непрочитано 04.04.2016, 11:03  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Сообщение от Impartial Посмотреть сообщение
А что, в 303 счетчик в дма 8 битный?
AdrDMA 8-битный (буфер DMA 128 байт), но мысль для подумать о кольце счетчика DMA важная!?!
__________________
Будь проще, дойдет и до синтеза.
marera вне форума  
Непрочитано 04.04.2016, 11:37  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Тогда нужно быть уверенным, что обращение к этому регистру дма сгенерировано не байтное.
Impartial вне форума  
Непрочитано 04.04.2016, 21:03  
zöner
Гражданин KAZUS.RU
 
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
zöner на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Цитата:
Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
еще интереснее - запустить в режиме интерлива, и получить 10msps - с экранчиком 320х200 за 4$ уже на уровне начальных не-игрушечных скопов, минимум в 5 раз дешевле...
zöner вне форума  
Непрочитано 04.04.2016, 22:57  
Kabron
Почётный гражданин KAZUS.RU
 
Аватар для Kabron
 
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,588
Сказал спасибо: 704
Сказали Спасибо 4,353 раз(а) в 1,996 сообщении(ях)
Kabron на пути к лучшему
По умолчанию Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает

Сообщение от marera Посмотреть сообщение
Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
Портал закрыт. Все ушли #насрач.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Kabron вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вы родом из 70-80х если: baskervil Отвлекитесь, эмбеддеры! 163 23.10.2008 22:26
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


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


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