Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

астрономия и програмирование

241  
  Geist2006 завсегдатай29.12.06 22:43
NEW 29.12.06 22:43 
Написал прогу для управления телескопом.В простонародье подобные системы называют ГОТО.
Написана на языке С2 под микроконтроллер Ccontrol2 http://www.cc2net.de/Die_C-Control_II/die_c-control_ii.html
Поскольку я отношу себя к программистам-самоучкам( то есть специально на программиста нигде не учился), то ессно многих правил хорошего тона не знаю.
Если у кого есть желание покопаться в исходнике и оценить качество стиля, прошу в прикрепл╦нные файлы.
#1 
  Geist2006 завсегдатай29.12.06 22:46
29.12.06 22:46 
в ответ Geist2006 29.12.06 22:43
Компилятор занимает около 1.5МБ,
не знаю можно ли его тут прилепить, но если кому надо зашлю на мыло, а так можно исходники в блокноте посмотреть
#2 
  Geist2006 завсегдатай29.12.06 23:20
NEW 29.12.06 23:20 
в ответ Geist2006 29.12.06 22:46
основной задачей этой штуки является точное наведение телескопа на выбранный объект по заданным координатам.Поскольку координатных систем в астрономии несколько( но для выполнения данной задачи используются две системы- экваториальная и горизонтальная) то системе вначале необходимо преобразовать координаты одной системы в другую.Тут сплошные синусы и косинусы.
Далее от начальной точки контроллер запускает драйвер шаговых движков с редукторами и поочер╦дно( сначала по горизонтали, затем по вертикали) наводит телескоп на объект, после чего переводит движки на зв╦здную скорость.
к контроллеру по шине I2C-BUS приделан пульт с кнопками управления и ЖКИ, на который выводятся координаты( азимут и высота), а также название объекта,склонение и прямое восхождение.Но не все одновременно, а по очереди, так как ЖКИ 2х16.
Начальная точка иначе именуется привязкой к горизонтальной системе.То есть из массива данных выбирается любая видимая в данный момент звезда и е╦ координаты фиксируются как начальная точка . Контроллер принимает радиосигнал из Франкфурта для синхронизации времени, необходимого для расч╦та зв╦здного времени.
К контроллеру ещ╦ приделан автогид- устройство, которое корректирует скорость телескопа по гидирующей звезде.Но поскольку эту часть я позаимствовал у одного астронома-любителя из России, то описание тут приводить не буду.
Припересч╦те координат возникают небольшие неточности, то есть результат отличается от правильного в пределах от практически полного совпадения до разницы в 30 угловых минут.Для астрономии это не совсем приемлемо, поэтому прошу совета- как можно повысить точность, несмотря на то что все переменные имеют размерность float ?
#3 
  Geist2006 завсегдатай29.12.06 23:21
NEW 29.12.06 23:21 
в ответ Geist2006 29.12.06 23:20, Последний раз изменено 29.12.06 23:29 (Geist2006)
схема пульта с кнопками и ЖКИ
#4 
  Geist2006 завсегдатай29.12.06 23:21
NEW 29.12.06 23:21 
в ответ Geist2006 29.12.06 23:21, Последний раз изменено 29.12.06 23:30 (Geist2006)
драйвер шаговых движков
#5 
  Geist2006 завсегдатай29.12.06 23:22
NEW 29.12.06 23:22 
в ответ Geist2006 29.12.06 23:21, Последний раз изменено 29.12.06 23:31 (Geist2006)
собственно пульт
#6 
  Geist2006 завсегдатай29.12.06 23:22
29.12.06 23:22 
в ответ Geist2006 29.12.06 23:22, Последний раз изменено 29.12.06 23:33 (Geist2006)
пример ввода координат небесного объекта
#7 
  Geist2006 завсегдатай29.12.06 23:23
NEW 29.12.06 23:23 
в ответ Geist2006 29.12.06 23:22, Последний раз изменено 29.12.06 23:32 (Geist2006)
тут как раз видны несовпадения
#8 
  Geist2006 завсегдатай29.12.06 23:23
NEW 29.12.06 23:23 
в ответ Geist2006 29.12.06 23:23, Последний раз изменено 29.12.06 23:34 (Geist2006)
ну а тут телескоп с трубой автогида
#9 
desyman свой человек30.12.06 15:48
desyman
NEW 30.12.06 15:48 
в ответ Geist2006 29.12.06 22:43
ну ты Кулибин
#10 
  Geist2006 завсегдатай31.12.06 20:55
NEW 31.12.06 20:55 
в ответ desyman 30.12.06 15:48, Последний раз изменено 31.12.06 20:56 (Geist2006)
С Новым Годом Вас , дорогие товарищи !!!
#11 
belkin_npnb знакомое лицо02.01.07 10:21
belkin_npnb
NEW 02.01.07 10:21 
в ответ Geist2006 29.12.06 22:43
Походу тебя здесь никто не оценит. Тебе с твоими мозгами нужно деньги зарабатывать, а ты время только теряешь. Если захочешь заработать, пиши в личку.
Германия страна цветов, Германия страна цветов, страна тюльпанов!!!
#12 
gothica1982 посетитель03.01.07 21:21
gothica1982
03.01.07 21:21 
в ответ Geist2006 29.12.06 23:20
Float - 6 значащих цифр, double - 10. Если вы используете все переменные в float, то естественно при каждой операции получается ошибка в расчетах. Например при умножении как результат получается число, которое занимает больше чем n бит. Остальные биты просто не учитываются, а результат умножения записывается в формате float. И так при каждой операции получается ошибка, которая потом все наростает и наростает при последующих.
Чтобы уменьшить значение этой ошибки нужно увеличить разрядность числа. Для этого вам нужно придумать новый формат числа (например 64 бита) и написать функции сложения, вычитания, умножения и деления для этого формата. То есть например, умножаем число в 64 бита на число в 64 бита, как результат получаем число больше 64 бита, но сохраняем его в 64-битном формате. Существуют еще различные методы округления числа, это тоже необходимо учитывать.
Есть определенные форматы, например fract32 и fract64, которые используются в Visual DSP (можно писать на C и Assembler, но в моем случае проект был написан на С) для процессоров звуковых карт. Форматы были сделаны на основе формата integer, описания всех функций есть в руководстве. Если что, пишите в приват.
#13 
gothica1982 посетитель03.01.07 21:29
gothica1982
NEW 03.01.07 21:29 
в ответ belkin_npnb 02.01.07 10:21
Чтобы мозгами зарабатывать деньги, нужно как то мозги эти тренировать. Без тренировки не получится сразу писать хорошие программы за недолгий срок.
#14 
  Geist2006 завсегдатай04.01.07 08:49
NEW 04.01.07 08:49 
в ответ gothica1982 03.01.07 21:21
Да тут собственно и придумывать ничего не надо- всё уже придумано до нас.
Напр., координаты задаются таким форматом 20╟15.234'. У меня создан массив long с координатой 2015234.Далее, я его преобразую во float
и получаю число 20.15234 . И уже с этим числом произвожу дальнейшие вычисления.
А можно напр. сделать так - создать две переменные одной координаты напр. int 20╟ и float15.234', и затем складывать их в переменную типа float ( интересно, повысит это точность или нет?)
Некоторые сложности возникают из-за того, что первая переменная может быть отрицательной , а вторая только положительной, но и это решается.
Я как -то задумался об этом в самом начале,но почему-то решил пойти по более лёгкому пути и вот результат - недостаточная точность. Теперь придётся пол-программы перепахать.
#15 
  Chipolino местный житель04.01.07 12:00
NEW 04.01.07 12:00 
в ответ Geist2006 04.01.07 08:49
А почему бы не создать что-нибудь типа
typedef struct{
int grad;
int min;
int sec;
}koord;
И проблемы с точностью исчезнут.
Я думаю ;-)
#16 
  Geist2006 постоялец04.01.07 12:14
NEW 04.01.07 12:14 
в ответ Chipolino 04.01.07 12:00
дык создать не проблема
только выглядеть это будет прмерно так
type katalog
{
int grad;
float min;
float rest_min;
}
а вот дальше надо подумать как этот type katalog по формулам типа этой раскидать
function Prez_RA(float RA_0,float DEC_0) returns float
{ float ra0,a1,b0,S1;
ra0=var.to_dez(RA_0);//переводим в дес. форму.
b0=var.to_dez(DEC_0);//переводим в дес. форму.
a1=ra0*15.0;//переводим в градусную меру
S1=((3.07420+1.33589*math.sin(a1*constant.rad)*
math.tan(b0*constant.rad))*epocha_J_NOW())/3600.0;//4.
return S1+ra0;//в радианах с дес.дробью. xxx.xxxxxx
}//----------------OK
//#################################################################
#17 
  Geist2006 постоялец04.01.07 13:45
NEW 04.01.07 13:45 
в ответ Geist2006 04.01.07 12:14
покопался в доках к моему контроллеру и обнаружил следующее -
float Wertbereich- +- 1.7*10^-308......+- 1.7*10^308, Speicherplatzbedarf- 8 Bytes. Тоже самое в доках по Си, только применительно к переменным типа Double. Получается , что мой float - это тоже самое , что ихний Double. Или я не догоняю чего-то?
#18 
  Chipolino местный житель05.01.07 17:59
NEW 05.01.07 17:59 
в ответ Geist2006 04.01.07 12:14
Нельзя передать структуру в качестве аргумента ?
#19 
  Geist2006 постоялец05.01.07 20:01
NEW 05.01.07 20:01 
в ответ Chipolino 05.01.07 17:59
конечно можно
#20