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

 
 
> STM32F103. Взаимное влияние каналов АЦП?
Lost_Viking
сообщение Mar 30 2014, 09:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Камень 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 - Mar 30 2014, 09:58
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lost_Viking
сообщение Mar 30 2014, 14:33
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
Myron
сообщение Mar 30 2014, 15:21
Сообщение #3


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:38
Рейтинг@Mail.ru


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