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

 
 
> 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
 
Start new topic
Ответов
RadiatoR
сообщение Sep 6 2016, 09:34
Сообщение #2


Местный
***

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



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


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

Группа: Свой
Сообщений: 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
Obam
сообщение Sep 7 2016, 14:15
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Forger
сообщение Sep 7 2016, 16:25
Сообщение #5


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

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



Цитата(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 не дает ему расслабиться).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan1   STM32F070: выход из строя модуля ADC   Sep 4 2016, 19:48
- - ViKo   А вы смотрели питание осциллографом? Может, оно сл...   Sep 4 2016, 20:58
- - vladec   Аналоговые цепи обвязки часом не с пятивольтовой з...   Sep 5 2016, 07:38
- - HardEgor   Входы АЦП не Five-Tolerant и где-то похоже больше ...   Sep 5 2016, 09:08
- - glags   Показали бы схему, а то так тяжело гадать. И при п...   Sep 5 2016, 09:22
|- - Ruslan1   Большое спасибо всем за идеи и наводящие вопросы...   Sep 5 2016, 20:19
|- - glags   Цитата(Ruslan1 @ Sep 5 2016, 22:19) ...   Sep 6 2016, 06:11
- - RadiatoR   У мощных DCDC при уменьшении потребляемой мощности...   Sep 6 2016, 06:14
- - vladec   По нашему опыту в STM-х при превышении напряжения ...   Sep 6 2016, 06:35
- - KnightIgor   Цитата(Ruslan1 @ Sep 4 2016, 20:48) Что я...   Sep 6 2016, 09:31
|- - KnightIgor   Цитата(RadiatoR @ Sep 6 2016, 10:34) фер...   Sep 6 2016, 11:44
|- - Alechek   Цитата(Obam @ Sep 7 2016, 19:15) Рецепт н...   Sep 8 2016, 05:27
|- - HardEgor   Цитата(Alechek @ Sep 8 2016, 12:27) Вопро...   Sep 8 2016, 05:54
||- - Alechek   Цитата(HardEgor @ Sep 8 2016, 10:54) - в ...   Sep 8 2016, 06:34
|- - amiller   Цитата(Alechek @ Sep 8 2016, 08:27) Вопро...   Sep 8 2016, 08:13
- - RadiatoR   Если запитываете от опорника - не прыгает напряжен...   Sep 7 2016, 13:46
- - Obam   "Ни один серийный девайс по этому поводу не ж...   Sep 8 2016, 07:39


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

 


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


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