Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F072 непонятный эффект с выборкой ADC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
seniorandre
Имею ADC, запуск выборки идет от триггера с периодом 2us, ADC тактируется от APBCLK = 48 MHz с делением на 2 или 4, данные забираются через DMA. Период запуска конверсии 2us, проверял осциллографом, все ок, 2us в наличии.
Далее непонятный эффект, если ставлю предделитель на 4 (тактовая ADC = 12 MHz), то выборку могу поставить только 1.5 ADC clock cycles, при 7.5 сс данные становятся случайными, хотя:
7.5cc + 12.5cc=20cc, плюс еще trigger start latency 2.625 ADC clock cycles = 22.625cc => 1/12MHz * 22.625 = 1,885 us

Если ставлю предделитель на 2 (тактовая ADC = 24 MHz, что ни есть хорошо),
То все работает вплоть до выборки 28,5сс
28.5cc + 12.5cc + 2.75сс =43.75cc, 2.75 => 1/24MHz * 43,75 = 1.823us
Код
    // ADC1
    ADC1->CFGR1 = ADC_CFGR1_DISCEN; //discontinuos mode, the each TRIGOI event do convertion
    //ADC1->CFGR1 = ADC_CFGR1_CONT | ADC_CFGR1_SCANDIR;
    //ADC1->CFGR2 |= ADC_CFGR2_CKMODE_1; //APBCLK/4 = 12MHz
    ADC1->CFGR2 |= ADC_CFGR2_CKMODE_0; //APBCLK/2 = 24MHz
    ADC1->CFGR1 |= ADC_CFGR1_EXTSEL_1 | ADC_CFGR1_EXTEN_0; // SEL = 010 TIM2 TRIGOut EN = 01 ON RISING
    // Время для всех каналов
    //ADC1->SMPR &= !ADC_SMPR_SMP; //Для всех каналов 000: 1.5 ADC clock cycles
    //ADC1->SMPR |= ADC_SMPR_SMP_0; //Для всех каналов 001: 7.5 ADC clock cycles, 7.5cc + 12.5cc=20cc, 1/12MHz * 20 = 1,66us  1/24MHz * 20 = 0.8us
    //ADC1->SMPR |= ADC_SMPR_SMP_1; //Для всех каналов 010: 13.5 ADC clock cycles, 13.5cc + 12.5cc=26cc, 1/12MHz * 26 = 2.16us  1/24MHz * 26 = 1.08us
    ADC1->SMPR |= ADC_SMPR_SMP_1 | ADC_SMPR_SMP_0; //Для всех каналов 011: 28.5 ADC clock cycles, 28.5cc + 12.5cc=41cc,  1/24MHz * 41 = 1.708us


Не хватает чуть чуть...
Может кто-то имеет опыт в этом деле. Получится запустить на ADC на 12 MHz с выборкой 7,5сс?
ViKo
Возможно, пересылка по DMA тоже тактов требует.
scifi
Цитата(seniorandre @ Apr 24 2016, 08:48) *
trigger start latency 2.625 ADC clock cycles

Откуда такое странное дробное число? Надо думать, преобразование может начаться только синхронно с тактированием АЦП, то есть в реальности будет переменное целое число (3-4?). Кроме того, загляните в даташит и посмотрите на такую штуку, как "ADC_DR register ready latency". Боюсь, будете неприятно удивлены.
Aner
Да, третий битик задействовали, не как у старших STM. Да и с измерениями внутренней темп., напряжения по другому теперь с ADC.
seniorandre
Цитата(scifi @ Apr 24 2016, 11:25) *
Откуда такое странное дробное число?

Table 41. Latency between trigger and start of conversion. Но даже если было бы 3 такта, то все равно вроде как должно было поместиться.
Цитата(scifi @ Apr 24 2016, 11:25) *
Кроме того, загляните в даташит и посмотрите на такую штуку, как "ADC_DR register ready latency".

А причем тут ADC_DR register ready latency, это забота DMA забрать результат по готовности из ADC_DR
Цитата(Aner @ Apr 24 2016, 14:04) *
Да, третий битик задействовали, не как у старших STM. Да и с измерениями внутренней темп., напряжения по другому теперь с ADC.

Извиняюсь, но ни чего не понял.
Цитата
Возможно, пересылка по DMA тоже тактов требует.

Пересылка по DMA вроде бы параллельно идет, только шину занимает.


Попробовал
Код
ADC1->CFGR1 |= ADC_CFGR1_OVRMOD;

Не помогло.

Понятно что самым простым решением было бы поднять немного тактовую частоту ядра, но у данного камня есть USB, который тактируется именно от 48MHz, ни на HSI же переходить для USB.
scifi
А том вроде бы есть HSI14 специально для АЦП. Не подойдёт?
seniorandre
Цитата(scifi @ Apr 24 2016, 21:04) *
А том вроде бы есть HSI14 специально для АЦП. Не подойдёт?

Нет тайминг нужен точный и синхронный с таймерами и DAC.
Вот подумываю для USB HSI48 задействовать и поднять тактовую ядра, либо вообще оставить ADC от 24MHz. На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.
Случайно включил ADC на 48MHz, как ни странно, но тоже работает.
scifi
Цитата(seniorandre @ Apr 24 2016, 21:19) *
На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.
Случайно включил ADC на 48MHz, как ни странно, но тоже работает.

Есть некий риск, конечно. Кто знает, что внутри у этого АЦП? В диапазоне температур и напряжений питания может что-то вылезти. А может и не вылезти...
seniorandre
Цитата(scifi @ Apr 24 2016, 21:26) *
Есть некий риск, конечно. Кто знает, что внутри у этого АЦП?

Проект собственно не коммерческий, поэтому можно и вылезти за пределы ТТХ.
У меня такое ощущение, что у буржуев старого оборудования и технологий нет, вот им и приходится старые чипы на новых технологиях выпускать. А параметры приходится занижать что бы линейку поддерживать. Маркетинг блин... Это косвенно подтверждается тем что ядро народ на 3-х кратной частоте запускает, а оно все работает.
Должен быть и от маркетинга хоть какой-то выхлоп для нас sm.gif
ST в CubeMx не дают тактовую поднять, а через регистры что хошь делай.
scifi
Цитата(seniorandre @ Apr 24 2016, 21:34) *
Проект собственно не коммерческий, поэтому можно и вылезти за пределы ТТХ.

А, ну тогда конечно!

Цитата(seniorandre @ Apr 24 2016, 21:34) *
Они в CubeMx не дают тактовую поднять, а через регистры что хошь делай.

За кубмх могут пару индусов-говнокодеров расстрелять, так что там всё понятно biggrin.gif
KnightIgor
Цитата(seniorandre @ Apr 24 2016, 06:48) *
Имею ADC, запуск выборки идет от триггера с периодом 2us, ADC тактируется от APBCLK = 48 MHz с делением на 2 или 4, данные забираются через DMA. Период запуска конверсии 2us, проверял осциллографом, все ок, 2us в наличии.

А что, ADC тянет 500ksps? По тексту вроде даже два канала, то есть, 1Msps на канал? Чет быстро...
jcxz
Цитата(seniorandre @ Apr 25 2016, 00:34) *
поддерживать. Маркетинг блин... Это косвенно подтверждается тем что ядро народ на 3-х кратной частоте запускает, а оно все работает.

А Вы хоть раз испытания в камере тепла и холода делали? Или хотя-бы видели её? biggrin.gif
А если ещё скомбинировать такие испытания с крайними значениями питания?
А ПО нагруженное писали? Так чтобы одновременно работала куча периферии и тяжёлые вычисления?
А испытания на устойчивость к нано- и микросекундным помехам делали?

Вот и тот народ этого ничего не умеет и не видели даже, так как радиолюбители.
Ну работает 5 сек в данных определённых условиях у них на столе. Ну и что? А через 5 минут или при другой температуре или влажности или чуть другом напряжении или... - уже глючит.
amiller
Цитата(seniorandre @ Apr 24 2016, 22:19) *
Нет тайминг нужен точный и синхронный с таймерами и DAC.
Вот подумываю для USB HSI48 задействовать и поднять тактовую ядра, либо вообще оставить ADC от 24MHz. На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.
Случайно включил ADC на 48MHz, как ни странно, но тоже работает.

Насколько я представляю, синхронизацию можно обеспечить всех узлов, в том числе АЦП и ЦАПа внешними эвентами, например от таймера, который будет тактироваться от основной частоты.
А на какой частоте при этом работает сам АЦП и когда точно появятся данные в ячейке памяти (посредством DMA), собственно неважно. Если что можно другим потоком DMA забирать из ячейки памяти и отправлять в ЦАП, например. Главное, чтобы новые данные появлялись до того момента, когда Вы их будете использовать.
Это будет более правильно, чем заставлять работать АЦП на частоте, которая выше предельной.
seniorandre
Цитата(KnightIgor @ Apr 25 2016, 23:03) *
А что, ADC тянет 500ksps? По тексту вроде даже два канала, то есть, 1Msps на канал? Чет быстро...

Мало того что тянет 500ksps, так еще и в реалтайме ДПФ для одной частоты вычисляет, после обсчета 10 000 семплов одного канала, обсчитываем следующий. Все запускается синхронно по таймерам. Синус естественного для ДПФ и ЦАП уже подготовлен в буфере.

Цитата(jcxz)
А Вы хоть раз испытания в камере тепла и холода делали? Или хотя-бы видели её?

Не видел.
Цитата(jcxz)
А ПО нагруженное писали? Так чтобы одновременно работала куча периферии и тяжёлые вычисления?

Пытаюсь
Цитата(jcxz)
А испытания на устойчивость к нано- и микросекундным помехам делали?

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

Вот хочется спросить... А вы что-то по существу вопроса добавить можете? Или только подковырнуть хотите?
jcxz
Цитата(seniorandre @ Apr 26 2016, 20:44) *
Вот хочется спросить... А вы что-то по существу вопроса добавить можете? Или только подковырнуть хотите?

По существу я уже добавил. Если не поняли, то: если "вылезаете за пределы ТТХ", гарантировать ничего уже нельзя. Железо может как работать так и нет - как повезёт - в зависимости от фазы луны. То, что там где-то у кого-то что-то заработало, не означает что заработает в другой раз и при немного других условиях.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.