Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F070: выход из строя модуля ADC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ruslan1
Здравствуйте!
Впервые столкнулся с подобным феноменом.

Было сделано 5 плат, отлажены, вопросов нет. На них же программа разрабатывалась, никто не поломался.
Далее: плата несколько изменена (основные изменения- источник питания), заказано в Китае 20 плат и отправлены для тестирования дружественной конторе.
Из этих 20 плат на половине очень скоро перестал работать встроенный АЦП, всегда показывает ноль.
Проверили напряжения, никакого криминала, все в пределах требований даташита и согласно схеме. Но АЦП не работает.
Ну, поматюгали китайских сборщиков, заказали (говорят что с Дижикея) микроконтроллеры, перепаяли, запрограммировали- работает.
Через какое-то время- пять плат опять отказали.

Подключили наконец разработчиков (то бишь меня), дали одну такую плату.
Что я вижу:
питание: 3.45 вольта, чуть выше привычного 3.3 но ниже предельного рабочего (3.6) и сильно ниже предельного допустимого (4.0).
на некоторые ноги, толерантные 5 вольт, подается около 5.05 V (по даташиту: max= Vdd+4, то есть около 7.3 V ), причем последовательно стоит не менее 10к резистор в этих цепях.
ADC настроен для работы с DMA, и оно срабатывает: буфер заполняется, прерывание возникает.
под отладчиком смотрю регистры ADC: все на месте, только DR всегда равен нулю.



перепаял МК. Изменил напряжение питания с 3.45 на 3.25. Залил тот же код- все нормально работает DR ненулевой. опять же не вижу криминала в сигналах и напряжениях.
уже сколько-то часов молотит, не поломалось.

Как так может быть, что поломался именно АЦП, причем прерывания идут, а данные равны нулю? Причем остальные модули работают, МК функционирует нормально.
Причем и внутренние сенсоры тоже показывают ноль при измерениях. Такое ощущение как если модуль просто не запитан.

Может, кто-то встречался с подобными выходами из строя ?


Пока что я думаю
1.
Питание: может быть кратковременные иголки в питании во время работы могут таким образом убить АЦП? Что еще может быть, кроме питания? Импульс по одному из входов АЦП может так вывести из строя весь модуль??
2.
Что-то все-таки в моем коде не так, но как возможно поломать модуль АЦП кодом?
3.
О чем еще подумать? Бракованные МК? Как-то маловероятно, говорят что купили на Дижикее замену. Я уж думаю может бракованные микросхемы источника питания DC-DC, собираюсь погонять с импульсными нагрузками. Может, конденсаторы некачественные. Хотя раньше к сборщику претензий подобного рода не было, но все когда-то случается впервые.


Детали:

Схема: DC-DC питание вниз, выводы VDDA и VSSA напрямую подключены к VDD и VSS соответственно.
кварц на 16.384 MHz, SYSCLK= 45875200 Hz
МК обвешен 100nF возле ног питания, дополнительно 10uF/16V (тоже керамика)


Процедура инициализации АЦП
CODE
/**
* \brief Internal ADC init
* \param None
* \retval None
*/
void ADCint_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;


//pins init pins: IN0(PA0), IN9(PB1) : input< ADC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* ADC1 DeInit */
ADC_DeInit(ADC1);

/* Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

/* DMA1 Channel1 Config */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AdcIntRawArray[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADCINT_BUFF_SIZE;
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_Mode = ADC_DMAMode_OneShot;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
/* ADC DMA request in circular mode */
ADC_DMARequestModeConfig(ADC1,ADC_DMAMode_Circular);
/* Initialize ADC structure */
ADC_StructInit(&ADC_InitStructure);
/* Configure the ADC1 in continous mode with a resolutuion equal to 12 bits */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init(ADC1,&ADC_InitStructure);

ADC_ClockModeConfig(ADC1, ADC_ClockMode_SynClkDiv4);

// channels selection and it's sampling time config
ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_239_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_5, ADC_SampleTime_239_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor, ADC_SampleTime_55_5Cycles);
ADC_TempSensorCmd(ENABLE);
ADC_ChannelConfig(ADC1,ADC_Channel_Vrefint,ADC_SampleTime_55_5Cycles);
ADC_VrefintCmd(ENABLE);

/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);

/* Enable ADC1 */
ADC_Cmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN));/* Wait the ADCEN falg */

//interrupt
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); // Enable DMA1 Channel Transfer Complete interrupt
DMA_Cmd(DMA1_Channel1, ENABLE); //Enable the DMA1 - Channel1
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; //Enable DMA1 channel IRQ Channel */
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


/* ADC1 regular Software Start Conv */
ADC_DMACmd(ADC1,ENABLE);
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_StartOfConversion(ADC1);
}

extern volatile xSemaphoreHandle Semaphore_ADCint_Done; /*!< it is set in interrupt when new reading is done */


void DMA1_Channel1_IRQHandler(void)
{
DMA_ClearITPendingBit( DMA1_IT_TC1);
// this is ADC_DMAMode_OneShot mode, so everething has stopped till next start
xSemaphoreGiveFromISR (Semaphore_ADCint_Done, NULL); //FreeRTOS support: the ADCinternal_Task will be activated
}


Буду благодарен за любые идеи, про что еще подумать.
ViKo
А вы смотрели питание осциллографом? Может, оно слишком шумное, в палках и т.п.
vladec
Аналоговые цепи обвязки часом не с пятивольтовой запиткой? При перегрузках по входам на входах АЦП не могут возникать опасные превышения?
HardEgor
Входы АЦП не Five-Tolerant и где-то похоже больше 4 вольт пролазит на входы. Может быть при включении/подключении виртуальное питание через FT-входы пролазит и передавливает 3.3В питание.
glags
Показали бы схему, а то так тяжело гадать. И при правильном включении (используя аналоговую часть) надо ставить фильтр - например BLM21AH102SN1D.
Ruslan1
Большое спасибо всем за идеи и наводящие вопросы!

Разбираюсь с блоком питания. уже нашел некоторые проблемы. Там схема немного сложная, из разных входных делается 5.8 вольт, и из этих 5.8 делаются разные напряжения, в том числе и 3.3.
У меня возможно резкое изменение тока потребления по каналу 5V ( запитываю Распберри 3, оно сильно жручее в пике во время включения чем вторая RPi).
5.8 вольта делается на ACT4070. так эта ACT4070 не всегда корректно отрабатывает изменение тока нагрузки от 0 до +1 А (подключаю резистор 5 Ом кнопкой): иногда все красиво, а иногда схлопывается в ноль с короткими импульсами (режим КЗ). с разными емкостями и разными величинами RC. Такое ощущение, что оно очень чувствительно к фазовращающей цепочке, либо что-то напортачил в дизайне (хотя как-то сложно это сделать). Микросхема сырая, кроме пары схем и одного даташита ничего не нашел, может просто нужно менять элементную базу. Но входе- стабильное питание, а на выходе во время подключения нагрузки- по разному, то красивые 5.8, то пульсы от КЗ, раз на раз не приходится.
Эффект непонятный, запросто может быть что такой непонятно работающий блок питания и какие-то пульсы может сгенерить иногда, и эти пульсы пролазят через DC-DC 3.3 V питания МК.

по аналоговым цепям- маловероятно пролезание, там TVS и после него честный делитель на резисторах, при напряжении TVS напряжение на AIN меньше чем 3.3. Разве что суперкороткий пульс который TVS не успеет ограничить.
По толерантным 5V ногам- пролезание в принципе возможно, и теоретически 5 вольт может появиться раньше чем 3.3 (у меня это параллельные независимые каналы питания, но микросхемы одинаковые). В следующей версии платы сделаю появление 5 вольт только после 3.3.

Цитата(glags @ Sep 5 2016, 12:22) *
Показали бы схему, а то так тяжело гадать. И при правильном включении (используя аналоговую часть) надо ставить фильтр - например BLM21AH102SN1D.

Понимаю, что схема бы сняла многие вопросы, но оно не только мое творчество, пока показывать не буду (хотя по-моему там ничего супер ноу-хау и нет, штатные типовые узлы и схемы).
"ставить фильтр" - это где, между VDD и VDDA ? С какой целью? (у меня этот АЦП не основной и к шумам претензий нет, что смешно- основной 24-битный молотит без проблем, а встроенный в МК, вспомогательный для функциональности платы АЦП, выходит из строя).
glags
Цитата(Ruslan1 @ Sep 5 2016, 22:19) *
"ставить фильтр" - это где, между VDD и VDDA ? С какой целью? (у меня этот АЦП не основной и к шумам претензий нет, что смешно- основной 24-битный молотит без проблем, а встроенный в МК, вспомогательный для функциональности платы АЦП, выходит из строя).

Тогда ставить фильтр смысла нет. Фильтр только для того - чтоб отфильтровать ВЧ помехи по питанию которые даёт сам микроконтроллер.
RadiatoR
У мощных DCDC при уменьшении потребляемой мощности появляется неслабая болтанке на выходе. Все из за того, что индуктивность остается прежней, а нагрузке меняется. Может еще это давать свой вклад.
vladec
По нашему опыту в STM-х при превышении напряжения питания в первую очередь убиваются PLL и АЦП
KnightIgor
Цитата(Ruslan1 @ Sep 4 2016, 20:48) *
Что я вижу:
питание: 3.45 вольта, чуть выше привычного 3.3 но ниже предельного рабочего (3.6) и сильно ниже предельного допустимого (4.0).

Думаю, величину 3.45V можно исключить из круга подозреваемых: у меня есть система, где F051 работает от 3.6V без каких-либо проблем, ADC используется. Правда, это напряжение происходит от LDO-регулятора (линейного), а не DC-DC, и VDDA действительно подключен через такой фильтр с ferrit bead и всякими кондёрами за ним, как здесь некоторые коллеги порекомендовали.

P.S. Может ADC работает и далее, а из строя выходит защита входного пина, тот садится на землю, и ADC честно показывает ноль? TVS - это хорошо, но даже у 3.3V TVS напряжение ограничения чуть ли не 7V. Далее: попробуйте сменить ADC_SampleTime_239_5Cycles на ADC_SampleTime_71_5Cycles; не спрашивайте, почему: я имел проблемы на F051, которые не исследовал далее, поставив затем по наитию ADC_SampleTime_71_5Cycles, после чего проблемы с ADC ушли.
RadiatoR
феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение
KnightIgor
Цитата(RadiatoR @ Sep 6 2016, 10:34) *
феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение

А кто спорит?
Forger
Я в своих схемах с ST-ками ставлю два LDO 3.3В после 5В DC-DC: один питает ядро, другой аналоговую часть камня.
Ну и правильная разводка земель, чтобы встроенный АЦП еще меньше ловил мусора.
В итоге такое решение оказалось гораздо эффективнее (по борьбе помехами), чем феррит между цифрой и аналогом.
Более того, для еще большей точности аналоговую часть запитываю прямо от опорника 3.0В, вместо LDO (цифра от LDO 3.3В)
или его отправляю на один из аналоговых входов, чтобы его использовать при перерасчете напряжения на других аналоговых входах.

Короче, всеми возможными путями избегаю кидать питание на камень напрямую с DC-DC (особенно аналоговая часть), всегда предпочитают ставить LDO даже после хорошего DC-DC.
Устройства, где применяю такие решения, вообще некритичны по цене и тем более к дополнительному одному или двум бюджетным LDO. Там важнее надежность wink.gif
RadiatoR
Если запитываете от опорника - не прыгает напряжение при измерениях? Все таки нагрузка меняется

Хотя если мощный ма ma на 20 взять врятли будет...
Obam
Цитата(Forger @ Sep 6 2016, 16:28) *
Я в своих схемах с ST-ками ставлю два LDO 3.3В после 5В DC-DC: один питает ядро, другой аналоговую часть камня.
… Более того, для еще большей точности аналоговую часть запитываю прямо от опорника 3.0В, вместо LDO (цифра от LDO 3.3В)
или его отправляю на один из аналоговых входов, чтобы его использовать при перерасчете напряжения на других аналоговых входах.


Рецепт на грани допустимого (в смысле без запаса): глянул я в DS на STM32L152VD, с которым работал, и в "General operating conditions" "Note 2. It is recommended to power VDD and VDDA from the same source.
A maximum difference of 300 mV between VDD and VDDA can be tolerated during power-up."

Forger
Цитата(Obam @ Sep 7 2016, 17:15) *
Рецепт на грани допустимого (в смысле без запаса): глянул я в DS на STM32L152VD, с которым работал, и в "General operating conditions" "Note 2. It is recommended to power VDD and VDDA from the same source.
A maximum difference of 300 mV between VDD and VDDA can be tolerated during power-up."

Ни один серийный девайс по этому поводу не жаловался, все работают sm.gif
Но на будущее, конечно, учту! Спасибо!
Такую важную сноску и пропустил ((((

Цитата(RadiatoR @ Sep 7 2016, 16:46) *
Если запитываете от опорника - не прыгает напряжение при измерениях? Все таки нагрузка меняется

Хотя если мощный ма ma на 20 взять врятли будет...

Ставил в одном изделии ADR3430 (в свете новых событий надо будет поменять на ADR3433, и чуть поправить исходники в одной строчке).
Он дает до 10ма на выходе, этого вполне хватает аналоговой части. Нагрузка в том проекте не меняется - ADC сразу по включении работает постоянно (DMA не дает ему расслабиться).
Alechek
Цитата(Obam @ Sep 7 2016, 19:15) *
Рецепт на грани допустимого (в смысле без запаса): глянул я в DS на STM32L152VD, с которым работал, и в "General operating conditions" "Note 2. It is recommended to power VDD and VDDA from the same source.
A maximum difference of 300 mV between VDD and VDDA can be tolerated during power-up."

Вопрос в том, на что это повлияет...
А если разница будет в величину VDD (ну висит в воздухе/на 0 посажено VDDA)? Не должно же погореть.

PS. LPC1788 при VDD=2.9В и VDDA=2.5В (напрямую от TL431) работает вполне неплохо. Хотя по DS VDDA min 2.7В
Задавал вопрос NXP, что будет, если подать 2.5? Сказали, ничего не будет плохого, все будет работать.
HardEgor
Цитата(Alechek @ Sep 8 2016, 12:27) *
Вопрос в том, на что это повлияет...

может нечаянно помереть sm.gif
Для STM32F070 в даташите:
- в разделе Absolute maximum ratings написано "VDD–VDDA Allowed voltage difference for VDD > VDDA Max 0.4 V"
- в таблице General operating conditions написано "VDDA Analog operating voltage Must have a potential equal to or higher than VDD"
Alechek
Цитата(HardEgor @ Sep 8 2016, 10:54) *
- в разделе Absolute maximum ratings написано "VDD–VDDA Allowed voltage difference for VDD > VDDA Max 0.4 V"

Наталкивает лишь на мысль, что есть диод(ы) VDD->VDDA, возможно, паразитные.
То есть, вышеприведенное из ДШ необходимо для того, чтобы обеспечить заявленные харакеристики ADC.

Хотя... "Absolute maximum rating", действительно, говорит о том, что может и погореть. (
Obam
"Ни один серийный девайс по этому поводу не жаловался, все работают sm.gif

Такую важную сноску и пропустил (((("

Немудрено: документация сотнями страниц исчисляется (;
Самого порой бесит, когда к таблице из десятков пунктов прилагается страница примечаний. Опять же, у MSP430-ых подобное (про разбаланс питаний) тоже есть.


"Вопрос в том, на что это повлияет..."

Скорее всего на параметры во всём диапазоне рабочих условий.

"PS. LPC1788 при VDD=2.9В и VDDA=2.5В (напрямую от TL431) работает вполне неплохо. Хотя по DS VDDA min 2.7В
Задавал вопрос NXP, что будет, если подать 2.5? Сказали, ничего не будет плохого, все будет работать."

Во времена начала моей трудовой биографии (ё-моё эт сколько уже пошло) "применение элементной базы не в соответствии с ТУ (техническими условиями)" страшным грехом (да в общем, признаком непрофессионализма) считалось.
amiller
Цитата(Alechek @ Sep 8 2016, 08:27) *
Вопрос в том, на что это повлияет...

Был зафиксирован случай, когда при питании VDD и VDDA от разных стабилизаторов, отключалось питание BackUp области и RTC регистров у STM32F105 при наличии батарейки.
После установки между питаниями двустороннего диода, проблема исчезла.
Поэтому можно сказать, что если питание на МК подается не в соответствии с документацией, это может приводить к сбоям во внутренней логике управления питанием. А это уже может привести к непредсказуемым последствиям в работе любой периферии. К сожалению...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.