Kleiner Schrittschaltmotor mit ATMega88A und L293D
von
am 20.11.2012 um 20:34 (3035 Hits)
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.
Anmerkungen und Fragen willkommen.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
Gruß
Searcher