Перейти к содержанию
    

STM32F072 непонятный эффект с выборкой ADC

Имею 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сс?

Изменено пользователем seniorandre

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, пересылка по DMA тоже тактов требует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

trigger start latency 2.625 ADC clock cycles

Откуда такое странное дробное число? Надо думать, преобразование может начаться только синхронно с тактированием АЦП, то есть в реальности будет переменное целое число (3-4?). Кроме того, загляните в даташит и посмотрите на такую штуку, как "ADC_DR register ready latency". Боюсь, будете неприятно удивлены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, третий битик задействовали, не как у старших STM. Да и с измерениями внутренней темп., напряжения по другому теперь с ADC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда такое странное дробное число?

Table 41. Latency between trigger and start of conversion. Но даже если было бы 3 такта, то все равно вроде как должно было поместиться.

Кроме того, загляните в даташит и посмотрите на такую штуку, как "ADC_DR register ready latency".

А причем тут ADC_DR register ready latency, это забота DMA забрать результат по готовности из ADC_DR

Да, третий битик задействовали, не как у старших STM. Да и с измерениями внутренней темп., напряжения по другому теперь с ADC.

Извиняюсь, но ни чего не понял.

Возможно, пересылка по DMA тоже тактов требует.

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

 

 

Попробовал

ADC1->CFGR1 |= ADC_CFGR1_OVRMOD;

Не помогло.

 

Понятно что самым простым решением было бы поднять немного тактовую частоту ядра, но у данного камня есть USB, который тактируется именно от 48MHz, ни на HSI же переходить для USB.

Изменено пользователем seniorandre

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А том вроде бы есть HSI14 специально для АЦП. Не подойдёт?

Нет тайминг нужен точный и синхронный с таймерами и DAC.

Вот подумываю для USB HSI48 задействовать и поднять тактовую ядра, либо вообще оставить ADC от 24MHz. На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.

Случайно включил ADC на 48MHz, как ни странно, но тоже работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.

Случайно включил ADC на 48MHz, как ни странно, но тоже работает.

Есть некий риск, конечно. Кто знает, что внутри у этого АЦП? В диапазоне температур и напряжений питания может что-то вылезти. А может и не вылезти...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть некий риск, конечно. Кто знает, что внутри у этого АЦП?

Проект собственно не коммерческий, поэтому можно и вылезти за пределы ТТХ.

У меня такое ощущение, что у буржуев старого оборудования и технологий нет, вот им и приходится старые чипы на новых технологиях выпускать. А параметры приходится занижать что бы линейку поддерживать. Маркетинг блин... Это косвенно подтверждается тем что ядро народ на 3-х кратной частоте запускает, а оно все работает.

Должен быть и от маркетинга хоть какой-то выхлоп для нас :)

ST в CubeMx не дают тактовую поднять, а через регистры что хошь делай.

Изменено пользователем seniorandre

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проект собственно не коммерческий, поэтому можно и вылезти за пределы ТТХ.

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

 

Они в CubeMx не дают тактовую поднять, а через регистры что хошь делай.

За кубмх могут пару индусов-говнокодеров расстрелять, так что там всё понятно :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имею ADC, запуск выборки идет от триггера с периодом 2us, ADC тактируется от APBCLK = 48 MHz с делением на 2 или 4, данные забираются через DMA. Период запуска конверсии 2us, проверял осциллографом, все ок, 2us в наличии.

А что, ADC тянет 500ksps? По тексту вроде даже два канала, то есть, 1Msps на канал? Чет быстро...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поддерживать. Маркетинг блин... Это косвенно подтверждается тем что ядро народ на 3-х кратной частоте запускает, а оно все работает.

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

А если ещё скомбинировать такие испытания с крайними значениями питания?

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

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

 

Вот и тот народ этого ничего не умеет и не видели даже, так как радиолюбители.

Ну работает 5 сек в данных определённых условиях у них на столе. Ну и что? А через 5 минут или при другой температуре или влажности или чуть другом напряжении или... - уже глючит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет тайминг нужен точный и синхронный с таймерами и DAC.

Вот подумываю для USB HSI48 задействовать и поднять тактовую ядра, либо вообще оставить ADC от 24MHz. На 24 MHz время выборки увеличилось (как доля от 2 us), а время конверсии уменьшилось, качество данных стало лучше, правда пока не понял на сколько, но вижу данные вообще не плавают. Потребление только надо на 24MHz и 12MHz сравнить.

Случайно включил ADC на 48MHz, как ни странно, но тоже работает.

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

А на какой частоте при этом работает сам АЦП и когда точно появятся данные в ячейке памяти (посредством DMA), собственно неважно. Если что можно другим потоком DMA забирать из ячейки памяти и отправлять в ЦАП, например. Главное, чтобы новые данные появлялись до того момента, когда Вы их будете использовать.

Это будет более правильно, чем заставлять работать АЦП на частоте, которая выше предельной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что, ADC тянет 500ksps? По тексту вроде даже два канала, то есть, 1Msps на канал? Чет быстро...

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

 

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

Не видел.

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

Пытаюсь

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

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

 

Вот хочется спросить... А вы что-то по существу вопроса добавить можете? Или только подковырнуть хотите?

Изменено пользователем seniorandre

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот хочется спросить... А вы что-то по существу вопроса добавить можете? Или только подковырнуть хотите?

По существу я уже добавил. Если не поняли, то: если "вылезаете за пределы ТТХ", гарантировать ничего уже нельзя. Железо может как работать так и нет - как повезёт - в зависимости от фазы луны. То, что там где-то у кого-то что-то заработало, не означает что заработает в другой раз и при немного других условиях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...