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

 
 
> 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

Сообщений в этой теме
- 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
- - RadiatoR   феррит бид на VDDA фильтрует помехи, но никак не о...   Sep 6 2016, 09:34
|- - KnightIgor   Цитата(RadiatoR @ Sep 6 2016, 10:34) фер...   Sep 6 2016, 11:44
|- - Forger   Я в своих схемах с ST-ками ставлю два LDO 3.3В пос...   Sep 6 2016, 12:28
|- - Obam   Цитата(Forger @ Sep 6 2016, 16:28) Я в св...   Sep 7 2016, 14:15
|- - Forger   Цитата(Obam @ Sep 7 2016, 17:15) Рецепт н...   Sep 7 2016, 16:25
|- - 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 Текстовая версия Сейчас: 19th July 2025 - 09:44
Рейтинг@Mail.ru


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