реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F070: выход из строя модуля ADC, все остальное работает, прерывания от АЦП идут, а в регистре DR - нуль
Ruslan1
сообщение Sep 4 2016, 19:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Здравствуйте!
Впервые столкнулся с подобным феноменом.

Было сделано 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
}


Буду благодарен за любые идеи, про что еще подумать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2016, 20:58
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А вы смотрели питание осциллографом? Может, оно слишком шумное, в палках и т.п.
Go to the top of the page
 
+Quote Post
vladec
сообщение Sep 5 2016, 07:38
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 167
Регистрация: 3-10-05
Из: Москва
Пользователь №: 9 158



Аналоговые цепи обвязки часом не с пятивольтовой запиткой? При перегрузках по входам на входах АЦП не могут возникать опасные превышения?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Sep 5 2016, 09:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Входы АЦП не Five-Tolerant и где-то похоже больше 4 вольт пролазит на входы. Может быть при включении/подключении виртуальное питание через FT-входы пролазит и передавливает 3.3В питание.
Go to the top of the page
 
+Quote Post
glags
сообщение Sep 5 2016, 09:22
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



Показали бы схему, а то так тяжело гадать. И при правильном включении (используя аналоговую часть) надо ставить фильтр - например BLM21AH102SN1D.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 5 2016, 20:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Большое спасибо всем за идеи и наводящие вопросы!

Разбираюсь с блоком питания. уже нашел некоторые проблемы. Там схема немного сложная, из разных входных делается 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-битный молотит без проблем, а встроенный в МК, вспомогательный для функциональности платы АЦП, выходит из строя).
Go to the top of the page
 
+Quote Post
glags
сообщение Sep 6 2016, 06:11
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



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

Тогда ставить фильтр смысла нет. Фильтр только для того - чтоб отфильтровать ВЧ помехи по питанию которые даёт сам микроконтроллер.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 6 2016, 06:14
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



У мощных DCDC при уменьшении потребляемой мощности появляется неслабая болтанке на выходе. Все из за того, что индуктивность остается прежней, а нагрузке меняется. Может еще это давать свой вклад.
Go to the top of the page
 
+Quote Post
vladec
сообщение Sep 6 2016, 06:35
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 167
Регистрация: 3-10-05
Из: Москва
Пользователь №: 9 158



По нашему опыту в STM-х при превышении напряжения питания в первую очередь убиваются PLL и АЦП
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 6 2016, 09:31
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(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 ушли.

Сообщение отредактировал KnightIgor - Sep 6 2016, 09:48
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 6 2016, 09:34
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 6 2016, 11:44
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(RadiatoR @ Sep 6 2016, 10:34) *
феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение

А кто спорит?
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 6 2016, 12:28
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Sep 7 2016, 13:46
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Если запитываете от опорника - не прыгает напряжение при измерениях? Все таки нагрузка меняется

Хотя если мощный ма ma на 20 взять врятли будет...
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 7 2016, 14:15
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(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."



--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016