Ruslan1 17 4 сентября, 2016 Опубликовано 4 сентября, 2016 · Жалоба Здравствуйте! Впервые столкнулся с подобным феноменом. Было сделано 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 (тоже керамика) Процедура инициализации АЦП /** * \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 1 4 сентября, 2016 Опубликовано 4 сентября, 2016 · Жалоба А вы смотрели питание осциллографом? Может, оно слишком шумное, в палках и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladec 12 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Аналоговые цепи обвязки часом не с пятивольтовой запиткой? При перегрузках по входам на входах АЦП не могут возникать опасные превышения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 89 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Входы АЦП не Five-Tolerant и где-то похоже больше 4 вольт пролазит на входы. Может быть при включении/подключении виртуальное питание через FT-входы пролазит и передавливает 3.3В питание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Показали бы схему, а то так тяжело гадать. И при правильном включении (используя аналоговую часть) надо ставить фильтр - например BLM21AH102SN1D. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Большое спасибо всем за идеи и наводящие вопросы! Разбираюсь с блоком питания. уже нашел некоторые проблемы. Там схема немного сложная, из разных входных делается 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. Показали бы схему, а то так тяжело гадать. И при правильном включении (используя аналоговую часть) надо ставить фильтр - например BLM21AH102SN1D. Понимаю, что схема бы сняла многие вопросы, но оно не только мое творчество, пока показывать не буду (хотя по-моему там ничего супер ноу-хау и нет, штатные типовые узлы и схемы). "ставить фильтр" - это где, между VDD и VDDA ? С какой целью? (у меня этот АЦП не основной и к шумам претензий нет, что смешно- основной 24-битный молотит без проблем, а встроенный в МК, вспомогательный для функциональности платы АЦП, выходит из строя). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба "ставить фильтр" - это где, между VDD и VDDA ? С какой целью? (у меня этот АЦП не основной и к шумам претензий нет, что смешно- основной 24-битный молотит без проблем, а встроенный в МК, вспомогательный для функциональности платы АЦП, выходит из строя). Тогда ставить фильтр смысла нет. Фильтр только для того - чтоб отфильтровать ВЧ помехи по питанию которые даёт сам микроконтроллер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 3 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба У мощных DCDC при уменьшении потребляемой мощности появляется неслабая болтанке на выходе. Все из за того, что индуктивность остается прежней, а нагрузке меняется. Может еще это давать свой вклад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladec 12 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба По нашему опыту в STM-х при превышении напряжения питания в первую очередь убиваются PLL и АЦП Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 6 сентября, 2016 Опубликовано 6 сентября, 2016 (изменено) · Жалоба Что я вижу: питание: 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 ушли. Изменено 6 сентября, 2016 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 3 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба феррит бид на VDDA фильтрует помехи, но никак не ограничивает напряжение А кто спорит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба Я в своих схемах с ST-ками ставлю два LDO 3.3В после 5В DC-DC: один питает ядро, другой аналоговую часть камня. Ну и правильная разводка земель, чтобы встроенный АЦП еще меньше ловил мусора. В итоге такое решение оказалось гораздо эффективнее (по борьбе помехами), чем феррит между цифрой и аналогом. Более того, для еще большей точности аналоговую часть запитываю прямо от опорника 3.0В, вместо LDO (цифра от LDO 3.3В) или его отправляю на один из аналоговых входов, чтобы его использовать при перерасчете напряжения на других аналоговых входах. Короче, всеми возможными путями избегаю кидать питание на камень напрямую с DC-DC (особенно аналоговая часть), всегда предпочитают ставить LDO даже после хорошего DC-DC. Устройства, где применяю такие решения, вообще некритичны по цене и тем более к дополнительному одному или двум бюджетным LDO. Там важнее надежность ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 3 7 сентября, 2016 Опубликовано 7 сентября, 2016 · Жалоба Если запитываете от опорника - не прыгает напряжение при измерениях? Все таки нагрузка меняется Хотя если мощный ма ma на 20 взять врятли будет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 7 сентября, 2016 Опубликовано 7 сентября, 2016 · Жалоба Я в своих схемах с 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." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться