Krokový motor - příklad v C pro AVR

Dobrý den , potřebují poradit rozjezdové a dojezdové rampy pro krokače nějaký příklad v C pro AVR .

Děkují

:arrow_right: administrator: přejmenováno z "Krokový motor"

dobry start je tahle application note vcetne ukazkoveho kusu zdrojaku
atmel.com/images/doc8017.pdf
atmel.com/Images/AVR446.zip

nějak nechápu jak to časovat ty kroky ?

nejlepe pres timer a preruseni

to jo a přímo v přerušeni i ten motor ovládat třeba to přerušeni bude co 2 KHz ale jak to přepočítat jak bu chtít třeba rychlost 500Hz ?

v rutine preruseni vzdycky kdyz udelas krok, tak spocitas za jak dlouho je potreba udelat dalsi krok viz kod a nastavis timer na uplne novy interval

mě jde oto jak odpočítat čas chci 1 krok třeba 1 sekunda tak to musím na 500 ms STEP na HI a na 500 ms LO jak odpočítat těch 500 ms

vymyslel sem něo takového ale na začátek aby to počítalo kroky
ale nějak mi to děla krok naviíc

[code]#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED_PIN (1<<PA0)
#define LED_ON PORTA &= ~LED_PIN
#define LED_OFF PORTA |= LED_PIN
#define LED_TOG PORTA ^= LED_PIN

volatile uint16_t speed;
volatile uint16_t step;

int main(void){

DDRA |= LED_PIN;
DDRB |= (1<<PB3);
DDRD |= (1<<PD5);
LED_ON;

// TIMER1

TCCR1B |= (1<<WGM12);                  // CTC
TCCR1B |= (1<<CS12) | (1<<CS10);      // preskaler = 1024
TCCR1A |= (1<<COM1A0);
PORTD |= (1<<PD5);
OCR1A |= 16999;
TIMSK |= (1<<TICIE1);

	step = 5;
	sei();	              



while(1){

	_delay_ms(10000);

}

}

ISR (TIMER1_CAPT_vect){

LED_TOG;

	static uint16_t krok;
	krok++;
	if(krok==step){
		krok=0;
		TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
	}

}
[/code]

nevíte čim to může byt ja si myslím že jak ten generator je apnuty dřiv než přerušení