roboforum.ru

Технический форум по робототехнике.

Доплеровский пеленгатор на Аtmega128

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 12 июн 2009, 16:36

Из схемы http://roboforum.ru/download/file.php?id=9456 видно что переключение
антенн происходит не прямоугольными импульсами, а через R-C цепочку.
Может поэтому и появляется синусоида(ИМХО). Т.е. второй PIN диод начинает открываться,
а первый еще не закрылся и тд...
В приемнике собрана след схема для шумодава: по памяти с pin(?)МС3361 на конденсатор далее
выпрямитель из 2 диодов и конденсатор(один конец на землю другой на катод диода) если шипит уровень напряжения на конденсаторе растет (на аналог вх Мега16).
Можно ли использовать эту схему в качестве уровне-мера сигнала (что нужно изменить , подобрать)?
У Вас явный баг в программе. МК зависать не должен.


Эти контроллеры http://www.intekufa.ru/Section200_70.aspxс Радиомодем Мега-09-УКВ, но сейчас другие начали закупать для новых скважин. Старые остались и проблемы в месте с ними .
Проще и точнее сравнивать не синусоиды, а каждые 4 уровня после RC на pin9.

Если можно поподробнее.Не совсем понимаю как.

Re: Доплеровский пеленгатор на Аtmega128

contr » 12 июн 2009, 17:29

Из схемы …видно что переключение антенн происходит не прямоугольными импульсами, а через R-C цепочку.

Ну и что? Вас ведь интересует DC уровень ЧМ сигнала после подключения антены, а не нюансы работы коммутатора.
уровень напряжения на конденсаторе растет (на аналог вх Мега16).

Вы бы сначала решили задачу пеленга, а уже потом с СШП разбирались.
Старые остались и проблемы в месте с ними

Старые МК это какие? Исходники имеете? Где сбоит по WD знаете?
Если можно поподробнее.Не совсем понимаю как

По 4 значениям, а именно столько Вы имеете для 4 антенн, красивой картинки одного периода синусоиды, как в примере с вращающейся антенной не получится.

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 12 июн 2009, 19:53

Ну и что? Вас ведь интересует DC уровень ЧМ сигнала после подключения антены, а не нюансы работы коммутатора.

НЕ только уровень ЧМ сигнала, а еще направление.
Уровни ЧМ сигнала, на всех попеременно подключаемых антеннах, должны быть почти равны.
Расстояние между антеннами в моем случае около 45 см(в зависимости от длинны волны)
Определить направление (радиопередатчика мощностью 5-20 Вт) по затуханию сигнала через 45 см для меня является не возможным.
Вы бы сначала решили задачу пеленга, а уже потом с СШП разбирались.

Я имел ввиду использовать уже готовую схему шумодава в качестве уровне-мера ЧМ сигнала
из слов
В ЧМ уровень несущей определяют по шумам, т.е. контролируют не сам сигнал, а подавление им ВЧ шумов. В простейшей схеме это емкость с выхода (pin9) на вход усилителя шумов (pin10) и выпрямителем/интегратором на pin11.....

Старые МК это какие? Исходники имеете? Где сбоит по WD знаете?

Старые контроллеры(готовые модули со всеми прибамбасами), а не МК(Atmega 8 16 32 128 ).
Исходников к сожалению нет, производитель не делится такой информацией.

Все MK подключены по TWI(I2C), если один из вспомогательных МК занял линиию(I2C)и не освобождает ее, то основной МК перестает видеть все остальные(вообще разные случаи бывают, эт просто один пример).

По 4 значениям, а именно столько Вы имеете для 4 антенн, красивой картинки одного периода синусоиды, как в примере с вращающейся антенной не получится.

Вроде начал понимать.
к примеру на антеннах(1,2,3,4) уровень на аналог.входе 0-50-100-50 после подключения, значит
сигнал пройдет с 3 к 1 антенне и будет перпендикулярен линии между 2 и 4 антенны
Так что ли?

Re: Доплеровский пеленгатор на Аtmega128

contr » 12 июн 2009, 20:34

В какие моменты нужно снять эти 4 значения на аналог. входе

после подключения антенны и устаканивания переходного процесса
Исходников к сожалению нет, производитель не делится такой информацией.

тогда и глюки WD в чужой прошивке Вам не победить :(
Я имел ввиду использовать уже готовую схему шумодава в качестве уровне-мера ЧМ сигнала

у чипа есть НЧ выход, на нем напряжение зависящее от фазы/частоты. Зачем с него снимать шумы и опять переводить в уровень?
Уровни ЧМ сигнала, на всех попеременно подключаемых антеннах, должны быть почти равны.

Не угадали! Прочтите что-нибудь про распространение радиоволн.

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 12 июн 2009, 20:57


USER777 Уровни ЧМ сигнала, на всех попеременно подключаемых антеннах, должны быть почти равны.

contr
Не угадали! Прочтите что-нибудь про распространение радиоволн.

Большое влияние на распространение радиоволн короче 30 см в нижних слоях
атмосферы оказывают гидрометеоры (дождь, туман, облака и т. д.). Затухание
радиоволн в парах воды особенно сильно сказывается для сантиметрового
диапазона. Затухание радиоволн в атмосфере может заметно уменьшать дальность
действия при больших расстояниях. На малых расстояниях оно сказывается
незначительно. На миллиметровых волнах поглощение сказывается на определенных
длинах волн и обусловливается молекулярным строением входящих в атмосферу
газов.

Я не знаток,но нужно разобраться. Допустим уровень ЧМ сигнала на 1 антенне -70 dBm и 2-я антенна дальше первой относительно излучателя на 45 см, то на сколько больше или меньше будет уровень ЧМ сигнала на 2-ой антенне (хотя бы примерно) (-69,99 dBm или -70,01dBm)(УКВ 165 МГЦ , мощность 5Вт , 3км ) от чего зависит???.

Re: Доплеровский пеленгатор на Аtmega128

contr » 12 июн 2009, 22:40

Круги на воде видели? Расстояние между гребнями – длина волны. От гребеня до впадины - половина длины волны, вот в этом промежутке и вытарчивают из воды 4 штыря.

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 13 июн 2009, 00:13

Ясно!
Соберу отпишусь.

Re: Доплеровский пеленгатор на Аtmega128

blindman » 13 июн 2009, 06:33

contr писал(а):От гребеня до впадины - половина длины волны, вот в этом промежутке и вытарчивают из воды 4 штыря.

Какое отношение это имеет к данной системе?

Здесь радиус окружности выбирается в зависимости от 3 параметров: частоты несущей, частоты вращения и желаемого максимального допплеровского сдвига.

Добавлено спустя 18 минут 36 секунд:
Странные какие-то нефтяники. Тратят время на какой-то пеленгатор, с которым потом ещё и носиться по полям периодически надо будет, вместо того чтобы избавиться от плохого оборудования и заменить на надёжное.

Re: Доплеровский пеленгатор на Аtmega128

contr » 13 июн 2009, 11:55

Какое отношение это имеет к данной системе?

никакого, но чек хоть представление иметь будет о длине волны, фазе прихода и размерах антены

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 13 июн 2009, 13:10

Странные какие-то нефтяники. Тратят время на какой-то пеленгатор, с которым потом ещё и носиться по полям периодически надо будет, вместо того чтобы избавиться от плохого оборудования и заменить на надёжное.

Нефтяники эт громко сказано.Средний процент обводненности нефти доходит до 90%
+ кризис.
Оборудование меняется на другое, но слабым звеном все же остается (УКВ связь)
Т.е контроллеры то новые http://www.lufkinautomation.com/sam1.asp, а вот средства связи с ними те же. Пытаются внедрить что-то вроде ШБД(широкополосный беспроводной доступ)пока не очень успешно.
Если считаете тему не актуальной можно закрыть.

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 13 июн 2009, 17:31

По моему для 4 точек упрощается до след
U_k[1..4] уровни ацп.

A = U_k[1]-U_k[3];
B = U_k[2]-U_k[4];

если А>B и A>-B, то Phi = arctg(B/A);
если А<B и A>-B, то Phi = 90 град. - arctg(A/B);
если А<B и A<-B, то Phi = arctg(B/A) + 180 град.;
если А>B и A<-B, то Phi = 270 град. - arctg(B/A);

вроде так.
Код: Выделить всёРазвернуть
//ICC-AVR application builder : 13.09.2008 11:20:34
// Target : M128
// Crystal: 16.000Mhz


#include <iom128v.h>
#include <macros.h>
#include <math.h>





void port_init(void)
{
PORTA = 0xAA;
DDRA  = 0xFF;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0x00;
}




//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0,2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x67; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
//uart has received a character in UDR
}




//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();

uart0_init();


MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x01; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

//
void main(void)
{
int Phi;
float Phi0;
int U_k[4];
float A;
float B;
init_devices();
U_k[0]=100;
U_k[1]=50;
U_k[2]=60;
U_k[3]=40;
A=U_k[0]-U_k[2];
B=U_k[1]-U_k[3];
if ((A>B)&&(A>-B))  Phi0 = atan(B/A)*180/_PI,putchar0(1);
if ((A<B)&&(A>-B))  Phi0 =90- atan(A/B)*180/_PI,putchar0(2);
if ((A<B)&&(A<-B))  Phi0 =180+ atan(B/A)*180/_PI,putchar0(3);
if ((A>B)&&(A<-B))  Phi0 =270- atan(B/A)*180/_PI,putchar0(4);
Phi=(int)fround(Phi0);

putchar0(Phi>>8);
putchar0(Phi);


}






void putchar0(unsigned char data )//êîì1 ïåðåäà÷à
{
   
    while ( !( UCSR0A & (1<<UDRE0)) );// æäàòü ïîêà áóôåð íå îñâîáîäèòüñÿ
   
    UDR0 = data; // çïèñàòü â áóôåð
}
void putchar1(unsigned char data )//êîì2 ïåðåäà÷à
{
 
    while ( !( UCSR1A & (1<<UDRE1)) );
 
    UDR1 = data;
}



unsigned char getchar0( void )// êîì1 ïðèåì
{

while ( !(UCSR0A & (1<<RXC0)) );
return UDR0;
}
unsigned char getchar1( void )// êîì 2 ïðèåì
{

while ( !(UCSR1A & (1<<RXC1)) );
return UDR1;
}

на вычисление арктангенса уходит много времени...
без арктангенса нельзя?
может есть вариант проще?
Project1.rar
sin_cos_tg_4Ant
(161.68 КиБ) Скачиваний: 22

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 29 июн 2009, 13:32

С вычислением арктангенса вроде разобрался. Сделал массив из значений тангенса для 0...89 +чуть больше 89 (см.таблиц 10000 ниже) град. Т.е позиция в массиве некого значения будет соответствовать арктангенсу этого значения.
А для того чтобы избавится от чисел с плавающей запятой float значения массива были предварительно умножены на 100 и округлены. Да еще и исходные тоже нужно *100. к примеру A/B =1 1 нужно умножить на 100. Чтобы соблюдался масштаб значений
к примеру 0 соответствует 0град, 100=45 град, 5729=89 град
Код: Выделить всёРазвернуть
const unsigned int arct[91]=
{0, 2, 3, 5, 7, 9, 11, 12, 14, 16, 18, 19, 21, 23, 25, 27, 29, 31, 32, 34, 36,
38, 40, 42, 45, 47, 49, 51, 53, 55, 58, 60, 62, 65, 67, 70, 73, 75, 78, 81,
84, 87, 90, 93, 97, 100, 104, 107, 111, 115, 119, 123, 128, 133, 138, 143,
148, 154, 160, 166, 173, 180, 188, 196, 205, 214, 225, 236, 248, 261, 275,
  290, 308, 327, 349, 373, 401, 433, 470, 514, 567, 631, 712, 814, 951, 1143,
   1430, 1908, 2864, 5729, 10000 };

Получилась "Вывернутая таблица"
Для того чтобы быстро находить позицию значения использовал метод деления по палам
к примеру Phi = arc(100); Phi=0x002D или 45(десят)
Код: Выделить всёРазвернуть
unsigned char  arc (unsigned int D)
{

unsigned char i;
unsigned char toLeft=0;
unsigned char toRight=89;
unsigned char pol0=0;
unsigned char pol1=0;

   

while (1)//сам поиск
   {
   
   
      i=(toLeft+toRight) / 2;
      if (D < arct[i])
      {
         toRight= i-1;
         pol1 = i;
         
      }
      else if (D > arct[i])
      {
         toLeft= i+1;
         pol0=i;
         
      }
      if ((((pol0-pol1)<2)&&(pol0)&&(pol1))||(toLeft > toRight)||(D == arct[i]) ) break;
      
   }
return i;// позиция значения или что близкое
   
}

Сам бы не разобрался помогал =DeaD= За эт ему большое СПС Метод рабочий сам проверял.
Это было для углов 0-90
А для остальных углов прописал условия
Для Всех углов:
Код: Выделить всёРазвернуть
U[0..3] значения АЦП
unsigned int Phi=0;
unsigned int Phi_0;




if (((U[0])+(U[2])+(U[1])+(U[3]))>50)
{
if ((U[0]>U[2])&&(U[1]>=U[3]))
{if (U[1]==U[3]) Phi_0=10000;else
{
Phi_0=(((U[1]-U[3])*100)/((U[0]-U[2])));
if (Phi_0>6000) Phi=10000;
}
Phi=0;
}
if ((U[0]<=U[2])&&(U[1]>U[3]))
{if (U[0]==U[2]) Phi_0=10000;else
{
Phi_0=(((U[2]-U[0])*100)/((U[1]-U[3])));
if (Phi_0>6000) Phi=10000;
}
Phi=90;
}
if ((U[0]<U[2])&&(U[1]<=U[3]))
{if (U[1]==U[3]) Phi_0=10000;else
{
Phi_0=(((U[3]-U[1])*100)/((U[2]-U[0])));
if (Phi_0>6000) Phi=10000;
}
Phi=180;
}
if ((U[0]>=U[2])&&(U[1]<U[3]))
{if (U[0]==U[2]) Phi_0=10000;else
{
Phi_0=(((U[0]-U[2])*100)/((U[3]-U[1])));
if (Phi_0>6000) Phi=10000;
}
Phi=270;
}

Phi += arc(Phi_0);

Вроде так.
Вопрос по усреднению значения для углов 350-0-10 как правильно выполнить?

Добавлено спустя 56 минут 31 секунду:
Да еще вопрос по USART. Данные в моем случае нужно передавать без ожидания освобождения
while ( !( UCSR0A & (1<<UDRE0)) ); т.е через прерывания: байт ушел прерывание следующий байт ит.д . Не хотелось изобретать велосипед. Этот while сильно тормозит программу. Скорость 57600. 8 байт передать всего то.
Может примеры есть или ссылки?? Спасибо за ранее!

Re: Доплеровский пеленгатор на Аtmega128

contr » 29 июн 2009, 14:09

вышки угоняют и Вы их пеленгуете или исходно не знаете местоположения передатчиков?

Re: Доплеровский пеленгатор на Аtmega128

USER777 » 29 июн 2009, 14:45

contr
вышки угоняют и Вы их пеленгуете или исходно не знаете местоположения передатчиков?


Прикалываешься?

Re: Доплеровский пеленгатор на Аtmega128

contr » 29 июн 2009, 15:48

пытаюсь понять задачу, чтобы прикинуть варианты решения. Возможно это избавит Вас от необходимости вычислять арктангенсы.


cron
Rambler\'s Top100 Mail.ru counter