Skocz do zawartości
Eposas

Silnik bipolarny zliczanie impulsów

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 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...