Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103. Взаимное влияние каналов АЦП?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Lost_Viking
Камень STM32F103VET6
Отладочная плата , как у автора данной статьи: STM32 и дисплей

Небольшая предыстория:

Была у меня как-то идея из пьезодатчиков сделать датчики пульсирующего давления. А точнее - пульсирующего отрицательного давления относительно атмосферного, иначе говоря датчики пульсирующего разрежения wacko.gif . Где-то на форуме я уже поднимал вопросы по этой теме, но то было все на AVRах. Миграция на STM32 обусловлена некоторыми факторами. Так как времени свободного у меня почти нет, то работа эта растянулась на годы.

С датчиков снимается сигнал в виде производной от давления. Датчики включены так, что при нажатии на них снимается отрицательный сигнал, при отпускании - положительный. То есть при росте разрежения сигнал снимается положительный относительно "земли". Что бы узнать реальное давление необходимо проинтегрировать сигнал. Интегрировать собираюсь каждый период в отдельности, то есть от "нуля" до "нуля". Все это было проведено на собранном мною стенде (показывать не буду, ибо выглядит жутко), и сигналы были все обсчитаны в EXCEL'e . Получилось вот что:

Скриншот 1
Скриншот 2

На рисунках представлены первообразные положительной и отрицательной части сигнала. Видно, что амплитуда первообразной зависит от частоты. Причем, установить эту зависимость можно только экспериментальным путем. Необходимо: изменяя частоту давления (разрежения) снимать сигнал с датчика, далее интегрировать его, далее находить поправочные коэффициенты для каждой частоты, и эти коэффициенты потом применять к первообразной при дальнейших измерениях.

Для всех этих хитростей достаточно одного канала АЦП, одного датчика. Но в дальнейшем у меня в работе будет 4 датчика. И по этому собственно сам вопрос встает следующим образом:

Немного уточню чего хочу сделать. Есть 4 пьезо-датчика, сигналы с них идут сложной периодической формы. Значения снимаемого с них сигналов ниже нуля не интересуют. Частоты сигналов от 6 Гц до 50 Гц. Для более точной оцифровки решил использовать частоту дискретизации с запасом (500Гц, по 10 семплов на период для максимальной частоты). Возможно, что потребуется поднять верхний предел до 70Гц. Амплитуда положительной части сигналов до 10 вольт. Соответственно, будет использован делитель на сопротивлениях, хотя не уверен насколько правильным будет его использование с пьезодатчиками и АЦП. Каждый период сигнала будет интегрироваться (суммированием семплов), потом полученный интеграл (первообразная) будет домножаться на определенный коэффициент, зависящий от длительности сигнала с датчика.

1) Реально ли на данном камне реализовать 4 канала АЦП с частотой дискретизации 500гц каждый ? На AVRе были проблемы с емкостью, что при коммутации каналов АЦП давала эффект влияния каналов друг на друга. Здесь же я наткнулся вот на такую интересную вещь: описание явления. Эффект похожий. На AVRе я просто пропускал несколько семплов после переключения канала. Как быть здесь?

2) STM32F103VET6 имеет 3 канала АЦП. Если пункт 1) реален, то как лучше мне организовать измерение 4 каналов, учитывая, что между измерениями будет выполняться матчасть, и будет организован вывод на 7-сегментный индикатор и будет опрос кнопок? Использовать RTOS ?

3) И еще раз - что делать с влиянием каналов друг на друга? Я так понимаю, что если использовать только 3 датчика, и повесить их на ADC1, ADC2, ADC3 , то это влияние можно минимизировать, может быть даже исключить. Если использовать 4 датчика, то один из каналов придется переназначать в процессе опроса. Алгоритм представляю, но влияние каналов...

В общем, сильно не пинайте. Ну уж хочется мне попробовать тарировать пьезоэлементы для использования в некоторых гаражных целях, заодно изучить тонкости STM32 =))
Lost_Viking
Использовал всего 1 канал. Код такой:
CODE
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_adc.h"
uint32_t adcdata1,adcdata2;
void initall()
{
GPIO_InitTypeDef port;
TIM_TimeBaseInitTypeDef timer;
ADC_InitTypeDef adc;



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

GPIO_StructInit(&port);

//*****************************НАСТРОЙКА GPIO*******************************

//Порт PC0 и PC1 - выходы ацп
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Mode = GPIO_Mode_AIN;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &port);
//*****************************xxxxxxxxxxxxxxx*******************************

//*****************************НАСТРОЙКА TIM*******************************
TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = 720;
timer.TIM_Period = 50;
TIM_TimeBaseInit(TIM3, &timer);
//*****************************xxxxxxxxxxxxxxx*******************************

//*****************************НАСТРОЙКА ADC*******************************
ADC_StructInit(&adc);
adc.ADC_Mode = ADC_Mode_Independent;
adc.ADC_ContinuousConvMode = DISABLE;
adc.ADC_DataAlign = ADC_DataAlign_Right;
adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
ADC_Init(ADC1, &adc);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}



void TIM3_IRQHandler()
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}



int main()
{
__enable_irq (); // может быть и не нужно
initall();
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
ADC_RegularChannelConfig(ADC1, 10 , 1, ADC_SampleTime_239Cycles5);
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);



while(1)
{


}


Заснял видео с осциллографа. Чуть позже будет доступно. Пока что вопрос: вроде бы все верно в коде? Ацп измеряет то, что надо. Лишнего нет ничего?

Видео с непонятными импульсами на входе ацп.

Схема отладочной платы.

Вопрос: что делать? Или эти импульсы не влияют на результат преобразования, т.к. они каким-то чудесным образом отслеживаются железом?

Значения пляшут от 3764 до 3776 . Что примерно есть 10мВ . Примерно 0.3% от шкалы. Это нормально?
Myron
Цитата(Lost_Viking @ Mar 30 2014, 08:33) *
Видео[/url] с непонятными импульсами на входе ацп. Схема отладочной платы. Вопрос: что делать? Или эти импульсы не влияют на результат преобразования, т.к. они каким-то чудесным образом отслеживаются железом? Значения пляшут от 3764 до 3776 . Что примерно есть 10мВ . Примерно 0.3% от шкалы. Это нормально?


1. Это не схема, это разрозненная россыпь компонентов.

2. 0.3% = ~50дв (примерно 8 разрядов)

3. Попробуйте заменить безобразное решение опорного напряжения на обычную батарейку с ~3В (две батарейки по 1.5) с обязательным параллельным шунтированием керамическим конденсатором 1мкФ-10мкФ близко к МК входам и проверьте шум. После этого найдите приемлемое для вас решение для чистого опорного для необходимого для вас разрешения (ошибки).

4. Не нашел - особо не искал, что подключено ко входам АЦП, жалко своего времени на поиски среди ваших меток безобразной схемы . Сигналы ко входам АЦП должны быть подключены через RC цепи, рассчет которых широко обсуждался на форуме - последовательный резистор минимально возможной величины для обеспечения корректной работы источника сигнала при вашем пиковом напряжении сигнала и параллелная емкость максимально возможной величины с постоянной времени RC в определенное число раз меньше времени между отсчетами АЦП. Например, RC<=(1/9)*Tlpf для 12 разрядов разрешения АЦП (Tlpf=1/Flpf, где Flpf - частота среза НЧ фильтра (antialiasing)по входу АЦП). И т.д.

3.
Lost_Viking
Цитата(Myron @ Mar 30 2014, 19:21) *
1. Это не схема, это разрозненная россыпь компонентов.


Так эту шнягу делал не я. Я уже потом обратил внимание на то, что как-то все слишком просто сделано. Даже отладочная на меге16 была гораздо хитрее сделана.

Про RC-цепочку я читал по ссылке, которую я привел в первом сообщении.
Если все так, как вы описали, и как мне кажется, то это весьма все печально. Придется колхозить.

Если будут еще мысли у кого-то - поделитесь, плиз =)

В принципе, на данном этапе я все равно буду сигнал пропускать через матфильтр. Эти выбросы , да и этот шум, я не думаю, что слишком уж окажут большое влияние. Вообще, печально конечно =))
Сергей Борщ
Цитата(Lost_Viking @ Mar 30 2014, 11:07) *
На AVRе были проблемы с емкостью, что при коммутации каналов АЦП давала эффект влияния каналов друг на друга.
Нету такого эффекта у AVR. Есть несоблюдение разработчиком требований документации. Обеспечьте выходное сопротивление источника сигнала для AVR менее 10Ком (как этого требует документация) и никакого влияния не будет. Как угодно обеспечивайте, хоть ОУ повторителем включите. Здесь абсолютно то же самое. Влияния каналов друг на друга у STM32 при соблюдении требований доументации нет. Каково выходное сопротивление вашего датчика?
Lost_Viking
Цитата(Сергей Борщ @ Mar 30 2014, 20:03) *
Каково выходное сопротивление вашего датчика?


В данном случае (на отладочной плате) стоит переменный резистор на 1кОм. Один конец на 3.3 вольта от стабилизатора, другой конец на землю. Движок резистора к PC0 напрямую.

Я так понимаю, в моем случае происходит нечто наподобие вот этого?
Сергей Борщ
Цитата(Lost_Viking @ Mar 30 2014, 18:13) *
В данном случае (на отладочной плате) стоит переменный резистор на 1кОм. Один конец на 3.3 вольта от стабилизатора, другой конец на землю. Движок резистора к PC0 напрямую.
Такого сопротивления достаточно. Для вашего времени выборки оно может быть до 50Ком (см. раздел "12-bit ADC characteristics").

Цитата(Lost_Viking @ Mar 30 2014, 18:13) *
Я так понимаю, в моем случае происходит нечто наподобие вот этого?
Да, такая картина будет наблюдаться на любом АЦП без встроенного входного усилителя или буфера - это заряд накопительного конденсатора УВХ (устройства выборки-хранения, sampling capacitor). Однако, если требования по выходному сопротивлению источника соблюдены, то даже несмотря на этот выброс конденсатор за время выборки успеет зарядиться или разрядиться (если был заряжен при преобразовании предыдущего канала) до входного напряжения с точностью лучше единицы младшего разряда.

Поэтому если вы наблюдаете болтанку больше единицы младшего разряда - дело или в качестве питания аналоговой части процессора или в качестве опорного напряжения или в качестве разводки аналоговых цепей, земель и аналогового питания.
Подключение вашего потенциометра относится к разводке аналоговых цепей и наверное стоит попробовать подключить потенциометр не к выходу стабилизатора, а ко входу опорного напряжения (если такой есть в вашем процессоре) или ко входу аналогового питания (если отдельного входа опоры нет). И второй конец потенциометра подключить к земле как можно ближе к ноге аналоговой земли. В противном случае вы можете измерять все шумы, бродящие по цепям земли и питания.
Lost_Viking
Цитата(Сергей Борщ @ Mar 31 2014, 08:14) *
дело или в качестве питания аналоговой части процессора или в качестве опорного напряжения или в качестве разводки аналоговых цепей, земель и аналогового питания.


Премного благодарен. По питанию наблюдаю шумы, в том числе и на опорном напряжении. Действительно, дело в разводке. Буду дорабатывать. Еще раз спасибо
Myron
Цитата(Lost_Viking @ Mar 31 2014, 02:49) *
Премного благодарен. По питанию наблюдаю шумы, в том числе и на опорном напряжении. Действительно, дело в разводке. Буду дорабатывать. Еще раз спасибо

Сначала надо применить чистое опорное, а потом "чистое" аналоговое напряжение (если надо) и, после получения 12-ти - 14-ти бит разрешения, вылизывать разводку, если хочется получить 15-16 разрядов. У вас имеется прототип с программой и вам легко это проверить до доработки печатной платы. Проверка, как я сказал выше, заключается в подключении батареек вместо вашего опорного, затем, если нужно сделать еще лучше - вместо аналогового на МК, с обязательным их шунтированием керамикой 1-10мкФ. При этом важно использовать чистое напряжение на входе АЦП - подключив одну батарейку (1.5В) тоже с конденсатором на вход АЦП.

Цитата(Lost_Viking @ Mar 30 2014, 09:47) *
...это весьма все печально. Придется колхозить.

Это не называется колхозить, это азы инженерного подхода при разработке "железа". Здесь нужно применять несколько иной подход, по сравнению с подходом программиста.

Цитата(Lost_Viking @ Mar 30 2014, 09:47) *
В принципе, на данном этапе я все равно буду сигнал пропускать через матфильтр. Эти выбросы , да и этот шум, я не думаю, что слишком уж окажут большое влияние. Вообще, печально конечно =))

Если выбросы от грязного опорного, аналогового или даже от цифрового напрядения, убрать не удасться, только уменьшить. Насколько - вопрос соотношений частот.
И цифровая постфильтрация не уберет никак наложение спектров (aliasing) от полезного сигнала и от его дискретизации. Для этого необходимо применять входной НЧ фильтр по сигналу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.