|
|
  |
STM32F103. Взаимное влияние каналов АЦП? |
|
|
|
Mar 30 2014, 09:07
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Камень STM32F103VET6 Отладочная плата , как у автора данной статьи: STM32 и дисплейНебольшая предыстория: Была у меня как-то идея из пьезодатчиков сделать датчики пульсирующего давления. А точнее - пульсирующего отрицательного давления относительно атмосферного, иначе говоря датчики пульсирующего разрежения  . Где-то на форуме я уже поднимал вопросы по этой теме, но то было все на 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 - Mar 30 2014, 09:58
|
|
|
|
|
Mar 30 2014, 14:33
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Использовал всего 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% от шкалы. Это нормально?
Сообщение отредактировал IgorKossak - Mar 31 2014, 05:10
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Mar 30 2014, 15:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 849
Регистрация: 6-02-05
Пользователь №: 2 451

|
Цитата(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.
|
|
|
|
|
Mar 30 2014, 15:47
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Myron @ Mar 30 2014, 19:21)  1. Это не схема, это разрозненная россыпь компонентов. Так эту шнягу делал не я. Я уже потом обратил внимание на то, что как-то все слишком просто сделано. Даже отладочная на меге16 была гораздо хитрее сделана. Про RC-цепочку я читал по ссылке, которую я привел в первом сообщении. Если все так, как вы описали, и как мне кажется, то это весьма все печально. Придется колхозить. Если будут еще мысли у кого-то - поделитесь, плиз =) В принципе, на данном этапе я все равно буду сигнал пропускать через матфильтр. Эти выбросы , да и этот шум, я не думаю, что слишком уж окажут большое влияние. Вообще, печально конечно =))
Сообщение отредактировал Lost_Viking - Mar 30 2014, 15:52
|
|
|
|
|
Mar 30 2014, 16:13
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Сергей Борщ @ Mar 30 2014, 20:03)  Каково выходное сопротивление вашего датчика? В данном случае (на отладочной плате) стоит переменный резистор на 1кОм. Один конец на 3.3 вольта от стабилизатора, другой конец на землю. Движок резистора к PC0 напрямую. Я так понимаю, в моем случае происходит нечто наподобие вот этого?
Сообщение отредактировал Lost_Viking - Mar 30 2014, 16:08
|
|
|
|
|
Mar 31 2014, 04:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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). Однако, если требования по выходному сопротивлению источника соблюдены, то даже несмотря на этот выброс конденсатор за время выборки успеет зарядиться или разрядиться (если был заряжен при преобразовании предыдущего канала) до входного напряжения с точностью лучше единицы младшего разряда. Поэтому если вы наблюдаете болтанку больше единицы младшего разряда - дело или в качестве питания аналоговой части процессора или в качестве опорного напряжения или в качестве разводки аналоговых цепей, земель и аналогового питания. Подключение вашего потенциометра относится к разводке аналоговых цепей и наверное стоит попробовать подключить потенциометр не к выходу стабилизатора, а ко входу опорного напряжения (если такой есть в вашем процессоре) или ко входу аналогового питания (если отдельного входа опоры нет). И второй конец потенциометра подключить к земле как можно ближе к ноге аналоговой земли. В противном случае вы можете измерять все шумы, бродящие по цепям земли и питания.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 31 2014, 08:49
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Сергей Борщ @ Mar 31 2014, 08:14)  дело или в качестве питания аналоговой части процессора или в качестве опорного напряжения или в качестве разводки аналоговых цепей, земель и аналогового питания. Премного благодарен. По питанию наблюдаю шумы, в том числе и на опорном напряжении. Действительно, дело в разводке. Буду дорабатывать. Еще раз спасибо
|
|
|
|
|
Mar 31 2014, 11:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 849
Регистрация: 6-02-05
Пользователь №: 2 451

|
Цитата(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) от полезного сигнала и от его дискретизации. Для этого необходимо применять входной НЧ фильтр по сигналу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|