-         
RSS-Feed anzeigen

Searcher

Kleiner Schrittschaltmotor mit ATMega88A und L293D

Bewerten
Hab endllich mal wieder einen Anlaß für einen Blogeintrag gefunden.

Wollte schon lange mal einen Schrittschaltmotor selber ansteuern. Dazu sollte mir ein zweckentfremdeter bipolarer Stepper aus einem 3 1/2" Floppy Laufwerk dienen. Natürlich keine Daten dazu zu finden

Der Motor hat ca. 15 Ohm Gleichstromwiderstand in einer Spule. Floppylaufwerk wird mit 5V versorgt. Also angenommen der Stepper hält auch 5V aus: 5V/15Ohm macht nicht mehr als 334mA. Das sollte die L293D Doppel H-Brücke locker treiben können und die hatte ich schon einige Zeit hier rum liegen.

Um zum schnellen Erfolg zu kommen, wurde VCC2 am L293D für den Motorstrom, wie der Mega88, auch an 5V geklemmt. Aufgrund des inneren Spannungsabfalls am L293D kommt viel weniger als 5V am Motor an. Reicht aber gut für erste Versuche

Die L293D ist direkt am PortD des Mega88 angeschlossen und verbraucht 6 Pins. Vielleicht geht demnächst da was mit 74HC595 Schieberegister und SPI?

Programm in Bascom geschrieben, Englisch geübt, die Bestromungssequenz für Halbschritt aus dem RN-Wiki entnommen; er dreht und läßt sich butterweich mit Poti in der Geschwindigkeit steuern

In Planung ist Richtungswechsel, Umschaltung von Halb- auf Vollschritt ohne Drehzahlveränderung, Rampe.
Code:
'Control of a bipolar stepper motor, salvaged from 3 1/2 floppy drive

'BASCOM Demo Version 2.0.5.0

'double H-bridge L293D, connected to portD of ATMega88A,is used as driver for the motor
'Potentiometer allows motor speed control

'Timer0 is configured with OCR0A as Top
'OCR0A is modified by a potentiometer through ADC values to allow motor speed control
'Comparematch 0A Interrupt routine sends control information to the double H-bridge

$regfile = "m88def.dat"
$framesize = 32
$swstack = 32
$hwstack = 34
$crystal = 8000000

Dim Adc_result As Word
Dim Alt_wert As Word
Dim Neu_wert As Word
Dim Differenz As Integer

Dim Step_phase_count As Byte
Dim Step_phase(8) As Byte               'array holds control bits for energising the stepper coils

Step_phase_count = 1                    'initialise

'energising sequence, 1st coil at 1Y, 2Y; 2nd coil at 3Y, 4Y
'bit: 7 = 4A , 6= 3A , 5= 2A , 4 = 1A , 3 = 3,4EN, 2 = 1,2EN at L293D ; 1 = PD1 , 0 = PD0
'halfstep
'bit              7654 3210
Step_phase(1) = &B0101_1111
Step_phase(2) = &B0001_0111
Step_phase(3) = &B1001_1111
Step_phase(4) = &B1000_1011
Step_phase(5) = &B1010_1111
Step_phase(6) = &B0010_0111
Step_phase(7) = &B0110_1111
Step_phase(8) = &B0100_1011

Portd.0 = 1                             'pullup resistor on, not relevant for stepper
Portd.1 = 1                             'pullup resistor on, not relevant for stepper
Config Portd.2 = Output                 '1,2 EN at L293D
Config Portd.3 = Output                 '3,4 EN at L293D
Config Portd.4 = Output                 '1A at L293D
Config Portd.5 = Output                 '2A at L293D
Config Portd.6 = Output                 '3A at L293D
Config Portd.7 = Output                 '4A at L293D

'Timer0 Configuration
Tccr0a = Bits(wgm01 , Wgm00)            'fast PWM
Tccr0b = Bits(wgm02 , Cs02 , Cs00)      'fast PWM - top OCR0A, prescale 1024

Config Adc = Single , Prescaler = Auto , Reference = Avcc

On Compare0a Isr_stepper_step
Enable Compare0a
Enable Interrupts

Do
  Adc_result = Getadc(0)                'read potentiometer for speed (value between 0 and 1023)

  Neu_wert = Adc_result
  Differenz = Neu_wert - Alt_wert       'calculate difference to previous read value
  Differenz = Abs(differenz)            'make a positive number
  If Differenz > 3 Then                 'if difference larger than tolerance (last 2 LSBs)
    Shift Neu_wert , Right , 2          'make a number between 0 and 255, cut last 2 LSBs
    If Neu_wert = 0 Or Neu_wert = 255 Then       'if extrem values for OCR0A then
        Disable Compare0a               'stop updating control bits to H-bridge (motor in hold)
      Else
        Enable Compare0a                'enable updating control bits (motor turns)
        Ocr0a = Neu_wert                'set stepper sequence cycle (frequency)
    End If
    Alt_wert = Adc_result
  End If
Loop

Isr_stepper_step:                       'called by compare0a interrupt and controls H-bridge
  Portd = Step_phase(step_phase_count)  'send control bits to the double H-bridge
  If Step_phase_count < 8 Then          'index cycling of step_phase array
      Incr Step_phase_count
    Else
      Step_phase_count = 1
  End If
Return

End                                     'end program
Anmerkungen und Fragen willkommen.
Gruß
Searcher

"Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei Twitter speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei Facebook speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei Mister Wong speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei YiGG.de speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei Google speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei del.icio.us speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei Webnews speichern "Kleiner Schrittschaltmotor mit ATMega88A und L293D" bei My Yahoo speichern

Stichworte: - Stichworte bearbeiten
Kategorien
Projekte , Root , Sonstiges

Kommentare