Вход

Просмотр полной версии : Мой ГОТО


Andreichk
08.01.2007, 18:16
Решил перенести описание своей разработки управления телескопом сюда.Поскольку схема уже практически готова,то по мере подготовки фотоматериала буду выкладывать и рассказывать как оно такое получилось.
Питание от двух паралельносоеденённых аккумуляторов.На сутки хватает выше крыши

Andreichk
08.01.2007, 18:26
Основой системы управления является Ccontroller на базе микропроцессора С164 от Сименс
http://www.cc2net.de/Die_C-Control_II/die_c-control_ii.html

тут схема дополнительного драйвера шаговых движков,ручного пульта и общая схема

Andreichk
08.01.2007, 18:34
Пульт соеденён с контроллером по шине I2C-BUS и имеет десять кнопок и ЖКИ 2х16.
На пульте отображаются текущие координаты - азимут и высота, названия обьектов, а так же значения некоторых величин при их изменении ,относящиеся по большей части к телеавтогиду Павла Бахтинова, размещённого в общем чемоданчике

Andreichk
08.01.2007, 18:39
тут выложена последняя версия программы управления, написанная на языке Си2, специально адаптированном под микроконтроллер.Просмотреть можно простым редактором, но если кому надо, то компилятор(ок. 2Мб) могу заслать на мыло

Andreichk
08.01.2007, 19:12
ну и здесь самодельные редукторы и монтировка SKY WIEW PRO

Andreichk
08.01.2007, 19:25
сам телескоп МАК150\1900 с трубой телеавтогида и бинокулярная приставка от Soligor с окулярами от Meade 18mm 67° multicoated

Andreichk
09.01.2007, 02:07
Значит работает это следующим образом- После включения происходит инициализация контроллера и синхронизация с часами точного времени.Время нужно для расчёта часового угла,который в свою очередь используется в формулах преобразования экваториальных координат в горизонтальные.Текущее и звёздное время отображаются на дополнительном ЖКИ на основной панели.
Подсветка ослаблена, чтобы не слепил.В идеале, конечно можно было применить негативный ЖКИ с красной подсветкой, но под рукой такого не оказалось.При правильном расположении приёмной антены синхронизация часов наступает прим. через три-четыре минуты. С этого момента в контроллер можно вводить координаты наблюдаемого обьекта.Привязка телескопа осуществляется следующим образом- на пульте нажимаем кнопку ПРИВЯЗКА. При этом на ЖКИ высвечиваются названия наиболее ярких звёзд, предварительно занесённых в базу данных(всего ок.200) , выбирается одна из них.При этом контроллер преобразует координаты и выводит их на ЖКИ. Далее кнопками ВВЕРХ, ВНИЗ, ВЛЕВО и ВПРАВО совмещаем выбранный обьект с телескопом и ещё раз нажимаем кнопку ПРИВЯЗКА.Происходит фиксация с системой гор.координат. Далее из опять же из базы данных( обьекты разбиты на категории) выбираем интересующий обьект и нажимаем кнопку ПУСК. Телескоп поехал ,вначале по горизонтали, затем по вертикали и попал туда, куда мы его направили.Однако ввиду неточностей в механике, а также погрешностях при математических расчётах координат попадание телескопа довольно грубое.Если в искатель ещё можно увидеть выбранный обьект, то в 18ти мм окуляр уже нет.Как с этим бороться пока не знаю.Да, чуть не забыл, нужно же ещё иметь привязку к местности.Для этих целей я использовал свой навигационный GPS-прибор фирмы YAKUMO со встроенной программой DESTINATOR-6. В ней есть фича которая показывает очень точные координаты местоположения.Вот их-то я и ввожу в контроллер.Прибор всегда со мной, поэтому специально встраивать его в прогу я не стал( хотя есть возможность связать их через USB-кабель).

Andreichk
09.01.2007, 02:24
После того как телескоп прибыл в пункт назначения ,происходит переключение на звёздную скорость.
Ну про установку на полярную ось все итак знают, поэтому не буду даже упоминать тут об этом.
Далее можно включать автогид и гидироваться. С работой телеавтогида Павла Бахтинова я думаю все уже знакомы и его описание и принцип работы известен.Я его использовал практически один-в-один за исключением того, что передача управляющих сигналов происходит по аналоговым каналам, то есть в моей программе в процедуру запуска звёздной скорости включены аналоговые порты и сигнал на них подаётся с соответствующих операционных усилителей телеавтогида v0,v1,v2,v3(см. схему телеавтогида ниже).Таким образом происходит плавная коррекция скорости движения телескопа.Снимков и графиков я пока не делал,но одно могу сказать- при полностью отсутствующей установке полярной оси( то есть она устанавливалась примерно на север по компасу- с моего балкона Полярная звезда просто не видна) тем не менее автогид изо всех сил удерживал обьекты в поле зрения.Колебания картинки по вертикали конечно были значительными , но всё ж таки ручками мне подстраивать телескоп не приходилось.Поскольку телеавтогид также имеет изменяемые параметры, то и я решил ввести в программу возможность изменения ПИД-параметров.Однако прочитав рекомендации Антона по использованию и настройке Прогайдера на сайте Астроника, просто выставил все коэфициенты равными 1 и вроде бы автогид на это не обиделся.
На фотографиях виден маркер с искуственной звездой, первый свет автогида и разработанная мной печатная плата для него

Andreichk
09.01.2007, 02:57
В будущем планируется введение в программу и автофокуссера, но пока ещё не решил что, куда и как(хотя кнопочки под него уже поставил :rolleyes: ), а пока , ну пока так..... как есть.Может будет у меня Мега-чемоданчик или всё в одном флаконе( может быть...).

Да, совсем чуть не забыл.Неоценимую помощь в создании сего аппарата мне оказали Денис Никитин, Володя Суворов,дядя Вова,Павел Бахтинов,anddor(имени к сож. не знаю),CombaSoft(тутошний модератор),halx и Asafan( тоже имён не знаю),Антон Дрокин.Кто словом, кто советом , кто ссылкой, кто шуткой.Вобщем от всех по-немногу.А от меня всем ВАМ огромное СПАСИБО.
Пока вот так, так что если есть вопросы - задавайте.

p.s. Ниже приведены схема телеавтогида на ПИК-процессоре 16F874 и простой программатор для LTP-порта

Asafan
09.01.2007, 10:39
Поздравляю с успешным испытанием чуда, тёзка. Основным занятием, видимо, является доводка ПО. Вопрос: ГО-ТО в твоей реализации учитывает смещение объекта за счет вращения небесной сферы во время перемещения от одного пункта до другого?

Andreichk
09.01.2007, 11:14
Спасибо.такая попытка присутствует.Во всяком случае в програмном коде.Однако ж насколько точно это срабатывает остаётся только догадываться:-k

//################################################## ############################
//В этой процедуре должна высчитываться реальная точка попадания телескопа на
//выбраный объект с учётом направления движения и скорости телескопа,
//а также скорости движения небесной сферы.
//################################################## ############################
const ges_object=0.000075205;//15.041'' скорость вращ.неб.сферы в радианах
const ges_teleskop=0.026183;//1.5° в сек вычислить в радианах
//------------------------------------------------------------------------------
function KOORD_KORREKTUR_AZ_ALT(float ra,float dec)
{float distanz,geschwindigkeit;string s;
//================================================== ==================
var.Azimuth_Soll=Soll_Azimuth(var.to_hour(ra),var. to_hour(dec));//конечная цель.
richtung.dec_soll=100000.0*var.to_dez(100000.0*dec );//конечная цель.
//================================================== ==================
if counter.azim_ist<var.Azimuth_Soll//телескоп идёт навстречу объекту
{
distanz=var.Azimuth_Soll-counter.azim_ist;
geschwindigkeit=ges_teleskop + ges_object;
var.Azimuth_Soll=var.Azimuth_Soll - (distanz/geschwindigkeit)*ges_object;
}
if counter.azim_ist>=var.Azimuth_Soll//телескоп догоняет объект.
{
distanz=counter.azim_ist-var.Azimuth_Soll;
geschwindigkeit=ges_teleskop - ges_object;
var.Azimuth_Soll=var.Azimuth_Soll + (distanz/geschwindigkeit)*ges_object;
}
vergleich();return;
}//----------------
//################################################## ##############

Andreichk
13.01.2007, 14:40
Чтоб не забыть
моторчик Sanyo Denki 4,5V 1.875Deg/Step
на валу шестерня 15 зубьев,диам.8.5мм
промежутка- зубьев 25,диам.13.5мм с ней на одной оси шестерня 15 зубьев,диам.8.5мм
и на червяке шестерня-зубьев 60,диам.31мм
сам червяк прим.10мм в диам. и большая шестерня 70мм и 140 зубьев.
я сам как-то считал- общ.передаточное число- прим.1 : 1560.
Максимальная скорость при правильной балансировке достигает до 1.5° в сек.

CombaSoft
13.01.2007, 15:20
Есть вопросы, пока что по электронике.
1) какой ток потребляет ШД на 1х ( 3.5 шагов в секунду? )
и на максимальной скорости (1248 шагов в секунду?)
2) судя по указанному току на общей схеме - ШД потребляют до 1А -
почему решено было отказаться от использования м/с со стабилизацией тока ? - L6219. Возможно тогда удалось бы добится скорости в 2.5-3 градуса в секунду.

Andreichk
13.01.2007, 18:38
не понял куда девался предыдущий пост, поэтому отвечаю ещё раз.
при максимальной скорости напряжение на ключах 8 вольт, ток около 200мА.
При звёздной скорости напряжение понижается до 5-ти вольт, а ток возрастает примерно 400 мА

CombaSoft
13.01.2007, 20:27
Если я верно понял - регуляция стабилизируемого напряжения осуществляется ключем VT2, база которого через сопротивление идет на 25-ю ногу R8C/С13.
Я такое встречал в своей HEQ-5, правда в более убогом виде - там вобщем ШД по часовой оси был биполярный, но с 4-мя обмотками. Первая пара - высокоомные - использовались на тихом ходу (1х), вторая пара - низкоомные - использовались на остальных скоростях. Обмотки коммутировались мелким реле с двумя переключающими группами. Вобщем убогое решение.
Можно более детальную общую схему ? Потому, что как я понял - на R8/C13 сделан лишь контроллер ШД. И без общей схемы неясно назначение сигналов на контроллере ШД...разве что кроме сигнала "сутки", который видимо устанавливает скорость 1х.

Andreichk
13.01.2007, 20:35
Если я верно понял - регуляция стабилизируемого напряжения осуществляется ключем VT2, база которого через сопротивление идет на 25-ю ногу R8C/С13.
правильно ,VT2 просто садит коллектор на землю и понижает напряжение до 5-ти вольт.

CombaSoft
13.01.2007, 20:39
я там прежний пост свой дополнил...

Andreichk
13.01.2007, 20:59
Ну, значит так.
PWM DEC и PWM RA - это широтно-импульсные сигналы, частота которых собственно и определяет скорость вращения шаговых двигателей. Эти сигналы выпрямляются операционными усилителями.Ножки 31 и 30 R8C/13- это аналоговые 10-битные входы.
сигналRA и сигналDEC - это импульсы, которые Ccontrol пересчитывает в угловые градусы , минуты и секунды как бы имитируя сигналы с энкодеров( метод конечно неверный, но пока так).Кстати пропусков импульсов даже на максимальной скорости не наблюдалось.
DEC DOWN, DEC UP, RA<<<< и RA >>>> это просто логические входы, имеющие два состояния - 0 и 1.То есть какой вход имеет лог.1 - тот програмный блок драйвера и работает.
Ниже программа , записанная в драйвере R8C/13

см. пост №34 - обновленный вариант

а тут и сам R8C/13

CombaSoft
13.01.2007, 22:51
Ну, значит так.
PWM DEC и PWM RA - это широтно-импульсные сигналы, частота которых собственно и определяет скорость вращения шаговых двигателей. Эти сигналы выпрямляются операционными усилителями.Ножки 31 и 30 R8C/13- это аналоговые 10-битные входы.

Уточню - широтно-импульсные ? - тогда верно ли я понимаю, что на операционном усилителе реализован фильтр импульсов ( я пока что :) там вижу 6 дб фвч ), на выходе которого появляется сигнал прямопропорциональный ширине импульса ?

сигналRA и сигналDEC - это импульсы, которые Ccontrol пересчитывает в угловые градусы , минуты и секунды как бы имитируя сигналы с энкодеров( метод конечно неверный, но пока так).

если в Ccontrol заложена полноценная математика - т.е. контроллер просчитывает по трем(или более) указанным звездам как установлена полярка и как расположены оси монтировки - то такой способ "обратной связи" видимо будет хорош для создания системы а-ля IntelliCope

Кстати пропусков импульсов даже на максимальной скорости не наблюдалось.

Еще уточню. Пропусков импульсов идущих с сигналRA и сигналDEC ? - так их по алгоритму программы не может быть.

DEC DOWN, DEC UP, RA<<<< и RA >>>> это просто логические входы, имеющие два состояния - 0 и 1.То есть какой вход имеет лог.1 - тот програмный блок драйвера и работает.
Ниже программа , записанная в драйвере R8C/13

С этим вроде ясно. Именно "вроде" :)

//########################################
unsigned int adc(unsigned char ch)
{
adcon0 = 0x80 + ch;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
}//---------------------------OK
//########################################

Здесь пожалста подробнее. То ли здесь идет загрузка таймера инициализирующим значением, то ли идет преобразование значения сигнала на входе АЦП... Я здесь одно понял - позавершении некоторого
процесса adst сбрасывается в 0, а некто ad ( не регистр ли, так же как и adst ?)- во время процесса заполняется некоторым числом. Чую здесь все же АЦП работает...
Только пожалста в даташит меня носом не тыч :) - пока не могу себе позволить скачать его.

Andreichk
13.01.2007, 23:09
на выходе которого появляется сигнал прямопропорциональный ширине импульса ?
точно так и есть- такая схема предлагалась в букваре про програмированию Ccontrol2- её я и использовал.
IntelliCope
это что за зверь?

Еще уточню. Пропусков импульсов идущих с сигналRA и сигналDEC ? - так их по алгоритму программы не может быть.
в самом деле, откуда им взятся-то?:) хотя я имел ввиду, что Ccontrol2 успевал их всех посчитать



unsigned int adc(unsigned char ch)
{
adcon0 = 0x80 + ch;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
}//---------------------------OK
//########################################

данный кусок кода есть ни что иное как инициализация аналогового порта (unsigned char ch) - номер порта .
код взят из примера, описанного в доке к контроллеру R8C/13.
почему он такой и как функционирует- для меня тайна:) - чесное слово
тут к нему ещё вот это файл по ходу пришивается, может в нём ты прояснение найдёшь

CombaSoft
13.01.2007, 23:28
это что за зверь?
Это я в названии S пропустил, т.е. я имел ввиду IntelliScope


в самом деле, откуда им взятся-то?:) хотя я имел ввиду, что Ccontrol2 успевал их всех посчитать

А, ясно. Т.е. ты поставил задержку в wait() такую, при которой Ccontrol успевал отметить импульс.


данный кусок кода есть ни что иное как инициализация аналогового порта (unsigned char ch) - номер порта .
код взят из примера, описанного в доке к контроллеру R8C/13.
почему он такой и как функционитует- для меня тайна:) - чесное слово
Ладно, а что в ad возвращается?
p.s.
Как с сотового на АДСЛ уйду - доберусь до документации по R8C/13

Andreichk
13.01.2007, 23:38
IntelliScope гугль выдаёт ссылки на какие-то мышки с этим Intelliscope


А, ясно. Т.е. ты поставил задержку в wait() такую, при которой Ccontrol успевал отметить импульс.

function Azim_Links()returns float//Azimuth
{
counter=counter-ports.getcount(0);azim_ist=counter*0.00000853;
return azim_ist;
}//----------------OK
вот такой код к примеру и считает импульсы в Ccontrol2
ports.getcount(0) - это есть порт ,настроенный на счёт импульсов.
Вызов его выглядит так:

lcd_azimuth(5,counter.Azim_Links()); и сразу на ЖКИ

Ладно, а что в ad возвращается?
очевидно значение выбранного ADC

CombaSoft
13.01.2007, 23:39
тут к нему ещё вот это файл по ходу пришивается, может в нём ты прояснение найдёшь
Уже хорошо - пробежался - многое ясно стало, но все равно - даташит желателен. Завтра по утру вникать буду.

Andreichk
14.01.2007, 00:00
Intelliscope - нашёл таки описание сего чудного слова.
Стремлюсь к нему всем своим разумением ](*,) :D


http://www.m16c.de/ тут краткое описание R8C/13

CombaSoft
14.01.2007, 14:06
Мне сильно помогла pdf-ка с распиновкой м/с.


** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
in half-step mode
step_cymku(); ( 8 шагов )
void Dec_korrektur(void)
void step_cymku_Dec_minus(void) ( по 8 шагов на часовую ось и ось склонений )
void step_cymku_Dec_plus(void)
т.о. коррекциия по оси склонений работает по 8 шага через каждые 8 шагов по оси склонений и
составляет 0.5х от скорости по часовой оси.

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
конструкция вида :
p1 = 0b10011000;
sleep_star_();if (adc(1)<200) break;
ведет к потере положения ротора ШД.

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
p1 = 0b00000001;
sleep_star();
p1 = 0b00001001;
Dec_korrektur();
ведет к разному времени меж шагами и накоплению ошибки каждые 4 шага.

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
вообще, из-за времени исполнения операций ветвления шаги получаются "резиновыми"
(ветвление может быть, а может и не быть, а время на ветвление уходит, вообще из-за проверок
шаги следуют сериями, рывками по 8 шагов).

real-time системы все же надо делать исключительно на прерываниях, без привязки к скорости
выполнения команд, но с учетом этой скорости для обеспечения запаса времени меж временем
исполнения процедуры прерывания и временем следования прерываний.
Однако, в режиме гидирования, т.е. при наличии обратной связи возможно
добиться высокой точности ведения. В режиме же наведения без оюратной связи неизбежны ошибки.
Обратная связь реализована через "сигнал RA" и "сигнал DEC". Из-за постоянных рывков (следствие
ветвления) коррекция должна производится постоянно.

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **

CombaSoft
14.01.2007, 14:19
while (adc(0)>=200)
Надо полагать, что ВСЕ биты порта P0 работают как входы АЦП.
Возможно ли установить бит 0 порта Р0 как обычный ttl-вход ? -
тогда не будет траты времени на преобразование A -> D. И будет
конструкция вида :
while (P0_0==1)
Аналогично для проверки сигнала "сутки" (P0_1) - ты пока не дал полную схему с Ccontrol, но я предполагаю, что он TTL-ный.

Andreichk
14.01.2007, 14:22
Знаешь, я как та собака- всё понимаю, только сказать не могу:D
И подсказать мне некому было.Вот и маюсь теперь.
Написал как сумел- вроде работает сижу и радуюсь:rolleyes:


real-time системы все же надо делать исключительно на прерываниях

это для меня непостижимо наверное

Andreichk
14.01.2007, 14:31
while (adc(0)>=200)
Надо полагать, что ВСЕ биты порта P0 работают как входы АЦП.
Возможно ли установить бит 0 порта Р0 как обычный ttl-вход ? -
тогда не будет траты времени на преобразование A -> D. И будет
конструкция вида :
while (P0_0==1)
Аналогично для проверки сигнала "сутки" (P0_1) - ты пока не дал полную схему с Ccontrol, но я предполагаю, что он TTL-ный.

сутки Р0_1 - TTL-ный.

как видно из описания TTL-портов явно не хватило, вот и пришлось аналоговые задействовать в качестве таковых.Они там жёстко прописаны ,как я понимаю и просто так их в TTL не переделать.

CombaSoft
14.01.2007, 14:42
Работает и ладно. Теперь интересно - какие объекты занесены в память, сколько их. И можно ли загружать с компа новые объеты в память гото.
24С65 - видимо здесь хранятся объеты ? У этой м/с какой объем памяти?

Andreichk
14.01.2007, 14:56
Работает и ладно. Теперь интересно - какие объекты занесены в память, сколько их. И можно ли загружать с компа новые объеты в память гото.
24С65 - видимо здесь хранятся объеты ? У этой м/с какой объем памяти?
Нет , тут немного по-другому. Объекты записаны прямо в прогу.
Если посмотришь блок DATEN в файле в начале темы.Сколько их там уже не считаю, но вроде самые основные точно уже там(даже те, что в южном полушарии).Если чего-то нужно дополнить, то тогда надо перекомпилировать прогу и заново загружать в Ccontrol.

25С65 (объём 8 килобайт) используется для хранения некоторых переменных, напр. координаты местности , ПИД-параметры и что самое главное для сохранения последних координат .То есть привыключении и последующем включении на ЖКИ отображаются последние запомненные координаты.

CombaSoft
14.01.2007, 15:09
Посмотрел. :shock:

CombaSoft
14.01.2007, 15:29
Очень хорошо, что есть деление на блоки и в файлах есть комментарии. Однако ж сколько там математики!

Andreichk
14.01.2007, 15:35
удобнее просматривать с родным компилятором ( в цвете )

Andreichk
14.01.2007, 20:14
Вот блин!! Век живи- век учись.:)
Оказывается можно заменить adс(0)>=200 на P0_7==1 и adc(1)>=200 на P0_6==1.
работает однако:kuru исправлена сегодня.(ув.модераторы, сотрите плиз предыдущую в посте Nr.188)


/************************************************** **************************/
/* File: Driver.c for Steppermotor */
/* Description: Main-Modul. */
/* Starts the external 20 MHz Quartz and flashes the Port */
/* Port 1.x on GLYN EVBR8C/13 Carrier Board */
/* Date: 15.01.2007 */
/************************************************** **************************/
#include "sfr_r813.h"
void timer(void)
{ /*-------------------------------------------------
- Change on-chip oscillator clock to Main clock -
-------------------------------------------------*/
prc0 = 1; /* Protect off */
cm13 = 1; /* Xin Xout */
cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */
cm05 = 0; /* Xin on */
cm16 = 0; /* Main clock = No division mode */
cm17 = 0;
cm06 = 0; /* CM16 and CM17 enable */
asm("nop"); /* Waiting for stable of oscillation */
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0; /* Main clock change */
prc0 = 0; /* Protect on */

pd1 = 0xFF; /* Set Port 1.0 - 1.7 be used for output*/
pd4 = 0xFF; /* Set Port 4.0 - 4.7 be used for output*/
pd3_3 = 0x01; /* Set Port 3.3 be used for output*/
}//---------------------------OK
//########################################
unsigned int adc(unsigned char ch)
{
adcon0 = 0x80 + ch;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
}//---------------------------OK
//########################################
void wait(void)
{unsigned char t;
for (t=0; t<2; t++);
}//---------------------------OK
//########################################
void sleep_RA(void)
{ long t;
for (t=0; t<(30+adc(6)); t++ );
p4_5=1;wait();p4_5=0;//pulsen RA
}//---------------------------OK
//########################################
void sleep_DEC(void)
{ long t;
for (t=0; t<(30+adc(5)); t++ );
p3_3=1;wait();p3_3=0;//pulsen DEC
}//---------------------------OK
//########################################
void sleep_RA_DEC(void)
{ long t;
for (t=0; t<(30+adc(6)); t++ );
p4_5=1;p3_3=1;wait();p4_5=0;p3_3=0;//pulsen RA,DEC
}//---------------------------OK
//##################################
void step_left_up(void)//OK
{ //DEC RA
p1 = 0b00011001; sleep_RA_DEC();
p1 = 0b00110001; sleep_RA_DEC();
p1 = 0b00100011; sleep_RA_DEC();
p1 = 0b01100010; sleep_RA_DEC();
p1 = 0b01000110; sleep_RA_DEC();
p1 = 0b11000100; sleep_RA_DEC();
p1 = 0b10001100; sleep_RA_DEC();
p1 = 0b10011000; sleep_RA_DEC();
}//---------------------------OK
//########################################
void step_left_down(void)//OK
{ //DEC RA
p1 = 0b10011001; sleep_RA_DEC();
p1 = 0b10000001; sleep_RA_DEC();
p1 = 0b11000011; sleep_RA_DEC();
p1 = 0b01000010; sleep_RA_DEC();
p1 = 0b01100110; sleep_RA_DEC();
p1 = 0b00100100; sleep_RA_DEC();
p1 = 0b00111100; sleep_RA_DEC();
p1 = 0b00011000; sleep_RA_DEC();
}//---------------------------OK
//########################################
void step_right_up(void)//OK
{ //DEC RA
p1 = 0b00011000; sleep_RA_DEC();
p1 = 0b00111100; sleep_RA_DEC();
p1 = 0b00100100; sleep_RA_DEC();
p1 = 0b01100110; sleep_RA_DEC();
p1 = 0b01000010; sleep_RA_DEC();
p1 = 0b11000011; sleep_RA_DEC();
p1 = 0b10000001; sleep_RA_DEC();
p1 = 0b10011001; sleep_RA_DEC();
}//---------------------------OK
//########################################
void step_right_down(void)//OK
{ //DEC RA
p1 = 0b10011000; sleep_RA_DEC();
p1 = 0b10001100; sleep_RA_DEC();
p1 = 0b11000100; sleep_RA_DEC();
p1 = 0b01000110; sleep_RA_DEC();
p1 = 0b01100010; sleep_RA_DEC();
p1 = 0b00100011; sleep_RA_DEC();
p1 = 0b00110001; sleep_RA_DEC();
p1 = 0b00011001; sleep_RA_DEC();
}//---------------------------OK
//########################################
void step_up(void)//DEC UP
{ //DEC RA
p1 = 0b00010000; sleep_DEC();
p1 = 0b00110000; sleep_DEC();
p1 = 0b00100000; sleep_DEC();
p1 = 0b01100000; sleep_DEC();
p1 = 0b01000000; sleep_DEC();
p1 = 0b11000000; sleep_DEC();
p1 = 0b10000000; sleep_DEC();
p1 = 0b10010000; sleep_DEC();
}//---------------------------OK
//########################################
void step_down(void)//DEC DOWN
{ //DEC RA
p1 = 0b10010000; sleep_DEC();
p1 = 0b10000000; sleep_DEC();
p1 = 0b11000000; sleep_DEC();
p1 = 0b01000000; sleep_DEC();
p1 = 0b01100000; sleep_DEC();
p1 = 0b00100000; sleep_DEC();
p1 = 0b00110000; sleep_DEC();
p1 = 0b00010000; sleep_DEC();
}//---------------------------OK
//########################################
void step_right(void)//OK------------------>>>>>>>>>>>>>>>>>
{ //DEC RA
p1 = 0b00001000; sleep_RA();
p1 = 0b00001100; sleep_RA();
p1 = 0b00000100; sleep_RA();
p1 = 0b00000110; sleep_RA();
p1 = 0b00000010; sleep_RA();
p1 = 0b00000011; sleep_RA();
p1 = 0b00000001; sleep_RA();
p1 = 0b00001001; sleep_RA();
}//---------------------------OK
//########################################
void step_left(void)//OK-<<<<<<<<<<<<<<<<-------------------------
{ //DEC RA
p1 = 0b00001001; sleep_RA();
p1 = 0b00000001; sleep_RA();
p1 = 0b00000011; sleep_RA();
p1 = 0b00000010; sleep_RA();
p1 = 0b00000110; sleep_RA();
p1 = 0b00000100; sleep_RA();
p1 = 0b00001100; sleep_RA();
p1 = 0b00001000; sleep_RA();
}//---------------------------OK
//########################################
void sleep_star_(void)
{ long t;
for (t=0; t<(7000+10*adc(6)); t++ );
p4_5=1;p3_3=1;wait();p4_5=0;p3_3=0;//pulsen RA,DEC
}//---------------------------OK
//##################################
long Dec_korr;
void step_cymku_Dec_plus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr < var.dec_tor
//while (p3_0==1)// ( Dec_korr >=adc(5))//PWM DEC
// { //DEC RA
p1 = 0b00011000; sleep_star_();if (p0_6==0) return; //если нажать СТОП
p1 = 0b00111100; sleep_star_();if (p0_6==0) return;
p1 = 0b00100100; sleep_star_();if (p0_6==0) return;
p1 = 0b01100110; sleep_star_();if (p0_6==0) return;
p1 = 0b01000010; sleep_star_();if (p0_6==0) return;
p1 = 0b11000011; sleep_star_();if (p0_6==0) return;
p1 = 0b10000001; sleep_star_();if (p0_6==0) return;
p1 = 0b10011001; sleep_star_();if (p0_6==0) return;
// }
}//---------------------------OK
//########################################
void step_cymku_Dec_minus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr > -var.dec_tor
// while (p0_7==1) // (Dec_korr <=adc(5))//PWM DEC
// { //DEC RA
p1 = 0b10011000; sleep_star_();if (p0_6==0) return;//если нажать СТОП
p1 = 0b10001100; sleep_star_();if (p0_6==0) return;
p1 = 0b11000100; sleep_star_();if (p0_6==0) return;
p1 = 0b01000110; sleep_star_();if (p0_6==0) return;
p1 = 0b01100010; sleep_star_();if (p0_6==0) return;
p1 = 0b00100011; sleep_star_();if (p0_6==0) return;
p1 = 0b00110001; sleep_star_();if (p0_6==0) return;
p1 = 0b00011001; sleep_star_();if (p0_6==0) return;
// }
}//---------------------------OK
//########################################
void Dec_korrektur(void)
{ long t;
Dec_korr=adc(5);//PWM DEC
for (t=0; t<(6999+10*adc(6)); t++ );
p4_5=1;wait();p4_5=0;//pulsen RA
if (p3_0==1) step_cymku_Dec_plus();//
if (p0_7==1) step_cymku_Dec_minus();//
}//---------------------------OK
//##################################
void sleep_star(void)
{ long t;
for (t=0; t<(7000+10*adc(6)); t++ );
p4_5=1;wait();p4_5=0;//pulsen RA
}//---------------------------OK
//##################################
void step_cymku(void)//RA starspeed
{ //DEC RA
Dec_korr=adc(5);//PWM DEC
while (p0_6==1) {
p1 = 0b00001000; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00001100; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00000100; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00000110; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00000010; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00000011; sleep_star();if (p0_6==0) return;//если нажать СТОП
p1 = 0b00000001; sleep_star(); if (p0_6==0) return;//если нажать СТОП
p1 = 0b00001001; Dec_korrektur();if (p0_6==0) return;//если нажать СТОП
}
}//---------------------------OK
//########################################
void start(void)
{
while(1){
while (p0_6==1) {step_cymku();}
//motoren zusammen
//RA>>> DEC UP
while ((p3_1==1) && (p3_0==1)) {step_right_up();}
//RA>>> DEC DOWN
while ((p3_1==1) && (p0_7==1)) {step_right_down();}
//RA <<< DEC UP
while ((p3_2==1) && (p3_0==1)) {step_left_up();}
//RA <<< DEC DOWN
while ((p3_2==1) && (p0_7==1)) {step_left_down();}
//motoren getrennt
while ((p0_7==1)&&(p3_2==0)&&(p3_1==0)) {step_up();}
while ((p3_0==1)&&(p3_2==0)&&(p3_1==0)) {step_down();}
while ((p3_2==1)&&(p0_7==0)&&(p3_0==0)) {step_left();}
while ((p3_1==1)&&(p0_7==0)&&(p3_0==0)) {step_right();}
if ((p3_0==0)&&(p3_1==0)&&(p3_2==0)&&(p0_6==0)&&(p0_7==0)) p1 = 0b00000000;
}
}//---------------------------OK
//########################################
void main(void)
{
timer();
start();
}//---------------------------OK
//########################################

Andreichk
15.01.2007, 03:20
Навёл телескоп на Орион(М42), а трубу автогида на Сириус.Целый час смотрю в окуляр, а М42 всё ещё в кадре( радуюсь однако :rolleyes: )
Как всегда полярку установил пинком ноги на север и тем не менее коррекция по оси DEC примерно раз в 10 секунд.Наверное попал на полярку:-k

CombaSoft
15.01.2007, 11:58
Да ладно, нехай будет. История как-никак. Ну...хошь, напишем, что де "впереди вас ждет оптимизированный вариант" ?
Я попробовал у себя в редакторе С просмотреть - синтаксис подсвечивается, но мне через "блокнот" привычнее.
Как гидирование - без рывков? - т.е. заметно, что гидирование происходит? И в кадре оно ведь по-равзному может быть - например оставясь в кадре к краю уехать. Ты этот момент проясни пожалста.
p.s.
Сириус говоришь? да...звезды это хорошо. когда их видно - еще лучше /ставлю зонтик сушиться/

Andreichk
15.01.2007, 16:30
Да ладно, нехай будет. История как-никак. Ну...хошь, напишем, что де "впереди вас ждет оптимизированный вариант" ?
Я попробовал у себя в редакторе С просмотреть - синтаксис подсвечивается, но мне через "блокнот" привычнее.
Как гидирование - без рывков? - т.е. заметно, что гидирование происходит? И в кадре оно ведь по-равзному может быть - например оставясь в кадре к краю уехать. Ты этот момент проясни пожалста.
p.s.
Сириус говоришь? да...звезды это хорошо. когда их видно - еще лучше /ставлю зонтик сушиться/
Этих оптимизаций ещё будет тыщя :p . Чего их сохранять-то?
По оси RA вообще никаких рывков ,там ведь аналоговый сигнал скоростью управляет, плавненько так ползёт себе. А по оси DEC как я написал - каждые 10 сек. моторчик включается- так это я полярку не выставил как нужно.А если её выставить- так он наверное ещё реже включаться будет. Но и так за час наблюдений ухода на край не заметил.
С погодой и у нас проблемы- в этом году первая ночь со звёздами, а так дождь.Даже на Новый год- ужос :(

CombaSoft
18.01.2007, 12:52
Попробовал переписать код driver.c с тем, что бы избавиться от "резиновых" шагов, задержек в ветвлениях, потери шагов.
Алгоритм работы оставил прежним, а вот код линейный, т.е. за исключением цикла while(1){} в нем нет проверок, точнее они
есть, но в "завуалированном виде" :) - реализованы за счет
соотвествующей организации структуры данных. Я постарался
хорошо откомментировать код, однако если вопросы по работе
кода все же возникнут - постараюсь ответить.

p.s.
вышла в свет новая версия :)

Andreichk
20.01.2007, 22:35
Ещё более новая версия :-\"

/************************************************** **************************/
/* File: Driver.c for Steppermotor */
/* Description: Main-Modul. */
/* Starts the external 20 MHz Quartz and flashes the Port */
/* Port 1.x on GLYN EVBR8C/13 Carrier Board */
/* Date: 20.01.2007 */
/************************************************** **************************/
#include "sfr_r813.h"
unsigned char ra_step[8] = { 0b00001000, 0b00001100,0b00000100,0b00000110,
0b00000010,0b00000011,0b00000001,0b00001001}; //ok
unsigned char dec_step[8] = {0b10010000,0b10000000,0b11000000,0b01000000,
0b01100000,0b00100000,0b00110000,0b00010000}; //ok
unsigned char ra_dec_up[8] = { 0b00011000,0b00111100,0b00100100,0b01100110,
0b01000010,0b11000011,0b10000001,0b10011001}; //ok
//----------------------------------------------------------------------------------------------------------------------------
unsigned char ra_right_dec_up[8] = { 0b00011001,0b00110001,0b00100011,0b01100010,
0b01000110,0b11000100,0b10001100,0b10011000}; //ok
unsigned char ra_right_dec_down[8] = { 0b10011000,0b10001100,0b11000100,0b01000110,
0b01100010,0b00100011,0b00110001,0b00011001}; //ok
unsigned char ra_left_dec_up[8] = { 0b00011001,0b00110001,0b00100011,0b01100010,
0b01000110,0b11000100,0b10001100,0b10011000}; //ok
unsigned char ra_left_dec_down[8] = { 0b10011000,0b10001100,0b11000100,0b01000110, 0b01100010,0b00100011,0b00110001,0b00011001}; //ok
// массивы, содержащие значения, выводимые в порт.
//---------------------------------------
void timer(void)
{ /*-------------------------------------------------
- Change on-chip oscillator clock to Main clock -
-------------------------------------------------*/
prc0 = 1; /* Protect off */
cm13 = 1; /* Xin Xout */
cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */
cm05 = 0; /* Xin on */
cm16 = 0; /* Main clock = No division mode */
cm17 = 0;
cm06 = 0; /* CM16 and CM17 enable */
asm("nop"); /* Waiting for stable of oscillation */
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0; /* Main clock change */
prc0 = 0; /* Protect on */

pd1 = 0xFF; /* Set Port 1.0 - 1.7 be used for output*/
pd4 = 0xFF; /* Set Port 4.0 - 4.7 be used for output*/
pd3_3 = 0x01; /* Set Port 3.3 be used for output*/
} //---------------------------OK
//########################################
unsigned int adc(unsigned char ch)
{
adcon0 = 0x80 + ch;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
} //---------------------------OK
//########################################
void wait(void)
{unsigned char t;
for (t=0; t<2; t++);
} //---------------------------OK
//########################################
void sleep_RA(void)
{ long t;
for (t=0; t<(30+adc(6)); t++ );
p4_5=1;wait();p4_5=0; //pulsen RA
} //---------------------------OK
//########################################
void sleep_DEC(void)
{ long t;
for (t=0; t<(30+adc(5)); t++ );
p3_3=1;wait();p3_3=0; //pulsen DEC
} //---------------------------OK
//########################################
void sleep_RA_DEC(void)
{ long t;
for (t=0; t<(30+adc(6)); t++ );
p4_5=1;p3_3=1;wait();p4_5=0;p3_3=0; //pulsen RA,DEC
} //---------------------------OK
//##################################
char pos;
step(char k) //считаем шаги
{
pos +=k;
pos %=8;
return pos;
} //---------------------------OK
//##################################
void sleep_star(void)
{ long t;
for (t=0; t<(7000+10*adc(6)); t++ );
p4_5=1;p3_3=1;wait();p4_5=0;p3_3=0; //pulsen RA,DEC
} //---------------------------OK

void step_cymku_Dec_plus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr < var.dec_tor
p1= ra_dec_up[step(1)];
sleep_star();
if (p0_6==0) return; //если нажать СТОП
} //---------------------------OK
//########################################
void step_cymku_Dec_minus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr > -var.dec_tor
p1= ra_right_dec_down[step(1)];
sleep_star();
if (p0_6==0) return; //если нажать СТОП
} //---------------------------OK
//########################################
void Dec_korrektur(void)
{ long t;
for (t=0; t<(7000+10*adc(6)); t++ ); //вот тут уточнить параметр 7000
p4_5=1;wait();p4_5=0; //pulsen RA
if (p3_0==1) step_cymku_Dec_plus();//
if (p0_7==1) step_cymku_Dec_minus();//
} //---------------------------OK
//##################################
void step_cymku(void) //RA starspeed
{
while (p0_6==1) {
p1= ra_step[step(1)];
Dec_korrektur();
if (p0_6==0) return; //если нажать СТОП
}
} //---------------------------OK
//########################################
void start(void)
{
while(1){
while (p0_6==1) {step_cymku();} // суточный ход
//моторы одновременно
//RA>>> DEC UP //ВПРАВО И ВВЕРХ
while ((p3_1==1) && (p0_7==1)) {p1= ra_right_dec_up[step(-1)];sleep_RA_DEC(); }
//RA>>> DEC DOWN //ВПРАВО И ВНИЗ
while ((p3_1==1) && (p3_0==1)) {p1= ra_right_dec_down[step(1)];sleep_RA_DEC(); }
//RA <<< DEC UP //ВЛЕВО И ВВЕРХ
while ((p3_2==1) && (p0_7==1)) {p1=ra_left_dec_up[step(-1)];sleep_RA_DEC();}
//RA <<< DEC DOWN //ВЛЕВО И ВНИЗ
while ((p3_2==1) && (p3_0==1)) {p1= ra_left_dec_down[step(1)]; sleep_RA_DEC();}
//моторы порознь
while ((p0_7==1 )&&(p3_2==0)&&(p3_1==0)) {p1= dec_step[step(-1)];sleep_DEC(); } //ВВЕРХ
while ((p3_0==1)&&(p3_2==0)&&(p3_1==0)) {p1= dec_step[step(1)];sleep_DEC();} //ВНИЗ
while ((p3_1==1)&&(p0_7==0)&&(p3_0==0)) {p1= ra_step[step(1)];sleep_RA(); } //ВПРАВО
while ((p3_2==1)&&(p0_7==0)&&(p3_0==0)) {p1= ra_step[step(-1)]; sleep_RA();} //ВЛЕВО
//ничего не крутится
if ((p3_0==0)&&(p3_1==0)&&(p3_2==0)&&(p0_6==0)&&(p0_7==0)) p1 = 0b00000000;//
}
} //---------------------------OK
//########################################
void main(void)
{
timer();
start();
} //---------------------------OK
//########################################

Andreichk
21.01.2007, 03:11
А вот и график, сделанный с помощью Телеавтогида и Astronica ProGuider 2.0 примерно в течении часа.
В некоторые моменты Сириус колбасило, но это всего лишь птички и тучки,а так же голые ветки дерева, растущего перед окном в 10ти метрах.
Кстати, с новым драйвером(см.выше) автогид работает значительно качественноей.А именно- по оси RA происходит плавная реглировка скорости без рывков и пропусков шагов,а по оси DEC периодическое подшагивание вверх-вниз, причём иногда на один полушаг, а иногда на 3 или 4.
В окуляре же ничего не дрыгается и никуда не уходит.
На последней фотографии вид видимого горизонта с места положения телескопа.Помехи нам не помеха :)
Да здравствует аналоговая коррекция положения телескопа - самая лучшая коррекция в мире !!! =D>

CombaSoft
21.01.2007, 19:50
Это графики чего?

Andreichk
21.01.2007, 21:17
В смысле чего? Периодической ошибки ведения наверное, которые Proguider2 с камеры моего телеавтогида нарисовал.

Andreichk
22.01.2007, 21:16
дурь конечно :D , но ради чиста интиреса взял и зацепил трубу автогида за хвост Луны чтоб посмотреть, а как оно типа гидировать будет? Ну дык вот скажу я вам моторчики там такую чечётку выбивали :D , что те ирландские танцоры просто отдыхают :-({|= .
Однако луна при этом наблюдалась нормально и даже прямо в окуляре.:vo

sailor
22.01.2007, 21:20
Andreichk, и Луна перестала "турбулировать"? :eek: В любом случае - отличная проделанная работа, поздравляю :cool::vo:pivo

Andreichk
22.01.2007, 21:26
Турбуленция у меня зависит от того с какой скоростью котяра мой носится по комнате :D ( да остальные домочадцы тоже нехило добавляют). Я ведь по большей части из-за стекол оконных наблюдаю.
Ну лень мне на холодный балкон телескоп вытаскивать:p .
Ну всё равно спасибо :pivo

Andreichk
24.01.2007, 01:07
Вести с полей.Сегодня , накануне всенародного праздника 200 лет гранённому стакану, ваш покорный слуга в очередной раз обновил драйвер. Теперь он выглядит так(в целях сокращения видимой части поля, то есть поста приводится только видоизменённая часть)

step_dec(char k) //вверх-вниз
{
dec_pos +=k;
dec_pos %=8;
return dec_pos;
} //---------------------------OK
//##################################
void sleep_star(void)
{ long t;
for (t=0; t<(7000+10*adc(6)); t++ );
p4_5=1;p3_3=1;wait();p4_5=0;p3_3=0; //pulsen RA,DEC
} //---------------------------OK
//########################################
void step_cymku_Dec_plus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr < var.dec_tor
// p1= ra_dec_up[step(1)]; \\старая (file://\\старая)
p1= dec_step[step_dec(-1)] + ra_step[step_ra(1)] ;\\ НОВАЯ
sleep_star();
if (p0_6==0) return; //если нажать СТОП
} //---------------------------OK
//########################################
void step_cymku_Dec_minus(void)//DEC,RA starspeed korrektur DEC
{ //пока значение переменной var.DEC_Korr > -var.dec_tor
// p1= ra_right_dec_down[step(1)]; \\ СТАРАЯ
p1= dec_step[step_dec(1)] + ra_step[step_ra(1)] ;\\ НОВАЯ
sleep_star();
if (p0_6==0) return; //если нажать СТОП
} //---------------------------OK
//########################################

Навёлся сегодня на Сатурн. Как мне кажется коррекция по оси DEC стала как-то мягче или плавнее или тоньше - незнаю как правильно выразить,но как-то лучше.По оси RA никаких ухудшений не наблюдается. Или мне только кажется:kuru

Andreichk
27.01.2007, 12:09
Родилась у меня мысль разнести управление движками на разные контроллеры, чтобы они типа не мешали друг другу движками ворочать.Что скажет на это купечество?

CombaSoft
27.01.2007, 12:23
Не. Ты лучше L6219 поставь. Модульность это хорошо, но не делать же по контроллеру на каждую операцию!

Andreichk
27.01.2007, 12:32
а как ей управлять? какие сигналы на какие ноги подавать?
Я тут посчитал давеча - у Ренесаса портов не хватит сразу двумя L6219 двигать .там у Бахтинова по одному порту на каждую выделено, а у меня только один имеется, но зато два Ренесаса

CombaSoft
27.01.2007, 12:41
По три ноги на каждый канал + опорное напряжение, которым максимальный ток задаешь ( когда I1 и I1 равны нолику ). Т.е. на пару драйверов 12 ног - если будет четвертьшаг.

Andreichk
27.01.2007, 12:49
а зачем тогда у Бахтинова 7 ног на каждый L6219 ?

CombaSoft
27.01.2007, 13:00
У него задействован четвертьшаговый режим + по одной ноге на каждый драйвер на управление опорным напряжением.

Andreichk
27.01.2007, 13:03
и я такой хочу, только на Ренесас

CombaSoft
27.01.2007, 13:09
Ну, хотеть не вредно :) - а зачем тебе четвертьшаг ? Вот, насчет седьмой ноги цитирую Павла Бахтинова : "В целях снижения потребляемой мощности предусмотрено 1,5-кратное автоматическое снижение тока обмоток при остановке и работе на низких скоростях (часовое ведение и гидирование). Если этот экономичный режим не нужен, его можно отключить, для чего достаточно удалить резисторы R15, R16."
Вот, если делать лишь полушаг и полный шаг(полный...а оно надо?) - то входы I0 и I1 - можно объединить и получится по 4 вывода на драйвер.

Andreichk
27.01.2007, 13:12
а что , четвертьшаг- это плохо разве? зачем тогда дразнят? ХААААЧУУУУУУ :cry:

CombaSoft
27.01.2007, 13:33
Ну вот сам же радовался - как хорошо у тебя движки монтировку крутят - плавно, без вибраций. Четвертьшаг - повышенная точность шага. Вот есть у тебя движок...скажем 100шаговый. При одинаковой приемистости он сможет дать бОльшее число оборотов вала в минуту, чем 200-т шаговый, но млин точность страдает - тогда его в четверть шаг уводим и по точности получаем примерно как у 200-т шагового в полушаге.
Мне кажется тебе оно не нужно. А вообще - хозяин-барин :)

Andreichk
27.01.2007, 13:41
Так что, получается 1/4-шаговый режим плавности для 200-шагового не добавит? Или добавит, но это ничего не улучшит? И от чего точность зависит?От опорного напряжения или от качества АЦП или ещё чего? Я всё равно попробовать хочу, зачем тогда я эти L6219 покупал и печатку под них рисовал? В полушаге у меня и на транзисторах хорошо крутит

CombaSoft
27.01.2007, 13:54
Андрей, ты шутить с утра изволишь ? :) Опорное напряжение определяет ток в обмотках. Четвертьшаг плавности добавит, правда не факт, что ты это заметишь :), так же точность ведения возрастет.
Драйвера ты не зря брал - они тебе одинаковый ток в обмотках дадут при разной скорости шагов в секунду - можно будет подрубить 12, лучше 24 вольта :) питания - сможешь уйти на бОльшее количество шагов в секунду и при этом не думать о токе в обмотках при мелкой скорости - в драйвере стоит шим-стабилизация тока. Вот из-за одного этого стоило брать драйвер.

Andreichk
27.01.2007, 14:03
Нет, я просто по ангельски не читаю.Смотрю в даташит и не вижу там как его в 1\4шаг включать( а осень хосется). Если есть кусок кода на Си под это дело- поделись.
Экономия потребления электроэнергии- тоже вещь необходимая.Зачем на звёздной скорости на моторы повышенный ток ?
Кстати Денис Никитин Володе Суворову тоже советует на три камня всё раскидать- один под математику( у меня это Ccontrol), а два другие на управление движками.Денис плохого не советует, так что стоит прислушаться

CombaSoft
27.01.2007, 14:19
Можно на одном камне парой драйверов управлять, можно на двух это сделать - управление драйвером не требует большой производительности.
Делай как тебе хочется - это же творчество - весь кайф в том, что ты сам для себя ТЗ разрабатываешь и никто тебе не ставит ограничений. Конечно, придется сначала почитать, потренироваться на "кирпичиках", а потом уже строить большую систему.
Насчет управления током в обмотках. Посмотри внимательно, чего я выше говорил - драйвер стабилизирует ток независимо от скорости шагов в секунду, покуда напряжения питания хватит. Т.е. ток одинаковый что при 10 шаг/сек, что при 1000 шаг/сек. При разгоне действительно, имеет смысл делать ток выше номинального, что бы гарантировать, что пропуска шагов не будет.

CombaSoft
27.01.2007, 14:22
А насчет куска кода - не дам я его тебе. Я на компилятор твоего R8C/13 зуб имею и он меня недолюбливает :) Алгоритм если хошь, дам. На си код дам, как с компилятором рандеву состоится :), а то опять ошибки, возникшие на ровном месте, отлаживать придется.

Andreichk
27.01.2007, 14:30
Ты его полюбишь, и он тебя - гарантирую.(Он уже где-то в пути).
Так что давай что есть, не жмись

Andreichk
27.01.2007, 18:26
Вот такой хацу драйвер:vo
Уже с исправлением.Добавлен стабилизатор на 7.5 вольт для опорного напряжения

CombaSoft
27.01.2007, 19:40
Поискал я у себя насчет микрошага - нету. Похоже, что ошибся. Есть полушаг, но его и так все знают.

Andreichk
27.01.2007, 19:48
Ничего, давай что есть,остальное позже состряпаем

CombaSoft
27.01.2007, 20:08
Хорошо. Тогда вот, что я думаю. У L6219 есть возможность устанавливать величину тока в обмотках относительно установленного - 100%, 2/3, 1/3, 0. Можно сделать так, что бы 100% соответствовал ток выше номинального. Получим возможность регулировать ток на ШД в зависимости от нужного режима работы - 100% - при разгоне, 2/3 - обычный режим, 1/3 - ток удержания.

Andreichk
27.01.2007, 20:13
не возражаю. Ты мне только скажи- платину заказывать или её перерисовать нужно?

CombaSoft
27.01.2007, 20:16
У тебя маунт путешествовать будет? - на плате вижу 15вольт - где их в поле взять?
На всякий случай :) - плата отзеркалирована, да?

Andreichk
27.01.2007, 20:24
у меня есть 2 аккумулятора по 12 вольт. это не вопрос.
Я тебе ссылки давал на программу-рисовалку.
http://www.cqham.ru/e_soft.htm Sprint Layout 4.0 русская версия
тут файл лежит, открой - посмотри
исправленный

CombaSoft
27.01.2007, 20:31
Еще вижу, что ты сделал "по мотивам" схемы Павла Бахтинова. Тебе нужна возможность масштабировать ток ? ( там в 1.5раза ток падает, когда нога садит на "землю" 4.7к сопротивление)

Andreichk
27.01.2007, 20:33
пущай и это будет- электричество сэкономим в полях :)

CombaSoft
27.01.2007, 20:40
Сейчас гляну. А пока немного о драйвере - 5 вольт на референсе задает ток пол-ампера. Вот...так что если твои движки рабтают на номинале 0.3а например, то все нормально - будут работать в нормальном режиме при токе чуть бОльшем 300мА, а на разгоне - все 500мА. Если нужен бОльший ток - придется доставать на схеме напряжение бОльшее, чем 5 вольт и считать делитель

Andreichk
27.01.2007, 20:43
Достанем, какие дела? На худой конец перемычку прямо от 15ти вольт кинем

CombaSoft
27.01.2007, 20:50
Только не это! Пульсаций на референсе не надо! - те 15 вольт идут на питание выходных каскадов. Можно взять 7809, запитать ее от 12-ти вольт (паралельно с 7805) и с нее делителем получить 7.5вольт...или сколько тебе нужно - это кстати ты уже сейчас можешь узнать - может зря говорим про ток, бОльший, чем пол-ампера. Посмотри ток, потребляемый ШД в режиме ведения, ток в режиме наибольшей скорости - можно будет определиться с будущим номинальным током.
p.s.
Так написал о получении нужной напруги, будто там больше 7.5вольт подать можно. По даташиту - это максимальное напряжение референса.

Andreichk
27.01.2007, 20:52
при максимальной скорости напряжение на ключах 8 вольт, ток около 200мА.
При звёздной скорости напряжение понижается до 5-ти вольт, а ток возрастает примерно 400 мА

Andreichk
27.01.2007, 20:55
щас дорисую ещё один стабилизатор на маленькой 78L08 и всего делов-то и стабилитрон как раз на 7.5 вольт.

CombaSoft
27.01.2007, 21:01
Хорошо, рисуй мелкий стабилизатор - масло кашей не спортишь, а в случае перехода на другие, более прожоливые движки уже и плату другую делать не придется. А с этими движками я так понимаю номинальным ток будет миллиампер 300-350.

Andreichk
27.01.2007, 21:04
ну примерно так и будет

CombaSoft
27.01.2007, 21:12
Я на сегодня все - спать ложусь, т.к. завтра с утра экзамен. Последний :)

Andreichk
27.01.2007, 21:17
успехов тебе, как снова заглянешь- качни обновлённую плату

Andreichk
01.02.2007, 20:53
Загрузка драйвера R8C/13 прямо из програмной среды High-performance Embedded Workshop

Andreichk
07.02.2007, 20:45
Ну вот, титаническими усилиями Combasoft и моим методом научного тыка родился на свет новый софт для драйвера R8C\13.
Выкладываю на всеобщее обозрение :vo

/******************** ***************************/
/* FILE :opt.c */
/* DATE : Feb 07, 2007 */
/* DESCRIPTION :Main Program */
/* This file is generated by Renesas Project Generator (Ver.4.0). */
/************************************************** */
#include "sfr_r813.h"
void init(void)
{ /*-------------------------------------------------
- Change on-chip oscillator clock to Main clock -
-------------------------------------------------*/
prc0 = 1; /* Protect off */
cm13 = 1; /* Xin Xout */
cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */
cm05 = 0; /* Xin on */
cm16 = 0; /* Main clock = No division mode */
cm17 = 0;
cm06 = 0; /* CM16 and CM17 enable */
asm("nop"); /* Waiting for stable of oscillation */
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0; /* Main clock change */
prc0 = 0; /* Protect on */
pd1 = 0xFF; /* Set Port 1.0 - 1.7 be used for output*/
pd4 = 0xFF; /* Set Port 4.0 - 4.7 be used for output*/
pd3_3 = 0x01; /* Set Port 3.3 be used for output*/
} //---------------------------OK
//########################################
//---------------------------------------
// СЕКЦИЯ ОПИСАНИЯ ПЕРЕМЕННЫХ
//---------------------------------------
int spd[2][2] = {30, 1, 7000, 10};
// массив, содержащий значения множителей и оффсетов. Применяется в цикле задержки между шагами.
//---------------------------------------
unsigned char ra_step[8] = {0b00000001, 0b00000011, 0b00000010, 0b00000110, 0b00000100, 0b00001100, 0b00001000, 0b00001001};
unsigned char dec_step[8] = {0b00010000, 0b00110000, 0b00100000, 0b01100000, 0b01000000, 0b11000000, 0b10000000, 0b10010000};
// массивы, содержащие значения, выводимые в порт.
//---------------------------------------
signed char direction[2][2] = {0,1,0,-1};
// массив, содержащий значения инкремента направлений.
// для прямого движения инкременты 0 и 1
// для обратного движения инкременты 0 и -1
//---------------------------------------
signed char ra_direction, dec_direction;
// переменные-флаги указывающие направления движения по оси
//
// ненулевое значение так же говорит о том, что есть движение,
// это используется для обесточивания обмоток и подачи импульсов
// на Ccontrol 2
//---------------------------------------
char ra_pos, dec_pos;
// переменные хранят текущий шаг
//---------------------------------------
unsigned char ra, dec;
// в эти переменные заносятся значения, соответствующие текущему шагу
//---------------------------------------
unsigned char out ;
//---------------------------------------
unsigned int adc(unsigned char ch)
{
adcon0 = 0x80 + ch;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
} //---------------------------OK
//########################################
//---------------------------------------
// РАБОЧИЙ ЦИКЛ
//---------------------------------------
void work_loop(void) {
long t; // используется как счетчик в циклах задержки
//---------------------------------------
unsigned int i;
// используется в цикле задержки,
// содержит количество итераций
//---------------------------------------
int s;
int spd_a, spd_b;
// s используется как аккумулятор значения p0_6
// во избежание дребезга между операциями
//---------------------------------------
ra_pos = 0;
dec_pos = 0;
// инициализация. первый шаг - №0
//---------------------------------------
while(1) {
//---------------------------------------
s = p0_6;
spd_a = spd[s][0];
spd_b = spd[s][1];
// определяем задержку меж шагами применительно к сигналу "сутки"
//---------------------------------------
ra_direction = direction [0][p3_1] | direction[1][p3_2] | direction[1][p0_6];
dec_direction = direction [0][p3_0] | direction[1][p0_7] ;
// определяем направление движения по осям
//---------------------------------------
ra_pos +=ra_direction;
dec_pos +=dec_direction;
// изменяем номер текущего шага по обеим осям
//---------------------------------------
ra_pos %=8;
dec_pos %=8;
//---------------------------------------
ra = ra_step[ra_pos];
dec = dec_step[dec_pos];
// заносим в переменные биты, выводимые в порт
//---------------------------------------
i = adc(6) | adc(5);
// берем значение из АЦП
//---------------------------------------
i *= spd_b*6;
i += spd_a*6;
// определяем количество итераций.
for (t=0; t<i; t++ );
// собственно цикл задержки
//---------------------------------------
ra_direction *= ra_direction;
dec_direction *= dec_direction;
//---------------------------------------
ra *= ra_direction;
dec *= dec_direction;
// если инкремент движения ненулевой - двигаемся,
// иначе обесточиваем обмотки
//---------------------------------------
//out = ra | dec;
p1 = ra | dec; //out;
// двигаемся...........................
//---------------------------------------
p4_5= ra_direction;
p3_3= dec_direction;
// если было движение по оси, то даем импульс
for (t=0; t<2; t++);
// ширина импульса
p4_5=0;
p3_3=0;
// завершаем импульс, если он был
//---------------------------------------
}
}
/////////////////////////////////////////////////////////////////////
void main(void) ///
{ ///
init(); ///
work_loop(); ///
} ///
////////////////////////////////////////////////////////////////////

Однако грядет новая эра драйверов управления шаговыми двигателями. Уже не за горами связка R8C\13 и L6219 с четвертьшагом( а может быть и с микрошагом :-k )........
Так что ,дорогие телезрители, смотрите в следующей серии.....:-\"

Andreichk
08.02.2007, 01:15
Вот он, новорождённый драйвер !!! :vo :vo :vo

Andreichk
11.02.2007, 00:46
Ну вот такой гибрид родился сегодня.
Режим- четвертьшаг.
Теперь скорость телескопа в ручном режиме с разгоном возросла до 5ти градусов в секунду. :vo

/**************************************************/
/* FILE :R8C_L6219.c */
/* DATE :Sat, Feb 10, 2007 */
/**************************************************/
#include "sfr_r813.h"
#define set_motor(X) p1 = (p1 & 0xC0) | X /* Set the motor control lines
without messing up the other
two bits of Port 1 */
/* These macros correlate the L6219 signal names with their positions within
Port 1. Note that here we call the two windings 'A' and 'B' instead of '1'
and '2' like the data sheet does. */
#define A_I0 0x01 // P1_0
#define A_I1 0x02 // P1_1
#define A_Ph 0x04 // P1_2
#define B_I0 0x08 // P1_3
#define B_I1 0x10 // P1_4
#define B_Ph 0x20 // P1_5

/* These macros give names to the various possible settings of the current
control signals. The numbers in the names indicate percent of full
current. */

#define A_0 (A_I0 | A_I1)
#define A_33 A_I1
#define A_67 A_I0
#define A_100 0

#define B_0 (B_I0 | B_I1)
#define B_33 B_I1
#define B_67 B_I0
#define B_100 0

/* These macros give names to the directions of current flow in the two
windings. */

#define A_PLUS A_Ph
#define A_MINUS 0

#define B_PLUS B_Ph
#define B_MINUS 0
//================================================== =====
unsigned char four_step[16] = {
A_MINUS | A_0 | B_PLUS | B_67,
A_PLUS | A_33 | B_PLUS | B_67,
A_PLUS | A_67 | B_PLUS | B_67,
A_PLUS | A_67 | B_PLUS | B_33,
A_PLUS | A_67 | B_PLUS | B_0,
A_PLUS | A_67 | B_MINUS | B_33,
A_PLUS | A_67 | B_MINUS | B_67,
A_PLUS | A_33 | B_MINUS | B_67,
A_PLUS | A_0 | B_MINUS | B_67,
A_MINUS | A_33 | B_MINUS | B_67,
A_MINUS | A_67 | B_MINUS | B_67,
A_MINUS | A_67 | B_MINUS | B_33,
A_MINUS | A_67 | B_MINUS | B_0,
A_MINUS | A_67 | B_PLUS | B_33,
A_MINUS | A_67 | B_PLUS | B_67,
A_MINUS | A_33 | B_PLUS | B_67
};
//----------------------------------------------------------------------------------------------------
void init(void)
{ /*-------------------------------------------------
- Change on-chip oscillator clock to Main clock -
-------------------------------------------------*/
prc0 = 1; /* Protect off */
cm13 = 1; /* Xin Xout */
cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */
cm05 = 0; /* Xin on */
cm16 = 0; /* Main clock = No division mode */
cm17 = 0;
cm06 = 0; /* CM16 and CM17 enable */
asm("nop"); /* Waiting for stable of oscillation */
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0; /* Main clock change */
prc0 = 0; /* Protect on */
pd1 = 0xFF; /* Set Port 1.0 - 1.7 be used for output*/
pd4 = 0xFF; /* Set Port 4.0 - 4.7 be used for output*/
pd3_3 = 0x01; /* Set Port 3.3 be used for output*/
} //---------------------------OK
//########################################
unsigned int adc()
{
adcon0 = 0x85;
adcon1 = 0x28;
adst = 1;
while(adst == 1){}
return ad;
} //---------------------------OK
//########################################
//---------------------------------------
// СЕКЦИЯ ОПИСАНИЯ ПЕРЕМЕННЫХ
//---------------------------------------
int spd[2][2] = {30, 1, 21000, 30};
// массив, содержащий значения множителей и оффсетов.
//Применяется в цикле задержки между шагами.
//---------------------------------------
signed char direction[2][2] = {0,1,0,-1};
// массив, содержащий значения инкремента направлений.
// для прямого движения инкременты 0 и 1
// для обратного движения инкременты 0 и -1
//---------------------------------------
signed char direction_;
// переменные-флаги указывающие направления движения по оси
// ненулевое значение так же говорит о том, что есть движение,
// это используется для обесточивания обмоток и подачи импульсов
// на Ccontrol 2
//---------------------------------------
unsigned char step_pos;
// переменные хранят текущий шаг
//---------------------------------------
// РАБОЧИЙ ЦИКЛ
//---------------------------------------
void work_loop(void) {
long t; // используется как счетчик в циклах задержки
//---------------------------------------
unsigned int i;
// используется в цикле задержки,
// содержит количество итераций
//---------------------------------------
int s, spd_a, spd_b;
// s используется как аккумулятор значения p3_0
// во избежание дребезга между операциями
//---------------------------------------
step_pos = 0;
// инициализация. первый шаг - №0
//---------------------------------------
while(1) {
//---------------------------------------
s = p3_0;
spd_a = spd[s][0];
spd_b = spd[s][1];
// определяем задержку меж шагами применительно к сигналу "сутки"
//---------------------------------------------------------------------------------------------------------------
//-------определяем направление движения по оси--------------------------------
direction_ = direction[0][p3_0] | direction [0][p3_1] | direction[1][p3_2] ;
//для загрузки в RA - модуль
//------------------------------------------------------------------------------------------------------
// direction_ = direction [0][p3_1] | direction[1][p3_2] ;//DEC
//для загрузки в DEC - модуль
//---------------------------------------
step_pos +=direction_; // изменяем номер текущего шага по обеим осям
//---------------------------------------
step_pos %=16; // заносим в переменные биты, выводимые в порт
//---------------------------------------
i = 4*adc(); // берем значение из АЦП
//---------------------------------------
i *= spd_b;
i += spd_a; // определяем количество итераций.
for (t=0; t<i; t++ ); // собственно цикл задержки
//---------------------------------------
set_motor( four_step[step_pos]); // двигаемся...........................
//---------------------------------------
p1_6=direction_; //ток на полную катушку
p3_3= direction_; // если было движение по оси, то даем импульс
for (t=0; t<2; t++); // ширина импульса
p3_3=0; // завершаем импульс, если он был
//---------------------------------------
}
}
/////////////////////////////////////////////////////////////////////
void main(void) ///
{ ///
init(); ///
work_loop(); ///
} ///
////////////////////////////////////////////////////////////////////

Andreichk
18.02.2007, 06:30
Вот такой график получился

Andreichk
08.01.2009, 23:15
Ввиду начала работы над новым проектом старый проект умер или почил в бозе, отслужив мне верой и правдой почти 3 года.

volhw
09.01.2009, 02:15
А энтот чудо драйвер есть в свободной продаже

CombaSoft
09.01.2009, 11:33
Зачем он вам? У Андрея новый проект, он круче, чем прежний. Вот на новый проект и записывайтесь ;)

Andreichk
09.01.2009, 13:14
А энтот чудо драйвер есть в свободной продаженет, сей чудо драйвер пошёл на дрова,но если вам надо, могу продать всё что от него осталось по сходной цене

Andreichk
12.01.2011, 01:00
http://gotosystem.xm4.ru/