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

 
 
> Ультразвуковой анемометр
brag
сообщение Dec 31 2013, 14:10
Сообщение #1


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Вот слепил таккой девайс из почти подручных материалов.
Мож кому будет интересно..

Принцип взят из этой темы http://electronix.ru/forum/index.php?showtopic=65996 + немного мозга. Отдельная благодарность ее учасникам за инфу wink.gif
Контроллер - атемга88 на плате от какого-то старого проекта.
Датчики брал вот такие http://voron.ua/catalog/018090 дешевые. По скольку мне прислали не пару, а 2 передатчика - так и поставил. передатчик тоже OK работает в качестве приемника wink.gif
Схема простая. добротности датчиков для расстояния 100мм (взял исходя из нужных критериев) достаточно, так что все прямо к мк. Компаратору опору немного сместил и поднял все это дело над землей.

Принцип основан на измерении разности фаз сигнала туда и обратно и выдача на комп по UART, дальше вся обработка на матлабе.

Тактовая частота 20мгц. резонансная около 42кгц(подстраивал).
У таймера1 2 прерывания в центре цикла и в конце, тоесть прерывания вылетают с частотой ~84кгц всегда из одного места: sleep; rjmp -1;
Код
OCR1B=TMVAL_PI-1; // middle
    OCR1A=TMVAL_PI*2-1;

главное - успеть их обработать, до наступления следующего прерывания.
В обработчике собственно дрыгание ногами и проверка флага ICR, который выставляется по одному фронту(без разницы какому) компаратора.
CODE
static void tih1(){
PORTC^=(PC_US00|PC_US01);
icr1();
}

static void tih2(){
PORTC^=(PC_US12|PC_US13);
icr2();
}

void tihInit(){
setTih1();
}

ISR(iTmr1CmpA){ // full cycle, 40khz
pTih();
}

ISR(iTmr1CmpB){ // middle of cycle
pTih();
}


В стейт-машине
1. делается 4096 холостых тактов
2. берется значение ICR, которое по сути является фазой(если свернуть к +-PI) и интегрируется 2048 раз
3. меняются местами приемник/передатчик
4. повторяется 1-3
5. вычисляется разность фаз(со сварачиванием ессно) выдается результат по uart ( cbkDfrdy(dfi); )

Разность фаз может быть как положительная, так и отрицательная, те можно мерять и направление ветра.

Вот примерно такой код
CODE
// --------------------------------------------------------
static CallbackF pTih;
static long g_integ;
static int g_icrint1,g_icrint2;
static U16 g_ctr;
static U8 g_st;

static void tih1();
static void tih2();

static void tmrReset(){
TCCR1B=(TCCR1B&~0x07);
TCNT1H=0;
TCNT1L=0;
TCCR1B|=(1<<CS10);
TIFR1=0x27;
}

static void setTih1(){
DIDR0=(1<<ADC2D)|(1<<ADC3D);
PORTC=0x30|PC_US00;
DDRC=PC_US00|PC_US12|PC_US01;
ADMUX=3;
pTih=tih1;
tmrReset();
}

static void setTih2(){
DIDR0=(1<<ADC0D)|(1<<ADC1D);
PORTC=0x30|PC_US12;
DDRC=PC_US00|PC_US12|PC_US13;
ADMUX=1;
pTih=tih2;
tmrReset();
}

#define T_PREAMBLE 4096
#define LS_INTC 11

static inline char getIcr(int *picr){
if(TIFR1&(1<<ICF1)){
int icr=ICR1L;
icr|=(U16)ICR1H<<8;
TIFR1=(1<<ICF1);
if(icr>=TMVAL_PI)icr-=TMVAL_PI*2; // if fi>=180 fi=fi-360;
*picr=icr;
return 1;
}
return 0;
}

static void icr1(){
int icr;

switch(g_st){
case 0: // start
g_ctr=0;
g_st=1;
break;
case 1:
if((++g_ctr)>=T_PREAMBLE){
g_ctr=0;
g_integ=0;
g_st=2;
}
break;
case 2:
if(!getIcr(&icr))break;
g_integ+=icr;
if((++g_ctr)>=(1<<LS_INTC)){
g_icrint1=g_integ>>LS_INTC;
g_st=0;
setTih2();
}
break;
default:
g_st=0;
break;
}
}

static void icr2(){
int icr;

switch(g_st){
case 0: // start
g_ctr=0;
g_st=1;
break;
case 1:
if((++g_ctr)>=T_PREAMBLE){
g_ctr=0;
g_integ=0;
g_st=2;
}
break;
case 2:
if(!getIcr(&icr))break;
g_integ+=icr;
if((++g_ctr)>=(1<<LS_INTC)){
g_icrint2=g_integ>>LS_INTC;

int dfi=g_icrint1-g_icrint2;
if(dfi>=TMVAL_PI)dfi-=TMVAL_PI*2; // wrap phase
else if(dfi<-TMVAL_PI)dfi+=TMVAL_PI*2;

cbkDfrdy(dfi);
//outhex(dfi);
//outhex(g_icrint1);uartch(' ');outhex(g_icrint2);
//uartstr_P("\r\n",2);

g_st=0;
setTih1();
}
break;
default:
g_st=0;
break;
}
}

Самое важное здесь выполнить tmrReset в начале каждого измерения иначе фаза будет прыгать рандомически. Ну и успеть полностью обработать прерывание(когда идет замер фазы) примерно за 230 тактов, в моем случаи.

Мне нужно мерять не скорость ветра, а расход воздуха, м3/час. Поэтому эта колбаса помещается в трубе диаметром 125мм.
Формулы простые, все основано на Википедии + Wolfram mathematica sm.gif

l=0.1; % расстояние между датчиками
d=0.125; % диаметр трубы
vs0=20.0457*sqrt(t+273.15); % скорость звука, t - температура в °C, берется с термодатчика тем же прибором.
dt=y/20e6; % y-разность фаз.
v=-l/dt + sqrt(l^2 + dt^2* vs0^2)/dt; % вычисляем скорость ветра, м/с
va=v*pi*(d/2)^2*3600; % расход воздуха, м3/час

Вот так выглядит результат. Пока тест, дул ртом (в одну и в другую сторону) sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- brag   Ультразвуковой анемометр   Dec 31 2013, 14:10
- - brag   С трубой картина хуже - отражения в трубе формирую...   Jan 3 2014, 02:07
- - Lagman   Ультразвуковой расходомер, много где применяется. ...   Jan 3 2014, 17:41
- - brag   В трубе какраз максимум отражений именно когда рас...   Jan 3 2014, 23:24
|- - Самоделкин   Цитата(brag @ Jan 4 2014, 01:24) В трубе ...   Jan 4 2014, 05:28
- - Herz   Цитата(brag @ Dec 31 2013, 16:10) 5. вычи...   Jan 4 2014, 09:58
- - brag   ЦитатаВозможно я чего то не правльно понял а чем В...   Jan 4 2014, 17:36
|- - Herz   Цитата(brag @ Jan 4 2014, 19:36) dfi=fi1-...   Jan 4 2014, 21:46
||- - brag   Цитата(Herz @ Jan 4 2014, 23:46) Читал-чи...   Jan 4 2014, 23:16
||- - Herz   Цитата(brag @ Jan 5 2014, 01:16) хм, что ...   Jan 5 2014, 08:08
|- - kolobok0   Цитата(brag @ Jan 4 2014, 21:36) Тем же п...   Jan 5 2014, 00:46
|- - brag   Цитата(kolobok0 @ Jan 5 2014, 02:46) я та...   Jan 5 2014, 10:52
|- - kolobok0   Цитата(brag @ Jan 5 2014, 14:52) ...это д...   Jan 5 2014, 14:57
|- - Herz   Цитата(brag @ Jan 5 2014, 12:52) А поскол...   Jan 5 2014, 19:40
- - brag   для контроля. клиент хочет, чобы его вентиляция да...   Jan 5 2014, 16:48
- - Lagman   так в ваших формулах все известно, подставляете зн...   Jan 5 2014, 18:15
- - brag   Цитататак в ваших формулах все известно, подставля...   Jan 5 2014, 20:18
|- - HardEgor   Точно измерить можно трубкой "Пито". М...   Jan 5 2014, 21:19
- - brag   Хм, у меня скоростя от 0.25 до 5.5 м/с - врядли их...   Jan 5 2014, 21:51
|- - Tanya   Цитата(brag @ Jan 6 2014, 01:51) Хм, у ме...   Jan 6 2014, 04:44
- - brag   проволоку геморой калибровать.. влияет ессно все, ...   Jan 6 2014, 20:41
- - uk8amk   Интересная тема. Тут как раз за недорого попалась ...   Jun 9 2014, 14:40
- - uk8amk   Попробовал изобрести УЗ анемометр. Стреляю пачку и...   Jun 10 2014, 08:07
|- - AndyBig   Цитата(uk8amk @ Jun 10 2014, 16:17) Сейча...   Jun 10 2014, 17:31
- - uk8amk   Доделал схему с программой так что теперь оба датч...   Jun 15 2014, 12:59
- - LexaryStyle   Я делал термоанемометр на базе спец сенсора. Точно...   Jun 15 2014, 15:37
- - uk8amk   Фазовым методом ТС насколько помню можно адекватно...   Jun 15 2014, 17:58
|- - HardEgor   Цитата(uk8amk @ Jun 16 2014, 00:58) Для м...   Jun 16 2014, 18:49
- - uk8amk   На низких скоростях погрешность в 2-3 м/с вполне п...   Jun 17 2014, 10:56
- - uk8amk   Решил заснять параметры отклика аналоговой части с...   Jun 18 2014, 08:11
- - Voblin   На самом деле ограничение в пи/2 можно обойти испо...   Jun 18 2014, 11:36
- - Anton75   На всякий случай, вдруг пригодится: этой темой дав...   Jun 23 2014, 06:59
- - uk8amk   Спасибо за совет. Но я пожалуй пока с несерьёзной ...   Jun 23 2014, 19:35
- - Anton75   Цитатапока с несерьёзной математикой повожусь Ког...   Jun 24 2014, 06:23
- - uk8amk   Появилось немного свободного времени, я оформил сх...   Aug 26 2014, 19:22
- - kolobok0   Цитата(uk8amk @ Aug 26 2014, 23:22) ... Е...   Aug 27 2014, 19:02


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 03:15
Рейтинг@Mail.ru


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