ВНИМАНИЕ! На форуме начался конкурс - астрофотография месяца ИЮЛЬ!
0 Пользователей и 2 Гостей просматривают эту тему.
Друзья, кто умеет программить для Arduino? Для трекера нужна помощь в написании скетча для шагового движка 28byj-48. Желательно не на библиотеке Stepper.h, а на CustomStepper или AccelStepper. Задача - выставить нужную скорость вращения двигателя. Силами Stepper.h это сделать не удается.http://arduino-kit.ru/catalog/id/shagovyiy-4-h-faznyiy-dvigatel-5v-s-platoy-upravleniya-uln2003
/*****************************************************This program was produced by theCodeWizardAVR V2.05.0 ProfessionalAutomatic Program Generator© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.comProject : Version : Date : 12.04.2011Author : Company : Comments: Chip type : ATmega8Program type : ApplicationAVR Core Clock frequency: 16,000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/#include <mega8.h>#include <delay.h>#define RA_1 PORTC.2#define RA_2 PORTC.3#define RA_3 PORTC.4#define RA_4 PORTC.5#define PULT_RA_LEFT PIND.0#define PULT_RA_RIGHT PIND.2#define PULT_DEC_LEFT PIND.1#define PULT_DEC_RIGHT PIND.3#define RA_DIR_LEFT 1#define RA_DIR_RIGHT 2#define LED PORTB.0// Declare your global variables hereint step = 0;char push = 0xCD;int RA_direction = RA_DIR_LEFT;void RA_full_step(int step){ switch (step & 3) { case 0: RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 0; break; case 1: RA_1 = 0; RA_2 = 1; RA_3 = 0; RA_4 = 0; break; case 2: RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 0; break; case 3: RA_1 = 0; RA_2 = 0; RA_3 = 0; RA_4 = 1; break; }}void RA_half_step(int step){ switch (step & 7) { case 0: RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 0; break; case 1: RA_1 = 1; RA_2 = 1; RA_3 = 0; RA_4 = 0; break; case 2: RA_1 = 0; RA_2 = 1; RA_3 = 0; RA_4 = 0; break; case 3: RA_1 = 0; RA_2 = 1; RA_3 = 1; RA_4 = 0; break; case 4: RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 0; break; case 5: RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 1; break; case 6: RA_1 = 0; RA_2 = 0; RA_3 = 0; RA_4 = 1; break; case 7: RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 1; break; }}void RA(int step){ RA_half_step(step);}// Timer 1 output compare A interrupt service routineinterrupt [TIM1_COMPA] void timer1_compa_isr(void){// Place your code here RA(step); LED = step & 1; if (RA_direction == RA_DIR_LEFT) { step--; } else { step++; } }void main(void){// Declare your local variables here// Input/Output Ports initialization// Port B initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 PORTB=0x00;DDRB=0x01;// Port C initialization// Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In // State6=T State5=0 State4=0 State3=0 State2=0 State1=T State0=T PORTC=0x00;DDRC=0x3C;// Port D initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=P State1=T State0=P PORTD=0x05;DDRD=0x00;// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 StoppedTCCR0=0x00;TCNT0=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// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: On// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x0B;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0xCD;OCR1AL=0x6E;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;// External Interrupt(s) initialization// INT0: Off// INT1: OffMCUCR=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x10;// USART initialization// USART disabledUCSRB=0x00;// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;// ADC initialization// ADC disabledADCSRA=0x00;// SPI initialization// SPI disabledSPCR=0x00;// TWI initialization// TWI disabledTWCR=0x00;// Global enable interrupts#asm("sei")while (1) { if ( !PULT_RA_LEFT || !PULT_RA_RIGHT ) // || !PULT_DEC_LEFT || !PULT_DEC_RIGHT { if (push > 10) { push=10; OCR1AH=push; OCR1AL=0x6E; } if (!PULT_RA_LEFT) { RA_direction = RA_DIR_LEFT; } if (!PULT_RA_RIGHT) { RA_direction = RA_DIR_RIGHT; } } else { push = 0xCD; RA_direction = RA_DIR_LEFT; OCR1AH=0xCD; OCR1AL=0x6E; }// LED = PULT_RA_LEFT; // LED = PULT_RA_RIGHT;// LED = PULT_DEC_RIGHT;// LED = PULT_DEC_LEFT; delay_ms(50); }}
А какой оператор меняет скорость вращения?
Цитата: Azatot от 25 Янв 2016 [20:55:04]А какой оператор меняет скорость вращения?Этот? delay_ms(50);
// 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// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: On// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x0B;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0xCD;OCR1AL=0x6E;OCR1BH=0x00;OCR1BL=0x00;
delay_ms(50);
Олежка, ну так пришёл телескоп то?Делись результатами наблюдений.
Цитата: Александр Иванов от 25 Янв 2016 [22:34:55]Олежка, ну так пришёл телескоп то?Делись результатами наблюдений. Не... выслали только вчера. Ждём-с. Дело-линии прогнозируют 31го. Надеюсь, не ошибаются. Если питерские соберутся первого в Мезмай, хотелось бы погонять трубу под тёмным небом.
Понял. Питер пока в раздумиях.
Цитата: Александр Иванов от 25 Янв 2016 [22:57:40]Понял. Питер пока в раздумиях. Погода, похоже, тоже.
Таймер в этом примере тикает на частоте 250 МГц. Как только наберётся значение compare A, то счётчик таймера сбрасывается, таймер начинает тикать заново. Одновременно с этим сбросом вызывается функция // Timer 1 output compare A interrupt service routineinterrupt [TIM1_COMPA] void timer1_compa_isr(void)Которая устанавливает текущее положение мотора, исходя из текущего номера шага RA(step);Моргает светодиодом LED = step & 1;И, в соответствии с настройкой направления движения по RA if (RA_direction == RA_DIR_LEFT)делает шаг назад или вперёд step++;
Ну а как же реализовать это на Ардуино
Боюсь, что через компаратор я не осилю. А нет более простых способов? Тем более, что точность сильная не нужна.