Выбросы на ножках АЦП в STM32

РЕШЕНО- ПЕРЕЗАРЯД КОНДЕНСАТОРА АЦП
При работе с АЦП STM32F100,103 в 64 ногих корпусах обращал внимание на неадекватное поведение сигналов с АЦП — сильно скакали, при этом каких то адекватных объяснений найти не удавалось.

Случайно подсоединившись к одной из ног плохоньким цифровым осциллографом увидел что то похожее на выбросы, но тк осцил был хреновенький решил дождаться нормального осциллографа и посмотреть им. В общем DSO-2250 показал вот такие картинки на двух ногах PA1 и PC4, при том что по еррате подобные выбросы вроде как описаны на PA0. WTF?
Схема и точка измерения:


Код с DMA:

ноги

 /* Configure pa1-7 analog inputs           */
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* Configure pc4 analog inputs           */
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);



void Setup_ADC1(void)
{

	//==Definitions==
	#define ADC1_DR_Address    ((uint32_t)0x4001244C)

	DMA_InitTypeDef DMA_InitStructure; //Variable used to setup the DMA

	ADC_InitTypeDef ADC_InitStructure;

	//--Enable DMA1 clock--
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	//==Configure DMA1 - Channel1==
	   DMA_DeInit(DMA1_Channel1); //Set DMA registers to default values
	   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //Address of peripheral the DMA must map to
	   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) & ADC_VAL; //Variable to which ADC values will be stored
	   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	   DMA_InitStructure.DMA_BufferSize = ADC_CH; //Buffer size (8 because we using 8 channels)
	   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 = DMA_Mode_Circular;
	   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

	   DMA_Init(DMA1_Channel1, &DMA_InitStructure); //Initialise the DMA
	   DMA_Cmd(DMA1_Channel1, ENABLE); //Enable the DMA1 - Channel1


	   //==Configure ADC1 - Channel 0 -5

	      ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	      ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	      ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	      ADC_InitStructure.ADC_NbrOfChannel = ADC_CH; //We using 8 channels

	      ADC_Init(ADC1, &ADC_InitStructure); //Initialise ADC1

	      //Setup order in which the Channels are sampled....

	      #define ADC_SampleTime ADC_SampleTime_239Cycles5
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 4, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 6, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7, ADC_SampleTime);
	      ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 8, ADC_SampleTime);

//       ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 7, ADC_SampleTime);


	      ADC_DMACmd(ADC1, ENABLE); //Enable ADC1 DMA
	      ADC_Cmd(ADC1, ENABLE); //Enable ADC1


	      //==Calibrate ADC1==

	         //Enable ADC1 reset calibaration register
	         ADC_ResetCalibration(ADC1);
	         while (ADC_GetResetCalibrationStatus(ADC1)); //Check the end of ADC1 reset calibration register

	         //Start ADC1 calibaration
	         ADC_StartCalibration(ADC1);
	         while (ADC_GetCalibrationStatus(ADC1)); //Check the end of ADC1 calibration


}



Осцилограммы,




Цена деления 20mS и 20mV :)




UPDATE:
В общем респект камраду ZIB который пояснил что это выбросы от перезаряда конденсатора.
От себя дополню почему так получилось: при внимательном рассмотрении выяснилось, что два крайних канала имели разный уровень примерно 1.65 и 3.1 вольта поэтому естественно при переходе с канала на канал на том канале который имел 1.65 вольта PC4 получались положительные выбросы, тк на кондесаторе было накоплено большее напряжение и на нагрузку 5.6к оно не сразу сливалось, ну и на PA1 естественно получались отрицательные провалы т.к. при напряжении на нем 3.1в предыдущий канал имел 1.65в. Вывод надо ставить меньшие защитные резисторы и все таки вероятно емкости на ~0.1 uF.

  • 0
  • 17 октября 2012, 11:30
  • GYUR22

Комментарии (45)

RSS свернуть / развернуть
А с какой частотой идут эти выбросы, не совпадает ли она с частотой опроса? Амплитуда выбросов изменяется так будто заряжается ёмкость, наталкивает на одну мысль. Я не знаю как устроен АЦП у STM но у AVR при измерении напряжения с чегото высокоомного на вход нужно вешать ёмкость иначе при выборе мультиплексором нужной ноги ёмкость АЦП не успеет зарядиться, соответственно будут просадки как в результатах измерений так и в реальном напряжении на ножке.
0
  • avatar
  • mChel
  • 17 октября 2012, 16:07
Кстати да, после R28 и R33 надо поставить конденсаторы на землю.
0
Можно, но это не обязательно — в приципе скорость у меня маленькая и поэтому когда я их обнаружил то задавил фильтрацией.
И такие выбросы они не на всех ногах а только на указанных, но правда тем или иным способом немного пролазят и вдругие каналы.
Вопрос один какого хрена?
0
От скорости это вроде особо не зависит — просадка происходит из-за зарядки сэмплирующего конденсатора. Так что перед ножкой, AFAIK, лучше все же буферный поставить. Да и выбросы он, в принципе, задавит.
А другие ноги подключены так же или все же без резисторов?
Если это не из-за заряда сэмплирующего кондера — то причину, вероятно, надо искать в свежей эррате.
0
Обязательно, совместно с резистором конденсатор образует антиалиасинговый фильтр. Возможно, из-за его отсутствия и получаются выбросы: высокочастотные помехи отображаются в область полезного сигнала.
0
скупой платит дважды. хотели дешевого дерьмеца? — кушайте, не обляпайтесь ;)
0
Что за глупые наезды какой критерий дешевизны?
Cколько по вашему должен стоить контролер подобного STM32F100RCT6? 500руб,1000руб, 100USD?
Какие есть другие варианты LPC1758 — похожие проблемы
Еще варианты которые можно в РФ купить без проблем?
зы вы хоть вообще претсавляете сколько вообще стоит то что вы покупаете по одной штуке за 200-300руб?
0
Выбросы только на указанных ногах — и с частотой вроде не совпадает (хотя не считал) они идут пачками — если кто обратил внимание
На остальных каналах 1-6 картина как слева до середины на первом рисунке
0
А каким образом организовано питание, и не смотрели ли осциллограммы по питанию? Никакой корреляции нет?
0
Еще не совсем понятно зачем защиту — BAV99 повешали на AVCC — мне кажется есть смысл на VCC. Ну остальное после осциллограмм.
0
Питание импульсное, но оно не влияет (проверено перепроверено) я писал что только на двух ногах такая ярко выраженная картина
это в принципе пофиг та двух ногах такая ярковырженная ко нк ток очень мал да и тащить через всю плату еще одно питание это не айс
0
Советую почитать AN2834: How to get the best ADC accuracy in STM32F10xxx devices, особенно пункт 1.2.
0
Прежде чем писать данный пост я еще раз обратился к еррате и на всякий случай к этому документу.
Вы не совсем понимаете о чем речь, например прочтите еррату про ADC PA0
0
В одном из errata было написано, что такое возможно на некоторых ножках. Может Вы попали как раз в ту серию.
0
  • avatar
  • OlegG
  • 18 октября 2012, 10:27
Да дочитал до конца и увидел что это уже предполагали.
0
Разводка платы? Мобильник далеко? Вафля?
0
Мобильник и вафля не причем они далеко и такая фигня не на всех ногах
0
Няшная плата. Ну и ты знаешь мой вопрос)
Алсо, почему ты не предусмотрел конденсаторы на входах АЦП? Они там нужны по нескольким причинам, а заодно и иголки бы задавили.
0
Это прототип контроллера/девелопмент борд
С одной стороны да кондеры там неплохо иметь, с другой совсем необязательно и еслибы они там стояли я бы никогда ненашел этих иголок :)
В связи со многими косяками в данной конфигурации (ацп правда задавленный фильтром и 3ремапленный уарт отваливающийся по непонятным причинам) и расширением i/o планирую переезд 100ногие камни
0
IMHO, чисто визуально кварцы кажутся далековато. Хотя может это и пофиг…
0
Кстати, емкости по питанию с другой стороны платы есть? Потому как те, что видны на фотке далековато стоят, я всегда вплотную их ставлю.
0
На другой стороне нет, в среднем там меньше 10 мм до ноги,
По секрету скажу что работает все и без них, и с дальшим расположение от процов
в моем случае есть какой то косяк в камне — может зависит от используемой периферии хз
А кварцу на 8 мегагерц его хот на выносную плату ставь он нормально работает.
0
Да работать-то оно будет. Вопрос в том, насколько чистое питание и стабильность работы вы хотите =)
0
В том, что оно будет работать я не сомневаюсь, вопрос в том, что получается в итоге. Процы имеют неприятное свойство весьма резко менять потребление, что приводит к заметным выбросам по питанию. Что и куда пролазит если эти выбросы не сглаживать близко расположенными емкостями — можно только догадываться. В вашем случае проблеме подвержены крайние ноги, расположенные как раз рядом с питанием. Что, как бы, намекает, что возможно тут есть связь. Я не утверждаю, что это именно так, но не исключаю.

P.S. равно как и с развязкой вопрос вовсе не в том, работает оно или нет, а в том, что получается в итоге. у стм-ок, насколько я помню, генераторы живут вместе с аналоговой частью. и я не сильно удивлюсь, если окажется, что все требования даташита к разводке кварца связаны, как раз, с тем, как он влияет на аналоговую часть, а вовсе не со стабильностью работы генератора.
0
Выбросы очень узкие-<1 микросекунды у питания так не получится и я привел осцилограмму по питанию посмотрите внимательно там все более менее чисто.
Я тожесначала грешил на питание нопосле 100500 эксперимента понля что дело не врем.
Да ирядом там аналоговое питание — оносильно отфильтрованное через ддроссель
0
да еще один момент — обратите внимание на форму выбросов
0
Да, я обратил, конечно. Выглядит довольно странно.
0
Осциллограммы по питанию снимались прямо на ногах чипа?

Аналоговое питание, насколько я вижу, сделано так же как и все остальное — от ноги до емкости идет довольно длинная дорожка, которая имеет свою собственную индуктивность и отнюдь не нулевое сопротивление.
0
насколько я могу судить такая длина как у меня — не критична 2.5см
Короче говоря повторюсь еще раз к питанию это отношения не имеет т.к. размах не тот у avcc размах около 5mv у выбросов 50мв — т.е. на порядок, если бы это было по питанию то там были бы выбросы ну никак не более выбросов на питанию и ширину имели бы на порядок большую — в смысле если бы это были наводки.
0
Это не обязательно наводки, более вероятны кратковременные просадки из-за внутренних связей. К тому же амплитуда не обязательно должна быть одинаковой, поскольку на такой длине у дорожки вполне может быть вполне заметная индуктивность.
Повторюсь: это только мое предположение, направление куда я стал бы копать сам в первую очередь.
0
на первой и третьей крfтинке явно не просадки :)
0
Уговорил, не просадка, а «приподнимание» земли. Сути это не меняет.
0
да не питание это посмотрите на AVCC!
0
Наварное глупость, но пробовали ли Вы убрать резисторы r25 и r28 и опять ткнуться в осциллографом в ножки?
0
кна выходах оу все в порядке я проверял — резисторы отсоединять смысла особого нет увеличиться выброс только и всего
0
А частота приподниманий не 50 Гц случайно?
0
Все давно решилось -заряд кондера на ацп при высоком входном сопротивлении дает просадку. Правда почему с аврками такого не было хз.
0
+кросталк
0
AVR рассчитаны на выходное сопротивление до 10к (да и внутри кристалла сопротивление пути от пина до S&H кондера составляет 1-100к). Вероятно, у них время сэмплирования больше (в принципе, у STM32 его тоже поднять можно).
0
я использовал максимальное на стм- 239 и частоты ставил тоже сравнимые, но действительно у авр макс 15ksps на 10бит -те скорости почти на 2 порядка меньше, так что можно было и незаметить.
Документация правда на тему стмок — слегка «противоречива» те в датащите указано что приданном времени сэмплирования 239 там очень большой резистор ставить, но при этом — заряд на сэмпл кондере никуда не ужодит т.е. он не разряжается перед следующим сэмлированием — кроссталк. Я вышел из положения следующим образом — выкинул нафиг оу и оставил делители и bav99 по входам поставил 0.47 мф — у менямаленькая частота сэмплирования — постоянный ток и вроде все работает нормально. Был еще один косяк с питанием dcdc — он тоже оказалось сильно срал, я его перевел на 5v и поставил ncv1117 в качестве стабилизатора для мк.
0
поставил ncv1117 в качестве стабилизатора для мк.
IMHO на питание аналоговых ног мк имеет смысл ставить стабилизаторы типа LP2985A и подобные.
0
посмотрел дш и не совсем понял в чем его преимушщество — чуть лучше подавление на ~100кГц?
менее распространен (наверное), меньший ток, худшие допуски 1.5%?
меня в принципе устроило мое описанное решение единственное чего не могу сделать так это адекватно померять пульсации — изза наличия более менее вч только комптерного осцилоскопа DSO-2250, а он из за конструкции начинает показывать неадекват ~20-40мв p2p — при подсоединении общего провода устройства и замыкания щупов. Портативный велеман старый показывает гдето 1.6 p2p — и это больше похоже на правду тк ацп не дрожит более чем на 1-2 мзр.
0
Он специально заточен для ситуаций, когда нужно малошумное питание. По распространенности подобные регуляторы (LP298x и у других производителей тоже есть подобные) врядли сильно уступает 1117, тем более, что 1117 в корпусах типа SOT23-5 не бывает. На практике они только частично перекрывают области применения друг друга — там где из 1117 выжимают по максимуму шумы, как правило, уже не критичны, а там где достаточно меньших токов LP298x зачастую удобнее. Цены примерно одинаковые. Другой плюс — значительно меньшее минимальное падение. Допуски у варианта А (именно того, который я упомянул) — 1%. Ну и, наконец, они позволяют довесить на свободную ногу еще емкость и еще улучшить уровень шумов.
0
Однако там есть нюансы, как раз в области 100 кГц. LP2982 там ведёт себя хорошо, 2985 тоже, а вот 2980 склонна подвозбуждаться. Частота и амплитуда возбуда зависят от емкостей в обвеске и тока нагрузки, обычно несколько десятков мВ на 100...150 кГц. В низкочастотных схемах такое не вылавливается, но вот когда запитали от LP2980 ГУН в синтезаторе частоты, он был заметно промодулирован по амплитуде. Дополнительная RC-фильтрация проблему решила, но уменьшилась мощность; в итоге пришлось поставить TK11230 (TOKO). А вообще стабилизаторов такого плана — море, есть из чего выбрать.
0
Эти все LP298x названы в даташитах Micropower Voltage Regulator, только у LP2985 и LP2989 фигурирует дополнительно Low Noise, видимо для питания ADC надо искать LDO по этим ключевым словам.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.