Контроллер шагового двигателя на Attiny13

Схема была придумана для проверки униполярных шаговых двигателей. Драйвер выполнен на микроконтроллере Attiny13, так как в нем есть АЦП была реализована возможность регулировки частоты вращения двигателя. Силовые ключи выполнены на довольно распространенных транзисторах КТ829А. При программировании контроллера оставить заводские настройки fuse-битов.

Направление вращения меняется потенциометром, его ручка сначала стоит в среднем положении, при повороте ручки в одну сторону движок начинает вращаться по часовой стрелке и наоборот
Контроллер шагового двигателя - схема

Схема устройства

 

Макет печатной платы

Исходный файл и прошивка микроконтроллера, а также макет печатной платы находятся в архиве.

Обсуждение статьи на форуме


//***************************************************************************
//  File Name	  : upstepper.c
//  Version       : 1.0
//  Description.  : Transistor as Switch: Simple Unipolar Stepper
//                  Motor Driver - Full Step Method
//  Author  	  : RWB
//  Target  	  : ATTiny13
//  Compiler      : AVR-GCC 4.3.2; avr-libc 1.6.2 (WinAVR 20090313)
//  IDE           : Atmel AVR Studio 4.17
//  Programmer    : Atmel AVRISPmkII
//  Last Updated  : 03 Nov 2010
//***************************************************************************

#include 
#include 
#include 

// Unipolar Stepper Motor CW/CCW Stepping Sequence
#define MAX_STEP 4

unsigned char cwstep_seq[MAX_STEP]= {0b00000110,
                                     0b00000011,
				     0b00001001,
				     0b00001100};

unsigned char ccwstep_seq[MAX_STEP]= {0b00001100,
                                      0b00001001,
				      0b00000011,
				      0b00000110};
volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;

ISR(TIM0_OVF_vect)
{
  static unsigned int count=1;

  count++;
  if (count >= ovftimes) {
    cli();                      // Disable Interrupt

    // Stepping Output
    if (status)
      PORTB = ccwstep_seq[step_index++];
    else
      PORTB = cwstep_seq[step_index++];

    if (step_index >= MAX_STEP)
      step_index=0;

    count=0;                    // Reset Count
    TCNT0=0;                    // Start counter from 0
    sei();                      // Enable Interrupt
  }
}

int main(void)
{
   // Initial I/O
   DDRB = 0b00001111;        // Set PB0, PB1, PB2, and PB3 as Output, Others as Input
   PORTB = 0b00000000;       // Reset PORTB Output

   // Set ADCSRA Register on ATTiny13
   ADCSRA = (1< Complete
     while (ADCSRA & (1< 800)
       status^=0x01;        // Toggle the Direction

     _delay_ms(50);
   }
   return 0;	            // Standard Return Code
}

/* EOF: upstepper.c */

Похожие материалы