Телескопы покупают здесь


A A A A Автор Тема: Контроллер / драйвер шаговиков мелких монти  (Прочитано 18188 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
"первый свет" :). Пока не купил 6219, кручу мотор в полушаге

http://starlab.ru/showthread.php?p=397050#post397050

Мысль идёт к покупке EQ3 :) :). Она сильно тяжелей EQ1?
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Идея не умерла, а лишь затаилась :).
Второе дыхание. Недавно купил EQ3.

Думал, сделать ли по уму, на картес м3 с железным usb или сделать "как знакомо" на атмеге + usb-uart. Пришёл к мысли, что если сейчас начну изучать новый проц, новые ide и новые технологии, результата увижу не скоро.

Поэтому, любой USB-UART, к примеру дата-кабель от мобилы на PL2303, к ней имеющаяся в наличии атмега88p, uln2003 и униполярные шаговики-редукторы.
Понимаю, что это тупик и придётся переходить на биполярные со спец.драйверами (уже купил аллегровские, в т.ч. собранные на мелкой платке с обвязкой). Но решил, опять таки, начать с чего-то, а дальше уже просто менять функцию работы с двигателями.

В данный момент, так как атмега88 достаточно ущербна, два мотора подключены на:
* ra: на 4 апаратных ШИМ из двух восьмибитных таймеров, номера 0 и 2. Сейчас в 1/8 микрошага (исключительно для плавности хода, а не точности для);
* dec: на 4 GPIO в полушаге. ШИМы кончились. Можно сделать програмный, но см. выше, потом просто повешу драйвер на ножки проца, для тестов хватит.

16битный таймер номер 1 отвечает за движение моторов. По-умолчанию вызывается раз в звёздный шаг. Если же нужен переход, сам себя генно модифицирует, постепенно разгоняясь до задаваемой скорости с задаваемой динамикой. Вот только торможение я ещё не сделал, хочу погонять в разных режимах уже созданное.

Воспринимает следующие команды на порту:
- A: abort slew
// input: void
// output: void
- S: slew ra/dec
// input: long ra, long dec
// output: void
- s: is slewing
// input: void
// output: bool
- P: sync ra/dec (put)
// input: long ra, long dec
// output: void
- G: get ra/dec
// input void
// output: long ra, long dec
- R: start sideral rate
// input: void
// output: void
- r: stop sideral rate
// input: void
// output: void
- L: pulseguide (модель не готова, нужно сначала изучить как это делается в аскоме, потом перенести принцип в контроллер

Проц оперирует только с целыми числами, что естественно для 8бит проца. Он, мягко говоря, плохо работает с 32бит float, не говоря о 64бит double. Да оно и к лучшему.
Мой текущий мотор-редуктор * шестерня RA дают разрешение порядка 0.86" на микрошаг 1/8 или 1497600 шагов на оборот = ~3.4% от ёмкости 32bit целого числа (long) или 29+ оборотов, что достаточно. О переполнении буду думать чуть позже.

Ну а когда через свою мелкопрогу отлажу работу через ком-порт, буду писать/тестить аском драйвер контроллера. Я уже написал аском-драйвер фокусёра на c#, думаю драйвер монти сложней, но не глобально. Пока очень интересно.

Неотдебуженный код МК:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : EQ1 motor
Version : 1
Date    : 19.03.2011
Author  : MO
Company : MO
Comments:


Chip type           : ATmega88P
Program type        : Application
Clock frequency     : 16,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega88p.h>
#include <stdio.h>
#include <delay.h>

///////// Редукторы и скорости //////
#define RA_SIDERAL_H 0x1C   // делитель таймера для задания звёздной скорости   
#define RA_SIDERAL_L 0x17

#define SLEW_FADE_START 10  // начальная скорость RA_SIDERAL_H при переходе 
                            // @todo дробную скорость падения                           
#define SLEW_FADE_SPEED 1   // скорость падения RA_SIDERAL_H при переходе   
#define SLEW_FADE_STOP 5    // минимум скорость падения RA_SIDERAL_H при переходе   

///////// Ножки //////////
// 4 ножки униполярного шаговика RA: апаратный ШИМ
#define RA_0 OCR0A          // D.6         
#define RA_1 OCR0B          // D.5         
#define RA_2 OCR2A          // B.3         
#define RA_3 OCR2B          // D.3           
// 4 ножки униполярного шаговика DEC: полушаг
#define DEC_3 PORTD.4       
#define DEC_2 PORTD.2
#define DEC_1 PORTD.1
#define DEC_0 PORTD.0

#define PULT_RA_LEFT PINB.0
#define PULT_RA_RIGHT PINB.1
#define PULT_DEC_LEFT PINB.4
#define PULT_DEC_RIGHT PINB.5

#define LED PORTB.2
/////// таблицы шагов мотора ///
flash char half_step_table[8][4] =
  {{1,0,0,0},
   {1,1,0,0},
   {0,1,0,0},
   {0,1,1,0},
   {0,0,1,0},
   {0,0,1,1},
   {0,0,0,1},
   {1,0,0,1}}; 
#define MICROSTEPS 8
flash char microstep_table[MICROSTEPS + 1] = {0,39,75,100,141,180,212,235,255};
////////////////////////////////
#define RA_DIR_LEFT 1
#define RA_DIR_RIGHT 2
//////////////////////////
long int ra = 0;
long int dec = 0;

long int slew_ra;
long int slew_dec;

char sideral = 1;
char slewing = 0;

unsigned char uart_byte = 0;
long int uart_ra, uart_dec;
char uart_mode;
//////////////////////////




/////////// UART ////////////
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
bit rx_buffer_overflow0;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
    char status,data;
    long int long_tmp;
    status=UCSR0A;
    data=UDR0;
    long_tmp = data;
                     
    // Номер байта в посылке
    switch (uart_byte)     
    {             
        // первый LONG параметр = RA, HhLl   
        case 1:           
            uart_ra |= (long_tmp<<24);       
            uart_byte++;
            break;
        case 2:
            uart_ra |= (long_tmp<<16);       
            uart_byte++;
            break;
        case 3:
            uart_ra |= (long_tmp<<8);       
            uart_byte++;
            break;
        case 4:         
            uart_ra |= long_tmp;       
            uart_byte++;
            break;

        // второй LONG параметр = DEC   
        case 5:           
            uart_dec |= (long_tmp<<24);       
            uart_byte++;
            break;
        case 6:
            uart_dec |= (long_tmp<<16);       
            uart_byte++;
            break;
        case 7:
            uart_dec |= (long_tmp<<8);       
            uart_byte++;
            break;
        case 8:         
            uart_dec |= long_tmp;       
            uart_byte = 0;
            switch (uart_mode)
            {
                // S: slew ra/dec
                case 'S':
                    slewing = 1;
                    slew_ra = uart_ra;
                    slew_dec = uart_dec;
                    OCR1AH = SLEW_FADE_START;
                    break;
               
                // P: sync ra/dec (put)
                case 'P':
                    ra = uart_ra;
                    dec = uart_dec;
                    break;
            }
            uart_ra = 0;
            uart_dec = 0;
            break;

        // первый байт
        case 0:
            switch (data)
            {             
                // A: abort slew
                // input: void
                // output: void
                case 'A':
                    // @todo: плавный останов
                    slew_ra = ra;
                    slew_dec = dec;
                    slewing = 0;
                    break;

                // S: slew ra/dec
                // input: long ra, long dec
                // output: void
                case 'S':
                    uart_byte++;
                    uart_ra = 0;
                    uart_dec = 0;
                    break;

                // s: is slewing
                // input: void
                // output: bool
                case 's':
                    putchar(slewing);
                    break;

                // P: sync ra/dec (put)
                // input: long ra, long dec
                // output: void
                case 'P':
                    uart_byte++;
                    uart_ra = 0;
                    uart_dec = 0;
                    break;

                // G: get ra/dec
                // input void
                // output: long ra, long dec 
                case 'G':
                    putchar((ra & 0xFF000000) >> 24);
                    putchar((ra & 0xFF0000) >> 16);
                    putchar((ra & 0xFF00) >> 8);
                    putchar(ra & 0xFF);
                    putchar((dec & 0xFF000000) >> 24);
                    putchar((dec & 0xFF0000) >> 16);
                    putchar((dec & 0xFF00) >> 8);
                    putchar(dec & 0xFF);
                    break;

                // R: start sideral rate
                // input: void
                // output: void
                case 'R':
                    sideral = 1;                   
                    break;

                // r: stop sideral rate
                // input: void
                // output: void
                case 'r':
                    sideral = 0;                   
                    break;

                // L: pulseguide @todo узнать параметры в аскоме
                case 'L':
                    // @todo
                    break;
            }
            uart_mode = data;
            break;
    }
   
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
        rx_buffer0[rx_wr_index0++]=data;
        if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
        if (++rx_counter0 == RX_BUFFER_SIZE0)
        {
            rx_counter0=0;
            rx_buffer_overflow0=1;
        }
    }
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
    char data;
    while (rx_counter0==0);
    data=rx_buffer0[rx_rd_index0++];
    if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
    #asm("cli")
    --rx_counter0;
    #asm("sei")
    return data;
}
#pragma used-
#endif
/////////// UART ////////////












// Звёздная шагалка, 16бит таймер 1
// она же slew с fade, таймер модифицируется
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    unsigned char phase;
    unsigned char microstep;
   
    if (slewing)
    {
        // start ускорения
        // нагоняем скорость, понижая край счётчика таймера на FADE_STEP, если не FADE_STOP
        if (OCR1AH > SLEW_FADE_STOP)
        {
            OCR1AH -= SLEW_FADE_SPEED;
        }
                 
        // @todo: учесть зацикливание по переполнению LONG
        if (ra < slew_ra)
        {
            ra++;
        }       
        else
        {
            if (ra > slew_ra)
            {
                ra--;
            }
        }
        if (dec < slew_dec)
        {
            dec++;
        }       
        else
        {
            if (dec > slew_dec)
            {
                dec--;
            }
        }
        if ( (ra == slew_ra) && (dec == slew_dec) )
        {
            // переход завершён
            slewing = 0;
        }
       
        // @todo: stop ускорения (щас просто отрубает моторы)
        /*
        if (ticks to stop < (SLEW_FADE_START - SLEW_FADE_SPEED) )
        {
            OCR1AH += SLEW_FADE_SPEED;
        }       
        */
    }
    else
    {
        if (sideral)
        {
            // Запуск звёздной скорости
            OCR1AH=RA_SIDERAL_H;
            OCR1AL=RA_SIDERAL_L;
            // шаг вперёд
            ra++;
        }
    }
   
    // частный случай на 1/8 микрошага
    // @todo: переделать бы в #define
    phase = ra & 0b11000;
    microstep = ra &0b111;
    RA_0 = ((phase == 1)?microstep_table[microstep]:(phase == 2)?microstep_table[8-microstep]:0);
    RA_1 = ((phase == 2)?microstep_table[microstep]:(phase == 3)?microstep_table[8-microstep]:0);
    RA_2 = ((phase == 3)?microstep_table[microstep]:(phase == 4)?microstep_table[8-microstep]:0);
    RA_3 = ((phase == 4)?microstep_table[microstep]:(phase == 1)?microstep_table[8-microstep]:0);

    DEC_0 = (half_step_table[dec & 7][0] == 1)?1:0;
    DEC_1 = (half_step_table[dec & 7][1] == 1)?1:0;
    DEC_2 = (half_step_table[dec & 7][2] == 1)?1:0;
    DEC_3 = (half_step_table[dec & 7][3] == 1)?1:0;
   
    //  и моргаем лампочкой
    LED = (ra+dec) & 1;
}

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x70;
OCR1AL=0x5F;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x02;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x98;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x67;

#asm("sei")

    while (1)
    {
    };
}

Занимает 24% памяти проца, то есть ещё есть куда расти.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Чуток подебужил код, тренируюсь в ютубе вот :)
Микрошаговый (1/8) драйвер униполярного шаговика (на фоне озвучка - мелкий помошник, сын Юрец двух лет отроду).
1/8 микрошаг работает. Без стабилизации по току, конечно. Схема простая: атмега + uln2x03 + мотор. Мой мотор 0.4А, uln до 0.5.

Щас шнурок pl2303 найду свободный, буду usart часть дебужить.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Подебужил. Сделал плавный разгон, осталось торможение.
Весь рабочий протокол, описанный выше плюс несколько дебуг-команд работают из терминала.

Сделал переход в полушаг при переходе - увеличивает мощность движка, да и микрошаг на низкочастотном ШИМе (из-за медленной оптопары частоту пришлось снизить) не даёт разогнать двигатель.

Теперь дело за аском-драйвером. Нашёл не только пустой шаблон (поставляется с ascom), но и готовый рабочий пример аналогичного проекта: http://www.starlab.ru/showpost.php?p=430772&postcount=23
Надо бы вебку найти, сделать пульсгид и потренироваться погидировать eq3 :), как на днях придёт второй мотор к ней.

Ещё достал из шкафа спаянный модуль на аллегровском драйвере биполярника 1/16 с контролем тока и встроенными ключами 35В / 2A (A4983). Как закончу аском драйвер, хочу погонять модуль.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Есть первая альфа-версия ASCOM драйвера. Не без косяков, продолжаю доделки.
Но уже работает несколько базовых функций:
- получение координат с монти (RightAscension и Declination);
- синхронизация из планетария (SyncToTarget);
- переход из планетария (SlewToTargetAsync).

Видео в ютубе: Контроллер монтировки (шаговики) с ASCOM драйвером
Несколько скринов в сообщении.
Фотки платы тут: http://photo.milantiev.com/?dir=1684
モ - mo

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 059
  • Благодарностей: 764
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Хорошее дело. Полезно прогнать Ascom Conformance Checker
http://ascom-standards.org/Downloads/DevTools.htm
, он напишет кучу замечаний (что именно в плагине не соответствует стандарту).

Пересчет в Alt Az координаты делать по моему не обязательно, достаточно внятно прописать в интерфейсе, что телескоп их не поддерживает.
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Забыл кратенько описать текущую реализацию схемы.
- шнурок-датакабель из евросети на pl2303 в качестве usb-uart;
- атмега8
- 4 железных ШИМа на частоте 7.75кГц (пришлось уйти от 62+кГц из-за медленных оптронов в наличии, теперь моторы слышно) через tlp521 и uln2003 на мотор RA, 1/8 микрошага униполярного движка-редуктора;
- 4 обычных порта (у atmega8 мало железных ШИМ) пока без опторазвязки (перепаяю после завершения борьбы с софтом), через вторую uln2003 на мотор DEC, 1/2 шага, такой же движок.

Кнопок нет и не планируется. Питание логики от USB, развязано от силовой части оптронами.

В перспективе переход на stm32 платку (350+ руб) и железные драйвера биполярников от Аллегро (400+ руб за канал) с контролем тока.
Платка придёт через пару недель из кЕтая. Аллегровский напаяный модуль уже дома.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Хорошее дело. Полезно прогнать Ascom Conformance Checker
http://ascom-standards.org/Downloads/DevTools.htm
, он напишет кучу замечаний (что именно в плагине не соответствует стандарту).

Пересчет в Alt Az координаты делать по моему не обязательно, достаточно внятно прописать в интерфейсе, что телескоп их не поддерживает.
Спс за ссылку. Обязательно прогоню перед переходом в стадию открытого бета-тестирования.

Угу, пересчёт не хочу делать. Хотя аском 6 поставляется с библиотекой, это сильно упрощающей. Но мне пока не нужна такая функция, мало времени разбираться. Есть другие интересные проекты.
モ - mo

Rusik

  • Гость
В перспективе переход на stm32 платку (350+ руб) и железные драйвера биполярников от Аллегро (400+ руб за канал) с контролем тока.
Платка придёт через пару недель из кЕтая. Аллегровский напаяный модуль уже дома.
тоже балывался с AVRками, и уже перешел на STM32+Allegro, проект ксате чемто похож на ваш
http://www.astroclub.kiev.ua/forum/index.php?topic=20674.msg241446#msg241446

на ASCOM драйвер не созрел "времярасход" большой, подвязался к EQMOD.
на текущий момент на столе в связке с EQMOD все работает, готовлю свежую прошивку ну и тестирование на монти.

так что ресурса кортекса с головой.

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
В перспективе переход на stm32 платку (350+ руб) и железные драйвера биполярников от Аллегро (400+ руб за канал) с контролем тока.
Платка придёт через пару недель из кЕтая. Аллегровский напаяный модуль уже дома.
тоже балывался с AVRками, и уже перешел на STM32+Allegro, проект ксате чемто похож на ваш
http://www.astroclub.kiev.ua/forum/index.php?topic=20674.msg241446#msg241446

на ASCOM драйвер не созрел "времярасход" большой, подвязался к EQMOD.
на текущий момент на столе в связке с EQMOD все работает, готовлю свежую прошивку ну и тестирование на монти.

так что ресурса кортекса с головой.

Читал Вашу тему, респект.
Сам заказал платку (другую) на кортекс-м3, устал от ограничений avr'ок, не только в этом проекте. И хочется переходить на устройства с аппаратным usb, забыть про com-uart преобразователи.

С аскомом сложность сильно преувеличена. Так как единственный язык, на котором я для себя пишу под винду - это c#, то был приятно удивлён, что с аскомом идут в комплекте шаблоны драйверов для всех типов устройств на c# / vb (что, по сути, одно и то же).

Остаётся заполнить шаблон из несколько десятка функций. Я пока заполнил штук десять, причём половина функций заключаются в return true :), типа canSlewToTargetAsync() return "да, могу".
モ - mo

Оффлайн Дядя Вова

  • *****
  • Сообщений: 8 095
  • Благодарностей: 95
    • Сообщения от Дядя Вова
На яхе лежит и рыба на Си(каком-то) того самого драйвера eqcontrl.dll для eqmod (ой! я зря про eqmod?  ;))
(Vixen ED80+Canon300Da, 9x50+QHY5)+EQ6upg
Meade ETX-90PE

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
На яхе лежит и рыба на Си(каком-то) того самого драйвера eqcontrl.dll для eqmod (ой! я зря про eqmod?  ;))
Зря или нет - эт ты сам решай :)
Да, я не сторонник eqmod, но не могу не признать, что это классная программа.

Сам же я ей не пользуюсь и свой контроллер строю на аском драйвере.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Обнаруживаются мелкие неприятности, связанные с написанием своего аском-драйвера. К примеру, я думал, что монти/драйверу не обязательно знать свои координаты. И, в принципе, всё работает и без них (в рамках протестированного). Но при перекладке монти идёт кругом по RA, не анализируя, уводит ли она трубу "под землю". Для избежания подобного достаточно чтобы монти знала широту места наблюдения с точностью в пяток градусов.

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

Для тестирования PulseGuide жду второго моторчика на монти и буду гидировать соседний фонарь на вебку, обманув максим, что трекинг включен.
モ - mo

Rusik

  • Гость
...Да, я не сторонник eqmod, но не могу не признать, что это классная программа.
Сам же я ей не пользуюсь и свой контроллер строю на аском драйвере.
имелось ввиду наверное свой аском, ведь eqmod можно сказать тоже аском драйвер.

Обнаруживаются мелкие неприятности, связанные с написанием своего аском-драйвера. К примеру, я думал, что монти/драйверу не обязательно знать свои координаты. И, в принципе, всё работает и без них (в рамках протестированного). Но при перекладке монти идёт кругом по RA, не анализируя, уводит ли она трубу "под землю". Для избежания подобного достаточно чтобы монти знала широту места наблюдения с точностью в пяток градусов.
я не вникал глубоко в аском, думал что надо больше знать информации как минимум координаты места наблюдения, и время, ну и вычисления для перехода от небесных координат в энкодеры движков.

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
...Да, я не сторонник eqmod, но не могу не признать, что это классная программа.
Сам же я ей не пользуюсь и свой контроллер строю на аском драйвере.
имелось ввиду наверное свой аском, ведь eqmod можно сказать тоже аском драйвер.
На 100% верно.
Обнаруживаются мелкие неприятности, связанные с написанием своего аском-драйвера. К примеру, я думал, что монти/драйверу не обязательно знать свои координаты. И, в принципе, всё работает и без них (в рамках протестированного). Но при перекладке монти идёт кругом по RA, не анализируя, уводит ли она трубу "под землю". Для избежания подобного достаточно чтобы монти знала широту места наблюдения с точностью в пяток градусов.
я не вникал глубоко в аском, думал что надо больше знать информации как минимум координаты места наблюдения, и время, ну и вычисления для перехода от небесных координат в энкодеры движков.
Хм... не будем торопиться. Через недельку-две выпущу бетту и пойму на какие подводные камни наступил. В данный момент полон оптимизма и не вижу существенных трудностей. Всё подробно опишу по факту.
モ - mo

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
я не вникал глубоко в аском, думал что надо больше знать информации как минимум координаты места наблюдения, и время, ну и вычисления для перехода от небесных координат в энкодеры движков.

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

Осваиваю биполярники. Есть у меня платка, по наводке Володи Суворова (из другой темы наводка). Плата построена вокруг A4988 с аппаратным контролем тока и 1/16 микрошагом.
Есть у меня NEMA17 0.4A гибридный мотор с 6 выводами. Не подключая средние работает биполярником.

Попросил свою платку осуществлять постоянный переход, щёлкать STEP, постоянно держа DIR в одном положении. Установил микрошаг 1/16, включил ENABLE, убрал RESET. Мотор едет. Но как-то уж очень дёргано. Пробовал менять полярность обмоток, не заметил разницы (кроме изменения направления, конечно). Увеличивал ток, мотор ощутимо сильней, но и микрошагов ощутимо меньше. Уменьшаешь ток, шагов как-будто больше, но легко срывается даже на малых скоростях. И движение рывком... потом останов... рывком, опять останов. Как-будто мотор работает только на верхней части кривой.

В общем, нужен хелп :).

Есть ещё другой нераспаянный аллегровский драйвер, но там лишь 1/8 :(. Мне и 1/16 для одного проекта маловато (но пойдёт), 1/8 вряд ли будет плавнее.



Цитата
The above diagram shows a standard bipolar stepper motor. To control this with the A4983 or A4988, connect stepper lead A to board output 1A, stepper lead C to board output 1B, stepper lead B to board output 2A, and stepper lead D to board output 2B. See the A4983/A4988 datasheet for more information.

If you have a six-lead unipolar stepper motor as shown in the diagram below:

Two-phase unipolar stepper motor with six leads.
(картинка 1)

Мой мотор: http://www./ссылка запрещена правилами форума//product-gs/447386858-FreeShipping-A57-Nema17-Hybrid-Stepping-Motor-5-32kg-cm-1-8Degre-0-4A-48mm-stepper-motor-wholesalers.html
(картинка 2)

Соответственно получилось:
1А: чёрный
1В: зелёный
2А: красный
2В: синий

Силовую часть запитал 12В, правда слабенький БП, заявлено 0.8А.
モ - mo

Rusik

  • Гость
скорее всего нехватает тока, у вашего двигателя большое сопротивление обмотки, нужно большое напряжение для раскачки, посмотрите в datashet на драйвер формулу расчета тока, проверьте что получается, и поднимите напряжение на драйвере до максимально возможного. даже на низкоомніх двигателях рекомендуется питатся от повышеного напряжения 24-28В

Rusik

  • Гость
я когда отлаживал драйвер на А3979 тоже столкнулся с дерганьями неравномерностями шагов пока не поднял ток на двигатель. Правда двигатель стал грется ,но пределах нормы

Оффлайн moАвтор темы

  • *****
  • Сообщений: 17 580
  • Благодарностей: 1078
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Понял.
ОГРОМНОЕ спасибо. А то я прям чуть слезу не пустил, что на столь ровном месте столь крупный затык. :)

Под рукой, правда, только +12. Поменяю БП на более мощный (от компа запитаю) и выкручу резистор на REF микрухи, думаю 0.4А движку хватит.

Драйвер держит до 35В... где-то валялся неизвестного качества / тока БП от сканера на 19В, попробую и его. А вообще надо бы обзавестись 24В стабилизированным БП, конечно.
モ - mo

Rusik

  • Гость
и еще  Allegro по крайней мене на микросхему А3979, рекомендует формулу для выбора минимального значения резисторов датчиков тока (у вас это R7 R8).
Смысл этого что при маленьких токах очень низкое падение напряжения на этих резисторах в результате низкие токи обмоток трудно стабилизировать, но это так, попробуйте добится нужного тока с теми резисторами что стоят, а дальше будет видно