Skocz do zawartości

Silnik bipolarny zliczanie impulsów


Eposas

Pomocna odpowiedź

Witam, mam problem może i  prosty do rozwiązania ale ja go akurat nie widzę. Chodzi mi kod do zliczania impulsów z silnika krokowego bipolarnego, przysyłam wam mój program w którym chce własnie taki licznik w którym  będzie wyświetlał mi na lcd ilosc kroków czyli impulsów.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "LCD/lcd44780.h"
#include "MK_ENCODER2/mkencoder.h"
 
 
#define BUZ       (1<<PB0)
#define BUZ_OFF   PORTB &= ~BUZ
#define BUZ_ON    PORTB|= BUZ
#define BEEP      BUZ_ON; _delay_ms(5); BUZ_OFF
#define BEEP1     BUZ_ON; _delay_us(500); BUZ_OFF
#define LED_PIN (1<<PC7) // definicja pinu do którego podłączona jest dioda
#define LED_PIN1 (1<<PC6)
#define LED_TOG PORTC ^= LED_PIN        // makrodefinicja – zmiana stanu diody
#define LED_TOG1 PORTC ^= LED_PIN1
static void kroki_lewo(void);
static void kroki_prawo(void);
 
uint8_t rep;
 
/* przydatne definicje pinów sterujących */
#define A1 (1<<PD4) // 4
#define B1 (1<<PD5) // 8
#define B2 (1<<PD6) // 16
#define A2 (1<<PD7) // 32
/* definicje kroków sterujących pracą silnika */
#define KROK1 PORTD |= A1|B1; PORTD &= ~(A2|B2) // 12 >> HEX: 0xC
#define KROK2 PORTD |= A2|B1; PORTD &= ~(A1|B2) // 40 >> HEX: 0x28
#define KROK3 PORTD |= A2|B2; PORTD &= ~(A1|B1) // 48 >> HEX: 0x30
#define KROK4 PORTD |= A1|B2; PORTD &= ~(A2|B1) // 20 >> HEX: 0x14
 
 
void enkoderek( int8_t edir, int value );
void przycisk( void);
 
 
// główna funkcja programu
 
int main( void ) {
/* ustawiamy piny sterujące L293D jako wyjścia */
        DDRD |= A1|A2|B1|B2;
        DDRC |= LED_PIN | LED_PIN1;             // kierunek pinu PC7 – wyjściowy
 
    DDRB |= BUZ;
    BUZ_OFF;
 
mk_encoder_init();
    register_enc_event_callback( enkoderek);
    register_enc_event_sw_callback( przycisk );
 
 
    // wyświetlacz LCD
    DDRA |= ( 1 << PA7 );
    PORTA |= ( 1 << PA7 );// podświetlenie LCD
    lcd_init();
    lcd_str_P( PSTR( "bipolar" ) );
 
 
    sei();      // globalne zezwolenie na przerwania
 
 
 
    while ( 1 ) {
 
 
        ENCODER_EVENT();    // zdarzenie enkodera
    }
 
}
void przycisk( void ) {
   BEEP1;
}
void enkoderek( int8_t edir, int value ) {
 
BEEP1;
 
if(edir==-1)kroki_prawo() ; //
else kroki_lewo();
}
 
 
 
/* funkcja wykonująca cyklicznie kroki (obrót w lewo) */
static void kroki_lewo(void) {
        static uint8_t kr;
 
        if( kr == 0 ) { KROK1; }
        if( kr == 1 ) { KROK2; }
        if( kr == 2 ) { KROK3; }
        if( kr == 3 ) { KROK4; }
 
        if( ++kr > 3 ) kr=0;
}
 
/* funkcja wykonująca cyklicznie kroki (obrót w prawo) */
static void kroki_prawo(void) {
        static uint8_t kr;
 
        if( kr == 0 ) { KROK4; }
        if( kr == 1 ) { KROK3; }
        if( kr == 2 ) { KROK2; }
        if( kr == 3 ) { KROK1; }
 
        if( ++kr > 3 ) kr=0;
}

komentarzami się nie przejmujcie bo nie miałem je kiedy poprawić, a po za tym kiedy przekręcam enkoderem to i tak silnik nie rusza :) i nie wiem w czym jest błąd 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.